Simple に書く Wicket の tree

Wicket の treeを学ぶ(1)

Wicket の treeを学ぶ(2)

Wicket の treeを学ぶ(3)

を書いてきたので、ここで、NestedTree を直接利用するシンプルな形を書きとめておく。

前に書いた素材に沿った Foo クラスを題材にして、、、

インポートに必要なもの。。。
import java.util.Set;
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.NestedTree;
import org.apache.wicket.extensions.markup.html.repeater.tree.content.Folder;
import org.apache.wicket.extensions.markup.html.repeater.tree.theme.WindowsTheme;
import org.apache.wicket.markup.head.CssHeaderItem;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.request.resource.CssResourceReference;

他に、treeの素材である Foo クラス、プロバイダにあたる FooProvider
Expansion を実装する FooExpansion 選択時の Panel 表示の SelectedPanel
を importする。


public class SimpleTreePage extends WebPage{

   public SimpleTreePage(){
      final WebMarkupContainer selectContainer = new WebMarkupContainer("select-container");
      selectContainer.setOutputMarkupId(true);

      NestedTree<Foo> tree = new NestedTree<Foo>("tree", new FooProvider(), new AbstractReadOnlyModel<Set<Foo>>(){
         @Override
         public Set<Foo> getObject(){
            return FooExpansion.get();
         }
      }){

         @Override
         protected Component newContentComponent(String id, IModel<Foo> model){

            return new Folder<Foo>(id, this , model){
               @Override
               protected MarkupContainer newLinkComponent(String _id, IModel<Foo> _model){
                  final Foo foo = _model.getObject();
                  if (getProvider().hasChildren(foo)){
                     return super.newLinkComponent(_id, _model);
                  }
                  return new AjaxLink<Foo>(_id, _model){
                     @Override
                     public void onClick(AjaxRequestTarget target){
                        selectContainer.remove("select-content");
                        selectContainer.add(new SelectedPanel("select-content", new Model<Foo>(foo)));
                        target.add(selectContainer);
                     }
                  };
               }
               /* アイコン変更はここで getClosedFolderClass(), getOpenFolderClass(). getLeafClass(T) をOverrideする   */
            };
         }
      };
      tree.add(new WindowsTheme());
      add(tree);
      selectContainer.add(new SelectedPanel("select-content", new Model<Foo>()));
      add(selectContainer);

      add(new Link<Void>("expandAll"){
         @Override
         public void onClick(){
            FooExpansion.get().expandAll();
         }
      });
      add(new Link<Void>("collapseAll"){
         @Override
         public void onClick(){
            FooExpansion.get().collapseAll();
         }
      });

   }
   @Override
   public void renderHead(IHeaderResponse response){
      super.renderHead(response);
      response.render(CssHeaderItem.forReference(new CssResourceReference(SimpleTreePage.class, "tree.css")));
   }
}

細かくクラスに分けた Javaソースにするか、このように1つにまとめてしまうか、
状況によるであろう。