Wicket の tree で、任意のノードを開くには、
org.apache.wicket.extensions.markup.html.repeater.tree.AbstractTree
の expand(E) メソッドを使うのであるが、対象の親ノードが開かれてなければ、
実際の画面では開かれない。
ツリーが全て閉じている場合は、これは少し困ったもので親ノードを全て開く操作が必要になる。
org.apache.wicket.extensions.markup.html.repeater.tree.ITreeProvider
このインターフェースは、ツリーのルートの直下にぶら下がる子をサーチする為の getChildren メソッドを約束しているが、
ツリー上の任意のノード、Leaf からルートまでの対象イテレータを提供するメソッドは約束していない。
仕方ないので tree形成プロバイダのインターフェースとして継承して新たなインターフェースを用意して
これをプロバイダに implement する。
public interface IExtensionTreeProvider<T> extends ITreeProvider<T>{
public Iterator<T> getParents(T t);
public T getObject(int key);
}
これを、tree形成プロバイダとして、
public class FooProvider implements IExtensionTreeProvider<Foo>{
として、Page クラスの中で、例えば AjaxButton の onSubmit で、、、
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> f){
String viewid = viewId.getModelObject();
int id = Integer.parseInt(viewid);
IExtensionTreeProvider<Foo> provider = (IExtensionTreeProvider<Foo>)tree.getProvider();
Foo foo = provider.getObject(id);
if (foo != null){
if (foo.isNode) tree.expand(foo);
}
for(Iterator<Foo> it = provider.getParents(foo); it.hasNext();){
tree.expand(it.next());
}
target.add(tree);
}
のようにすれば、任意のノード/Leafまで開く操作ができる。
昔からある Windows のヘルプファイルの検索して、ヘルプツリーBook の中から、
表示したい項目を開くみたいなことができるわけだ。