All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.zkoss.bind.converter.sys.TabboxSelectedTabConverter Maven / Gradle / Ivy

/* TabboxSelectedTabConverter.java

{{IS_NOTE
	Purpose:
		
	Description:
		
	History:
		Tue Nov 13 14:39:14     2007, Created by Henri
}}IS_NOTE

Copyright (C) 2007 Potix Corporation. All Rights Reserved.

{{IS_RIGHT
}}IS_RIGHT
*/
package org.zkoss.bind.converter.sys;

import java.util.Iterator;
import java.util.Set;

import org.zkoss.bind.BindContext;
import org.zkoss.bind.Converter;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.UiException;
import org.zkoss.zul.ListModel;
import org.zkoss.zul.Tab;
import org.zkoss.zul.Tabbox;
import org.zkoss.zul.Tabs;
import org.zkoss.zul.ext.Selectable;

/**
 * Convert tabbox selected tab and vice versa.
 *
 * @author Dennis
 * @since 6.0.0
 */
public class TabboxSelectedTabConverter implements Converter, java.io.Serializable {
	private static final long serialVersionUID = 200808190445L;
	
	@SuppressWarnings("unchecked")
	public Object coerceToUi(Object val, Component comp, BindContext ctx) {
		Tabbox tbx = (Tabbox) comp;
		final ListModel model = tbx.getModel();
		//ZK-762 selection of ListModelList is not correct if binding to selectedItem
		if(model !=null && !(model instanceof Selectable)){
			//model has to implement Selectable if binding to selectedItem
  			throw new UiException("model doesn't implement Selectable");
  		}
		
	  	if (val != null) {
	  		if(model!=null){
	  			((Selectable)model).addToSelection(val);
	  			return IGNORED_VALUE;
	  		}else{
	  			//no model case, //iterate to find the selected tab via the value
	  			Tabs tabs = ((Tabbox)comp).getTabs();
	  			if(tabs!=null){
					for (Iterator it = tabs.getChildren().iterator(); it.hasNext();) {
						final Component child = it.next();
						if (child instanceof Tab) {
							if (val.equals(((Tab)child).getLabel())) {
								return child;
							}
						}
					}
	  			}
	  		}
		  	//not in the item list
	  	}
	  	
	  //nothing matched, clean the old selection
	  	if(model!=null){
	  		Set sels = ((Selectable)model).getSelection();
	  		if(sels!=null && sels.size()>0)
	  			((Selectable)model).clearSelection();
	  		return IGNORED_VALUE;
	  	}
	  	return null;
	}

	public Object coerceToBean(Object val, Component comp, BindContext ctx) {
	  	if (val != null) {
		  	final Tabbox tbx = (Tabbox) comp;
	  		final ListModel model = tbx.getModel();
	  		if(model !=null && !(model instanceof Selectable)){
	  			throw new UiException("model doesn't implement Selectable");
	  		}
	  		if(model!=null){
	  			Set selection = ((Selectable)model).getSelection();
	  			if(selection==null || selection.size()==0) return null;
	  			return selection.iterator().next();
	  		} else{//no model
	  			return ((Tab)val).getLabel();
	  		}
	  	}
	 	return null;
	}
}