前回の続き、単純にツリーを表示して、ツリーの leaf をクリックした時の処理を
書ける形を前回書いたが、もっと簡略化、汎用的に書けるはずである。
前回の TreeContent を改め次の抽象クラスにする。
import org.apache.wicket.Component;
import org.apache.wicket.MarkupContainer;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.extensions.markup.html.repeater.tree.AbstractTree;
import org.apache.wicket.extensions.markup.html.repeater.tree.content.Folder;
import org.apache.wicket.model.IModel;
/**
* ClickableTreeContent
*/
public abstract class ClickableTreeContent<T> extends TreeContent<T> {
public abstract void onLeafClick(AjaxRequestTarget target, IModel<T> model);
@Override
public Component newContentComponent(String id, final AbstractTree<T> tree, IModel<T> model){
return new Folder<T> (id, tree, model){
@Override
protected MarkupContainer newLinkComponent(String _id, final IModel<T> _model){
T t = _model.getObject();
if (tree.getProvider().hasChildren(t)){
return super.newLinkComponent(_id, _model);
}
return new AjaxLink<T> (_id, _model){
@Override
public void onClick(AjaxRequestTarget target){
onLeafClick(target, _model);
}
};
}
};
}
}
すると、tree を宣言する前回のPageでは、、
TreeContent<Foo> content;
content = new ClickableTreeContent<Foo>(){
@Override
public void onLeafClick(AjaxRequestTarget target, IModel<Foo> model){
// model.getObject() で クリックした leaf の Foo を取得
}
};
と書くことができて整理できる。