ZK - Open Source Ajax Java FrameworkZK - Open Source Ajax Java Framework

ZK TreeModel and

bhushan
18 Mar 2010 03:32:06 GMT
18 Mar 2010 03:32:06 GMT

In the following URL we have sample example on TreeModel and TreeitemRenderer.
http://www.zkoss.org/smalltalks/zkTreeModel/

In example where TreeModelA extends AbstractTreeModel we have the fireEvenT(...) method to synchronize model with ui and
it always takes data[] of single column.

In case of Multiple columns we have set Model and PersonTreeitemRenderer to tree,but issue is how to get fireEvent() to synchronize model with ui.
Please provide some sample code where we use TreeItemRender and Treemodel with fireEvent() function.

Thanks in Advance
Bhushan

jimmyshiau
19 Mar 2010 23:39:29 GMT
19 Mar 2010 23:39:29 GMT

Hi, bhushan
I create a sample

index.zul

<zk>
	<window apply="ctrl.MyComposer">
		<tree id="tree" width="300px" height="500px">
			<treecols>
				<treecol width="150px" label="Name"/>
				<treecol width="120px" label="Email" />
				<treecol width="120px" label="AccountId" />
			</treecols>
		</tree>
		<button id="addBtn" label="add"/>
	</window>
</zk>


MyComposer.java
package ctrl;

import java.util.*;

import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.util.GenericForwardComposer;
import org.zkoss.zul.*;
import org.zkoss.zul.event.TreeDataEvent;
import org.zkoss.zul.event.TreeDataListener;

public class MyComposer extends GenericForwardComposer{	
	
	private Tree tree;
	private MySimpleTreeModel treeModel;
	private SimpleTreeNode rdDep, salesDep; 
	
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);		
		
		//create a PersonTreeitemRenderer
		tree.setTreeitemRenderer(new TreeitemRenderer() {			
			@Override
			public void render(Treeitem item, Object data) throws Exception {
				if (data == null) return;
				
				SimpleTreeNode t = (SimpleTreeNode)data;
				final Person person = (Person)t.getData();
				Treerow tr = new Treerow();
				tr.setParent(item);
				tr.appendChild(new Treecell(person.getName()));
				tr.appendChild(new Treecell(person.getEmail()));
				tr.appendChild(new Treecell(person.getAccountId()));
				item.setOpen(person.isOpen()); 

				item.addEventListener("onOpen", new EventListener() { 
					public void onEvent(Event event) throws Exception {
						Treeitem item = (Treeitem) event.getTarget();
						person.setOpen(item.isOpen()); 
					} 
				}); 
			}
		});		
		
		//create treemodel and assign root
		treeModel = new MySimpleTreeModel(createTreeData());
		tree.setModel(treeModel);		
	}
	
	public void onClick$addBtn(){
		Person person = new Person("NewName", "@zkoss.org","767676"); 
		SimpleTreeNode stn = new SimpleTreeNode(person, new ArrayList<SimpleTreeNode>());		
		treeModel.add(rdDep, stn);
	}	
	
	private SimpleTreeNode createTreeData() {
		//Create nodes for department R and D
		String[] name = {"Pierre","Adam","Thomas"};
		String[] accountId = {"p001","a002","t003"};		
		//Create branch department R and D and assigned children to it. rdDep's children are contained in ArrayList alc.
		rdDep = new SimpleTreeNode(new Person("R&D","",""), createTreeChildren(name, accountId));
		
		//Create nodes for department sales
		String[] name2 = {"Paul","Eric","Gray"};
		String[] accountId2 = {"p002","e009","g019"};		
		//Create branch department sales and assigned children to it
		salesDep = new SimpleTreeNode(new Person("Sales","",""), createTreeChildren(name2, accountId2));
		
		//create root and assigned children to it 
		ArrayList<SimpleTreeNode> al = new ArrayList<SimpleTreeNode>();
		al.add(salesDep);
		al.add(rdDep);		
		return new SimpleTreeNode("ROOT",al);
	}

	private List<SimpleTreeNode> createTreeChildren(String[] name, String[] accountId) {
		ArrayList<SimpleTreeNode> alc = new ArrayList<SimpleTreeNode>();
		for(int i =0; i < name.length; i++){
			Person person = new Person(name<i >,name<i > + "@zkoss.org",accountId<i >);
			SimpleTreeNode stn = new SimpleTreeNode(person,new ArrayList<SimpleTreeNode>());
			alc.add(stn);
		}
		return alc;
	}

	private class MySimpleTreeModel extends SimpleTreeModel{
		
		public MySimpleTreeModel(SimpleTreeNode root) {
			super(root);
		}

		public void add(SimpleTreeNode parent, SimpleTreeNode newNodes){
			
			List<SimpleTreeNode> children = parent.getChildren();
			int length = children.size();
			children.add(newNodes);
			fireEvent(parent, length, length, TreeDataEvent.INTERVAL_ADDED);
		}
	}
	
	private class Person {
		
		private String _name;			
		private String _email;			
		private String _accountId;
		private boolean _open;
		
		public Person(String name, String email, String dep) {
			super();
			_name = name;
			_email = email;
			_accountId = dep;
		}
	
		public String getAccountId() {
			return _accountId;
		}
	
		public String getEmail() {
			return _email;
		}	
	
		public String getName() {
			return _name;
		}
		
		public boolean isOpen() { 
			return _open; 
		} 

		public void setOpen(boolean open) { 
			_open = open; 
		}
	}

}