Wicket tree 任意のノードを開く

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 の中から、
表示したい項目を開くみたいなことができるわけだ。