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つにまとめてしまうか、
状況によるであろう。