アイコン委任
目的
IconDelegate を作成し、Windchill オブジェクトタイプのアイコンを表示する場合に使用します。
バックグラウンド
このオブジェクトアイコンの目的は、ユーザーが Windchill UI のさまざまな Windchill ビジネスオブジェクトを区別しやすいようにすることです。クラスをモデリングする際に、アイコンをモデルタイプと関連付けることができます。このアイコンは、このタイプのオブジェクトが表示されるときに使用されます。サブタイプの場合は、「タイプおよび属性の管理」ユーティリティによって、UI でこのサブタイプを示すように使用するアイコンを関連付けることができます。指定されたアイコンが無効またはブランクの場合は、親タイプのアイコンが使用されます。この動作を実行するには、IconDelegates を使用します。
ただし、オブジェクトの属性など、その他の要因でアイコンが動的に決定される場合もあります。下のテーブルに、一部の Windchill タイプで使用可能な OOTB IconDelegates を示します。
Windchill タイプ
|
IconDelegate
|
wt.part.WTPart
|
com.ptc.windchill.enterprise.part.comm ands.delegate.WTPartIconDelegate
|
wt.epm.EPMDocument
|
wt.epm.identity.EPMDocumentIconDelegate
|
wt.doc.WTDocument
|
wt.doc.DocumentIconDelegate
|
さまざまなタイプ (既成以外)、またはユーザーが作成したモデルタイプ/サブタイプに対して、別のアイコンを使用する必要がある場合、そのタイプ用にカスタム IconDelegate を作成する必要があります。
範囲/適用可能性/前提条件
OOTB IconDelegates が存在するタイプのカスタム IconDelegates は作成できません。
予測される結果
アイコンを指定するために各 Windchill タイプに作成した IconDelegate によって定義されているアイコンが表示されます。
ソリューション
Windchill タイプに対してそのアイコンを指定するカスタム IconDelegate を作成します。
前提となる知識
この目的を達成するには、次のことを理解している必要があります。
• Java
• Windchill タイプ識別子
ソリューションエレメント
エレメント
|
タイプ
|
説明
|
<カスタムアイコン委任>. java
|
java
|
ユーザーの IcondDelegate
ランタイム場所:
<Windchill>\codebase\*
|
ユーザーの xconf ファイル
|
xconf
|
ユーザーの IconDelegate の登録
ランタイム場所:
<Windchill>\codebase\*
|
手順 - カスタム IconDelegate の作成
Windchill UI は、Persistable フォームと TypeInstance フォームのいずれでもオブジェクトを処理できるので、IconDelegates はどちらのフォームにも対応するはずです。Persistable フォームのオブジェクトであれば、アイコンの決定に関係する属性をすぐに使用できます。オブジェクトが TypeInstance フォームで、属性を使用できない場合は、TypeInstance をインフレートして属性を取得する必要があるため、パフォーマンスが低下する可能性があります。TypeInstance オブジェクトの場合は、アイコンとアイコンのツールチップは SCA 属性として使用できます。これは <Windchill>/codebase/LogicalAttributes.xml で定義されます。
<Class name="wt.fc.Persistable">
-------
<Property>
<LogicalForm>objectIcon</LogicalForm>
<ExternalForm>SCA|objectIcon</ExternalForm>
</Property>
<Property>
<!-- This attribute is populated by the SCA|objectIcon
function -->
<LogicalForm>objectTooltip</LogicalForm>
<ExternalForm>NPA|objectTooltip</ExternalForm>
</Property>
カスタム IconDelegate の作成
1. wt.fc.IconDelegate または既存の wt.fc.IconDelegate のサブクラスを拡張できます。
2. アイコン決定ロジックの設定のため、オーバーライドが必要となる API はあまりありません。
a. これら 2 つの API は、特定の Windchill オブジェクトのアイコン情報を持つ IconSelector オブジェクトを返します。
API 署名
|
説明
|
public IconSelector getStandardIconSelector() throws WTException, IllegalAccessException, InvocationTargetException;
|
アイコンの標準セレクタを取得します。
|
public IconSelector getOpenIconSelector() throws WTException, IllegalAccessException, InvocationTargetException;
|
いつオブジェクトを開くかのセレクタを取得します (フォルダを開いたときなど)。
|
b. この API は、アイコンに表示するローカライズされたツールチップ値を返します。
API 署名
|
説明
|
public String getToolTip()
|
アイコンとともに表示するツールチップ。
|
c. この API は、TypeInstances を処理するのに必要です。メソッドで、使用可能な TypeInstance に、アイコンとツールチップの判断に最低限必要な属性値がすべて含まれるかどうかを確認する必要があります。足りない場合は、TypeInstance をインフレートする必要があります。
API 署名
|
説明
|
protected Boolean inflateRequired()
|
アイコン/ツールチップの計算に必要な属性が TypeInstance にない場合は、インフレートが必要です。
|
@Override
protected boolean inflateRequired() {
boolean need = super.inflateRequired();
TypeInstance ti = getTypeInstanceObject();
if(ti != null && !need){
//check you necessary attributes in TypeInstance
// to determine to inflate it or not.
}
}
return need;
}
d. この API は、TypeInstances を処理するのに必要です。メソッドで、アイコン/ツールチップを決めるのに必要なすべての属性を追加する必要があります。これにより、getStandardIconSelector() または getOpenIconSelector() を呼び出したときに、必要な属性が正しく入力されるようになります。
API 署名
|
説明
|
protected void initAttributes(Set<AttributeTypeIdentifier> attributes)
|
アイコン/ツールチップの決定に必要な属性で <AttributeTypeIdentifier> を更新します。
|
@Override
protected void initAttributes(Set<AttributeTypeIdentifier>
attributes) {
super.initAttributes(attributes);
//add your attributes here
}
3. IconDelegate は、以下の例のように、サブクラスで使用可能な AttributeTypeIdentifier と TypeIdentifier オブジェクトを作成する静的ヘルパーメソッドを定義します。
AttributeTypeIdentifier NAME_ATI = getIdentifier("name",
"wt.part.WTPart");
TypeIdentifier WTPART_TI = getIdentifier("wt.part.WTPart",
null);
4. getObject() API は、Persistable がない場合は、現在の TypeInstance を Persistable に変換します。このため、この使用は避けて、getObject(false) を優先します。
コーディングパターン
現在、IconDelegate サブクラスの多くは、内部 "params" オブジェクトを使用して、Persistable と TypeInstance を処理するかどうかをカプセル化しています。params オブジェクトには、プロパティが Persistable と TypeInstance のどちらから入力されたかにかかわらず、アイコン解決ロジックが使用可能な単純なプロパティがあります。
AttributeTypeIdentifier PERSONAL_CABINET_ATI =
getIdentifier("personalCabinet", "wt.folder.Cabinet");
TypeIdentifier CABINET_TID = getIdentifier("wt.folder.Cabinet",
null);
protected void initAttributes(Set<AttributeTypeIdentifier>
attributes) {
super.initAttributes(attributes);
attributes.add(PERSONAL_CABINET_ATI);
}
private static class ObjectParams {
Cabinet cabinet = null;
TypeInstance ti = null;
ObjectParams(Cabinet cabinet){
if(cabinet != null)
this.cabinet = cabinet;
}
ObjectParams(TypeInstance ti){
if(ti != null)
this.ti = ti;
}
void reSetObject(Cabinet cabinet){
if(cabinet != null)
this.cabinet = cabinet;
}
boolean isPersonalCabinet(){
if(cabinet != null){
return (cabinet.isPersonalCabinet());
}else{
return (Boolean)ti.get(PERSONAL_CABINET_ATI);
}
}
}
protected boolean inflateRequired() {
boolean need = false;
TypeInstance ti = getTypeInstanceObject();
if(ti != null){
need = super.inflateRequired();
if(!need){
if(ti.get(PERSONAL_CABINET_ATI) == null){ // should contain
PERSONAL_CABINET_ATI
need = true;
}
}
}
return need;
}
private ObjectParams getObjectParams(){
ObjectParams object_params = null;
WTObject obj = super.getObject(false);
TypeInstance ti = getTypeInstanceObject();
if (obj != null && obj instanceof Cabinet) {//Object is available
object_params = new ObjectParams((Cabinet)obj);
} else if(ti != null) {//TypeInstance is available
if(inflateRequired()){
obj = super.getObject(true);
if (obj != null && obj instanceof Cabinet) {
object_params = new ObjectParams((Cabinet)obj);
}else{
object_params = null;
}
} else {
object_params = new ObjectParams(ti);
}
}
return object_params;
}
public IconSelector getStandardIconSelector()
throws WTException, IllegalAccessException,
InvocationTargetException {
IconSelector icon = null;
ObjectParams object_params = getObjectParams();
if(object_params != null){
boolean is_personal_cabinet =
object_params.isPersonalCabinet();
if(is_personal_cabinet)
icon = new IconSelector(PERSONAL_ICON);
else
icon = new IconSelector(SHARED_ICON);
}
if (icon == null)
icon = super.getStandardIconSelector();
return icon;
}
カスタム IconDelegate の登録
xconf ファイルのカスタム IconDelegate を登録し、xconfmanager を使用して <Windchill>/codebase/service.properties ファイルに適用します。
<Service context="default" name="wt.fc.IconDelegate">
<Option cardinality="duplicate" requestor="<your_type>"
serviceClass="<your_IconDelegate>"/>
</Service>