/* CollectionIndexComposer.java Purpose: Description: History: Created by Dennis Copyright (C) 2011 Potix Corporation. All Rights Reserved. */ package org.zkoss.zktest.bind.issue; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.Set; import org.zkoss.bind.BindContext; import org.zkoss.bind.Converter; import org.zkoss.bind.annotation.Command; import org.zkoss.bind.annotation.NotifyChange; import org.zkoss.zk.ui.Component; import org.zkoss.zktest.bind.issue.F00743_1.Item; import org.zkoss.zul.DefaultTreeModel; import org.zkoss.zul.DefaultTreeNode; import org.zkoss.zul.TreeModel; import org.zkoss.zul.TreeNode; /** * @author Dennis Chen * */ public class F00769{ private String message1; DefaultTreeModel<String> model; MyTreeNode root; Set<MyTreeNode> selected; public F00769() { root = new MyTreeNode("Root", new MyTreeNode[] {}); String[] labs = new String[]{"A","A"}; for (int i = 0; i < 2; i++) { MyTreeNode ni = new MyTreeNode(labs[i] + "-" + i, new MyTreeNode[] {}); ni.setOpen(true); for (int j = 0; j < 3; j++) { MyTreeNode nj = new MyTreeNode(ni.getData() + "-" + j, new MyTreeNode[] {}); nj.setOpen(true); for (int k = 0; k < 2; k++) { MyTreeNode nk = new MyTreeNode( nj.getData() + "-" + k); nj.add(nk); } ni.add(nj); } root.add(ni); } model = new DefaultTreeModel<String>(root); model.setMultiple(true); } public Set<MyTreeNode> getSelected() { return selected; } public void setSelected(Set<MyTreeNode> selected) { this.selected = selected; } public Converter getSelectedConverter(){ return new Converter() { public Object coerceToUi(Object val, Component component, BindContext ctx) { return sort((Set)val); } public Object coerceToBean(Object val, Component component, BindContext ctx) { return val; } }; } public TreeModel<TreeNode<String>> getModel() { return model; } public String getMessage1() { return message1; } static public class MyTreeNode extends DefaultTreeNode<String> { boolean open; public MyTreeNode(String data, MyTreeNode[] children) { super(data,children); } public MyTreeNode(String data) { super(data); } public boolean isOpen() { return open; } public void setOpen(boolean open) { this.open = open; } public String toString(){ return getData(); } } List sort(Set set){ if(set==null) return null; ArrayList list = new ArrayList((Set)set); Collections.sort(list); return list; } int[][] sort(int[][] path){ ArrayList al = new ArrayList(); for(int i=0;i<path.length;i++){ al.add(path[i]); } Collections.sort(al,new Comparator() { public int compare(Object o1, Object o2) { int[] a1 = (int[])o1; int[] a2 = (int[])o2; for(int i=0;i<a1.length && i<a2.length;i++){ if(a1[i]==a2[i]) continue; return new Integer(a1[i]).compareTo(new Integer(a2[i])); } return a1.length>a2.length?1:-1; } }); for(int i=0;i<path.length;i++){ path[i] = (int[])al.get(i); } return path; } @Command @NotifyChange({"items","message1","selected"}) public void reload() { ArrayList list = null; if(selected!=null){ list = new ArrayList((Set)selected); Collections.sort(list); } message1 = "reloaded "+ (selected==null?"no selection":list); } @Command @NotifyChange({"selected","message1"}) public void select() { message1 = "select"; if(selected==null){ selected = new HashSet<MyTreeNode>(); }else{ selected.clear(); } selected.add((MyTreeNode)root.getChildAt(0).getChildAt(1)); selected.add((MyTreeNode)root.getChildAt(1).getChildAt(1).getChildAt(1)); } @Command @NotifyChange({"selected","message1"}) public void clean1() { message1 = "clean"; selected = null; } @Command @NotifyChange({"selected","message1"}) public void clean2() { message1 = "clean"; if(selected!=null){ selected.clear(); } } @Command @NotifyChange("message1") public void showselection(){ if(model.isSelectionEmpty()){ message1 = "no selection"; }else{ int path[][] = sort(model.getSelectionPaths()); StringBuilder sb = new StringBuilder(); sb.append("["); for(int i=0;i<path.length;i++){ if(i!=0){ sb.append(", "); } sb.append("["); for(int j=0;j<path[i].length;j++){ if(j!=0){ sb.append(", "); } sb.append(path[i][j]); } sb.append("]"); } sb.append("]"); message1 = sb.toString(); } } }