/* SelectedIndexConverter.java Purpose: Description: History: Feb 3, 2012 6:10:20 PM, Created by dennis Copyright (C) 2011 Potix Corporation. All Rights Reserved. */ package org.zkoss.bind.converter.sys; 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.ext.Selectable; /** * Convert selected index to bean and vice versa. * @author dennis * @since 6.0.0 */ public abstract class AbstractSelectedIndexConverter<C extends Component> implements Converter<Object, Object, C>, java.io.Serializable { private static final long serialVersionUID = 201108171811L; @SuppressWarnings("unchecked") public Object coerceToUi(Object val, C comp, BindContext ctx) { final ListModel<?> model = getComponentModel(comp); //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) { int index = ((Integer) val).intValue(); if (index < 0) { Set<Object> sels = ((Selectable<Object>) model).getSelection(); if (sels != null && sels.size() > 0) ((Selectable<Object>) model).clearSelection(); } else { ((Selectable<Object>) model).addToSelection(model.getElementAt(index)); } return IGNORED_VALUE; } else { return val; } //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 val; } protected abstract ListModel<?> getComponentModel(C comp); public Object coerceToBean(Object val, C comp, BindContext ctx) { return val; } }