基本的なカスタマイズ > ユーザーインタフェースのカスタマイズ > UI の情報の表示 > Windchill クライアントアーキテクチャツリー > ソリューション > 手順 - JCA ツリーの設定 > ComponentConfigBuiler と ComponentDataBuilder の実装 > 別個のビルダーによるアプローチ > 非同期の DataSource の使用
  
非同期の DataSource の使用
ComponentConfigBuilder の実装
例:
@ComponentBuilder(value = "custom.treeExample.seperate", type = ComponentBuilderType.CONFIG_ONLY)
public class TreeExampleConfigBuilder extends AbstractComponentConfigBuilder {
private static final String RESOURCE = "com.ptc.carambola.carambolaResource";
@Override
public ComponentConfig buildComponentConfig(ComponentParams params)
throws WTException {
ComponentConfigFactory factory = getComponentConfigFactory();
//Create TreeConfig
TreeConfig tree = factory.newTreeConfig();
// Need to set DataSOurceModes explicitely to DataSourceMode.ASYNCHRONOUS
((JcaTreeConfig) tree).setDataSourceMode(DataSourceMode.ASYNCHRONOUS);
// Set expansion level . Default is TableTreeProperties.ONE_EXPAND
(expand by one level)
((JcaTreeConfig) tree).setExpansionLevel(TableTreeProperties.FULL_EXPAND);

tree.setLabel((new ResourceBundleClientMessageSource(RESOURCE)).getMessage
("PART_TREE_LABEL"));

//Add Columns to the config
tree.addComponent(factory.newColumnConfig(NAME, true));
tree.addComponent(factory.newColumnConfig(NUMBER, true));
//Set column to which expand/collapse norgie should appear
tree.setNodeColumn(NUMBER);
return tree;
}
}
要点:
1. 非同期 DataSource を使用するには、DataSource モードを明示的に DataSourceMode.ASYNCHRONOUS に設定する必要があります。
2. setNodeColumn メソッドによって、展開/折りたたみボタンを表示する列を選択できます。デフォルトは "名前" 列です。
ComponentDataBuilder の実装
具象クラスによってインタフェース com.ptc.mvc.components.TreeDataBuilderAsync を実装する必要があります。詳細については、Java API のマニュアルを参照してください。
例:
@ComponentBuilder(value = "custom.treeExample.seperate", type =
ComponentBuilderType.DATA_ONLY)
public class TreeExampleComponentDataBuilder
implements TreeDataBuilderAsync {
@Override
public void buildNodeData(Object node,
ComponentResultProcessor resultProcessor)
throws Exception {
if (node == TreeNode.RootNode) {
List<Object> objects = getRootNodes();
resultProcessor.addElements(objects);
} else {
List nodeList = new ArrayList();
nodeList.add(node);
Map<Object, List> map = getNodes(nodeList);
Set keySet = map.keySet();
for (Object key : keySet) {
resultProcessor.addElements(map.get(key));
}
}
}
private List<Object> getRootNodes(){ // Add code to find RootNodes}
private List<Object> getNodes(List<Object> nodeList){ // Add code to find ChildNodes}
}
TreeExpansionStateManager を実装することによる高度なコンフィギュレーション
TreeExpansionStateManager は以下の API を提供します。
boolean isExpandNeeded(DefaultMutableTreeNode node, ComponentConfig config,
ComponentParams params) throws WTException;
void addExpandedNode(Object node, ComponentConfig config,
ComponentParams params)
throws WTException;

Set getExpandedOids(ComponentConfig config, ComponentParams params)
throws WTException;
boolean hasChildren(Object node, ComponentResultProcessor resultProcessor,
TreeDataBuilderAsync builder) throws Exception;
List<DefaultMutableTreeNode> getDynamicExpandedNodes(ComponentConfig config,
ComponentParams params) throws WTException;
詳細については、Javadoc を参照してください。
TreeExpansionStateManager の具体化は DefaultTreeExpansionStateManager によって提供されます。この実装を拡張して必要に応じて API をカスタマイズしたり、TreeExpansionStateManager を直接実装したりすることができます。ExpansionStateManager アノテーションを使用して、具体化をビルダー内に注入できます。
例:
@ComponentBuilder ("folderbrowser_tree")
@ExpansionStateManager (FolderTreeExpansionStateHandler.class)
//
public class FolderTreeBuilder extends AbstractComponentConfigBuilder implements TreeDataBuilderAsync{…}
ここでは FolderTreeExpansionStateHandlerDefaultTreeExpansionStateManager を実装し、FolderTreebuilder に注入されます。
これらの API はツリー拡張状態の動作をカスタマイズするのに便利です。たとえば、IsExpandNeeded API を使用して、ノードを拡張するかどうかを決定するデフォルトのロジックをオーバーライドできます。