Update of /var/cvs/applications/taglib/src/org/mmbase/bridge/jsp/taglib/tree
In directory james.mmbase.org:/tmp/cvs-serv21019/tree
Modified Files:
Tag: MMBase-1_8
TreeTag.java
Log Message:
MMB-1611, MMB-1478
See also:
http://cvs.mmbase.org/viewcvs/applications/taglib/src/org/mmbase/bridge/jsp/taglib/tree
See also: http://www.mmbase.org/jira/browse/MMB-1611
See also: http://www.mmbase.org/jira/browse/MMB-1478
Index: TreeTag.java
===================================================================
RCS file:
/var/cvs/applications/taglib/src/org/mmbase/bridge/jsp/taglib/tree/TreeTag.java,v
retrieving revision 1.18.2.2
retrieving revision 1.18.2.3
diff -u -b -r1.18.2.2 -r1.18.2.3
--- TreeTag.java 14 Feb 2008 14:37:17 -0000 1.18.2.2
+++ TreeTag.java 28 Feb 2008 12:15:50 -0000 1.18.2.3
@@ -13,6 +13,7 @@
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.*;
+import javax.servlet.jsp.jstl.core.*;
import java.io.IOException;
import java.util.Stack;
@@ -48,7 +49,7 @@
</pre>
* @author Michiel Meeuwissen
* @since MMBase-1.7
- * @version $Id: TreeTag.java,v 1.18.2.2 2008/02/14 14:37:17 michiel Exp $
+ * @version $Id: TreeTag.java,v 1.18.2.3 2008/02/28 12:15:50 michiel Exp $
*/
public class TreeTag extends AbstractNodeProviderTag implements TreeProvider,
QueryContainerReferrer {
private static final Logger log = Logging.getLoggerInstance(TreeTag.class);
@@ -65,10 +66,18 @@
private int index;
private Node nextNode;
+ private BranchLoopStatus nextBranchStatus;
private Object prevDepthProvider;
private Object prevTreeProvider;
+ protected Attribute varStatus = Attribute.NULL;
+ protected String varStatusName = null;
+
+ protected Attribute varBranchStatus = Attribute.NULL;
+ protected String varBranchStatusName = null;
+
+
/**
* Lists do implement ContextProvider
*/
@@ -126,6 +135,8 @@
}
+
+
// ContextProvider implementation
public ContextContainer getContextContainer() throws JspTagException {
if (collector == null) return
getContextProvider().getContextContainer(); // to make sure old-style
implemntation work (which do not initialize container)
@@ -165,6 +176,24 @@
return nextDepth;
}
+ /**
+ * @since MMBase-1.8.6
+ */
+ public void setVarStatus(String s) throws JspTagException {
+ varStatus = getAttribute(s);
+ }
+ /**
+ * @since MMBase-1.8.6
+ */
+ public void setVarBranchStatus(String s) throws JspTagException {
+ varBranchStatus = getAttribute(s);
+ }
+
+
+ public TreeIterator getIterator() {
+ return iterator;
+ }
+
protected void noSpecification() throws JspTagException {
if (nodeManager != Attribute.NULL) {
@@ -190,6 +219,9 @@
pageContext.setAttribute(DepthProvider.KEY, this,
PageContext.REQUEST_SCOPE);
pageContext.setAttribute(TreeProvider.KEY, this,
PageContext.REQUEST_SCOPE);
+ varStatusName = (String) varStatus.getValue(this);
+ varBranchStatusName = (String) varBranchStatus.getValue(this);
+
// serve parent timer tag:
TagSupport t = findParentTag(TimerTag.class, null, false);
if (t != null) {
@@ -254,10 +286,22 @@
Node node = iterator.nextNode();
setNodeVar(node);
fillVars();
+ if (varStatusName != null) {
+ org.mmbase.bridge.jsp.taglib.util.ContextContainer cc =
getContextProvider().getContextContainer();
+ cc.register(varStatusName, getLoopStatus());
+ }
+ if (varBranchStatusName != null) {
+ org.mmbase.bridge.jsp.taglib.util.ContextContainer cc =
getContextProvider().getContextContainer();
+ cc.register(varBranchStatusName, new BranchLoopStatus(node,
iterator.getSiblings()));
+ }
depth = iterator.currentDepth();
if (iterator.hasNext()) {
nextNode = iterator.nextNode();
+ if (varBranchStatusName != null) {
+ org.mmbase.bridge.jsp.taglib.util.ContextContainer cc =
getContextProvider().getContextContainer();
+ nextBranchStatus = new BranchLoopStatus(nextNode,
iterator.getSiblings());
+ }
nextDepth = iterator.currentDepth();
log.debug("hasnext " + nextDepth);
} else {
@@ -291,11 +335,23 @@
log.debug("using next-node");
setNodeVar(nextNode);
fillVars();
+ if (varStatusName != null) {
+ org.mmbase.bridge.jsp.taglib.util.ContextContainer cc =
getContextProvider().getContextContainer();
+ cc.reregister(varStatusName, new
ListProviderLoopTagStatus(this));
+ }
+ if (varBranchStatusName != null) {
+ org.mmbase.bridge.jsp.taglib.util.ContextContainer cc =
getContextProvider().getContextContainer();
+ cc.reregister(varBranchStatusName, nextBranchStatus);
+ }
previousDepth = depth;
depth = nextDepth;
if (iterator.hasNext()) {
nextNode = iterator.nextNode();
+ if (varBranchStatusName != null) {
+ org.mmbase.bridge.jsp.taglib.util.ContextContainer cc =
getContextProvider().getContextContainer();
+ nextBranchStatus = new BranchLoopStatus(nextNode,
iterator.getSiblings());
+ }
nextDepth = iterator.currentDepth();
log.debug("has next " + nextDepth);
} else {
@@ -348,6 +404,45 @@
}
+ /**
+ * @since MMBase-1.8.6
+ */
+ class BranchLoopStatus implements LoopTagStatus {
+ private final Node current;
+ private final NodeList siblings;
+ public BranchLoopStatus(Node c, NodeList s) {
+ current = c;
+ siblings = s;
+ }
+ public Object getCurrent() {
+ return current;
+ }
+ public int getIndex() {
+ return siblings.indexOf(current);
+ }
+
+ public int getCount() {
+ return siblings.size();
+ }
+
+ public boolean isFirst() {
+ return getIndex() == 0;
+ }
+ public boolean isLast() {
+ return getCount() == getIndex() + 1;
+ }
+ public Integer getBegin() {
+ return null;
+ }
+ public Integer getEnd() {
+ return null;
+ }
+ public Integer getStep() {
+ return null;
+ }
+ }
+
+
}
_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs