[richfaces-svn-commits] JBoss Rich Faces SVN: r2454 - in trunk: framework/api/src/main/java/org/richfaces/model and 9 other directories.
richfaces-svn-commits at lists.jboss.org
richfaces-svn-commits at lists.jboss.org
Thu Aug 23 13:50:34 EDT 2007
Author: nbelaevski
Date: 2007-08-23 13:50:34 -0400 (Thu, 23 Aug 2007)
New Revision: 2454
Added:
trunk/ui/tree/src/test/java/org/richfaces/renderkit/
trunk/ui/tree/src/test/java/org/richfaces/renderkit/TreeRowKeyComparatorTest.java
Modified:
trunk/framework/api/src/main/java/org/richfaces/event/AjaxSelectedEvent.java
trunk/framework/api/src/main/java/org/richfaces/event/NodeSelectedEvent.java
trunk/framework/api/src/main/java/org/richfaces/model/ListRowKey.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/component/UITreeNode.java
trunk/ui/tree/src/main/java/org/richfaces/renderkit/NodeRendererBase.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.js
trunk/ui/tree/src/test/java/org/richfaces/component/ListRowKeyTest.java
Log:
http://jira.jboss.com/jira/browse/RF-642
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-23 17:45:15 UTC (rev 2453)
+++ trunk/framework/api/src/main/java/org/richfaces/event/AjaxSelectedEvent.java 2007-08-23 17:50:34 UTC (rev 2454)
@@ -38,8 +38,4 @@
super(component);
}
- public AjaxSelectedEvent(UIComponent component, boolean duplicate) {
- super(component, duplicate);
- }
-
}
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-23 17:45:15 UTC (rev 2453)
+++ trunk/framework/api/src/main/java/org/richfaces/event/NodeSelectedEvent.java 2007-08-23 17:50:34 UTC (rev 2454)
@@ -32,18 +32,10 @@
*/
public class NodeSelectedEvent extends FacesEvent {
- private boolean duplicate = false;
-
public NodeSelectedEvent(UIComponent component) {
super(component);
}
- public NodeSelectedEvent(UIComponent component, boolean duplicate) {
- super(component);
-
- this.duplicate = duplicate;
- }
-
/**
*
*/
@@ -64,8 +56,4 @@
public void processListener(FacesListener listener) {
((NodeSelectedListener) listener).processSelection(this);
}
-
- public boolean isDuplicate() {
- return duplicate;
- }
}
Modified: trunk/framework/api/src/main/java/org/richfaces/model/ListRowKey.java
===================================================================
--- trunk/framework/api/src/main/java/org/richfaces/model/ListRowKey.java 2007-08-23 17:45:15 UTC (rev 2453)
+++ trunk/framework/api/src/main/java/org/richfaces/model/ListRowKey.java 2007-08-23 17:50:34 UTC (rev 2454)
@@ -187,12 +187,7 @@
if (rowKey instanceof ListRowKey) {
ListRowKey listRowKey = (ListRowKey) rowKey;
- int commonLength = getCommonPathLength(listRowKey);
- if (commonLength != 0) {
- return commonLength == depth();
- } else {
- return rowKey.depth() == 0;
- }
+ return depth() == getCommonPathLength(listRowKey);
} else {
return super.isSubKey(rowKey);
}
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-23 17:45:15 UTC (rev 2453)
+++ trunk/samples/tree-demo/src/main/java/org/richfaces/Bean.java 2007-08-23 17:50:34 UTC (rev 2454)
@@ -34,17 +34,17 @@
import javax.faces.context.FacesContext;
import javax.faces.event.FacesEvent;
+import org.ajax4jsf.context.AjaxContext;
+import org.richfaces.component.UITree;
+import org.richfaces.component.UITreeNode;
+import org.richfaces.component.xml.XmlTreeDataBuilder;
import org.richfaces.event.DropEvent;
-import org.ajax4jsf.context.AjaxContext;
+import org.richfaces.event.NodeExpandedEvent;
+import org.richfaces.event.NodeSelectedEvent;
import org.richfaces.model.ListRowKey;
import org.richfaces.model.TreeNode;
import org.richfaces.model.TreeNodeImpl;
import org.richfaces.model.TreeRowKey;
-import org.richfaces.component.UITree;
-import org.richfaces.component.UITreeNode;
-import org.richfaces.event.NodeExpandedEvent;
-import org.richfaces.event.NodeSelectedEvent;
-import org.richfaces.component.xml.XmlTreeDataBuilder;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
@@ -186,6 +186,16 @@
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);
+ }
+
+ keys.add(tree.getRowKey());
+ keys.add(new ListRowKey());
+
if (getTree(event).getTreeNode()!=null) {
selectedNode = getTree(event).getTreeNode();
initData();
Modified: trunk/samples/tree-demo/src/main/webapp/pages/index.jsp
===================================================================
--- trunk/samples/tree-demo/src/main/webapp/pages/index.jsp 2007-08-23 17:45:15 UTC (rev 2453)
+++ trunk/samples/tree-demo/src/main/webapp/pages/index.jsp 2007-08-23 17:50:34 UTC (rev 2454)
@@ -1,4 +1,6 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<!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"%>
<%@ taglib uri="http://richfaces.org/a4j" prefix="a4j" %>
@@ -118,7 +120,7 @@
onselected="window.status='selectedNode: '+event.selectedNode;"
onexpand="window.status='expandedNode: '+event.expandedNode"
oncollapse="window.status='collapsedNode: '+event.collapsedNode"
- ajaxSubmitSelection="true" reRender="outputText, selectOneListbox"
+ ajaxSubmitSelection="true"
preserveModel="none"
dragIndicator="treeIndicator"
immediate="false"
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-23 17:45:15 UTC (rev 2453)
+++ trunk/ui/tree/src/main/java/org/richfaces/component/UITree.java 2007-08-23 17:50:34 UTC (rev 2454)
@@ -321,8 +321,8 @@
AbstractTreeDataModel dataModel = (AbstractTreeDataModel) getExtendedDataModel();
dataModel.walk(faces, visitor, range, rowKey,
argument,
- faces.getExternalContext().getRequestParameterMap().get(
- getBaseClientId(faces) + LAST_ELEMENT_FLAG) != null);
+ false/*faces.getExternalContext().getRequestParameterMap().get(
+ getBaseClientId(faces) + LAST_ELEMENT_FLAG) != null*/);
} finally {
try {
setRowKey(faces, savedRowKey);
@@ -492,9 +492,7 @@
if (event instanceof NodeSelectedEvent) {
NodeSelectedEvent selectedEvent = (NodeSelectedEvent) event;
- if (!selectedEvent.isDuplicate()) {
- setSelected();
- }
+ setSelected();
}
// fire node events
Modified: trunk/ui/tree/src/main/java/org/richfaces/component/UITreeNode.java
===================================================================
--- trunk/ui/tree/src/main/java/org/richfaces/component/UITreeNode.java 2007-08-23 17:45:15 UTC (rev 2453)
+++ trunk/ui/tree/src/main/java/org/richfaces/component/UITreeNode.java 2007-08-23 17:50:34 UTC (rev 2454)
@@ -20,7 +20,6 @@
import org.richfaces.event.DropEvent;
import org.richfaces.event.DropListener;
import org.richfaces.event.NodeExpandedListener;
-import org.richfaces.event.NodeSelectedEvent;
import org.richfaces.event.NodeSelectedListener;
import org.richfaces.event.TreeListenerEventsProducer;
@@ -108,13 +107,6 @@
FacesContext context = getFacesContext();
UITree tree = getUITree();
- if (event instanceof NodeSelectedEvent) {
- NodeSelectedEvent selectedEvent = (NodeSelectedEvent) event;
- if (!selectedEvent.isDuplicate()) {
- tree.setSelected();
- }
- }
-
TreeEvents.invokeListenerBindings(this, event, context);
//TODO quick fix for UITree to invoke listeners
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-23 17:45:15 UTC (rev 2453)
+++ trunk/ui/tree/src/main/java/org/richfaces/renderkit/NodeRendererBase.java 2007-08-23 17:50:34 UTC (rev 2454)
@@ -289,11 +289,11 @@
if (tree.getAttributes().get(
UITree.SELECTED_NODE_PARAMETER_NAME) == null) {
+ new NodeSelectedEvent(tree).queue();
new NodeSelectedEvent(node).queue();
- new NodeSelectedEvent(tree, true).queue();
} else {
+ new AjaxSelectedEvent(tree).queue();
new AjaxSelectedEvent(node).queue();
- new AjaxSelectedEvent(tree, true).queue();
}
}
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-23 17:45:15 UTC (rev 2453)
+++ trunk/ui/tree/src/main/java/org/richfaces/renderkit/TreeRendererBase.java 2007-08-23 17:50:34 UTC (rev 2454)
@@ -23,6 +23,8 @@
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;
@@ -52,6 +54,35 @@
public abstract class TreeRendererBase extends CompositeRenderer {
+ protected final static Comparator treeRowKeyComparator = new Comparator() {
+
+ public int compare(Object key1, Object key2) {
+ TreeRowKey treeRowKey1 = (TreeRowKey) key1;
+ TreeRowKey treeRowKey2 = (TreeRowKey) key2;
+
+ Iterator iterator1 = treeRowKey1.iterator();
+ Iterator iterator2 = treeRowKey2.iterator();
+
+ while (iterator1.hasNext() && iterator2.hasNext()) {
+ String id1 = iterator1.next().toString();
+ String id2 = iterator2.next().toString();
+
+ int cr = id1.compareTo(id2);
+ if (cr != 0) {
+ return cr;
+ }
+ }
+
+ if (iterator1.hasNext()) {
+ return 1;
+ } else if (iterator2.hasNext()) {
+ return -1;
+ } else {
+ return 0;
+ }
+ }
+ };
+
private final class RendererDataModelEventNavigator extends
TreeDataModelEventNavigator {
private final FacesContext context;
@@ -62,7 +93,6 @@
private String clientId;
private boolean expanded;
private boolean showLines;
- private boolean isLastElement;
private RendererDataModelEventNavigator(UITree tree,
TreeRowKey floatingKey, FacesContext context, Flag droppedDownToLevelFlag) {
@@ -129,10 +159,7 @@
public void beforeUp(int levels) throws IOException {
}
- int stat = 0;
-
public void openDiv(Context context) throws IOException {
- stat++;
writer.startElement("div", tree);
if (context == null) {
@@ -159,12 +186,7 @@
public void closeDiv() throws IOException {
writer.endElement("div");
- stat--;
}
-
- public int getStat() {
- return stat;
- }
}
private class DataVisitorWithLastElement implements DataVisitor,
@@ -172,8 +194,6 @@
private boolean isLastElement = false;
- private final ResponseWriter writer;
-
private final Flag flag;
private final UITree tree;
@@ -182,10 +202,8 @@
private TreeStateAdvisor methodBindingAdvisor = null;
- private DataVisitorWithLastElement(ResponseWriter writer,
- Flag flag, UITree tree,
+ private DataVisitorWithLastElement(Flag flag, UITree tree,
RendererDataModelEventNavigator navigator) {
- this.writer = writer;
this.flag = flag;
this.tree = tree;
this.navigator = navigator;
@@ -208,8 +226,20 @@
try {
nodeFacet.getAttributes().put("isLastElement", new Boolean(isLastElement));
- renderChild(context, nodeFacet);
+ ResponseWriter writer = context.getResponseWriter();
+ if (isLastElement) {
+ writer.startElement("p", tree);
+ writer.writeAttribute("class", "last-node", null);
+ writer.endElement("p");
+ writer.startElement("div", tree);
+ renderChild(context, nodeFacet);
+ writer.endElement("div");
+ } else {
+ renderChild(context, nodeFacet);
+ }
+
+
c = new Context();
c.setClientId(nodeFacet.getClientId(context) + NamingContainer.SEPARATOR_CHAR);
c.setLast(this.isLastElement);
@@ -331,12 +361,38 @@
try {
Set ajaxKeys = tree.getAjaxKeys();
if (ajaxKeys != null) {
- Iterator ajaxKeysItr = ajaxKeys.iterator();
+ List list = new ArrayList(ajaxKeys.size());
+ list.addAll(ajaxKeys);
+ Collections.sort(list, treeRowKeyComparator);
+ Iterator ajaxKeysItr = list.iterator();
+ TreeRowKey lastKey = null;
+
while (ajaxKeysItr.hasNext()) {
TreeRowKey key = (TreeRowKey) ajaxKeysItr.next();
+
+ if (lastKey == null) {
+ lastKey = key;
+ } else {
+ if (!lastKey.isSubKey(key)) {
+ lastKey = key;
+ } else {
+ //skip nodes that's parent nodes have been rendered
+ continue;
+ }
+ }
+
+ if (key != null && key.depth() == 0) {
+ key = null;
+ }
+
tree.setRowKey(context, key);
- String id = tree.getNodeFacet().getClientId(context);
+ String id;
+ if (key == null) {
+ id = tree.getClientId(context);
+ } else {
+ id = tree.getNodeFacet().getClientId(context);
+ }
String treeChildrenId = id + NamingContainer.SEPARATOR_CHAR + "childs";
if (ids.isEmpty() || ids.contains(id) || ids.contains(tree.getClientId(context))/* handle tree updates requests */) {
writeContent(context, tree, key);
@@ -349,7 +405,7 @@
}
}
- ajaxKeys.clear();
+ //ajaxKeys.clear();
}
} catch (Exception e) {
throw new FacesException(e);
@@ -525,8 +581,7 @@
};
- input.walk(context, new DataVisitorWithLastElement(writer,
- droppedDownToLevelFlag, input,
+ input.walk(context, new DataVisitorWithLastElement(droppedDownToLevelFlag, input,
levelNavigator), treeRange, key, null);
/*if (key != null) {
@@ -534,8 +589,6 @@
}*/
levelNavigator.followRowKey(context, null);
-
- System.out.println("TreeRendererBase.writeContent() " + levelNavigator.getStat());
} finally {
input.setRowKey(context, null);
input.restoreOrigValue();
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-23 17:45:15 UTC (rev 2453)
+++ trunk/ui/tree/src/main/resources/org/richfaces/renderkit/html/css/tree.xcss 2007-08-23 17:50:34 UTC (rev 2454)
@@ -80,6 +80,10 @@
cursor: pointer;
}
+.last-node {
+ display: none;
+}
+
]]>
</f:verbatim>
@@ -112,11 +116,14 @@
<f:resource f:key="org.richfaces.renderkit.html.images.TreeLineNodeImage"/>
</u:style>
</u:selector>
-<u:selector name=".dr-tree-h-ic-line-last">
+<u:selector name="p.last-node+* .rich-tree-node-handleicon">
<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:style name="background-image" value="none" />
+</u:selector>
<u:selector name=".dr-tree-h-ic-line-exp">
<u:style name="background-image">
<f:resource f:key="org.richfaces.renderkit.html.images.TreeLineExpandedImage"/>
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-23 17:45:15 UTC (rev 2453)
+++ trunk/ui/tree/src/main/resources/org/richfaces/renderkit/html/scripts/tree.js 2007-08-23 17:50:34 UTC (rev 2454)
@@ -136,7 +136,17 @@
if (nodeIds) {
for (var i = 0; i < nodeIds.length; i++ ) {
var nodeId = nodeIds[i];
- this._getNodeElements(this, nodeId, nodeId.substring(0, nodeId.lastIndexOf(':')));
+ if (nodeId != this.id) {
+ this._getNodeElements(this, nodeId, nodeId.substring(0, nodeId.lastIndexOf(':')));
+ } else {
+ for (var i = 0; i < this.childs.length; i++) {
+ var child = this.childs[i];
+ child.destroy();
+ }
+
+ this.childs = [];
+ this.getElements();
+ }
}
//input holding selection has been refreshed
Modified: trunk/ui/tree/src/test/java/org/richfaces/component/ListRowKeyTest.java
===================================================================
--- trunk/ui/tree/src/test/java/org/richfaces/component/ListRowKeyTest.java 2007-08-23 17:45:15 UTC (rev 2453)
+++ trunk/ui/tree/src/test/java/org/richfaces/component/ListRowKeyTest.java 2007-08-23 17:50:34 UTC (rev 2454)
@@ -241,10 +241,10 @@
ListRowKey listRowKey1 = new ListRowKey(keyBase);
- assertFalse(new ListRowKey().isSubKey(listRowKey1));
- assertFalse(new ListRowKey().isSubKey(listRowKey));
- assertTrue(listRowKey.isSubKey(new ListRowKey()));
- assertTrue(listRowKey1.isSubKey(new ListRowKey()));
+ assertTrue(new ListRowKey().isSubKey(listRowKey1));
+ assertTrue(new ListRowKey().isSubKey(listRowKey));
+ assertFalse(listRowKey.isSubKey(new ListRowKey()));
+ assertFalse(listRowKey1.isSubKey(new ListRowKey()));
assertTrue(listRowKey.isSubKey(listRowKey1));
assertFalse(listRowKey1.isSubKey(listRowKey));
Added: trunk/ui/tree/src/test/java/org/richfaces/renderkit/TreeRowKeyComparatorTest.java
===================================================================
--- trunk/ui/tree/src/test/java/org/richfaces/renderkit/TreeRowKeyComparatorTest.java (rev 0)
+++ trunk/ui/tree/src/test/java/org/richfaces/renderkit/TreeRowKeyComparatorTest.java 2007-08-23 17:50:34 UTC (rev 2454)
@@ -0,0 +1,95 @@
+/**
+ * License Agreement.
+ *
+ * JBoss RichFaces - Ajax4jsf Component Library
+ *
+ * Copyright (C) 2007 Exadel, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1 as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+package org.richfaces.renderkit;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+
+import org.richfaces.model.ListRowKey;
+
+import junit.framework.TestCase;
+
+/**
+ *
+ * <br /><br />
+ *
+ * Created 22.08.2007
+ * @author Nick Belaevski
+ * @since 3.1
+ */
+
+public class TreeRowKeyComparatorTest extends TestCase {
+
+ /* (non-Javadoc)
+ * @see junit.framework.TestCase#setUp()
+ */
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ /* (non-Javadoc)
+ * @see junit.framework.TestCase#tearDown()
+ */
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ public void testComparator() throws Exception {
+ Comparator comparator = TreeRendererBase.treeRowKeyComparator;
+
+ ListRowKey emptyKey = new ListRowKey();
+ ListRowKey key = new ListRowKey(new Integer(23));
+ ListRowKey eqkey = new ListRowKey(new Integer(23));
+ ListRowKey supKey = new ListRowKey(new ListRowKey(new Integer(23)), new Integer(34));
+
+ ListRowKey predLongKey = new ListRowKey(new ListRowKey(new ListRowKey(new Integer(22)), new Integer(0)), new Integer(8));
+ ListRowKey predKey = new ListRowKey(new Integer(22));
+ ListRowKey predSupKey = new ListRowKey(new ListRowKey(new Integer(22)), new Integer(34));
+ ListRowKey succKey = new ListRowKey(new ListRowKey(new Integer(25)), new Integer(34));
+ ListRowKey succSupKey = new ListRowKey(new ListRowKey(new ListRowKey(new Integer(25)), new Integer(34)), new Integer(2));
+
+ ArrayList list = new ArrayList();
+ list.add(eqkey);
+ list.add(succSupKey);
+ list.add(succKey);
+ list.add(predSupKey);
+ list.add(predKey);
+ list.add(supKey);
+ list.add(key);
+ list.add(emptyKey);
+ 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));
+
+ }
+}
More information about the richfaces-svn-commits
mailing list