Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /* BindingListitemRenderer.java
  
  {{IS_NOTE
  	Purpose:
  		
  	Description:
  		
  	History:
  		Sat Feb  3 14:18:27     2007, Created by Henri
 }}IS_NOTE
 
 Copyright (C) 2007 Potix Corporation. All Rights Reserved.
 
 {{IS_RIGHT
 }}IS_RIGHT
 */
 package org.zkoss.zkplus.databind;
 
 import java.util.List;
 import java.util.Map;
 
 import  org.zkoss.zul.Listbox;
 import  org.zkoss.zul.Listcell;
 import  org.zkoss.zul.Listitem;
 
 /*package*/ class BindingListitemRenderer 
 implements org.zkoss.zul.ListitemRenderer, org.zkoss.zul.ListitemRendererExt, Serializable {
 	private static final long serialVersionUID = 200808191417L;
 	private static final String KIDS = "zkplus.databind.KIDS";
 	private Listitem _template;
 	private DataBinder _binder;
 	private int x = 0;
 	
 	public BindingListitemRenderer(Listitem templateDataBinder binder) {
 		 = template;
 		 = binder;
 	}
 	
 	//-- ListitemRendererExt --//
 	public Listitem newListitem(Listbox listbox) {
 		//clone from template
 		final Listitem clone = (Listitem).clone();
 		//TODO: see if databinder has this kind of Listitem, if not, add new CollectionListItem 
 		//avoid duplicate id error, will set to new id when render()
 		//Bug #1962153: Data binding generates duplicate id in some case (add "_")
 		if (!ComponentsCtrl.isAutoId(clone.getId())) {
 			clone.setId("@"clone.getUuid() + "_" + ++);
 		}
 					
 		//link cloned component with template
 		//each Listitem and and it decendants share the same templatemap
 		Map templatemap = new HashMap(7);
 		linkTemplates(clonetemplatemap);
 		
 		//link this template map to parent templatemap (Listbox in Listbox)
 		Map parenttemplatemap = (Maplistbox.getAttribute(.);
 		if (parenttemplatemap != null) {
 				templatemap.put(.parenttemplatemap);
 		}
 		//kept clone kids somewhere to avoid create too many components in browser
 		final List kids = new ArrayList(clone.getChildren());
 		clone.setAttribute(kids);
 		clone.getChildren().clear();
 		return clone;
 	}
 	
 	public Listcell newListcell(Listitem item) {
 		return null;
 	}
 	
 	public int getControls() {
 		return DETACH_ON_RENDER;
 	}
 		
 	//-- ListitemRenderer --//
 	public void render(Listitem itemjava.lang.Object bean) {
 		final List kids = (Listitem.getAttribute();
 		item.getChildren().addAll(kids);
 //			item.removeAttribute(KIDS);
 			
 		//remove template mark of cloned component and its decendant
 			
 		//setup clone id
 		setupCloneIds(item);
 
 		//bind bean to the associated listitem and its decendant
 		final String varname = (String.getAttribute(.);
 		final Map templatemap = (Mapitem.getAttribute(.);
 		templatemap.put(varnamebean);
 
 		//apply the data binding
	}
	//link cloned components with bindings of templates
	private void linkTemplates(Component cloneComponent templateMap templatemap) {
		if (.existsBindings(template)) {
			templatemap.put(templateclone);
			clone.setAttribute(.templatemap);
			clone.setAttribute(.template);
		}
		//Listbox in Listbox, Listbox in Grid, Grid in Listbox, Grid in Grid, 
		//no need to process down since BindingRowRenderer of the under Grid
		//owner will do its own linkTemplates()
		//bug #1888911 databind and Grid in Grid not work when no _var in inner Grid
		if (DataBinder.isCollectionOwner(template)) {
			return;
		}
		final Iterator itt = template.getChildren().iterator();
		final Iterator itc = clone.getChildren().iterator();
		while (itt.hasNext()) {
			final Component t = (Componentitt.next();
			final Component c = (Componentitc.next();
			linkTemplates(cttemplatemap);	//recursive
		}
	}
	//setup id of cloned components (cannot called until the component is attached to Listbox)
	private void setupCloneIds(Component clone) {
		//bug #1813271: Data binding generates duplicate ids in grids/listboxes
		//Bug #1962153: Data binding generates duplicate id in some case (add "_")
		clone.setId("@" + clone.getUuid() + "_"++); //init id to @uuid to avoid duplicate id issue
		//Listbox in Listbox, Listbox in Grid, Grid in Listbox, Grid in Grid, 
		//no need to process down since BindingRowRenderer of the under Grid
		//owner will do its own setupCloneIds()
		//bug #1893247: Not unique in the new ID space when Grid in Grid
		final Component template = DataBinder.getComponent(clone); 
		if (template != null && DataBinder.isCollectionOwner(template)) {
			return;
		}
		for(final Iterator it = clone.getChildren().iterator(); it.hasNext(); ) {
			setupCloneIds((Componentit.next()); //recursive
		}
	}
New to GrepCode? Check out our FAQ X