Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /* BindingRowRenderer.java
  
  {{IS_NOTE
  	Purpose:
  		
  	Description:
  		
  	History:
  		Mon Mar 19 11:10:12     2007, Created by Henri
 }}IS_NOTE
 
 Copyright (C) 2007 Potix Corporation. All Rights Reserved.
 
 {{IS_RIGHT
 }}IS_RIGHT
 */
 package org.zkoss.zkplus.databind;
 
 
 import  org.zkoss.zul.Listbox;
 import  org.zkoss.zul.Grid;
 import  org.zkoss.zul.Row;
 import  org.zkoss.zul.RowRenderer;
 import  org.zkoss.zul.RowRendererExt;
 
 import java.util.Map;
 import java.util.List;
 
 /*package*/ class BindingRowRenderer 
 implements org.zkoss.zul.RowRenderer, org.zkoss.zul.RowRendererExt, Serializable {
 	private static final String KIDS = "zkplus.databind.KIDS";
 	private Row _template;
 	private DataBinder _binder;
 	private int x = 0;
 	
 	public BindingRowRenderer(Row templateDataBinder binder) {
 		 = template;
 		 = binder;
 	}
 	
 	//-- RowRendererExt --//
 	public Row newRow(Grid grid) {
 		//clone from template
 		final Row clone = (Row).clone();
 		
 		//avoid duplicate id error, will set to new id when render()
 		if (!ComponentsCtrl.isAutoId(clone.getId())) {
 			clone.setId("@"clone.getUuid() + ++);
 		}
 					
 		//link cloned component with template
 		//each Row and its decendants share the same templatemap
 		Map templatemap = new HashMap(7);
 		linkTemplates(clonetemplatemap);
 		
 		//link this template map to parent templatemap (Grid in Grid)
 		Map parenttemplatemap = (Mapgrid.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 Component newCell(Row row) {
 		return null;
 	}
 	
 	public int getControls() {
 		return DETACH_ON_RENDER;
 	}
 		
 	//-- RowRenderer --//
 	public void render(Row rowjava.lang.Object bean) {
 		final List kids = (Listrow.getAttribute();
 		row.getChildren().addAll(kids);
 //			row.removeAttribute(KIDS);
 			
 		//remove template mark of cloned component and its decendant
 			
 		//setup clone id
 
 		//bind bean to the associated listitem and its decendant
 		final String varname = (String.getAttribute(.);
 		final Map templatemap = (Maprow.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
		if (template instanceof Grid || template instanceof Listbox) {
			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 Grid)
	private void setupCloneIds(Component clone) {
		//bug #1813271: Data binding generates duplicate ids in grids/listboxes
		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
		if (clone instanceof Grid || clone instanceof Listbox) {
			return;
		}
		for(final Iterator it = clone.getChildren().iterator(); it.hasNext(); ) {
			setupCloneIds((Componentit.next()); //recursive
		}
	}
New to GrepCode? Check out our FAQ X