Author: ilya_shaikovsky
Date: 2008-07-21 06:30:06 -0400 (Mon, 21 Jul 2008)
New Revision: 9702
Added:
trunk/samples/richfaces-demo/src/main/java/org/richfaces/demo/tree/SimpleTreeDndBean.java
trunk/samples/richfaces-demo/src/main/webapp/richfaces/tree/examples/simple-tree-data-dnd.properties
trunk/samples/richfaces-demo/src/main/webapp/richfaces/tree/examples/simpleDnd.xhtml
trunk/samples/richfaces-demo/src/main/webapp/richfaces/tree/simple-tree-dnd.xhtml
Modified:
trunk/samples/richfaces-demo/src/main/java/org/richfaces/demo/tree/SimpleTreeBean.java
trunk/samples/richfaces-demo/src/main/webapp/WEB-INF/faces-config.xml
trunk/samples/richfaces-demo/src/main/webapp/richfaces/tree.xhtml
Log:
simple-tree-dnd draft
Modified:
trunk/samples/richfaces-demo/src/main/java/org/richfaces/demo/tree/SimpleTreeBean.java
===================================================================
---
trunk/samples/richfaces-demo/src/main/java/org/richfaces/demo/tree/SimpleTreeBean.java 2008-07-21
09:02:31 UTC (rev 9701)
+++
trunk/samples/richfaces-demo/src/main/java/org/richfaces/demo/tree/SimpleTreeBean.java 2008-07-21
10:30:06 UTC (rev 9702)
@@ -23,9 +23,12 @@
import java.io.IOException;
import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Properties;
import javax.faces.FacesException;
+import javax.faces.component.UIComponent;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
@@ -39,7 +42,6 @@
private TreeNode rootNode = null;
private String nodeTitle;
-
private static final String DATA_PATH =
"/richfaces/tree/examples/simple-tree-data.properties";
private void addNodes(String path, TreeNode node, Properties properties) {
@@ -54,9 +56,7 @@
TreeNodeImpl nodeImpl = new TreeNodeImpl();
nodeImpl.setData(value);
node.addChild(new Integer(counter), nodeImpl);
-
addNodes(key, nodeImpl, properties);
-
counter++;
} else {
end = true;
@@ -96,10 +96,7 @@
return rootNode;
}
- public void processSelection(NodeSelectedEvent event) {
- UITree tree = (UITree) event.getComponent();
- nodeTitle = (String) tree.getRowData();
- }
+
public String getNodeTitle() {
return nodeTitle;
@@ -108,5 +105,6 @@
public void setNodeTitle(String nodeTitle) {
this.nodeTitle = nodeTitle;
}
+
}
Added:
trunk/samples/richfaces-demo/src/main/java/org/richfaces/demo/tree/SimpleTreeDndBean.java
===================================================================
---
trunk/samples/richfaces-demo/src/main/java/org/richfaces/demo/tree/SimpleTreeDndBean.java
(rev 0)
+++
trunk/samples/richfaces-demo/src/main/java/org/richfaces/demo/tree/SimpleTreeDndBean.java 2008-07-21
10:30:06 UTC (rev 9702)
@@ -0,0 +1,211 @@
+/**
+ * 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.demo.tree;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import javax.faces.FacesException;
+import javax.faces.component.UIComponent;
+import javax.faces.context.ExternalContext;
+import javax.faces.context.FacesContext;
+
+import org.ajax4jsf.context.AjaxContext;
+import org.richfaces.component.UITree;
+import org.richfaces.component.UITreeNode;
+import org.richfaces.component.html.HtmlTree;
+import org.richfaces.event.DropEvent;
+import org.richfaces.event.NodeSelectedEvent;
+import org.richfaces.model.TreeNode;
+import org.richfaces.model.TreeNodeImpl;
+import org.richfaces.model.TreeRowKey;
+
+public class SimpleTreeDndBean {
+
+ private TreeNode rootNode = null;
+ private List<String> selectedNodeChildren = new ArrayList<String>();
+ private String nodeTitle;
+
+ private static final String DATA_PATH =
"/richfaces/tree/examples/simple-tree-data-dnd.properties";
+
+ private void addNodes(String path, TreeNode node, Properties properties) {
+ boolean end = false;
+ int counter = 1;
+
+ while (!end) {
+ String key = path != null ? path + '.' + counter : String.valueOf(counter);
+
+ String value = properties.getProperty(key);
+ if (value != null) {
+ TreeNodeImpl nodeImpl = new TreeNodeImpl();
+ nodeImpl.setData(value);
+ node.addChild(new Integer(counter), nodeImpl);
+
+ addNodes(key, nodeImpl, properties);
+
+ counter++;
+ } else {
+ end = true;
+ }
+ }
+ }
+
+ private void loadTree() {
+ FacesContext facesContext = FacesContext.getCurrentInstance();
+ ExternalContext externalContext = facesContext.getExternalContext();
+ InputStream dataStream = externalContext.getResourceAsStream(DATA_PATH);
+ try {
+ Properties properties = new Properties();
+ properties.load(dataStream);
+
+ rootNode = new TreeNodeImpl();
+ addNodes(null, rootNode, properties);
+
+ } catch (IOException e) {
+ throw new FacesException(e.getMessage(), e);
+ } finally {
+ if (dataStream != null) {
+ try {
+ dataStream.close();
+ } catch (IOException e) {
+ externalContext.log(e.getMessage(), e);
+ }
+ }
+ }
+ }
+
+ public void processSelection(NodeSelectedEvent event) {
+ HtmlTree tree = (HtmlTree) event.getComponent();
+ nodeTitle = (String) tree.getRowData();
+ selectedNodeChildren.clear();
+ TreeNode currentNode = tree.getModelTreeNode(tree.getRowKey());
+ if (currentNode.isLeaf()){
+ selectedNodeChildren.add((String)currentNode.getData());
+ }else
+ {
+ Iterator<Map.Entry<Object, TreeNode>> it = currentNode.getChildren();
+ while (it!=null &&it.hasNext()) {
+ Map.Entry<Object, TreeNode> entry = it.next();
+ selectedNodeChildren.add(entry.getValue().getData().toString());
+ }
+ }
+ }
+
+ private Object getNewId(TreeNode parentNode) {
+ Map<Object, TreeNode> childs = new HashMap<Object, TreeNode>();
+ Iterator<Map.Entry<Object, TreeNode>> iter = parentNode.getChildren();
+ while (iter != null && iter.hasNext()) {
+ Map.Entry<Object, TreeNode> entry = iter.next();
+ childs.put(entry.getKey(), entry.getValue());
+ }
+
+ Integer index = 1;
+ while (childs.containsKey(index)) {
+ index++;
+ }
+ return index;
+ }
+
+ public void dropListener(DropEvent dropEvent) {
+ // resolve drag source attributes
+ UITreeNode srcNode = (dropEvent.getDraggableSource() instanceof UITreeNode) ?
(UITreeNode) dropEvent.getDraggableSource() : null;
+ UITree srcTree = srcNode != null ? srcNode.getUITree() : null;
+ TreeRowKey dragNodeKey = (dropEvent.getDragValue() instanceof TreeRowKey) ?
(TreeRowKey) dropEvent.getDragValue() : null;
+ TreeNode draggedNode = dragNodeKey != null ? srcTree.getTreeNode(dragNodeKey) : null;
+
+ // resolve drag destination attributes
+ UITreeNode destNode = (dropEvent.getSource() instanceof UITreeNode) ? (UITreeNode)
dropEvent.getSource() : null;
+ UITree destTree = destNode != null ? destNode.getUITree() : null;
+ TreeRowKey dropNodeKey = (dropEvent.getDropValue() instanceof TreeRowKey) ?
(TreeRowKey) dropEvent.getDropValue() : null;
+ TreeNode droppedInNode = dropNodeKey != null ? destTree.getTreeNode(dropNodeKey) :
null;
+
+ // Note: check if we dropped node on to itself or to item instead of folder here
+ if (droppedInNode != null && (droppedInNode.equals(draggedNode) ||
droppedInNode.getParent().getParent() != null || draggedNode.getParent().getParent() ==
null)) {
+ System.out.println("Warning: Can't drop on itself or to pic itself! Also
can't move folders");
+ return;
+ }
+
+ FacesContext context = FacesContext.getCurrentInstance();
+
+ if (dropNodeKey != null) {
+ // add destination node for rerender
+ destTree.addRequestKey(dropNodeKey);
+
+ Object state = null;
+ if (dragNodeKey != null) { // Drag from this or other tree
+ TreeNode parentNode = draggedNode.getParent();
+ // 1. remove node from tree
+ state = srcTree.removeNode(dragNodeKey);
+ // 2. add parent for rerender
+ Object rowKey = srcTree.getTreeNodeRowKey(parentNode);
+ srcTree.addRequestKey(rowKey);
+ } else if (dropEvent.getDragValue() != null) { // Drag from some drag source
+ draggedNode = new TreeNodeImpl<String>();
+ draggedNode.setData(dropEvent.getDragValue().toString());
+ }
+
+ // generate new node id
+ Object id = getNewId(destTree.getTreeNode(dropNodeKey));
+ destTree.addNode(dropNodeKey, draggedNode, id, state);
+ }
+
+ AjaxContext ac = AjaxContext.getCurrentInstance();
+ // Add destination tree to reRender
+ try {
+ ac.addComponentToAjaxRender(destTree);
+ } catch (Exception e) {
+ System.err.print(e.getMessage());
+ }
+
+
+ }
+
+ public List<String> getSelectedNodeChildren() {
+ return selectedNodeChildren;
+ }
+
+ public void setSelectedNodeChildren(List<String> selectedNodeChildren) {
+ this.selectedNodeChildren = selectedNodeChildren;
+ }
+
+ public TreeNode getTreeNode() {
+ if (rootNode == null) {
+ loadTree();
+ }
+ return rootNode;
+ }
+
+ public String getNodeTitle() {
+ return nodeTitle;
+ }
+
+ public void setNodeTitle(String nodeTitle) {
+ this.nodeTitle = nodeTitle;
+ }
+
+}
Modified: trunk/samples/richfaces-demo/src/main/webapp/WEB-INF/faces-config.xml
===================================================================
--- trunk/samples/richfaces-demo/src/main/webapp/WEB-INF/faces-config.xml 2008-07-21
09:02:31 UTC (rev 9701)
+++ trunk/samples/richfaces-demo/src/main/webapp/WEB-INF/faces-config.xml 2008-07-21
10:30:06 UTC (rev 9702)
@@ -323,6 +323,11 @@
<managed-bean-class>org.richfaces.demo.slides.SlidesBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
+ <managed-bean>
+ <managed-bean-name>simpleTreeDndBean</managed-bean-name>
+
<managed-bean-class>org.richfaces.demo.tree.SimpleTreeDndBean</managed-bean-class>
+ <managed-bean-scope>session</managed-bean-scope>
+ </managed-bean>
<navigation-rule>
<from-view-id>/richfaces/include/examples/wstep1.xhtml</from-view-id>
<navigation-case>
Added:
trunk/samples/richfaces-demo/src/main/webapp/richfaces/tree/examples/simple-tree-data-dnd.properties
===================================================================
---
trunk/samples/richfaces-demo/src/main/webapp/richfaces/tree/examples/simple-tree-data-dnd.properties
(rev 0)
+++
trunk/samples/richfaces-demo/src/main/webapp/richfaces/tree/examples/simple-tree-data-dnd.properties 2008-07-21
10:30:06 UTC (rev 9702)
@@ -0,0 +1,11 @@
+1=Unsorted
+1.1=pic1.jpg
+1.2=pic2.jpg
+1.3=pic3.jpg
+1.4=pic4.jpg
+1.5=pic5.jpg
+1.6=pic6.jpg
+1.7=pic7.jpg
+1.8=pic8.jpg
+2 = Favorites
+3 = Trash
\ No newline at end of file
Added:
trunk/samples/richfaces-demo/src/main/webapp/richfaces/tree/examples/simpleDnd.xhtml
===================================================================
--- trunk/samples/richfaces-demo/src/main/webapp/richfaces/tree/examples/simpleDnd.xhtml
(rev 0)
+++
trunk/samples/richfaces-demo/src/main/webapp/richfaces/tree/examples/simpleDnd.xhtml 2008-07-21
10:30:06 UTC (rev 9702)
@@ -0,0 +1,40 @@
+<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
+
xmlns:ui="http://java.sun.com/jsf/facelets"
+
xmlns:h="http://java.sun.com/jsf/html"
+
xmlns:f="http://java.sun.com/jsf/core"
+
xmlns:a4j="http://richfaces.org/a4j"
+
xmlns:rich="http://richfaces.org/rich">
+
+ <style>
+ .col1, .col2 {
+ width:50%;
+ vertical-align:top;
+ }
+ .rich-table-cell, .rich-table{
+ border:none;
+ }
+ </style>
+
+
+ <h:form>
+ <h:panelGrid columns="2" width="100%"
columnClasses="col1,col2">
+
+ <rich:tree style="width:300px"
nodeSelectListener="#{simpleTreeDndBean.processSelection}"
+ reRender="selectedNode" ajaxSubmitSelection="true"
switchType="client"
+ value="#{simpleTreeDndBean.treeNode}" var="item"
id="tree" dragType="pic"
+ acceptedTypes="pic" dragIndicator="indicator"
+ dropListener="#{simpleTreeDndBean.dropListener}">
+ <rich:treeNode>
+ <h:outputText value="#{item}"/>
+ </rich:treeNode>
+ </rich:tree>
+ <rich:panel id="selectedNode">
+ <rich:dataGrid value="#{simpleTreeDndBean.selectedNodeChildren}"
var="pic" columns="3" border="0">
+ <h:graphicImage value="/richfaces/jQuery/images/#{pic}"/>
+ </rich:dataGrid>
+ </rich:panel>
+ </h:panelGrid>
+
+ </h:form>
+
+</ui:composition>
\ No newline at end of file
Added: trunk/samples/richfaces-demo/src/main/webapp/richfaces/tree/simple-tree-dnd.xhtml
===================================================================
--- trunk/samples/richfaces-demo/src/main/webapp/richfaces/tree/simple-tree-dnd.xhtml
(rev 0)
+++
trunk/samples/richfaces-demo/src/main/webapp/richfaces/tree/simple-tree-dnd.xhtml 2008-07-21
10:30:06 UTC (rev 9702)
@@ -0,0 +1,24 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html
xmlns="http://www.w3.org/1999/xhtml"
+
xmlns:ui="http://java.sun.com/jsf/facelets"
+
xmlns:h="http://java.sun.com/jsf/html"
+
xmlns:f="http://java.sun.com/jsf/core"
+
xmlns:a4j="http://richfaces.org/a4j"
+
xmlns:rich="http://richfaces.org/rich">
+ <ui:composition template="/templates/component-sample.xhtml">
+ <ui:define name="sample">
+
+ <p>
+ Tree Dnd Example
+ </p>
+
+ <div class="sample-container" >
+ <ui:include src="/richfaces/tree/examples/simpleDnd.xhtml"/>
+ <ui:include src="/templates/include/sourceview.xhtml">
+ <ui:param name="sourcepath"
value="/richfaces/tree/examples/simpleDnd.xhtml"/>
+ <ui:param name="openlabel" value="Open Page Source" />
+ </ui:include>
+ </div>
+ </ui:define>
+ </ui:composition>
+</html>
Modified: trunk/samples/richfaces-demo/src/main/webapp/richfaces/tree.xhtml
===================================================================
--- trunk/samples/richfaces-demo/src/main/webapp/richfaces/tree.xhtml 2008-07-21 09:02:31
UTC (rev 9701)
+++ trunk/samples/richfaces-demo/src/main/webapp/richfaces/tree.xhtml 2008-07-21 10:30:06
UTC (rev 9702)
@@ -18,6 +18,9 @@
<rich:tab name="model" label="Default Tree Model">
<ui:include src="/richfaces/tree/simple-tree.xhtml" />
</rich:tab>
+ <rich:tab name="dnd" label="Editable Tree with Drag and Drop
support">
+ <ui:include src="/richfaces/tree/simple-tree-dnd.xhtml" />
+ </rich:tab>
<rich:tab name="info" label="Tag Information">
<rich:insert
src="/WEB-INF/#{componentNavigator.currentComponent.tagInfoLocation}"
errorContent="/templates/include/tagInfoNotes.xhtml" />