org.zkoss.zk.ui.metainfo.ForEachBranchInfo Maven / Gradle / Ivy
/* ForEachBranchInfo.java
Purpose:
Description:
History:
Thu Jul 7 17:22:35 TST 2011, Created by tomyeh
Copyright (C) 2011 Potix Corporation. All Rights Reserved.
*/
package org.zkoss.zk.ui.metainfo;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Page;
import org.zkoss.zk.ui.util.ConditionImpl;
import org.zkoss.zk.ui.util.ForEach;
import org.zkoss.zk.ui.util.ForEachImpl;
import org.zkoss.zk.xel.ExValue;
import org.zkoss.zk.xel.impl.Utils;
/**
* Used to implement a branch node that supports forEach.
* @author tomyeh
* @since 6.0.0
*/
/*package*/ abstract class ForEachBranchInfo extends BranchInfo {
/** The forEach content, i.e., what to iterate. */
private ExValue[] _forEach;
/** The forEach info: [forEachBegin, forEachEnd]. */
private ExValue[] _forEachInfo;
/*package*/ ForEachBranchInfo() {
}
/*package*/ ForEachBranchInfo(NodeInfo parent, ConditionImpl cond) {
super(parent, cond);
}
/** Used only by {@link ComponentInfo#duplicate} to make a virtual copy.
*/
/*package*/ ForEachBranchInfo(ForEachBranchInfo from) {
_forEach = from._forEach;
_forEachInfo = from._forEachInfo;
}
/** Returns the forEach object if the forEach attribute is defined
* (or {@link #setForEach} is called).
*
* If comp is not null, both pagedef and page are ignored.
* If comp is null, page must be specified.
*
* @param page the page. It is used only if comp is null.
* @param comp the component.
* @return the forEach object to iterate this info multiple times,
* or null if this info shall be interpreted only once.
*/
public ForEach resolveForEach(Page page, Component comp) {
return _forEach == null ? null
: _forEachInfo.length == 2
? (comp != null
? ForEachImpl.getInstance(_evalr, comp, _forEach, _forEachInfo[0], _forEachInfo[1])
: ForEachImpl.getInstance(_evalr, page, _forEach, _forEachInfo[0], _forEachInfo[1]))
: (comp != null
? ForEachImpl.getInstance(_evalr, comp, _forEach, _forEachInfo[0], _forEachInfo[1],
_forEachInfo[2])
: ForEachImpl.getInstance(_evalr, page, _forEach, _forEachInfo[0], _forEachInfo[1],
_forEachInfo[2]));
}
/** Sets the forEach attribute, which is usually an expression.
* @param expr the expression to return a collection of objects, or
* null/empty to denote no iteration.
*/
public void setForEach(String expr, String begin, String end) {
_forEach = Utils.parseList(expr, Object.class, false);
//forEach="" means to iterate a single-element array and the value
//is empty
_forEachInfo = _forEach == null ? null
: new ExValue[] { begin != null && begin.length() > 0 ? new ExValue(begin, Integer.class) : null,
end != null && end.length() > 0 ? new ExValue(end, Integer.class) : null };
}
/** Sets the forEach attribute, which is usually an expression.
* @param expr the expression to return a collection of objects, or
* null/empty to denote no iteration.
* @since 8.0.0
*/
public void setForEach(String expr, String begin, String end, String step) {
_forEach = Utils.parseList(expr, Object.class, false);
//forEach="" means to iterate a single-element array and the value
//is empty
_forEachInfo = _forEach == null ? null
: new ExValue[] { begin != null && begin.length() > 0 ? new ExValue(begin, Integer.class) : null,
end != null && end.length() > 0 ? new ExValue(end, Integer.class) : null,
step != null && step.length() > 0 ? new ExValue(step, Integer.class) : null };
}
/** Returns whether the forEach condition is defined.
*/
public boolean withForEach() {
return _forEach != null;
}
}