コンポーネントの作成　SimpleCategoryProperty

コンポーネントを作成するときの部品にカテゴリープロパティというものがありますが、どうも使い方がわかりずらいとのご指摘を受けましたので、ヘルプを見ながら使い方を見てみたいと思います。

#ドキュメント

コンポーネントを作成する場合、以下の２つはよく読まれていると思います。
[コンポーネント開発者ガイド](https://help.asteria.com/documentation/warp/ja/1906/flow/sdk/guide/ComponentGuide2.html)
[コンポーネント／マッパー関数定義ファイル書式ガイド](https://help.asteria.com/documentation/warp/ja/1906/flow/sdk/guide/ConfReference.html)

#SimpleCategoryProperty
まず、コンポーネント開発者ガイドで「CategoryProperty」で検索してみます。
[6.3 CategoryProperty](https://help.asteria.com/documentation/warp/ja/1906/flow/sdk/guide/ComponentGuide2.html#h6.3)

```CategoryPropertyはインスペクタ上でタブページとして表示されるプロパティに対応します。
これは名前と値のセットを定義するためのプロパティであり、値はマッピングによって設定することも可能です。
列項目として名前、データ型、デフォルト値の3つを持つものがSimpleCategoryPropertyで、 それ以上の項目が必要な場合はExtendedCategoryPropertyを使用します。
```
簡単な方のSimpleCategoryPropertyを使います。
といっても特に説明はないです・・・が、サンプルソースに以下のように使用されています。

プロパティ名を引数にしてコンストラクタを呼びます。

```java
private SimpleCategoryProperty propCategory = new SimpleCategoryProperty("MyCategory");
```

コンポーネントのコンストラクタ内で登録します。
registPropertyは古いメソッドで、今はregisterPropertyを使用した方が良いです。

```java
    registProperty(propCategory);
```
コンポーネントのexecuteメソッド内で使用されています。
Iteratorで名前を取得して、その名前を引数にgetValueメソッドでValueオブジェクトを取得しています。

```
//プロパティ「MyCategory」に設定したNameと値をプロパティ「LogMethod」で指定されたメソッドでログに出力する。
Iterator it = propCategory.keySet().iterator();
while (it.hasNext()) {
    String name = (String)it.next();
    String msg = name + " = " + propCategory.getValue(name);
    outputLog(context, msg);
}
```

xsc定義ファイルには以下のように定義されています。

```
    <Category key="Name" name="MyCategory">
        <Property name="Name" toolTip="Name" type="string"/>
        <Property name="Default" toolTip="Default value" type="string"/>
    </Category>
```
名前「Name」とデフォルト値「Default」というプロパティが２つあり、カテゴリープロパティの「Key」としてNameを指定しています。
xsc定義ファイルの設定値については、コンポーネント／マッパー関数定義ファイル書式ガイドで[Category](https://help.asteria.com/documentation/warp/ja/1906/flow/sdk/guide/ConfReference.html#h3.2.9)を参照してください。

サンプルではCategoryPropertyの説明に書いてあった「データ型」はありません。
この状態で、コンポーネントを作成してDesignerで表示すると以下のようになります。
![property1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/d6dd4df4-6426-a89e-3343-73356003f8f8.png)
このMyCategoryカテゴリープロパティは名前「Name」と値「Default」を複数持てるプロパティとなります。
データ型は表示されていませんが、String型になっています。

これが、もっともシンプルなカテゴリープロパティの使い方になります。
Nameに「Value1」と「Value2」という項目を追加してみます。
![property2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/4cde29e7-dd23-6dc1-4e90-7f43fd609749.png)

この状態で、コンポーネントの前にMapperコンポーネントをつなげてマッピングの編集画面を見てみると、追加した「Value1」と「Value2」がマッピング可能となっていることがわかります。
![property3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/67ccb569-c9b7-fb6b-bc68-37e1b84c569f.png)

では、CategoryPropertyの説明に書いてあった「データ型」を追加してみます。
xsc定義ファイルには以下のように「Type」という名前のPropertyを追加してコンポーネントを再作成します。

```
    <Category key="Name" name="MyCategory">
        <Property name="Name" toolTip="Name" type="string"/>
        <Property name="Type" toolTip="data type" type="choice">
            <Value>String</Value>
            <ChoiceItem ref="DataType"/>
        </Property>
        <Property name="Default" toolTip="Default value" type="string"/>
    </Category>
```
Designerで表示するとTypeという項目が増えていることが確認できます。
![property4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/04f54140-af32-d30b-46a5-4c7a64780e7a.png)

TypeはクリックするとValueの型をドロップダウンリストから選択できるようになっています。
![property5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/c0363984-9517-c372-cd88-5cb52dc22c0c.png)

SimpleCategoryPropertyはTypeに対する処理はすでに実装済ですので、Typeで「Integer」を指定した場合に、上記executeメソッド内のようにpropCategory.getValue(name)で取得するValueオブジェクトの型はIntegerとなります。
ユーザーに値の型を指定させたい場合は、このようにTypeを設定し表示させてください。


#まとめ
CategoryPropertyの簡単な実装としてSimpleCategoryPropertyの使い方をドキュメントを見ながら行ってみました。コードを追って見ていくと思ったよりは楽に使えるのではないでしょうか。是非カテゴリープロパティを使ってみてください。