You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lo...@apache.org on 2012/05/22 14:18:30 UTC

svn commit: r1341439 [3/3] - in /myfaces/tobago/trunk: ./ tobago-core/src/main/java-jsf-1.1-todo/ tobago-core/src/main/java-jsf-1.1-todo/org/apache/myfaces/tobago/internal/taglib/component/ tobago-core/src/main/java-jsf-1.2-todo/ tobago-core/src/main/j...

Modified: myfaces/tobago/trunk/tobago-theme/tobago-theme-scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeRenderer.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-theme/tobago-theme-scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeRenderer.java?rev=1341439&r1=1341438&r2=1341439&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-theme/tobago-theme-scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeRenderer.java (original)
+++ myfaces/tobago/trunk/tobago-theme/tobago-theme-scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeRenderer.java Tue May 22 12:18:26 2012
@@ -17,8 +17,8 @@ package org.apache.myfaces.tobago.render
  * limitations under the License.
  */
 
-import org.apache.myfaces.tobago.component.UITreeData;
 import org.apache.myfaces.tobago.component.UITreeNode;
+import org.apache.myfaces.tobago.internal.component.AbstractUIData;
 import org.apache.myfaces.tobago.internal.component.AbstractUITree;
 import org.apache.myfaces.tobago.renderkit.LayoutComponentRendererBase;
 import org.apache.myfaces.tobago.renderkit.css.Classes;
@@ -36,7 +36,6 @@ import org.slf4j.LoggerFactory;
 import javax.faces.component.UIComponent;
 import javax.faces.context.FacesContext;
 import java.io.IOException;
-import java.util.Arrays;
 
 public class TreeRenderer extends LayoutComponentRendererBase {
 
@@ -44,12 +43,13 @@ public class TreeRenderer extends Layout
 
   @Override
   public void decode(FacesContext facesContext, UIComponent component) {
-    if (ComponentUtils.isOutputOnly(component)) {
-      return;
-    }
+    final AbstractUITree tree = (AbstractUITree) component;
+    RenderUtils.decodedStateOfTreeData(facesContext, tree);
+  }
 
-    AbstractUITree tree = (AbstractUITree) component;
-    tree.setValid(true);
+  @Override
+  public boolean getRendersChildren() {
+    return true;
   }
 
   @Override
@@ -63,7 +63,7 @@ public class TreeRenderer extends Layout
     AbstractUITree tree = (AbstractUITree) component;
 
     String clientId = tree.getClientId(facesContext);
-    UIComponent root = tree.getRoot();
+    UIComponent root = ComponentUtils.findDescendant(tree, UITreeNode.class);
     if (root == null) {
       LOG.error("Can't find the tree root. This may occur while updating a tree from Tobago 1.0 to 1.5. "
           + "Please refer the documentation to see how to use tree tags.");
@@ -76,35 +76,44 @@ public class TreeRenderer extends Layout
     writer.writeClassAttribute(Classes.create(tree));
     Style style = new Style(facesContext, tree);
     writer.writeStyleAttribute(style);
+    writer.writeIdAttribute(clientId);
 
     writer.startElement(HtmlElements.INPUT, tree);
     writer.writeAttribute(HtmlAttributes.TYPE, HtmlInputTypes.HIDDEN, false);
-    writer.writeNameAttribute(clientId);
-    writer.writeIdAttribute(clientId);
-    writer.writeAttribute(HtmlAttributes.VALUE, ";", false);
+    final String markedId = clientId + ComponentUtils.SUB_SEPARATOR + AbstractUITree.SUFFIX_MARKED;
+    writer.writeNameAttribute(markedId);
+    writer.writeIdAttribute(markedId);
+    writer.writeClassAttribute(Classes.create(tree, AbstractUITree.SUFFIX_MARKED));
+    writer.writeAttribute(HtmlAttributes.VALUE, "", false);
     writer.endElement(HtmlElements.INPUT);
 
     writer.startElement(HtmlElements.INPUT, tree);
     writer.writeAttribute(HtmlAttributes.TYPE, HtmlInputTypes.HIDDEN, false);
-    writer.writeNameAttribute(clientId + ComponentUtils.SUB_SEPARATOR + AbstractUITree.MARKED);
-    writer.writeIdAttribute(clientId + ComponentUtils.SUB_SEPARATOR + AbstractUITree.MARKED);
-    writer.writeClassAttribute(Classes.create(tree, "marked"));
-    writer.writeAttribute(HtmlAttributes.VALUE, "", false);
+    final String expandedId = clientId + ComponentUtils.SUB_SEPARATOR + AbstractUIData.SUFFIX_EXPANDED;
+    writer.writeNameAttribute(expandedId);
+    writer.writeIdAttribute(expandedId);
+    writer.writeClassAttribute(Classes.create(tree, AbstractUIData.SUFFIX_EXPANDED));
+    writer.writeAttribute(HtmlAttributes.VALUE, ",", false);
     writer.endElement(HtmlElements.INPUT);
 
-/*
-    if (tree.getSelectableAsEnum().isSupportedByTree()) {
-      writer.startElement(HtmlElements.INPUT, tree);
-      writer.writeAttribute(HtmlAttributes.TYPE, "hidden", false);
-      writer.writeNameAttribute(clientId + AbstractUITree.SELECT_STATE);
-      writer.writeIdAttribute(clientId + AbstractUITree.SELECT_STATE);
-      writer.writeAttribute(HtmlAttributes.VALUE, ";", false);
-      writer.endElement(HtmlElements.INPUT);
+    final int last = tree.hasRows() ? tree.getFirst() + tree.getRows() : Integer.MAX_VALUE;
+    for (int rowIndex = tree.getFirst(); rowIndex < last; rowIndex++) {
+      tree.setRowIndex(rowIndex);
+      if (!tree.isRowAvailable()) {
+        break;
+      }
+
+      for (UIComponent child : tree.getChildren()) {
+        RenderUtils.prepareRendererAll(facesContext, child);
+        RenderUtils.encode(facesContext, child);
+      }
     }
-*/
-
-    RenderUtils.encode(facesContext, root, Arrays.asList(UITreeNode.class, UITreeData.class));
 
     writer.endElement(HtmlElements.DIV);
   }
+
+  @Override
+  public boolean getPrepareRendersChildren() {
+    return true;
+  }
 }

Modified: myfaces/tobago/trunk/tobago-theme/tobago-theme-scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeSelectRenderer.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-theme/tobago-theme-scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeSelectRenderer.java?rev=1341439&r1=1341438&r2=1341439&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-theme/tobago-theme-scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeSelectRenderer.java (original)
+++ myfaces/tobago/trunk/tobago-theme/tobago-theme-scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeSelectRenderer.java Tue May 22 12:18:26 2012
@@ -43,6 +43,9 @@ public class TreeSelectRenderer extends 
 
     TobagoResponseWriter writer = HtmlRendererUtils.getTobagoResponseWriter(facesContext);
 
+    writer.startElement(HtmlElements.SPAN, null);
+    writer.writeClassAttribute(Classes.create(select));
+
     if (select.isShowCheckbox()) {
       writer.startElement(HtmlElements.INPUT, null);
       writer.writeAttribute(HtmlAttributes.TYPE, HtmlInputTypes.CHECKBOX, false);
@@ -63,6 +66,8 @@ public class TreeSelectRenderer extends 
       writer.writeText(label);
       writer.endElement(HtmlElements.LABEL);
     }
+
+    writer.endElement(HtmlElements.SPAN);
   }
 
   @Override

Modified: myfaces/tobago/trunk/tobago-theme/tobago-theme-scarborough/src/main/resources/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/style/style.css
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-theme/tobago-theme-scarborough/src/main/resources/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/style/style.css?rev=1341439&r1=1341438&r2=1341439&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-theme/tobago-theme-scarborough/src/main/resources/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/style/style.css (original)
+++ myfaces/tobago/trunk/tobago-theme/tobago-theme-scarborough/src/main/resources/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/style/style.css Tue May 22 12:18:26 2012
@@ -1428,8 +1428,12 @@ div.tobago-richTextEditor-body {
   white-space: nowrap;
 }
 
+.tobago-treeNode {
+  width: 100%;
+}
+
 .tobago-treeNode img {
-  vertical-align: middle;
+  vertical-align: bottom;
   border: 0;
 }
 
@@ -1537,6 +1541,11 @@ div.tobago-richTextEditor-body {
   background-color: #d8e9fb;
 }
 
+.tobago-treeSelect input {
+  margin-top: 1px;
+  margin-bottom: 2px;
+}
+
 /* treeListbox ------------------------------------------------------------------- */
 
 .tobago-treeListbox {

Modified: myfaces/tobago/trunk/tobago-theme/tobago-theme-speyside/src/main/resources/org/apache/myfaces/tobago/renderkit/html/speyside/standard/style/style.css
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-theme/tobago-theme-speyside/src/main/resources/org/apache/myfaces/tobago/renderkit/html/speyside/standard/style/style.css?rev=1341439&r1=1341438&r2=1341439&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-theme/tobago-theme-speyside/src/main/resources/org/apache/myfaces/tobago/renderkit/html/speyside/standard/style/style.css (original)
+++ myfaces/tobago/trunk/tobago-theme/tobago-theme-speyside/src/main/resources/org/apache/myfaces/tobago/renderkit/html/speyside/standard/style/style.css Tue May 22 12:18:26 2012
@@ -783,18 +783,6 @@ div.tobago-tabGroup-toolBar {
   float: right;
 }
 
-.tobago-treeNode img {
-  vertical-align: top;
-	border: 0px;
-}
-
-/*
-.tobago-treeNode a {
-  font-size: 12px;
-  font-family: arial, helvetica, sans-serif;
-}
-
-*/
 .tobago-treeNode-disabled a {
   color: #888888;
   text-decoration: none;

Modified: myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/util/RenderUtils.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/util/RenderUtils.java?rev=1341439&r1=1341438&r2=1341439&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/util/RenderUtils.java (original)
+++ myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/util/RenderUtils.java Tue May 22 12:18:26 2012
@@ -20,8 +20,13 @@ package org.apache.myfaces.tobago.render
 import org.apache.myfaces.tobago.component.Attributes;
 import org.apache.myfaces.tobago.config.Configurable;
 import org.apache.myfaces.tobago.context.ResourceManagerUtils;
+import org.apache.myfaces.tobago.internal.component.AbstractUIData;
+import org.apache.myfaces.tobago.internal.component.AbstractUITree;
 import org.apache.myfaces.tobago.internal.util.StringUtils;
 import org.apache.myfaces.tobago.layout.Measure;
+import org.apache.myfaces.tobago.model.ExpandedState;
+import org.apache.myfaces.tobago.model.MarkedState;
+import org.apache.myfaces.tobago.model.TreePath;
 import org.apache.myfaces.tobago.renderkit.RendererBase;
 import org.apache.myfaces.tobago.util.ComponentUtils;
 import org.apache.myfaces.tobago.util.DebugUtils;
@@ -41,6 +46,7 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -356,4 +362,90 @@ public class RenderUtils {
             component.isItemDisabled(), component.getItemImage(), component.getMarkup());
   }
 
+
+  public static void decodedStateOfTreeData(FacesContext facesContext, AbstractUIData data) {
+
+    if (!data.isTreeModel()) {
+      return;
+    }
+
+    final boolean isTree = data instanceof AbstractUITree;
+    // marked
+    final Integer markedIndex = isTree ? decodeMarkedIndex(facesContext, data) : null;
+
+    // expanded
+    final List<Integer> expandedIndices = decodeExpandedIndices(facesContext, data);
+
+    final int last = data.isRowsUnlimited() ? Integer.MAX_VALUE : data.getFirst() + data.getRows();
+    for (int rowIndex = data.getFirst(); rowIndex < last; rowIndex++) {
+      data.setRowIndex(rowIndex);
+      if (!data.isRowAvailable()) {
+        break;
+      }
+
+//        final Object rowData = data.getRowData();
+      final TreePath path = data.getPath();
+
+      // marked
+      if (isTree) {
+        final MarkedState markedState = ((AbstractUITree) data).getMarkedState();
+        final boolean oldMarked = markedState.isMarked(path);
+        final boolean newMarked = ((Integer) rowIndex).equals(markedIndex);
+        if (newMarked != oldMarked) {
+//          new TreeMarkedEvent(node, oldValue, newValue).queue();
+          if (newMarked) {
+            markedState.setMarked(path);
+          } else {
+            markedState.setMarked(null);
+          }
+        }
+      }
+
+      // expanded
+      final ExpandedState expandedState = data.getExpandedState();
+      final boolean oldExpanded = expandedState.isExpanded(path);
+      final boolean newExpanded = expandedIndices.contains(rowIndex);
+      if (newExpanded != oldExpanded) {
+//          new TreeExpansionEvent(node, oldValue, newValue).queue();
+        if (newExpanded) {
+          expandedState.expand(path);
+        } else {
+          expandedState.collapse(path);
+        }
+      }
+
+    }
+    data.setRowIndex(-1);
+  }
+
+  private static Integer decodeMarkedIndex(FacesContext facesContext, AbstractUIData data) {
+    String markedString = null;
+    try {
+      markedString = (String) facesContext.getExternalContext().getRequestParameterMap()
+          .get(data.getClientId(facesContext) + ComponentUtils.SUB_SEPARATOR + AbstractUIData.SUFFIX_MARKED);
+      if (org.apache.commons.lang.StringUtils.isBlank(markedString)) {
+        return null;
+      }
+      return Integer.parseInt(markedString);
+    } catch (Exception e) {
+      // should not happen
+      LOG.warn("Can't parse marked: '" + markedString + "'", e);
+      return null;
+    }
+  }
+
+  private static List<Integer> decodeExpandedIndices(FacesContext facesContext, AbstractUIData data) {
+    List<Integer> expandedIndices;
+    String expandedString = null;
+    try {
+      expandedString = (String) facesContext.getExternalContext().getRequestParameterMap()
+          .get(data.getClientId(facesContext) + ComponentUtils.SUB_SEPARATOR + AbstractUIData.SUFFIX_EXPANDED);
+      expandedIndices = StringUtils.parseIntegerList(expandedString);
+    } catch (Exception e) {
+      // should not happen
+      LOG.warn("Can't parse expanded: '" + expandedString + "'", e);
+      return Collections.emptyList();
+    }
+    return expandedIndices;
+  }
 }

Propchange: myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/resources/org/apache/myfaces/tobago/renderkit/html/standard/standard/script/jquery-ui/
            ('svn:mergeinfo' removed)

Modified: myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/resources/org/apache/myfaces/tobago/renderkit/html/standard/standard/script/tobago-tree.js
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/resources/org/apache/myfaces/tobago/renderkit/html/standard/standard/script/tobago-tree.js?rev=1341439&r1=1341438&r2=1341439&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/resources/org/apache/myfaces/tobago/renderkit/html/standard/standard/script/tobago-tree.js (original)
+++ myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/resources/org/apache/myfaces/tobago/renderkit/html/standard/standard/script/tobago-tree.js Tue May 22 12:18:26 2012
@@ -20,9 +20,11 @@ Tobago.Tree = {};
 Tobago.Tree.toggleNode = function(element) {
   var src;
   var node = element.closest(".tobago-treeNode, .tobago-treeMenuNode");
-  var expanded = node.find(".tobago-treeMenuNode-expanded, .tobago-treeNode-expanded");
+  var data = node.closest(".tobago-treeMenu, .tobago-tree, .tobago-sheet");
+  var expanded = data.children(".tobago-treeMenu-expanded, .tobago-tree-expanded, .tobago-sheet-expanded");
   var toggle = node.find(".tobago-treeMenuNode-toggle, .tobago-treeNode-toggle");
-  if ("true" == expanded.attr("value")) {
+  var rowIndex = Tobago.Tree.rowIndex(node);
+  if (Tobago.Tree.isExpanded(node, expanded)) {
     Tobago.Tree.hideChildren(node);
     toggle.each(function() {
       src = jQuery(this).data("tobago-srcclose");
@@ -32,22 +34,26 @@ Tobago.Tree.toggleNode = function(elemen
       jQuery(this).attr("src", src);
       Tobago.fixPngAlpha(this);
     });
-    expanded.attr("value", "false");
+    expanded.attr("value", expanded.attr("value").replace(new RegExp("," + rowIndex + ","), ","));
     node.filter(".tobago-treeNode").removeClass("tobago-treeNode-markup-expanded");
     node.filter(".tobago-treeMenuNode").removeClass("tobago-treeMenuNode-markup-expanded");
   } else {
-    Tobago.Tree.showChildren(node);
-    toggle.each(function() {
-      src = jQuery(this).data("tobago-srcopen");
-      if (src == null) { // use the close icon if there is no open icon
-        src = jQuery(this).data("tobago-srcclose");
-      }
-      jQuery(this).attr("src", src);
-      Tobago.fixPngAlpha(this);
-    });
-    expanded.attr("value", "true");
-    node.filter(".tobago-treeNode").addClass("tobago-treeNode-markup-expanded");
-    node.filter(".tobago-treeMenuNode").addClass("tobago-treeMenuNode-markup-expanded");
+    var reload = Tobago.Tree.showChildren(node, expanded);
+    expanded.attr("value", expanded.attr("value") + rowIndex + ",");
+    if (reload) {
+      Tobago.reloadComponent(element, data.attr("id"), null, {});
+    } else {
+      toggle.each(function() {
+        src = jQuery(this).data("tobago-srcopen");
+        if (src == null) { // use the close icon if there is no open icon
+          src = jQuery(this).data("tobago-srcclose");
+        }
+        jQuery(this).attr("src", src);
+        Tobago.fixPngAlpha(this);
+      });
+      node.filter(".tobago-treeNode").addClass("tobago-treeNode-markup-expanded");
+      node.filter(".tobago-treeMenuNode").addClass("tobago-treeMenuNode-markup-expanded");
+    }
   }
 };
 
@@ -56,8 +62,16 @@ Tobago.Tree.toggleNode = function(elemen
  * @param node A jQuery-Object as a node of the tree.
  */
 Tobago.Tree.hideChildren = function (node) {
-  var children = node.nextAll("[data-tobago-treeparent='" + node.attr("id") + "']");
-  children.hide().each(function () {
+  var treeParentSelector = "[data-tobago-treeparent='" + node.attr("id") + "']";
+  var children;
+  if (node.parent("td").parent("tr").size() == 1) { // tree inside of a sheet
+    children = node.parent("td").parent("tr").nextAll().children().children(treeParentSelector);
+    children.parent().parent().hide();
+  } else { // normal tree
+    children = node.nextAll(treeParentSelector);
+    children.hide();
+  }
+  children.each(function () {
     Tobago.Tree.hideChildren(jQuery(this));
   });
 };
@@ -65,16 +79,32 @@ Tobago.Tree.hideChildren = function (nod
 /**
  * Show the children of the node recursively, there parents are expanded.
  * @param node A jQuery-Object as a node of the tree.
+ * @return is reload needed (to get all nodes from the server)
  */
-Tobago.Tree.showChildren = function (node) {
-  var children = node.nextAll("[data-tobago-treeparent='" + node.attr("id") + "']");
-  children.show().each(function () {
+Tobago.Tree.showChildren = function (node, expanded) {
+  var treeParentSelector = "[data-tobago-treeparent='" + node.attr("id") + "']";
+  var children;
+  if (node.parent("td").parent("tr").size() == 1) { // tree inside of a sheet
+    children = node.parent("td").parent("tr").nextAll().children().children(treeParentSelector);
+    children.parent().parent().show();
+  } else { // normal tree
+    children = node.nextAll(treeParentSelector);
+    children.show();
+  }
+  if (children.length == 0) {
+    // no children in DOM, reload it from the server
+    return true;
+  }
+  children.each(function () {
     var child = jQuery(this);
-    var expanded = child.find(".tobago-treeMenuNode-expanded, .tobago-treeNode-expanded");
-    if ("true" == expanded.attr("value")) {
-      Tobago.Tree.showChildren(child);
+    if (Tobago.Tree.isExpanded(child, expanded)) {
+      var reload = Tobago.Tree.showChildren(child, expanded);
+      if (reload) {
+        return true;
+      }
     }
   });
+  return false;
 };
 
 Tobago.Tree.init = function(elements) {
@@ -122,6 +152,7 @@ Tobago.Tree.init = function(elements) {
 
   Tobago.Utils.selectWidthJQuery(elements, ".tobago-treeNode-markup-folder .tobago-treeNode-toggle").click(function() {
     Tobago.Tree.toggleNode(jQuery(this));
+    return false;
   });
 
   Tobago.Utils.selectWidthJQuery(elements, ".tobago-treeMenuNode-markup-folder .tobago-treeMenuNode-toggle")
@@ -146,7 +177,7 @@ Tobago.Tree.init = function(elements) {
     var node = command.parent(".tobago-treeNode");
     var tree = node.closest(".tobago-tree");
     var marked = tree.children(".tobago-tree-marked");
-    marked.attr("value", node.attr("id"));
+    marked.attr("value", Tobago.Tree.rowIndex(node));
     tree.find(".tobago-treeNode").removeClass("tobago-treeNode-markup-marked");
     node.addClass("tobago-treeNode-markup-marked");
   });
@@ -157,11 +188,39 @@ Tobago.Tree.init = function(elements) {
     var node = command.parent(".tobago-treeMenuNode");
     var tree = node.closest(".tobago-treeMenu");
     var marked = tree.children(".tobago-treeMenu-marked");
-    marked.attr("value", node.attr("id"));
+    marked.attr("value", Tobago.Tree.rowIndex(node));
     tree.find(".tobago-treeMenuNode").removeClass("tobago-treeMenuNode-markup-marked");
     node.addClass("tobago-treeMenuNode-markup-marked");
   });
 
+  // init marked field
+  Tobago.Utils.selectWidthJQuery(elements, ".tobago-treeMenu, .tobago-tree").each(function() {
+    var marked = jQuery(this).children(".tobago-treeMenu-marked, .tobago-tree-marked");
+    var string = "";
+    jQuery(this).find(".tobago-treeMenuNode-markup-marked, .tobago-treeNode-markup-marked").each(function() {
+      string = Tobago.Tree.rowIndex(jQuery(this));
+    });
+    marked.attr("value", string);
+  });
+
+  // init expanded field
+  Tobago.Utils.selectWidthJQuery(elements, ".tobago-treeMenu, .tobago-tree, .tobago-sheet").each(function() {
+    var expanded = jQuery(this).children(".tobago-treeMenu-expanded, .tobago-tree-expanded, .tobago-sheet-expanded");
+    var string = ",";
+    jQuery(this).find(".tobago-treeMenuNode-markup-expanded, .tobago-treeNode-markup-expanded").each(function() {
+      string += Tobago.Tree.rowIndex(jQuery(this)) + ",";
+    });
+    expanded.attr("value", string);
+  });
+};
+
+Tobago.Tree.isExpanded = function(node, expanded) {
+  var rowIndex = Tobago.Tree.rowIndex(node);
+  return expanded.attr("value").indexOf("," + rowIndex + ",") > -1;
+};
+
+Tobago.Tree.rowIndex = function (node) {
+  return node.attr("id").replace(/.+\:(\d+)(\:\w+)+/, '$1');
 };
 
 Tobago.registerListener(Tobago.Tree.init, Tobago.Phase.DOCUMENT_READY);