/** IndirectBinding.java. Purpose: Description: History: 4:58:52 PM Jun 26, 2015, Created by jumperchen Copyright (C) 2015 Potix Corporation. All Rights Reserved. */ package org.zkoss.bind.impl; import java.io.Serializable; import java.util.Map; import org.zkoss.bind.BindContext; import org.zkoss.bind.sys.ReferenceBinding; import org.zkoss.bind.xel.zel.BindELContext; import org.zkoss.zul.ListModel; import org.zkoss.zul.ListModelArray; import org.zkoss.zul.ListModelList; /** * An indirect binding, a kind of reference binding, but it won't create a sub-tracking * tree to get two way bindings, and it is used for children binding internally. * i.e. this class is designed for some specific cases. * @author jumperchen * @since 8.0.0 */ public abstract class IndirectBinding implements ReferenceBinding, Serializable { private Object _data; public IndirectBinding(Object data) { _data = data; } /** * Returns the data */ public Object getData() { return _data; } protected abstract ListModel getModel(); /** * Sets the data */ public void setData(Object data) { _data = data; } /** * do nothing for this method */ public void load(BindContext ctx) { // do nothing } public void setValue(BindELContext ctx, Object value) { ListModel model = getModel(); if (model instanceof ListModelArray) { ((ListModelArray<Object>) model).set(((ListModelArray<Object>) model).indexOf(getData()), value); _data = value; // update it } else if (model instanceof ListModelList<?>) { ((ListModelList<Object>) model).set(((ListModelList<Object>) model).indexOf(getData()), value); _data = value; // update it } } public Object getValue(BindELContext ctx) { return getData(); } /** * Null is returned by default. (never be used) */ public Map<String, Object> getArgs() { return null; } /** * Null is returned by default. (never be used) */ public String getPropertyString() { return null; } /** * do nothing for this method */ public void invalidateCache() { } }