Wicket の tree を学ぶ(2)

前回の続き、単純にツリーを表示して、ツリーの 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 を取得
   }
};


と書くことができて整理できる。