[richfaces-svn-commits] JBoss Rich Faces SVN: r2488 - in trunk: samples/tree-demo/src/main/java/org/richfaces and 9 other directories.

richfaces-svn-commits at lists.jboss.org richfaces-svn-commits at lists.jboss.org
Fri Aug 24 15:13:38 EDT 2007


Author: nbelaevski
Date: 2007-08-24 15:13:37 -0400 (Fri, 24 Aug 2007)
New Revision: 2488

Modified:
   trunk/framework/api/src/main/java/org/richfaces/event/AjaxSelectedEvent.java
   trunk/framework/api/src/main/java/org/richfaces/event/NodeSelectedEvent.java
   trunk/samples/tree-demo/src/main/java/org/richfaces/Bean.java
   trunk/samples/tree-demo/src/main/webapp/pages/index.jsp
   trunk/ui/tree/src/main/java/org/richfaces/component/UITree.java
   trunk/ui/tree/src/main/java/org/richfaces/renderkit/NodeRendererBase.java
   trunk/ui/tree/src/main/java/org/richfaces/renderkit/TreeDataModelEventNavigator.java
   trunk/ui/tree/src/main/java/org/richfaces/renderkit/TreeRendererBase.java
   trunk/ui/tree/src/main/resources/org/richfaces/renderkit/html/css/tree.xcss
   trunk/ui/tree/src/main/resources/org/richfaces/renderkit/html/scripts/tree-item.js
   trunk/ui/tree/src/main/resources/org/richfaces/renderkit/html/scripts/tree.js
   trunk/ui/tree/src/main/templates/htmlTree.jspx
   trunk/ui/tree/src/main/templates/htmlTreeNode.jspx
   trunk/ui/tree/src/test/java/org/richfaces/component/TreeComponentTest.java
   trunk/ui/tree/src/test/java/org/richfaces/component/events/TreeEventsListenersTest.java
   trunk/ui/tree/src/test/java/org/richfaces/component/events/TreeEventsTest.java
   trunk/ui/tree/src/test/java/org/richfaces/renderkit/TreeRowKeyComparatorTest.java
Log:
http://jira.jboss.com/jira/browse/RF-642
Possibility to update ambigious node by AJAX added, demo updated

Modified: trunk/framework/api/src/main/java/org/richfaces/event/AjaxSelectedEvent.java
===================================================================
--- trunk/framework/api/src/main/java/org/richfaces/event/AjaxSelectedEvent.java	2007-08-24 18:58:45 UTC (rev 2487)
+++ trunk/framework/api/src/main/java/org/richfaces/event/AjaxSelectedEvent.java	2007-08-24 19:13:37 UTC (rev 2488)
@@ -23,6 +23,8 @@
 
 import javax.faces.component.UIComponent;
 
+import org.richfaces.model.TreeRowKey;
+
 /**
  * @author Konstantin Mishin
  *
@@ -34,8 +36,8 @@
 	 */
 	private static final long serialVersionUID = 1156974665865521208L;
 
-	public AjaxSelectedEvent(UIComponent component) {
-		super(component);
+	public AjaxSelectedEvent(UIComponent component, TreeRowKey oldSelection) {
+		super(component, oldSelection);
 	}
 
 }

Modified: trunk/framework/api/src/main/java/org/richfaces/event/NodeSelectedEvent.java
===================================================================
--- trunk/framework/api/src/main/java/org/richfaces/event/NodeSelectedEvent.java	2007-08-24 18:58:45 UTC (rev 2487)
+++ trunk/framework/api/src/main/java/org/richfaces/event/NodeSelectedEvent.java	2007-08-24 19:13:37 UTC (rev 2488)
@@ -25,6 +25,8 @@
 import javax.faces.event.FacesEvent;
 import javax.faces.event.FacesListener;
 
+import org.richfaces.model.TreeRowKey;
+
 /**
  * @author Nick Belaevski - nbelaevski at exadel.com
  * created 27.11.2006
@@ -32,8 +34,12 @@
  */
 public class NodeSelectedEvent extends FacesEvent {
 
-	public NodeSelectedEvent(UIComponent component) {
+	private TreeRowKey oldSelection;
+	
+	public NodeSelectedEvent(UIComponent component, TreeRowKey oldSelection) {
 		super(component);
+		
+		this.oldSelection = oldSelection;
 	}
 
 	/**
@@ -56,4 +62,8 @@
 	public void processListener(FacesListener listener) {
 		((NodeSelectedListener) listener).processSelection(this);
 	}
+	
+	public TreeRowKey getOldSelection() {
+		return oldSelection;
+	}
 }

Modified: trunk/samples/tree-demo/src/main/java/org/richfaces/Bean.java
===================================================================
--- trunk/samples/tree-demo/src/main/java/org/richfaces/Bean.java	2007-08-24 18:58:45 UTC (rev 2487)
+++ trunk/samples/tree-demo/src/main/java/org/richfaces/Bean.java	2007-08-24 19:13:37 UTC (rev 2488)
@@ -85,6 +85,8 @@
 
 	private int counter = 0;
 	
+	private int counter1 = 0;
+
 	public String getIcon() {
 		return icon;
 	}
@@ -187,14 +189,14 @@
 	public void onSelect(NodeSelectedEvent event) {
 		System.out.println("Node selected: " + getTree(event).getRowKey());
 		UITree tree = getTree(event);
-		Set keys = tree.getAjaxKeys();
-		if (keys == null) {
-			keys = new HashSet();
-			tree.setAjaxKeys(keys);
-		}
+//		Set keys = tree.getAjaxKeys();
+//		if (keys == null) {
+//			keys = new HashSet();
+//			tree.setAjaxKeys(keys);
+//		}
 
-		keys.add(tree.getRowKey());
-		keys.add(new ListRowKey());
+		//keys.add(tree.getRowKey());
+		//keys.add(new ListRowKey());
 		
 		if (getTree(event).getTreeNode()!=null) {
 			selectedNode = getTree(event).getTreeNode();
@@ -202,6 +204,17 @@
 		}
 	}
 
+	public boolean getReRenderValue() {
+		return false;
+	}
+	
+	public void setReRenderValue(boolean value) {
+		if (value) {
+			Set set = tree.getOrCreateDetachableRowKeys();
+			set.add(tree.getRowKey());
+		}
+	}
+	
 	public void onSelectInc(NodeSelectedEvent event) {
 		counter ++;
 		
@@ -439,4 +452,13 @@
 			break;
 		}
 	}
+	
+	public int getCounter1() {
+		return counter1;
+	}
+	
+	public void incCounter1() {
+		tree.setAjaxKeys(null);
+		counter1++;
+	}
 }
\ No newline at end of file

Modified: trunk/samples/tree-demo/src/main/webapp/pages/index.jsp
===================================================================
--- trunk/samples/tree-demo/src/main/webapp/pages/index.jsp	2007-08-24 18:58:45 UTC (rev 2487)
+++ trunk/samples/tree-demo/src/main/webapp/pages/index.jsp	2007-08-24 19:13:37 UTC (rev 2488)
@@ -1,5 +1,5 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-            "http://www.w3.org/TR/html4/loose.dtd">
+<!-- DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+            "http://www.w3.org/TR/html4/loose.dtd"-->
 
 <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
 <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
@@ -157,6 +157,8 @@
 
 					<rich:treeNode ondrop="blinkElement(this.getElement())" type="input" dropListener="#{bean.processDrop}" oncollapse="Element.removeClassName(event['treeItem'].getElement(), 'colored')" onexpand="Element.addClassName(event['treeItem'].getElement(), 'colored')">
 						<h:outputText value="#{data} : " />
+						<h:outputText value="#{bean.counter1} : " />
+						<h:selectBooleanCheckbox value="#{bean.reRenderValue}" />
 						<h:inputText value="#{data.name}" required="true" styleClass="inputs">
 						</h:inputText>
 
@@ -168,6 +170,8 @@
 					</rich:treeNode>
 				</rich:tree>
 
+				<a4j:commandButton value="Increase counter" action="#{bean.incCounter1}" />
+	
 				<h:outputText value="Enter path to expand, eg. [webApp_:id__1 , webApp_:id__1:7 ]:" />
 				<h:inputText value="#{bean.pathToExpand}">
 					<a4j:support event="onchange" reRender="tree" action="#{bean.expandNode}"/>

Modified: trunk/ui/tree/src/main/java/org/richfaces/component/UITree.java
===================================================================
--- trunk/ui/tree/src/main/java/org/richfaces/component/UITree.java	2007-08-24 18:58:45 UTC (rev 2487)
+++ trunk/ui/tree/src/main/java/org/richfaces/component/UITree.java	2007-08-24 19:13:37 UTC (rev 2488)
@@ -22,8 +22,10 @@
 package org.richfaces.component;
 
 import java.io.IOException;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Map;
+import java.util.Set;
 
 import javax.faces.application.Application;
 import javax.faces.component.NamingContainer;
@@ -107,6 +109,8 @@
 
 	private UITreeNode defaultFacet;
 
+	private Set detachableRowKeys;
+	
 	public UITree() {
 		super();
 
@@ -395,7 +399,7 @@
 				TreeState state = (TreeState) getComponentState();
 
 				if (!state.isSelected(null)) {
-					new NodeSelectedEvent(this).queue();
+					new NodeSelectedEvent(this, state.getSelectedNode()).queue();
 				}
 			}
 
@@ -814,6 +818,22 @@
 		
 		return null;
 	}
+	
+	
+	public Set getDetachableRowKeys() {
+		return detachableRowKeys;
+	}
+	
+	public void resetDetachableRowKeys() {
+		detachableRowKeys = null;
+	}
+	
+	public Set getOrCreateDetachableRowKeys() {
+		if (detachableRowKeys == null) {
+			detachableRowKeys = new HashSet();
+		}
+		return detachableRowKeys;
+	}
 }
 
 

Modified: trunk/ui/tree/src/main/java/org/richfaces/renderkit/NodeRendererBase.java
===================================================================
--- trunk/ui/tree/src/main/java/org/richfaces/renderkit/NodeRendererBase.java	2007-08-24 18:58:45 UTC (rev 2487)
+++ trunk/ui/tree/src/main/java/org/richfaces/renderkit/NodeRendererBase.java	2007-08-24 19:13:37 UTC (rev 2488)
@@ -249,11 +249,10 @@
 
 		UITreeNode node = (UITreeNode) component;
 		UITree tree = node.getUITree();
-
+		TreeRowKey key = (TreeRowKey) tree.getRowKey();
 		Map requestMap = context.getExternalContext().getRequestParameterMap();
 		String id = node.getClientId(context);
 		TreeState componentState = (TreeState) tree.getComponentState();
-		TreeRowKey key = (TreeRowKey) tree.getRowKey();
 
 		String nodeExpandedId = id + NODE_EXPANDED_INPUT_SUFFIX;
 		Object nodeExpandedValue = requestMap.get(nodeExpandedId);
@@ -289,17 +288,16 @@
 				if (tree.getAttributes().get(
 						UITree.SELECTED_NODE_PARAMETER_NAME) == null) {
 
-					new NodeSelectedEvent(tree).queue();
-					new NodeSelectedEvent(node).queue();
+					new NodeSelectedEvent(tree, componentState.getSelectedNode()).queue();
+					new NodeSelectedEvent(node, componentState.getSelectedNode()).queue();
 				} else {
-					new AjaxSelectedEvent(tree).queue();
-					new AjaxSelectedEvent(node).queue();
+					new AjaxSelectedEvent(tree, componentState.getSelectedNode()).queue();
+					new AjaxSelectedEvent(node, componentState.getSelectedNode()).queue();
 				}
 			}
 
 			tree.getAttributes().remove(UITree.SELECTION_INPUT_ATTRIBUTE);
 		}
-
 	}
 
 	public String getAjaxSelectedListenerFlag(FacesContext context,

Modified: trunk/ui/tree/src/main/java/org/richfaces/renderkit/TreeDataModelEventNavigator.java
===================================================================
--- trunk/ui/tree/src/main/java/org/richfaces/renderkit/TreeDataModelEventNavigator.java	2007-08-24 18:58:45 UTC (rev 2487)
+++ trunk/ui/tree/src/main/java/org/richfaces/renderkit/TreeDataModelEventNavigator.java	2007-08-24 19:13:37 UTC (rev 2488)
@@ -128,6 +128,10 @@
 	protected TreeRowKey getRowKey() {
 		return this.rowKey;
 	}
+	
+	protected TreeRowKey getFloatingKey() {
+		return floatingKey;
+	}
 
 	protected boolean isStackedLastElement() {
 		if (stackedLast != null) {

Modified: trunk/ui/tree/src/main/java/org/richfaces/renderkit/TreeRendererBase.java
===================================================================
--- trunk/ui/tree/src/main/java/org/richfaces/renderkit/TreeRendererBase.java	2007-08-24 18:58:45 UTC (rev 2487)
+++ trunk/ui/tree/src/main/java/org/richfaces/renderkit/TreeRendererBase.java	2007-08-24 19:13:37 UTC (rev 2488)
@@ -23,12 +23,12 @@
 
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.TreeSet;
 
 import javax.faces.FacesException;
 import javax.faces.component.NamingContainer;
@@ -60,6 +60,18 @@
 			TreeRowKey treeRowKey1 = (TreeRowKey) key1;
 			TreeRowKey treeRowKey2 = (TreeRowKey) key2;
 			
+			if (treeRowKey1 == null) {
+				if (treeRowKey2 == null) {
+					return 0;
+				} else {
+					return -1;
+				}
+			} else {
+				if (treeRowKey2 == null) {
+					return 1;
+				}
+			}
+			
 			Iterator iterator1 = treeRowKey1.iterator();
 			Iterator iterator2 = treeRowKey2.iterator();
 			
@@ -174,6 +186,15 @@
 			
 			if (!context.isExpanded()) {
 				getUtils().writeAttribute(writer, "style", "display: none;");
+			} else {
+				if (tree.isShowConnectingLines()) {
+					TreeRowKey floatingKey = getFloatingKey();
+					//need the expression only for AJAX update root
+					if (floatingKey != null && floatingKey.equals(context.getRowKey())) {
+						String expression = "background-image:expression(this.nextSibling ? '' : 'none')";
+						getUtils().writeAttribute(writer, "style", expression);
+					}
+				}
 			}
 			
 			String styleClasses = "";
@@ -202,11 +223,14 @@
 		
 		private TreeStateAdvisor methodBindingAdvisor = null;
 
+		private Object floatingKey;
+
 		private DataVisitorWithLastElement(Flag flag, UITree tree,
-				RendererDataModelEventNavigator navigator) {
+				RendererDataModelEventNavigator navigator, Object rowKey) {
 			this.flag = flag;
 			this.tree = tree;
 			this.navigator = navigator;
+			this.floatingKey = rowKey;
 		}
 
 		public void process(FacesContext context, Object rowKey, Object argument)
@@ -223,22 +247,19 @@
 			
 			UITreeNode nodeFacet = tree.getNodeFacet();
 			Object oldAttrValue = nodeFacet.getAttributes().get("isLastElement");
+			Object oldAjaxRootAttrValue = nodeFacet.getAttributes().get("isAjaxUpdateRoot");
 			try {
 				nodeFacet.getAttributes().put("isLastElement", new Boolean(isLastElement));
-
+				nodeFacet.getAttributes().put("isAjaxUpdateRoot", new Boolean(floatingKey != null && floatingKey.equals(rowKey)));
 				ResponseWriter writer = context.getResponseWriter();
 				if (isLastElement) {
 					writer.startElement("p", tree);
-					writer.writeAttribute("class", "last-node", null);
+					writer.writeAttribute("class", "dr-tree-last-node-marker", null);
 					writer.endElement("p");
-
-					writer.startElement("div", tree);
-					renderChild(context, nodeFacet);
-					writer.endElement("div");
-				} else {
-					renderChild(context, nodeFacet);
 				}
 				
+				renderChild(context, nodeFacet);
+				
 
 				c = new Context();
 				c.setClientId(nodeFacet.getClientId(context) + NamingContainer.SEPARATOR_CHAR);
@@ -255,6 +276,12 @@
 				} else {
 					nodeFacet.getAttributes().remove("isLastElement");
 				}
+
+				if (oldAjaxRootAttrValue != null) {
+					nodeFacet.getAttributes().put("isAjaxUpdateRoot", oldAjaxRootAttrValue);
+				} else {
+					nodeFacet.getAttributes().remove("isAjaxUpdateRoot");
+				}
 			}
 		}
 
@@ -361,13 +388,17 @@
 				try {
 					Set ajaxKeys = tree.getAjaxKeys(); 
 					if (ajaxKeys != null) {
-						List list = new ArrayList(ajaxKeys.size());
-						list.addAll(ajaxKeys);
-						Collections.sort(list, treeRowKeyComparator);
-						Iterator ajaxKeysItr = list.iterator();
+						Set keys = tree.getDetachableRowKeys();
+						Set sortedKeys = new TreeSet(treeRowKeyComparator);
+						sortedKeys.addAll(ajaxKeys);
+						if (keys != null) {
+							sortedKeys.addAll(keys);
+						}
+						Iterator ajaxKeysItr = sortedKeys.iterator();
 						TreeRowKey lastKey = null;
+						boolean nullRoot = false;
 						
-						while (ajaxKeysItr.hasNext()) {
+						while (!nullRoot && ajaxKeysItr.hasNext()) {
 							TreeRowKey key = (TreeRowKey) ajaxKeysItr.next();
 
 							if (lastKey == null) {
@@ -381,7 +412,8 @@
 								}
 							}
 							
-							if (key != null && key.depth() == 0) {
+							if (key == null || key.depth() == 0) {
+								nullRoot = true;
 								key = null;
 							}
 							
@@ -405,6 +437,7 @@
 							}
 						}
 						
+						tree.resetDetachableRowKeys();
 						//ajaxKeys.clear();
 					}
 				} catch (Exception e) {
@@ -582,7 +615,7 @@
 			};
 			
 			input.walk(context, new DataVisitorWithLastElement(droppedDownToLevelFlag, input,
-					levelNavigator), treeRange, key, null);
+					levelNavigator, key), treeRange, key, null);
 
 			/*if (key != null) {
 				closeLevelDownTable(context, input, writer);

Modified: trunk/ui/tree/src/main/resources/org/richfaces/renderkit/html/css/tree.xcss
===================================================================
--- trunk/ui/tree/src/main/resources/org/richfaces/renderkit/html/css/tree.xcss	2007-08-24 18:58:45 UTC (rev 2487)
+++ trunk/ui/tree/src/main/resources/org/richfaces/renderkit/html/css/tree.xcss	2007-08-24 19:13:37 UTC (rev 2488)
@@ -80,7 +80,7 @@
 	cursor: pointer;
 }
 
-.last-node {
+.dr-tree-last-node-marker {
 	display: none;
 }
 
@@ -116,12 +116,12 @@
 		<f:resource f:key="org.richfaces.renderkit.html.images.TreeLineNodeImage"/>
 	</u:style>
 </u:selector>
-<u:selector name="p.last-node+* .rich-tree-node-handleicon">
+<u:selector name="p.dr-tree-last-node-marker+* .rich-tree-node-handleicon, .dr-tree-h-ic-line-last">
 	<u:style name="background-image">
 		<f:resource f:key="org.richfaces.renderkit.html.images.TreeLineLastImage"/>
 	</u:style>
 </u:selector>
-<u:selector name="p.last-node+*+div.dr-tree-h-ic-line">
+<u:selector name="p.dr-tree-last-node-marker+*+div.dr-tree-h-ic-line">
 	<u:style name="background-image" value="none" />
 </u:selector>
 <u:selector name=".dr-tree-h-ic-line-exp">

Modified: trunk/ui/tree/src/main/resources/org/richfaces/renderkit/html/scripts/tree-item.js
===================================================================
--- trunk/ui/tree/src/main/resources/org/richfaces/renderkit/html/scripts/tree-item.js	2007-08-24 18:58:45 UTC (rev 2487)
+++ trunk/ui/tree/src/main/resources/org/richfaces/renderkit/html/scripts/tree-item.js	2007-08-24 19:13:37 UTC (rev 2488)
@@ -1,6 +1,6 @@
 Tree.Item = Class.create();
 Tree.Item.prototype = {
-	initialize: function(id, tree, parent) {
+	initialize: function(id, tree, parent, ajaxUpdate) {
 		this.parent = parent;
 		this.tree = tree;
 		this.elements = {};
@@ -26,7 +26,7 @@
 		this.elementID.icon = this.id + Tree.ID_DEVIDER + Tree.ID_ICON;
 		this.elementID.text = this.id + Tree.ID_DEVIDER + Tree.ID_TEXT;
 		
-		this.getElements(element);
+		this.getElements(element, ajaxUpdate);
 
 		this.eventSelectionClick = this.toggleSelection.bindAsEventListener(this);
 		this.eventMouseOut = this.processMouseOut.bindAsEventListener(this);
@@ -82,7 +82,7 @@
 		}
 	},
 
-	getElements: function(element) {
+	getElements: function(element, ajaxUpdate) {
 		this.childs = [];
 
 		/*var contextMenu = Richfaces.getNSAttribute("oncontextmenu", $(this.elementID.icon));
@@ -92,6 +92,21 @@
 		
 		var childsTd = element.nextSibling;//$(this.elementID.children);
 		
+		if (ajaxUpdate && this.tree.showConnectingLines) {
+			var cell = element.rows[0].cells[0];
+			if (cell.style && cell.style.removeExpression) {
+				cell.style.backgroundImage = cell.currentStyle.backgroundImage;
+				cell.style.removeExpression('backgroundImage');
+			}
+	
+			if (childsTd) {
+				if (childsTd.style && childsTd.style.removeExpression) {
+					childsTd.style.backgroundImage = childsTd.currentStyle.backgroundImage;
+					childsTd.style.removeExpression('backgroundImage');
+				}
+			}
+		}
+
 		if (childsTd) {
 			var child = childsTd.firstChild;
 			while ( child != null )

Modified: trunk/ui/tree/src/main/resources/org/richfaces/renderkit/html/scripts/tree.js
===================================================================
--- trunk/ui/tree/src/main/resources/org/richfaces/renderkit/html/scripts/tree.js	2007-08-24 18:58:45 UTC (rev 2487)
+++ trunk/ui/tree/src/main/resources/org/richfaces/renderkit/html/scripts/tree.js	2007-08-24 19:13:37 UTC (rev 2488)
@@ -19,7 +19,7 @@
 Tree.CLASS_AJAX_SELECTED_LISTENER_FLAG = "ajax_selected_listener_flag";
 
 Tree.prototype = {
-	initialize: function(id, input, switchType, events, onAjaxSelect, toggleOnClick) {
+	initialize: function(id, input, switchType, events, onAjaxSelect, toggleOnClick, showConnectingLines) {
 		this.childs = [];
 		this.elements = {};
 
@@ -33,6 +33,7 @@
 		this.inputId = input;
 		this.input = $(this.inputId);
 		this.toggleOnClick = toggleOnClick;
+		this.showConnectingLines = showConnectingLines;
 
 		var options = Object.extend({
 				columnCount: 0
@@ -107,14 +108,14 @@
 		}.bindAsEventListener(this));
 	},
 
-	getElements: function() {
+	getElements: function(ajaxUpdate) {
 		this.elements.contentTd = $(this.id + 
 			Tree.ID_DEVIDER + Tree.ID_CHILDS_ROW/* + Tree.ID_DEVIDER + Tree.ID_CHILDS_TD*/);
 
 		if (this.elements.contentTd) {
             for(var child = this.elements.contentTd.firstChild; child != null; child = child.nextSibling ) {
                 if (child.nodeType == 1 && child.tagName.toLowerCase() == "table") {
-                    this.addChild(new Tree.Item(child, this, this));
+                    this.addChild(new Tree.Item(child, this, this, ajaxUpdate));
                 }
             }
             /*
@@ -145,7 +146,7 @@
 					}
 					
 					this.childs = [];	
-					this.getElements();
+					this.getElements(true);
 				}
 			}
 
@@ -162,7 +163,7 @@
 			
 			if (cid == nodeId) {
 				child.destroy();
-				node.childs[i] = new Tree.Item(cid, this, child.parent);
+				node.childs[i] = new Tree.Item(cid, this, child.parent, true);
 				break;
 			} else {
 				var scid = cid.substring(0, cid.lastIndexOf(':'));

Modified: trunk/ui/tree/src/main/templates/htmlTree.jspx
===================================================================
--- trunk/ui/tree/src/main/templates/htmlTree.jspx	2007-08-24 18:58:45 UTC (rev 2487)
+++ trunk/ui/tree/src/main/templates/htmlTree.jspx	2007-08-24 19:13:37 UTC (rev 2488)
@@ -59,7 +59,8 @@
 		function(event) {
 			#{this:getAjaxScript(context, component)}
 		},
-		#{component.toggleOnClick}
+		#{component.toggleOnClick},
+		#{component.showConnectingLines}
 		);
 		#{this:getScriptContributions(context, component)}
 	</script> 

Modified: trunk/ui/tree/src/main/templates/htmlTreeNode.jspx
===================================================================
--- trunk/ui/tree/src/main/templates/htmlTreeNode.jspx	2007-08-24 18:58:45 UTC (rev 2487)
+++ trunk/ui/tree/src/main/templates/htmlTreeNode.jspx	2007-08-24 19:13:37 UTC (rev 2488)
@@ -41,6 +41,18 @@
 	        <f:parameter value="id,onclick"/>
 	    </f:call>
 		<td class="dr-tree-h-ic rich-tree-node-handleicon #{line}">
+			<jsp:scriptlet>
+				<![CDATA[
+					if (Boolean.TRUE.equals(component.getAttributes().get("isAjaxUpdateRoot")) && component.getUITree().isShowConnectingLines()) {
+						String lineBasic = getResource("org.richfaces.renderkit.html.images.TreeLineNodeImage").getUri(context, component);
+						String lineLast = getResource("org.richfaces.renderkit.html.images.TreeLineLastImage").getUri(context, component);
+						getUtils().writeAttribute(writer, "style", 
+								"background-image:expression(this.parentNode.parentNode.parentNode.nextSibling.nextSibling ? " +
+										"'url(" + lineBasic + ")' : 'url(" + lineLast + ")')");
+					}
+				]]>
+			</jsp:scriptlet>
+
 			<div>
 				<jsp:scriptlet>
 					<![CDATA[

Modified: trunk/ui/tree/src/test/java/org/richfaces/component/TreeComponentTest.java
===================================================================
--- trunk/ui/tree/src/test/java/org/richfaces/component/TreeComponentTest.java	2007-08-24 18:58:45 UTC (rev 2487)
+++ trunk/ui/tree/src/test/java/org/richfaces/component/TreeComponentTest.java	2007-08-24 19:13:37 UTC (rev 2488)
@@ -500,7 +500,7 @@
 	 */
 	public final void testQueueEventFacesEvent() {
 		NodeExpandedEvent nodeExpandedEvent = new NodeExpandedEvent(tree);
-		NodeSelectedEvent nodeSelectedEvent = new NodeSelectedEvent(tree);
+		NodeSelectedEvent nodeSelectedEvent = new NodeSelectedEvent(tree, null);
 		ExpandAllCommandEvent expandAllCommandEvent = new ExpandAllCommandEvent(tree);
 		DragEvent dragEvent = new DragEvent(tree);
 		DropEvent dropEvent = new DropEvent(tree);
@@ -525,7 +525,7 @@
 		tree.setImmediate(true);
 
 		NodeExpandedEvent nodeExpandedEvent = new NodeExpandedEvent(tree);
-		NodeSelectedEvent nodeSelectedEvent = new NodeSelectedEvent(tree);
+		NodeSelectedEvent nodeSelectedEvent = new NodeSelectedEvent(tree, null);
 		ExpandAllCommandEvent expandAllCommandEvent = new ExpandAllCommandEvent(tree);
 		DragEvent dragEvent = new DragEvent(tree);
 		DropEvent dropEvent = new DropEvent(tree);

Modified: trunk/ui/tree/src/test/java/org/richfaces/component/events/TreeEventsListenersTest.java
===================================================================
--- trunk/ui/tree/src/test/java/org/richfaces/component/events/TreeEventsListenersTest.java	2007-08-24 18:58:45 UTC (rev 2487)
+++ trunk/ui/tree/src/test/java/org/richfaces/component/events/TreeEventsListenersTest.java	2007-08-24 19:13:37 UTC (rev 2488)
@@ -73,7 +73,7 @@
 	}
 
 	public void testNodeSelectedListener() {
-		NodeSelectedEvent event = new NodeSelectedEvent(source);
+		NodeSelectedEvent event = new NodeSelectedEvent(source, null);
 		
 		SelectListener listener = new SelectListener();
 		

Modified: trunk/ui/tree/src/test/java/org/richfaces/component/events/TreeEventsTest.java
===================================================================
--- trunk/ui/tree/src/test/java/org/richfaces/component/events/TreeEventsTest.java	2007-08-24 18:58:45 UTC (rev 2487)
+++ trunk/ui/tree/src/test/java/org/richfaces/component/events/TreeEventsTest.java	2007-08-24 19:13:37 UTC (rev 2488)
@@ -106,7 +106,7 @@
 		assertNotNull(events);
 		assertEquals(0, events.size());
 
-		AjaxSelectedEvent event = new AjaxSelectedEvent(treeNode);
+		AjaxSelectedEvent event = new AjaxSelectedEvent(treeNode, null);
 		TreeEvents.invokeListenerBindings(treeNode, event, facesContext);
 		
 		assertEquals(1, events.size());
@@ -130,7 +130,7 @@
 		assertEquals(0, events.size());
 		assertEquals(0, binding.getInvocationArgs().length);
 
-		AjaxSelectedEvent event = new AjaxSelectedEvent(treeNode);
+		AjaxSelectedEvent event = new AjaxSelectedEvent(treeNode, null);
 		TreeEvents.invokeListenerBindings(treeNode, event, facesContext);
 		
 		assertNotNull(events);
@@ -157,7 +157,7 @@
 		MockMethodBinding binding = new MockMethodBinding();
 		treeNode.setNodeSelectListener(binding);
 	
-		NodeSelectedEvent event = new NodeSelectedEvent(treeNode);
+		NodeSelectedEvent event = new NodeSelectedEvent(treeNode, null);
 		TreeEvents.invokeListenerBindings(treeNode, event, facesContext);
 
 		Object[][] args = binding.getInvocationArgs();

Modified: trunk/ui/tree/src/test/java/org/richfaces/renderkit/TreeRowKeyComparatorTest.java
===================================================================
--- trunk/ui/tree/src/test/java/org/richfaces/renderkit/TreeRowKeyComparatorTest.java	2007-08-24 18:58:45 UTC (rev 2487)
+++ trunk/ui/tree/src/test/java/org/richfaces/renderkit/TreeRowKeyComparatorTest.java	2007-08-24 19:13:37 UTC (rev 2488)
@@ -24,6 +24,7 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.Iterator;
 
 import org.richfaces.model.ListRowKey;
 
@@ -76,20 +77,25 @@
 		list.add(predKey);
 		list.add(supKey);
 		list.add(key);
+		list.add(null);
 		list.add(emptyKey);
+		list.add(null);
 		list.add(predLongKey);
 		
 		Collections.sort(list, comparator);
 		
-		assertEquals(emptyKey, list.get(0));
-		assertEquals(predKey, list.get(1));
-		assertEquals(predLongKey, list.get(2));
-		assertEquals(predSupKey, list.get(3));
-		assertEquals(eqkey, list.get(4));
-		assertEquals(key, list.get(5));
-		assertEquals(supKey, list.get(6));
-		assertEquals(succKey, list.get(7));
-		assertEquals(succSupKey, list.get(8));
+		Iterator iterator = list.iterator();
+		assertNull(iterator.next());
+		assertNull(iterator.next());
+		assertEquals(emptyKey, iterator.next());
+		assertEquals(predKey, iterator.next());
+		assertEquals(predLongKey, iterator.next());
+		assertEquals(predSupKey, iterator.next());
+		assertEquals(eqkey, iterator.next());
+		assertEquals(key, iterator.next());
+		assertEquals(supKey, iterator.next());
+		assertEquals(succKey, iterator.next());
+		assertEquals(succSupKey, iterator.next());
 	
 	}
 }




More information about the richfaces-svn-commits mailing list