6.2. 固有プロパティを変更する「部品操作」メニューを実装する¶
6.2.1. イベントリスナを実装する¶
エレメントを選択した際に表示されるツールバーの「操作」メニューをクリックすると、ツールバー上に表示されている各操作以外で、エレメントに関する全ての操作が可能なメニューが追加表示されます。
この操作メニューには、エレメントのプロパティ値を変更するために用意された「部品操作」グループと、エレメント内部を別のものに差し替えるために用意された「部品選択」グループがあります。
操作メニューの「部品操作」グループに、エレメント固有プロパティの変更機能を付与するためには、「事前準備」にて用意した Layouter クラスに、特定のイベントリスナを実装します。
実装するイベントリスナは、以下の通りです。
- designer-toolbar-show
 
- 操作メニュー、または、ツールバーの表示が必要となったときに呼び出されるイベントです。
 - 操作メニューに表示する内容を返却します。
 
- designer-toolbar-hide
 
- 操作メニュー、または、ツールバーが非表示になったときに呼び出されるイベントです。
 - 実装は任意です。
 
- designer-toolbar-push-button
 
- designer-toolbar-show イベントで返却した操作メニュー、または、ツールバー上の項目が選択されたときに呼び出されるイベントです。
 - リクエストに従って、表示したメニューに応じた操作を、エレメントに対して行います。
 
以下のように実装します。
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-toolbar-show', () => {
            return {};  // メニューに表示する項目を返却する
        });
        // 操作メニュー・ツールバーが非表示になったとき(任意)
        eventListener.addEventListener(element, 'designer-toolbar-hide', () => {
            // 必要であれば、ツールバー非表示時の処理を実装する
        });
        // 操作メニュー・ツールバーから項目が選択されたとき
        eventListener.addEventListener(element, 'designer-toolbar-push-button', (eventValue) => {
            // エレメントの操作を実装する
        });
    }
}
6.2.2. 自身のエレメントを操作するメニューを実装する¶
6.2.2.1. 操作メニューに項目を追加する¶
操作メニューに項目を追加する場合は、イベントリスナで designer-toolbar-show のリスナを追加し、各項目の情報を返却します。
ここでは、郵便番号入力エレメントのプレースホルダ表示(placeholder プロパティの値)を切り替えるために、メニュー項目を追加します。
メニュー項目を特定するために、任意の ID を指定します。 この例では placeholder とします。
以下のように実装します。
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-toolbar-show', () => {
            // placeholder プロパティ値を取得する
            const placeholder = element.propertyAccessor.getProperty('placeholder').toBoolean();
            // メニューに表示する内容を返却する
            return {
                items: {
                    // 「部品操作」グループ
                    operations: [{
                        // プレースホルダを示す任意の ID を指定する(後続のメニュー選択時の判別で使用)
                        id: 'placeholder',
                        // メニューの左側に表示するアイコンを指定する
                        icon: placeholder
                            ? [{type: 'font-awesome', value: 'fas fa-check'}]
                            : [{type: 'font-awesome', value: 'fas im-empty'}],
                        // メニューのラベルに表示する文字列を指定する
                        label: 'プレースホルダを表示'
                    }]
                }
            };
        });
    }
}
コラム
icon の指定について
- type に 'font-awesome' を指定した場合、value には Font Awesome のクラス名を指定します。value に im-empty を指定した場合、アイコン1つに相当する空白を挿入します。
 - type に 'svg' を指定した場合、value には svg ファイルへのパスを指定します。パスは、Webサーバ上に配置したファイルにアクセスするための URL のうち、コンテキストパスより先を指定します。例えば URL が http://localhost:8080/imart/im_hichee/images/svg/foo.svg の場合、'im_hichee/images/svg/foo.svg' を指定します。
 - icon は配列です。 アイコンの指定を複数指定できます。例えば独自クラスを css または less ファイルとして用意し、スタイルシートを指定することで、アイコンを重ねて表示するような自由な表現ができます。
 
6.2.2.2. 項目が選択されたときの処理を実装する¶
メニュー項目を追加したら、メニュー項目が実際に選択されたときの処理を実装します。
メニュー選択時の処理は、イベントリスナで designer-toolbar-push-button のリスナを追加し、引数 eventValue の値を取得します。
最初に、eventValue.button が 'operation' であることを確認します。 これが、操作メニューの「部品操作」グループ内にある項目が選択されたことを示します。
次に eventValue.id を確認します。 ここには、選択されたメニューの ID が格納されています。 追加したメニュー項目の ID と一致する場合は、プレースホルダ表示(placeholder プロパティの値)を切り替える処理を実装します。
以下のように実装します。
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-toolbar-show', () => {
            // (省略)
        });
        // 操作メニューまたはツールバーから項目が選択されたとき
        eventListener.addEventListener(element, 'designer-toolbar-push-button', (eventValue) => {
            // 「部品操作」グループから項目が選択されたとき
            if (eventValue.button === 'operation') {
                // 「プレースホルダを表示」が選択されたとき
                if (eventValue.id === 'placeholder') {
                    // placeholder プロパティ値を取得する
                    const placeholder = element.propertyAccessor.getProperty('placeholder').toBoolean();
                    // placeholder プロパティ値の真偽値を反転して、プロパティ値を再設定する
                    element.propertyAccessor.setProperty('placeholder', !placeholder, true);
                }
            }
        });
    }
}
6.2.2.3. 動作を確認する¶
デベロップモードで郵便番号入力エレメントを配置したコンテンツ定義を作成し、レイアウトモードに切り替えます。
郵便番号入力エレメントをクリックし、ツールバーから「操作」 - 「部品操作」グループ - 「郵便番号入力」 - 「プレースホルダを表示」が表示されることを確認します。
「プレースホルダを表示」を選択すると、プレースホルダの表示が切り替わることを確認します。
また、再度「操作」メニューを表示した際に、「プレースホルダを表示」にチェックマークが表示、または、消去されることを確認します。