6.5. テーブルエディタを実装する¶
6.5.1. イベントリスナを実装する¶
ツールバー以外に、テーブルを編集するための専用バー(テーブルエディタ)が用意されています。
このテーブルエディタでは、以下の機能を提供します。
各行・各列の全体選択バー
- 各行・各列の間に挿入するアイコン
- 空行・空列の追加
- 前行・前列と同じ内容を追加
各行・各列を削除するアイコン
各行・各列の大きさを変更
郵便番号入力エレメントはテーブルではありませんが、説明のためにテーブルエディタを実装してみます。
特定のエレメントに対してテーブルエディタを使用可能とするためには、「事前準備」にて用意した Layouter クラスに、特定のイベントリスナを実装します。
実装するイベントリスナは、以下の通りです。
- designer-get-table-size
- インラインメニュー、または、ツールバーの表示が必要となったときに呼び出されるイベントです。
- このイベントを実装し、行・列の各サイズ情報を返却すると、エディタ上にテーブル用の行列エディタが表示されます。
- テーブルの行列を操作する機能を付与したい場合は、このイベントは必須です。 機能を使用しない場合は、このイベントは不要です。
- designer-set-table-size
- テーブルの行列を操作する機能において、行・列のサイズが変更されたときに呼び出されるイベントです。
- リクエストに従って、行・列のサイズを更新する操作を、エレメントに対して行います。
- designer-toolbar-push-table
- designer-get-table-size イベントで許可した操作において、ツールバー上の項目が選択されたときに呼び出されるイベントです。
- リクエストに従って、表示した項目に応じた操作を、エレメントに対して行います。
以下のように実装します。
export class MyZipCodeFieldLayouter implements IUIElementLayouterExpandCaller {
public isSupported(element: IUIElement): boolean {
return element.instance.elementTypeName === MyZipCodeField.name;
}
public initialize(element: IUIElement, container: IUIContainer): void {
const eventListener = container.eventListener;
// テーブル用の行列エディタが表示されたとき
eventListener.addEventListener(element, 'designer-get-table-size', async () => {
return {columns: [], rows: []}; // テーブルの各行列サイズを返却する
});
// テーブル用の行列エディタで、サイズが変更されたとき
eventListener.addEventListener(element, 'designer-set-table-size', (eventValue) => {
// テーブルの各行列サイズを設定する
});
// テーブル用のツールバーから項目が選択されたとき
eventListener.addEventListener(element, 'designer-toolbar-push-table', (eventValue) => {
// テーブル行列の操作を実装する
});
}
}
6.5.2. テーブルの各行列サイズを返却する¶
テーブルエディタに、テーブルの基本的な情報を与えるため、イベントリスナで designer-get-table-size のリスナを追加し、各行・各列の情報を返却します。
今回はサンプルとして、列の情報のみを返却してみます。
以下のように実装します。
export class MyZipCodeFieldLayouter implements IUIElementLayouterExpandCaller {
public isSupported(element: IUIElement): boolean {
return element.instance.elementTypeName === MyZipCodeField.name;
}
public initialize(element: IUIElement, container: IUIContainer): void {
const eventListener = container.eventListener;
// テーブルエディタが表示されたとき
eventListener.addEventListener(element, 'designer-get-table-size', async () => {
// エレメントの表示位置を取得する
const rect = element.getClientRect();
// テーブルの各行列サイズを返却する
return {
// 列
columns: [
// position には、列の堺となる場所(単位:px)を指定します。
// supported には、テーブルエディタに表示する機能を指定します。 表示されるだけで、実際に動作しません。
// サイズ変更を動作させるためには、designer-set-table-size イベントを実装します。
// 行・列の追加・削除を動作させるためには、designer-toolbar-push-table イベントを実装します。
{position: rect.left}, // 左上の位置
{position: rect.left + 100, supported: {changeWidth: true, cloneColumn: true, insertColumn: true, removeColumn: true}},
{position: rect.left + 200, supported: {changeWidth: true, cloneColumn: true, insertColumn: true, removeColumn: true}}
],
// 行
rows: [
{position: rect.top} // 左上の位置
]
};
});
}
}
6.5.3. テーブルの各行列サイズを更新する¶
テーブルエディタで表示されている行・列の堺にある三角マークをドラッグすると、サイズの変更が開始されます。
ドラッグ操作が終了したときに、最終的に決定したサイズを取得するため、イベントリスナで designer-set-table-size のリスナを追加し、新しいサイズの情報を取得します。
サイズを取得したら、実際にエレメント上で行・列のサイズを変更する実装を行います。
以下のように実装します。
export class MyZipCodeFieldLayouter implements IUIElementLayouterExpandCaller {
public isSupported(element: IUIElement): boolean {
return element.instance.elementTypeName === MyZipCodeField.name;
}
public initialize(element: IUIElement, container: IUIContainer): void {
const eventListener = container.eventListener;
eventListener.addEventListener(element, 'designer-get-table-size', async () => {
// (省略)
});
// テーブルエディタで行列のサイズが変更されたとき
eventListener.addEventListener(element, 'designer-set-table-size', (eventValue) => {
// テーブルの列サイズの変更要求があったとき
if (eventValue.direction === 'column') {
const index = eventValue.index; // 列番号
const size = eventValue.size; // 変更後のサイズ(単位:px)
// TODO: ここに、列サイズを変更する処理を実装する
}
// テーブルの行サイズの変更要求があったとき
if (eventValue.direction === 'row') {
// (省略)
}
});
}
}
6.5.4. テーブルの行列を追加・削除する¶
「テーブルの各行列サイズを返却する」で、行・列の複製や追加・削除を許可した場合、行・列選択バーをクリックするとツールバーが表示されます。
このツールバー上のアイコンをクリックしたとき、テーブルの行・列編集操作を行うため、イベントリスナで designer-toolbar-push-table のリスナを追加し、選択された操作種別を取得します。
操作種別を取得したら、実際にテーブルの操作をする実装を行います。
以下のように実装します。
export class MyZipCodeFieldLayouter implements IUIElementLayouterExpandCaller {
public isSupported(element: IUIElement): boolean {
return element.instance.elementTypeName === MyZipCodeField.name;
}
public initialize(element: IUIElement, container: IUIContainer): void {
const eventListener = container.eventListener;
eventListener.addEventListener(element, 'designer-get-table-size', async () => {
// (省略)
});
eventListener.addEventListener(element, 'designer-set-table-size', (eventValue) => {
// (省略)
});
// テーブルエディタのツールバーから項目が選択されたとき
eventListener.addEventListener(element, 'designer-toolbar-push-table', (eventValue) => {
const index = eventValue.index; // 行・列番号
if (eventValue.button === 'addColumn') {
// 「列を追加」アイコンが選択されたとき
// TODO: ここに列を末尾に追加する処理を実装する
} else if (eventValue.button === 'cloneColumn') {
// 「列を複製」アイコンが選択されたとき
// TODO: ここに index の位置にある列の右隣りに、同じ内容を複製する処理を実装する
} else if (eventValue.button === 'insertColumn') {
// 「列を挿入」アイコンが選択されたとき
// TODO: ここに index の位置にある列の右隣りに、空列を追加する処理を実装する
} else if (eventValue.button === 'removeColumn') {
// 「列を削除」アイコンが選択されたとき
// TODO: ここに index の位置にある列を削除する処理を実装する
} else if (eventValue.button === 'moveColumnLeft') {
// 「列を左に移動」アイコンが選択されたとき
// TODO: ここに index の位置にある列の左隣りに、列を移動する処理を実装する
} else if (eventValue.button === 'moveColumnRight') {
// 「列を右に移動」アイコンが選択されたとき
// TODO: ここに index の位置にある列の右隣りに、列を移動する処理を実装する
} else if (eventValue.button === 'addRow') {
// 「行を追加」アイコンが選択されたとき
// TODO: ここに行を末尾に追加する処理を実装する
} else if (eventValue.button === 'cloneRow') {
// 「行を複製」アイコンが選択されたとき
// TODO: ここに index の位置にある行の下隣りに、同じ内容を複製する処理を実装する
} else if (eventValue.button === 'insertRow') {
// 「行を挿入」アイコンが選択されたとき
// TODO: ここに index の位置にある行の下隣りに、空列を追加する処理を実装する
} else if (eventValue.button === 'removeRow') {
// 「行を削除」アイコンが選択されたとき
// TODO: ここに index の位置にある行を削除する処理を実装する
} else if (eventValue.button === 'moveRowUp') {
// 「行を上に移動」アイコンが選択されたとき
// TODO: ここに index の位置にある行の上隣りに、行を移動する処理を実装する
} else if (eventValue.button === 'moveRowDown') {
// 「行を下に移動」アイコンが選択されたとき
// TODO: ここに index の位置にある行の下隣りに、行を移動する処理を実装する
}
});
}
}
6.5.4.1. 動作を確認する¶
デベロップモードで郵便番号入力エレメントを配置したコンテンツ定義を作成し、レイアウトモードに切り替えます。
郵便番号入力エレメントをクリックすると、テーブルエディタが表示されます。 ツールバーに隠れて見えない場合は、ツールバーをドラッグ&ドロップして、移動させてください。
行・列の堺にある三角アイコンをドラッグすると、三角アイコンが上下または左右に移動することを確認します。
実際に行・列のサイズを変更する実装を行った場合、三角アイコンを移動させて、実際に行・列のサイズが変更されることを確認します。
行・列選択バーをクリックすると、追加のツールバーが表示されることを確認します。
実際に行・列の編集操作をする実装を行った場合、ツールバー上のアイコンをクリックして、実際に行・列の編集操作が行われることを確認します。