/* 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<Object>) 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<Component> 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<Object> sels = ((Selectable<Object>) model).getSelection(); if (sels != null && sels.size() > 0) ((Selectable<Object>) 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; } }