4.2. エレメントを実装する¶
この章では、エレメントの実装方法について解説します。
4.2.1. エレメント本体のファイルの実装¶
4.2.1.1. エレメント本体のクラスの実装¶
このファイルに、IUIElementCore インタフェースを実装した、エレメントのクラスを定義していきます。
export class MySampleElement implements IUIElementCore {
    // ラッパークラスを返却します。
    // 繰り返さないシンプルなエレメントを作成する場合は `SimpleUIElement`、
    // 手動で繰り返すエレメントを作成する場合は `IndexableUIElement`、
    // 自動的に繰り返すエレメントを作成する場合は `RepeatableUIElement` を返却してください。
    public get wrapperClass(): UIElementWrapperClass {
        return 'SimpleUIElement';
    }
    // エレメント名を返却します。
    // { エレメントのクラス名 } .name のように、エレメントのクラス名を返却してください。
    // エレメント名が他のエレメント名と重複すると、正常に動作しない恐れがあります。
    public get elementTypeName(): string {
        return MySampleElement.name;
    }
    // エレメントの表示形式を返却します。
    public get displayType(): UIElementDisplayType {
        // TODO: 後述します
    }
    // エレメントを非表示状態にするときの非表示方法を返却します。
    // 実装がない場合は REMOVE_NODE_TREE を返却した場合と同じ動作です。
    public get hiddenType(): UIElementHiddenType {
        // TODO: 後述します
    }
    // エレメントの配置制約を定義したクラスのクラス名を返却します。
    public get constraintClass(): UIComponentConstraintClass {
        // TODO: 後述します
    }
    // エレメント固有プロパティの定義を返却します。
    public get uniquePropertyDefinition(): IUniquePropertyDefinition {
        // TODO: 後述します
    }
    // 共通プロパティの定義を返却します。
    public get commonPropertyDefinition(): ICommonPropertyDefinition {
        return {};
    }
    // createChildren(), updateChildren(), cloneChildren() で
    // 子エレメントとして自身以外のエレメントを使用する場合に、そのクラス名を返却します。
    // ここで返却されたエレメントのクラスは、IM-BloomMaker 側によって自動的にクラスが登録されるため、
    // 上記の3メソッドの中で使用できます。
    // 子エレメントを実装する必要がない場合は、空の配列を返却します。
    public get dependElements(): UIElementCoreClass[] {
        return [];
    }
    // エレメントが作成された際に一度だけ呼び出されるメソッドです。
    // このメソッド内で、このエレメントで使用するルートとなる HTML エレメントを、HTMLElementBuilder を経由して返却します。
    // updateElement() によって都度変更されない常時適用する属性値やイベントの設定は、このメソッドに実装します。
    public createElement(
        container: IUIContainer,
        properties: IUIElementPropertyAccessor<PropertyDefinition & ICommonPropertyDefinition>
    ): IHTMLElementBuilder {
        // TODO: 後述します
    }
    // レンダリングが必要になった際に呼び出されるメソッドです。
    // プロパティで紐づけている変数の値が変更された際など、エレメント側を更新する必要がある場合は、このメソッドに実装します。
    public updateElement(
        builder: IHTMLElementBuilder,
        container: IUIContainer,
        properties: IUIElementPropertyAccessor<PropertyDefinition & ICommonPropertyDefinition>
    ): void {
        // TODO: 後述します
    }
    // レンダリングが行われた後に、レンダリングが不要になった際に呼び出されるメソッドです。
    // document.body や window などグローバルに対してのイベントの設定を解除する処理を、このメソッドに実装します。
    // 特に実装がない場合は、このメソッドの実装は不要です。
    public hiddenElement(
        builder: IHTMLElementBuilder,
        container: IUIContainer,
        properties: IUIElementPropertyAccessor<PropertyDefinition & ICommonPropertyDefinition>
    ): void {
        // TODO: 後述します
    }
    // エレメントが削除された際に呼び出されるメソッドです。
    // 外部ライブラリを使用しており、ライブラリの解放処理が必要な場合に、このメソッドに実装します。
    // そのため、エレメントの実装のみで表示処理が完結している場合は、このメソッドの実装は不要です。
    public destroyElement(
        builder: IHTMLElementBuilder,
        container: IUIContainer,
        properties: IUIElementPropertyAccessor<IUniquePropertyDefinition & ICommonPropertyDefinition>
    ): void {
        return;
    }
    // エレメントが作成された際に一度だけ呼び出されるメソッドです。 createElement() の後に呼び出されます。
    // 自身のエレメント配下に子エレメントを作成する必要がある場合、このメソッドでエレメントを作成し、配列として返却します。
    // 子エレメントが不要な場合は、空配列を返却します。
    // IHTMLElementBuilder.appendChild() で子要素を追加する場合と異なり、
    // デザイナ上でコンテナに配置した際に、子要素はそれぞれ別のエレメントとして扱われます。
    public createChildren(self: IUIElement, container: IUIContainer): IUIElement[] {
        return [];
    }
    // レンダリングが必要になった際に呼び出されるメソッドです。 updateElement() の後に呼び出されます。
    // プロパティの状態によって子エレメントの数に変更がある場合、新しい子エレメントの配列を返却することで、子エレメントを再配置します。
    // 子エレメントの数に変更がない場合でも、子エレメントのプロパティ値を変更する場合は、このメソッドに実装します。
    // createChildren() で空配列を返却しており、子エレメントを追加する予定がない場合は、このメソッドは実装しません。
    public updateChildren(
        children: IUIElement[],
        self: IUIElement,
        container: IUIContainer,
        properties: IUIElementPropertyAccessor<IUniquePropertyDefinition & ICommonPropertyDefinition>
    ): IUIElement[] {
        return children;
    }
    // エレメントが複製された際に呼び出されるメソッドです。 createElement() の後に呼び出されます。
    // children 引数には、同様に複製されたエレメントが格納されています。
    // プロパティの状態によって子エレメントの数に変更がある場合、新しい子エレメントの配列を返却することで、子エレメントを再配置します。
    // 子エレメントの数に変更がない場合でも、子エレメントのプロパティ値を変更する場合は、このメソッドに実装します。
    // 子エレメントに対して何も操作しない場合は、children 引数をそのまま返却します。
    public clonedChildren(
        children: IUIElement[],
        self: IUIElement,
        container: IUIContainer,
        properties: IUIElementPropertyAccessor<IUniquePropertyDefinition & ICommonPropertyDefinition>
    ): IUIElement[] {
        return children;
    }
}
4.2.1.2. 制約を実装する¶
エレメントには制約を実装する必要があります。 制約とは、具体的にはエレメントの移動・削除・複製等が可能であるかどうかの定義です。
以下の手順で実装します。
エレメント本体のクラスの外で、 IUIComponentConstraint を実装した制約クラスを定義します。
ここで定義した制約クラスをエレメント本体のクラスで利用します。特に理由がなければ、エレメント本体のクラスと同じファイルに記述することを推奨します。制約クラスを別ファイルに分けて定義する場合は、エレメント本体のクラスのファイルで制約クラスをimportして利用します。制約クラス内では、以下の6つのメソッドを実装します。いずれのメソッドも、真偽値(true か false)を返却します。
制約の内容 対応するメソッド エレメントの移動 movable() エレメントの削除 removable() エレメントの複製 copyable() 子エレメントの配置 extremity()acceptableChild()親エレメントの配置 acceptableParent() 各メソッドの実装方法については、以下に示す実装例を参考にしてください。
// 制約クラスで IUIComponentConstraint を実装します。 class Constraint implements IUIComponentConstraint { // エレメントの移動可否を指定するメソッドです。 // true を返却する場合、デザイナ画面上に配置したエレメントを移動できます。 public get movable(): boolean { return true; } // エレメントの削除可否を指定するメソッドです。 // true を返却する場合、デザイナ画面上に配置したエレメントを削除できます。 public get removable(): boolean { return true; } // エレメントの複製可否を指定するメソッドです。 // true を返却する場合、デザイナ画面上に配置したエレメントを複製できます。 public get copyable(): boolean { return true; } // エレメントが末端かどうかを指定するメソッドです。 // true を返却する場合、デザイナ画面上に配置したエレメントの配下に子エレメントは配置できません。 // このメソッドの返却値に true を指定した場合は、acceptableChild() の返却値は常に false とします。 public get extremity(): boolean { return true; } // 親要素に対して、自身の配置可否を指定するメソッドです。 // true を返却した場合、デザイナ画面上に配置したエレメントを親として、自身を子エレメントに配置できます。 // parent 引数には親エレメントが渡されますので、親エレメントによって配置可能とするかどうか指定できます。 public acceptableParent(parent: ParentUIElement): boolean { return true; } // 自身に対して、子エレメントの配置可否を指定するメソッドです。 // true を返却した場合、デザイナ画面上に配置した自身のエレメントに対して、子エレメントを配置できます。 // child 引数には子エレメントが渡されますので、子エレメントによって配置可能とするかどうか指定できます。 // 常に false を返却する場合は、extremity() の返却値は常に true とします。 public acceptableChild(child: IUIElement): boolean { return false; } }
エレメント本体のクラス内の constraintClass メソッドで返却するように実装します。
エレメント本体のクラス内では、以下のように constraintClass メソッドを実装します。
// 制約クラスのクラス名を返却します。 public get constraintClass(): UIComponentConstraintClass { return Constraint; }
4.2.1.3. エレメントの表示形式を実装する¶
エレメント本体のクラス内に、 displayType メソッドを実装し、設定したい表示形式を文字列で指定します。
displayType メソッドの実装例を示します。以下は、表示形式に INPUT を設定する場合です。
public get displayType(): UIElementDisplayType {
    return 'INPUT';
}
コラム
指定できる表示形式は、以下の通りです。
- BLOCK
 - ブロック要素。コンテナページの横いっぱいに幅を取って配置されるため、デザイナ画面上に連続でブロック要素のエレメントを配置した場合、縦並びに要素が配置されます。見出しレベルエレメントやリストエレメントなどで使用されています。
 
- INLINE
 - インラインブロック要素。連続でデザイナ画面上にエレメントを配置した場合、横並びに要素が配置されます。ラベルエレメントや画像埋め込みエレメントなどで使用されています。
 
- INLINE_FLEX
 - インラインフレックス要素。一定の間隔で縦や横に子エレメントを配置させたいインライン要素に指定します。インラインフレックスエレメントで使用されています。
 
- INPUT
 - インライン入力要素。横並びに要素が配置されます。INLINE とほぼ同様ですが、入力系エレメントの場合は INPUT を選択してください。テキスト入力エレメントやボタンエレメントなどで使用されています。
 
- SEPARATOR
 - セパレータ要素。水平の横線を引く際に利用される <hr> タグ専用の要素です。水平罫線エレメントで使用されています。
 
- TABLE
 - テーブル要素。テーブルのエレメントを形成する <table> タグ専用の要素です。テーブルエレメントで使用されています。
 
- TABLE_CELL
 - テーブルセル要素。テーブルのセル部分を形成する <th>, <td> タグ専用の要素です。テーブルエレメントのヘッダ部分やそれ以外のセル部分を構成するエレメントで使用されています。
 
- FLEX_BOX
 - フレックス要素。一定の間隔で縦や横に子エレメントを配置させたり、BLOCK や INLINE など、どちらか一方向のみ配置可能である子エレメントの並び方をレイアウトしたいブロック要素に指定します。フレックスコンテナエレメントで使用されています。
 
- FLEX_ITEM
 - フレックスアイテム要素。FLEX_BOX のエレメントを親にもち、テーブルセル要素に似た動作をさせたいブロック要素に指定します。フレックスコンテナの子エレメントで使用されています。
 
- FIXED
 - 無デザイン要素。デザイナ上で選択されたくない要素に指定します。この要素を指定したエレメントはデザイナ上での移動・削除やエレメントの固有プロパティの変更ができません。リッチテキストボックスエレメントで使用されています。
 
- SELECTABLE_FIXED
 - 選択可能な無デザイン要素。FIXED と似ていますが、FIXED の機能のうち、選択のみ可能になった要素です。
 
- FUNCTIONAL
 - 機能的な無デザイン要素。デザイナ上でのみ表示させ、プレビュー画面や実行画面上では表示させたくないエレメントに指定します。タイマーエレメントで使用されています。
 
- CANVAS
 - デザイナ上と実行画面上で表示方法が異なるインライン要素。デザイナ上ではイメージ図を表示させ、プレビュー画面や実行画面では実際の動作を行うエレメントに指定します。IM共通マスタ系のエレメントで使用されています。
 
- PURE
 - IM-BloomMaker による表示制御を行わない要素。エレメントの表示デザインを IM-BloomMaker によって変更されたくない場合に指定します。Bulma 系のエレメントで使用されています。
 
4.2.1.5. createElement メソッドを実装する¶
エレメント本体の createElement メソッド内でエレメントのビルダを作成して返却します。
例として、<input> タグだけのエレメントを作成する場合の実装を以下に示します。
public createElement(
    container: IUIContainer,
    properties: IUIElementPropertyAccessor<PropertyDefinition & ICommonPropertyDefinition>
): IHTMLElementBuilder {
    // エレメントのビルダを作成するには、IHTMLElementBuilder.createElement() を利用します。
    const builder = window.imHichee.HTMLElementBuilder.createElement('input', HTMLInputElement);
    // 返却値には作成したビルダを指定します。
    return builder;
}
コラム
エレメントのビルダを作成する方法について
ここまでの実装例に沿って実装することで、<input> タグだけのエレメントを作成できます。
4.2.1.6. スタイル(CSS)を設定する¶
スタイルが適用されたエレメントを作成するには、createElement メソッド内で、 setCSS メソッドを利用してスタイルを追加します。
例えば、 「createElement メソッドを実装する」の例に追加で padding: 10px を適用する場合、実装は以下の通りです。
public createElement(
    container: IUIContainer,
    properties: IUIElementPropertyAccessor<PropertyDefinition & ICommonPropertyDefinition>
): IHTMLElementBuilder {
    const builder = window.imHichee.HTMLElementBuilder.createElement('input', HTMLInputElement);
    // setCSS() を使用すると、作成したエレメントにstyleを追加できます。
    builder.setCSS('padding', '10px');
    return builder;
}
4.2.1.7. 属性を設定する¶
createElement メソッド内で、setAttribute メソッドを利用して属性を追加します。
例えば、「createElement メソッドを実装する」の例に追加で name 属性に sample-element という値を付与する場合、実装は以下の通りです。
public createElement(
    container: IUIContainer,
    properties: IUIElementPropertyAccessor<PropertyDefinition & ICommonPropertyDefinition>
): IHTMLElementBuilder {
    const builder = window.imHichee.HTMLElementBuilder.createElement('input', HTMLInputElement);
    // setAttribute() を使用すると、作成したエレメントにstyleを追加できます。
    builder.setAttribute('name', 'sample-element');
    return builder;
}
独自の属性を付与することも可能です。
public createElement(
    container: IUIContainer,
    properties: IUIElementPropertyAccessor<PropertyDefinition & ICommonPropertyDefinition>
): IHTMLElementBuilder {
    const builder = window.imHichee.HTMLElementBuilder.createElement('input', HTMLInputElement);
    // 独自の属性名は、最初に data- を付与します。
    builder.setAttribute('data-my-attribute', 'my-attribute-value');
    return builder;
}
4.2.1.8. 固有プロパティを追加する¶
エレメントのプロパティには、固有プロパティと共通プロパティがあります。
以下の手順で実装します。
PropertyDefinition 型を定義し、その中で、必要なプロパティを UniquePropertyDefinitionType 型で宣言します。
例えば sampleValue というプロパティが必要な場合、まずは以下のように宣言します。
type PropertyDefinition = { sampleValue: UniquePropertyDefinitionType; };
uniquePropertyDefinition という変数を作成し、UniquePropertyDefinitionType に従ってプロパティの定義を記述します。
上に続いて、以下のように sampleValue プロパティの定義を記述します。
// エレメント固有カテゴリのプロパティは uniquePropertyDefinition で設定できます。 const uniquePropertyDefinition: IUniquePropertyDefinition & PropertyDefinition = { sampleValue: { displayName: 'sampleValue', definition: { required: true, rerender: true, }, type: 'string', }, };
エレメント本体のクラスに、uniquePropertyDefinition メソッドを実装します。メソッド内で、プロパティの定義を宣言した変数を返却します。
以下のように実装します。
public get uniquePropertyDefinition(): IUniquePropertyDefinition { return uniquePropertyDefinition; }
エレメント本体のクラスの createElement メソッド内に、エレメントに値が入力されたときにプロパティの sampleValue を更新する処理を記述します。
以下のように実装します。
public createElement(
    container: IUIContainer,
    properties: IUIElementPropertyAccessor<PropertyDefinition & ICommonPropertyDefinition>
    ): IHTMLElementBuilder {
        // まず、<input>タグを作成します。
        const inputElement = document.createElement('input');
        // <input>タグに入力が行われたときに、sampleValueプロパティを更新するようにイベントリスナを付与します。
        inputElement.addEventListener('input', (e) => {
            properties.setProperty('sampleValue', inputElement.value, false);
        });
        // IHTMLElementBuilder.fromElement() を利用して、作成したエレメントからビルダを生成します。
        const builder = window.imHichee.HTMLElementBuilder.fromElement(inputElement);
        return builder;
    }
エレメント本体のクラスの updateElement メソッド内に、sampleValue が変更されたときにエレメント側の値を更新する処理を記述します。
以下のように実装します。
public updateElement(
    builder: IHTMLElementBuilder,
    container: IUIContainer,
    properties: IUIElementPropertyAccessor<PropertyDefinition & ICommonPropertyDefinition>
    ): void {
        // プロパティの値を取得するには、properties.getProperty() でプロパティ名を文字列で指定します。
        const sampleValue = properties.getProperty('sampleValue').toString();
        // builder.setValue() で、実際に描画される<input>タグのvalue属性に、sampleElementの値を反映します。
        builder.setValue(sampleValue);
    }
コラム
uniquePropertyDefinition で記述できるプロパティの定義について
type UniquePropertyDefinitionType = {
    /** 表示名 */
    displayName: string;
    /** 省略可能な定義 */
    definition: {
        /** バリデーションルール - 必須(未指定の場合: `false`) */
        required?: boolean;
        /** バリデーションルール - データ種別(未指定の場合: `ANY`) */
        dataType?: UIComponentPropertyDataType;
        /** バリデーションルール - 数値の最小値 */
        min?: number;
        /** バリデーションルール - 数値の最大値 */
        max?: number;
        /** 読み取り専用(未指定の場合: `false`) */
        readonly?: boolean;
        /** 値変更時、再レンダリング(未指定の場合: `false`) */
        rerender?: boolean;
        /** エレメント繰り返し使用可否(未指定の場合: `false`) */
        repeatable?: boolean;
        /** プレビュー時バリデーション実行(未指定の場合: `false`) */
        validateValue?: boolean;
        /** 固定値許可(未指定の場合: `true`) */
        acceptStatic?: boolean;
        /** 変数値許可(未指定の場合: `true`) */
        acceptDynamic?: boolean;
        /** 複数行文字列の入力許可(未指定の場合: `false`) */
        acceptMultipleLines?: boolean;
        /** 深い階層にある値の変更を検知(未指定の場合: `false`) */
        deepObserve?: boolean;
        /** 値の選択候補(セレクトボックスの場合などに指定) */
        candidate?: {
            /** 表示名 */
            displayName: string;
            /** 値 */
            value: UIComponentPropertyValueType;
        }[];
    };
    /** プロパティタイプ名 */
    type: UIComponentPropertyType;
    /** プロパティ値 */
    value?: {};
    /** カテゴリID */
    categoryId?: string;
};
コラム
双方向バインディングについて
- エレメントの入力値が変更された際に、その入力値のプロパティと結びついている変数の値が変更される。
 - アクション等、エレメントへの入力以外で変数の値が変更されると、エレメントのプロパティが変更される。
 
rerender について
deepObserve について
4.2.1.9. グローバルなイベントを登録する¶
type ResizeEventCallback = (this: Window, e: Event) => void;
private _attachedResizeCallback: ResizeEventCallback | null;
constructor() {
    this._attachedResizeCallback = null;
}
public updateElement(
    builder: IHTMLElementBuilder,
    container: IUIContainer,
    properties: IUIElementPropertyAccessor<PropertyDefinition & ICommonPropertyDefinition>
): void {
    // window に対して resize イベントを登録します。
    // 重複登録にならないよう、登録済みのコールバックの存在を確認します。
    if (!this._attachedResizeCallback) {
        const callback = this.resizeWindow.bind(this);
        this._attachedResizeCallback = callback;
        window.addEventListener('resize', callback);
    }
}
public hiddenElement(
    builder: IHTMLElementBuilder,
    container: IUIContainer,
    properties: IUIElementPropertyAccessor<PropertyDefinition & ICommonPropertyDefinition>
): void {
    // window に対して resize イベントを解除します。
    if (this._attachedResizeCallback) {
        window.removeEventListener('resize', this._attachedResizeCallback);
        this._attachedResizeCallback = null;
    }
}
private resizeWindow(): void {
    // ウィンドウがリサイズした際の処理を実装します。
}
コラム
updateElement メソッド内でのイベント登録について
4.2.1.10. 子エレメントを追加する¶
「createElement メソッドを実装する」の実装例では、<input> タグだけのエレメントを作成していましたが、これを子要素にもつ <div> タグのエレメントを作成する場合、createElement メソッドの実装例は以下です。
export class MySampleElement implements IUIElementCore {
    // 子要素のビルダを、あらかじめメソッドの外で宣言しておきます。理由は後述します。
    private _inputElementBuilder: IHTMLElementBuilder;
public createElement(
    container: IUIContainer,
    properties: IUIElementPropertyAccessor<PropertyDefinition & ICommonPropertyDefinition>
): IHTMLElementBuilder {
    const inputElement = document.createElement('input');
    inputElement.addEventListener('input', (e) => {
        properties.setProperty('value', inputElement.value, false);
    });
    // ビルダを生成し、あらかじめ宣言している変数に代入する
    this._inputElementBuilder = window.imHichee.HTMLElementBuilder.fromElement(inputElement);
    // <div> のエレメントビルダを生成
    const builder = window.imHichee.HTMLElementBuilder.createElement('div', HTMLDivElement);
    // 子要素を追加
    builder.appendChild(this._inputElementBuilder);
    return builder;
}
public updateElement(
    builder: IHTMLElementBuilder,
    container: IUIContainer,
    properties: IUIElementPropertyAccessor<PropertyDefinition & ICommonPropertyDefinition>
): void {
    // プロパティの値を文字列で取得します。
    const sampleValue = properties.getProperty('sampleValue').toString();
    // 子要素のエレメントに値をセットします。
    // 子ノードの IHTMLElementBuilder は自動で build() が呼ばれない仕様であるため、独自で build() を実行します。
    this._inputElementBuilder.setValue(sampleValue).build();
}
コラム
updateElement メソッド内での各子要素へのアクセスについて
コラム
エレメントの子要素について
4.2.2. 実装したクラスの登録¶
import {MySampleElement} from './public/elements/MySampleElement';
// エレメントのリポジトリは以下のように取得します。
const elementRepository = window.imHichee.UIElementRepository;
// エレメントのカテゴリを登録します。
// 新たにカテゴリを追加したい場合には IUIElementRepository.registerCategory() を使用して、カテゴリを追加してください。
// id にはカテゴリのID(任意)、sortNumber にはカテゴリを表示させる際の優先順位を指定してください。
// カテゴリは sortNumber を基準に昇順で表示されます。
elementRepository.registerCategory('programming-sample', {sortNumber: 120});
// 作成したエレメントをカテゴリに登録します。
// categoryId には登録先のカテゴリ名、sortNumber はカテゴリ内でエレメントを表示させる際の優先順位を指定できます。
// sortNumber を基準に昇順で表示されます。
elementRepository.registerClass(MySampleElement, {
    categoryId: 'programming-sample',
    sortNumber: 0,
});
// メッセージプロパティを JSON 化したものが以下に置換され、メッセージとして登録されます。
// そのため、この記述は削除しないでください。
window.imHichee.MessageBuilder.register('6549e165-925d-4de2-8c52-ec3cda282ed2');
4.2.3. プロパティファイルの実装¶
- component_ja.properties
 日本語のプロパティファイルです。
- component_en.properties
 英語のプロパティファイルです。
- component_zh_CN.properties
 中国語のプロパティファイルです。
- component.properties
 対応するロケールのプロパティが欠落している場合に参照されるプロパティファイルです。
それぞれのプロパティは以下のように記述します。
- エレメントのカテゴリ名: CAP.Z.IWP.HICHEE.COMPONENT.CATEGORY.NAME.{index.ts内で指定したカテゴリID}={表示したいカテゴリ名}
 - エレメントの名称: CAP.Z.IWP.HICHEE.COMPONENT.NAME.{エレメントのクラス名}={表示したいエレメント名}
 - エレメントのヘルプ: CAP.Z.IWP.HICHEE.COMPONENT.DESCRIPTION.{エレメントのクラス名}={表示したいヘルプの内容}
 
日本語のプロパティファイルを記述する際の例を以下に示します。(先頭に#をつけて、コメントを記述することも可能です。)
# エレメント - カテゴリ名
CAP.Z.IWP.HICHEE.COMPONENT.CATEGORY.NAME.programming-sample=プログラミングガイドサンプル
# エレメント - 名称
CAP.Z.IWP.HICHEE.COMPONENT.NAME.MySampleElement=サンプルエレメント
# エレメント - ヘルプ
CAP.Z.IWP.HICHEE.COMPONENT.DESCRIPTION.MySampleElement=サンプルエレメントです。
コラム
プロパティファイル内に記述する日本語・中国語の Unicode エスケープについて
注意
エレメントの命名について
4.2.4. スーパークラスの利用(任意)¶
- インラインで表示するエレメント
 - → displayType() は INLINE を返却する
 
- 繰り返しエレメントでは無い
 - → wrapperClass() は SimpleUIElement を返却する
 
- 子エレメントは持たない
 - → createChildren(), clonedChildren() では何も処理を行わない
 
その他メソッドでは、サブクラスで任意の実装を行う
このような場合のスーパークラスの実装例を以下に示します。
export abstract class SampleBaseElementCore implements IUIElementCore {
    public abstract get elementTypeName(): string;
    public get displayType(): UIElementDisplayType {
        return 'INLINE';
    }
    public abstract get constraintClass(): UIComponentConstraintClass;
    public get wrapperClass(): UIElementWrapperClass {
        return 'SimpleUIElement';
    }
    public abstract get uniquePropertyDefinition(): IUniquePropertyDefinition;
    public abstract get commonPropertyDefinition(): ICommonPropertyDefinition;
    public get dependElements(): UIElementCoreClass[] {
        return []; // NO DEPENDENCIES
    }
    public abstract createElement(
        container: IUIContainer,
        properties: IUIElementPropertyAccessor<IUniquePropertyDefinition & ICommonPropertyDefinition>
    ): IHTMLElementBuilder;
    public updateElement(
        builder: IHTMLElementBuilder,
        container: IUIContainer,
        properties: IUIElementPropertyAccessor<IUniquePropertyDefinition & ICommonPropertyDefinition>
    ): void {
        // DO NOTHING
    }
    public destroyElement(
        builder: IHTMLElementBuilder,
        container: IUIContainer,
        properties: IUIElementPropertyAccessor<IUniquePropertyDefinition & ICommonPropertyDefinition>
    ): void {
        // DO NOTHING
    }
    public createChildren(
        self: IUIElement,
        container: IUIContainer,
        properties: IUIElementPropertyAccessor<IUniquePropertyDefinition & ICommonPropertyDefinition>
    ): IUIElement[] {
        return []; // DO NOTHING
    }
    public clonedChildren(
        children: IUIElement[],
        self: IUIElement,
        container: IUIContainer,
        properties: IUIElementPropertyAccessor<IUniquePropertyDefinition & ICommonPropertyDefinition>
    ): IUIElement[] {
        return children; // DO NOTHING
    }
}
各エレメントのクラスでは以下のように継承して利用します。
export class SampleElementClass extends SampleBaseElementCore { ... }