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

Reply via email to