Author: nbelaevski
Date: 2008-07-14 20:27:44 -0400 (Mon, 14 Jul 2008)
New Revision: 9589
Added:
trunk/samples/treeModelDemo/src/main/java/org/richfaces/Loader.java
trunk/samples/treeModelDemo/src/main/resources/org/richfaces/digester-rules.dtd
trunk/samples/treeModelDemo/src/main/resources/org/richfaces/tree-model-rules.xml
trunk/samples/treeModelDemo/src/main/webapp/pages/rf-1081.jsp
Removed:
trunk/samples/treeModelDemo/src/main/java/org/richfaces/service/
trunk/samples/treeModelDemo/src/main/resources/org/richfaces/service/
Modified:
trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/ArchiveEntry.java
trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/ArchiveFile.java
trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/Class.java
trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/Directory.java
trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/Entry.java
trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/File.java
trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/Package.java
trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/Project.java
trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/SourceDirectory.java
trunk/samples/treeModelDemo/src/main/webapp/WEB-INF/faces-config.xml
trunk/samples/treeModelDemo/src/main/webapp/pages/index.jsp
Log:
Sample for
http://jira.jboss.com/jira/browse/RF-1081 added
Copied: trunk/samples/treeModelDemo/src/main/java/org/richfaces/Loader.java (from rev
9555, trunk/samples/treeModelDemo/src/main/java/org/richfaces/service/Loader.java)
===================================================================
--- trunk/samples/treeModelDemo/src/main/java/org/richfaces/Loader.java
(rev 0)
+++ trunk/samples/treeModelDemo/src/main/java/org/richfaces/Loader.java 2008-07-15
00:27:44 UTC (rev 9589)
@@ -0,0 +1,86 @@
+/**
+ *
+ */
+package org.richfaces;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.faces.FacesException;
+
+import org.apache.commons.digester.Digester;
+import org.apache.commons.digester.xmlrules.DigesterLoader;
+import org.richfaces.component.UITree;
+import org.richfaces.component.UITreeNode;
+import org.richfaces.event.DropEvent;
+import org.richfaces.model.Entry;
+import org.xml.sax.SAXException;
+
+/**
+ * @author Nick Belaevski mailto:nbelaevski@exadel.com created 25.07.2007
+ *
+ */
+public class Loader {
+ private List projects;
+
+ public synchronized List getProjects() {
+ if (projects == null) {
+ projects = Loader.load();
+ }
+ return projects;
+ }
+
+ private static List load() throws FacesException {
+ URL url = Loader.class.getResource("tree-model-rules.xml");
+ Digester digester = DigesterLoader.createDigester(url);
+ List list = new ArrayList();
+ digester.push(list);
+ InputStream stream =
Loader.class.getResourceAsStream("/org/richfaces/model/tree-model-data.xml");
+ try {
+ digester.parse(stream);
+ return list;
+ } catch (IOException e) {
+ throw new FacesException(e.getMessage(), e);
+ } catch (SAXException e) {
+ throw new FacesException(e.getMessage(), e);
+ } finally {
+ try {
+ stream.close();
+ } catch (IOException e) {
+ throw new FacesException(e.getMessage(), e);
+ }
+ }
+ }
+
+ public void trashDrop(DropEvent dropEvent) {
+ UITree tree = ((UITreeNode) dropEvent.getDraggableSource()).getUITree();
+ Entry rowData = (Entry) tree.getRowData(dropEvent.getDragValue());
+
+ if (rowData.getParent() != null) {
+ rowData.getParent().removeEntry(rowData);
+ } else {
+ projects.remove(rowData);
+ }
+
+ tree.addRequestKey(tree.getParentRowKey(dropEvent.getDragValue()));
+ }
+
+ public void treeDrop(DropEvent dropEvent) {
+ UITree tree = ((UITreeNode) dropEvent.getComponent()).getUITree();
+
+ Object dragValue = dropEvent.getDragValue();
+ Object dropValue = dropEvent.getDropValue();
+
+ Entry dragEntry = (Entry) tree.getRowData(dragValue);
+ Entry dropEntry = (Entry) tree.getRowData(dropValue);
+
+ dragEntry.getParent().removeEntry(dragEntry);
+ dropEntry.addEntry(dragEntry);
+
+ tree.addRequestKey(tree.getParentRowKey(dragValue));
+ tree.addRequestKey(dropValue);
+ }
+}
Modified: trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/ArchiveEntry.java
===================================================================
---
trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/ArchiveEntry.java 2008-07-15
00:27:05 UTC (rev 9588)
+++
trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/ArchiveEntry.java 2008-07-15
00:27:44 UTC (rev 9589)
@@ -22,4 +22,14 @@
public List getArchiveEntries() {
return archiveEntries;
}
+
+ @Override
+ public void addEntry(Entry entry) {
+ addArchiveEntry((ArchiveEntry) entry);
+ }
+
+ @Override
+ public void removeEntry(Entry entry) {
+ archiveEntries.remove(entry);
+ }
}
Modified: trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/ArchiveFile.java
===================================================================
---
trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/ArchiveFile.java 2008-07-15
00:27:05 UTC (rev 9588)
+++
trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/ArchiveFile.java 2008-07-15
00:27:44 UTC (rev 9589)
@@ -22,4 +22,14 @@
public List getArchiveEntries() {
return archiveEntries;
}
+
+ @Override
+ public void addEntry(Entry entry) {
+ addArchiveEntry((ArchiveEntry) entry);
+ }
+
+ @Override
+ public void removeEntry(Entry entry) {
+ archiveEntries.remove(entry);
+ }
}
Modified: trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/Class.java
===================================================================
--- trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/Class.java 2008-07-15
00:27:05 UTC (rev 9588)
+++ trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/Class.java 2008-07-15
00:27:44 UTC (rev 9589)
@@ -11,4 +11,13 @@
*
*/
public class Class extends Entry {
+ @Override
+ public void addEntry(Entry entry) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void removeEntry(Entry entry) {
+ throw new UnsupportedOperationException();
+ }
}
Modified: trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/Directory.java
===================================================================
---
trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/Directory.java 2008-07-15
00:27:05 UTC (rev 9588)
+++
trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/Directory.java 2008-07-15
00:27:44 UTC (rev 9589)
@@ -102,4 +102,19 @@
this.files.add(file);
file.setParent(this);
}
+
+ @Override
+ public void addEntry(Entry entry) {
+ if (entry instanceof File) {
+ addFile((File) entry);
+ } else {
+ addDir((Directory) entry);
+ }
+ }
+
+ @Override
+ public void removeEntry(Entry entry) {
+ files.remove(entry);
+ directories.remove(new StringKey(entry.getName()));
+ }
}
Modified: trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/Entry.java
===================================================================
--- trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/Entry.java 2008-07-15
00:27:05 UTC (rev 9588)
+++ trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/Entry.java 2008-07-15
00:27:44 UTC (rev 9589)
@@ -10,7 +10,7 @@
* created 29.07.2007
*
*/
-public class Entry {
+public abstract class Entry {
private String name;
private Entry parent;
@@ -51,4 +51,8 @@
public void click() {
System.out.println("Entry.click() " + getPath());
}
+
+ public abstract void addEntry(Entry entry);
+
+ public abstract void removeEntry(Entry entry);
}
Modified: trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/File.java
===================================================================
--- trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/File.java 2008-07-15
00:27:05 UTC (rev 9588)
+++ trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/File.java 2008-07-15
00:27:44 UTC (rev 9589)
@@ -10,4 +10,14 @@
*
*/
public class File extends Entry {
+
+ @Override
+ public void addEntry(Entry entry) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void removeEntry(Entry entry) {
+ throw new UnsupportedOperationException();
+ }
}
Modified: trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/Package.java
===================================================================
--- trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/Package.java 2008-07-15
00:27:05 UTC (rev 9588)
+++ trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/Package.java 2008-07-15
00:27:44 UTC (rev 9589)
@@ -27,4 +27,14 @@
this.classes.put(clazz.getName(), clazz);
clazz.setParent(this);
}
+
+ @Override
+ public void addEntry(Entry entry) {
+ addClass((Class) entry);
+ }
+
+ @Override
+ public void removeEntry(Entry entry) {
+ classes.remove(entry.getName());
+ }
}
Modified: trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/Project.java
===================================================================
--- trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/Project.java 2008-07-15
00:27:05 UTC (rev 9588)
+++ trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/Project.java 2008-07-15
00:27:44 UTC (rev 9589)
@@ -42,4 +42,19 @@
public void setDirs(List dirs) {
this.dirs = dirs;
}
+
+ @Override
+ public void addEntry(Entry entry) {
+ if (entry instanceof Directory) {
+ addDir((Directory) entry);
+ } else {
+ addSrcDir((SourceDirectory) entry);
+ }
+ }
+
+ @Override
+ public void removeEntry(Entry entry) {
+ dirs.remove(entry);
+ srcDirs.remove(entry);
+ }
}
Modified:
trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/SourceDirectory.java
===================================================================
---
trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/SourceDirectory.java 2008-07-15
00:27:05 UTC (rev 9588)
+++
trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/SourceDirectory.java 2008-07-15
00:27:44 UTC (rev 9589)
@@ -27,4 +27,19 @@
this.packages.add(pkg);
pkg.setParent(this);
}
+
+ @Override
+ public void addEntry(Entry entry) {
+ if (entry instanceof Package) {
+ addPackage((Package) entry);
+ } else {
+ super.addEntry(entry);
+ }
+ }
+
+ @Override
+ public void removeEntry(Entry entry) {
+ packages.remove(entry);
+ super.removeEntry(entry);
+ }
}
Copied: trunk/samples/treeModelDemo/src/main/resources/org/richfaces/digester-rules.dtd
(from rev 9555,
trunk/samples/treeModelDemo/src/main/resources/org/richfaces/service/digester-rules.dtd)
===================================================================
--- trunk/samples/treeModelDemo/src/main/resources/org/richfaces/digester-rules.dtd
(rev 0)
+++
trunk/samples/treeModelDemo/src/main/resources/org/richfaces/digester-rules.dtd 2008-07-15
00:27:44 UTC (rev 9589)
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!--
+ "Digester" component of the Jakarta Commons Subproject
+ DTD for the definition of Digester rules in XML.
+ $Id: digester-rules.dtd,v 1.8 2003/03/27 18:54:45 rdonkin Exp $
+-->
+
+<!-- This document type defines an XML format for defining Digester rules.
+ Digester is a framework for pattern-matching-based parsing of XML into
+ Java objects. See
http://jakarta.apache.org/commons/digester.html. -->
+
+<!ENTITY % rule-elements "bean-property-setter-rule | call-method-rule |
call-param-rule |
+ factory-create-rule | object-create-rule |
+ set-properties-rule | set-property-rule | set-top-rule |
+ set-next-rule" >
+
+<!-- digester-rules is the root element. -->
+<!ELEMENT digester-rules (pattern | include | bean-property-setter-rule |
call-method-rule | call-param-rule | factory-create-rule | object-create-rule |
set-properties-rule | set-property-rule | set-top-rule | set-next-rule )*>
+
+
+<!-- <pattern> defines a matching pattern, or part of a matching pattern. Any
+ rule nested in a pattern element prepends its parent's to its pattern.
+ Patterns may be recursively nested.
+ Example:
+ <pattern value="foo">
+ <pattern value="bar">
+ <object-create-rule pattern="baz" classname="Fubar"
/>
+ </pattern>
+ </pattern>
+
+ The above sample fragment defines an ObjectCreateRule associated
+ with the pattern "foo/bar/baz".
+
+ Note that the use of pattern elements is optional; an alternative is for
+ each rule element to contain a 'pattern' attribute. -->
+<!ELEMENT pattern (pattern | include | bean-property-setter-rule | call-method-rule |
call-param-rule |
+ factory-create-rule | object-create-rule |
+ set-properties-rule | set-property-rule | set-top-rule |
+ set-next-rule )*>
+<!ATTLIST pattern
+ value CDATA #REQUIRED>
+
+
+<!--
+ <include> allows one set of digester rules to be included inside
+ another. The 'path' attribute contains the URI of the document to
+ include. Inclusion behaves as if the included rules document is
+ 'macro-expanded' within the outer document.
+ Programmatically initialized rules can be included as well, via the
+ 'class' attribute. The 'class' attribute should contain the name
+ of a class that implements
+ org.apache.commons.digester.xmlrules.DigesterRulesSource.
+-->
+<!ELEMENT include EMPTY>
+<!ATTLIST include
+ path CDATA #IMPLIED
+ class CDATA #IMPLIED>
+
+
+<!-- Each 'rule' element below corresponds to a concrete subclass
+ of org.apache.framework.digester.Rule.
+ Each 'rule' element has an optional 'pattern' attribute, which
+ defines the pattern for that rule instance. If the rule element
+ is nested inside one or more <pattern> elements, those patterns
+ will be prepended to the pattern specified in the rule's 'pattern'
+ attribute. -->
+
+<!-- Bean Property Setter Rule -->
+<!ELEMENT bean-property-setter-rule EMPTY>
+<!ATTLIST bean-property-setter-rule
+ pattern CDATA #IMPLIED
+ propertyname CDATA #IMPLIED>
+
+<!-- CallMethodRule -->
+<!ELEMENT call-method-rule EMPTY>
+<!ATTLIST call-method-rule
+ pattern CDATA #IMPLIED
+ methodname CDATA #REQUIRED
+ paramcount CDATA #IMPLIED
+ paramtypes CDATA #IMPLIED>
+
+<!--
+ CallParamRule
+ attrname - set param from attribute value (cannot be combined with from-stack)
+ from-stack - set param from stack (cannot be combined with attrname)
+ -->
+<!ELEMENT call-param-rule EMPTY>
+<!ATTLIST call-param-rule
+ pattern CDATA #IMPLIED
+ paramnumber CDATA #REQUIRED
+ attrname CDATA #IMPLIED
+ from-stack CDATA #IMPLIED>
+
+<!--
+ FactoryCreateRule
+
+ ignore-exceptions - if this attribute is (ignore case) 'true' then any
exceptions
+ thrown by the object create rule will be ignore.
+ This will allow processing to continue.
+ -->
+<!ELEMENT factory-create-rule EMPTY>
+<!ATTLIST factory-create-rule
+ pattern CDATA #IMPLIED
+ classname CDATA #REQUIRED
+ attrname CDATA #IMPLIED
+ ignore-exceptions CDATA #IMPLIED>
+
+<!-- ObjectCreateRule -->
+<!ELEMENT object-create-rule EMPTY>
+<!ATTLIST object-create-rule
+ pattern CDATA #IMPLIED
+ classname CDATA #REQUIRED
+ attrname CDATA #IMPLIED>
+
+<!-- SetPropertiesRule -->
+<!ELEMENT set-properties-rule (alias)*>
+<!ATTLIST factory-create-rule
+ pattern CDATA #IMPLIED>
+
+<!-- An alias is a custom attribute->property name mapping -->
+<!ELEMENT alias EMPTY>
+<!ATTLIST alias
+ attr-name CDATA #REQUIRED
+ prop-name CDATA #IMPLIED>
+
+<!-- SetPropertyRule -->
+<!ELEMENT set-property-rule EMPTY>
+<!ATTLIST set-property-rule
+ pattern CDATA #IMPLIED
+ name CDATA #IMPLIED
+ value CDATA #IMPLIED>
+
+<!-- SetTopRule -->
+<!ELEMENT set-top-rule EMPTY>
+<!ATTLIST set-top-rule
+ pattern CDATA #IMPLIED
+ methodname CDATA #REQUIRED
+ paramtype CDATA #IMPLIED>
+
+<!-- SetNextRule -->
+<!ELEMENT set-next-rule EMPTY>
+<!ATTLIST set-next-rule
+ pattern CDATA #IMPLIED
+ methodname CDATA #REQUIRED
+ paramtype CDATA #IMPLIED>
Copied: trunk/samples/treeModelDemo/src/main/resources/org/richfaces/tree-model-rules.xml
(from rev 9555,
trunk/samples/treeModelDemo/src/main/resources/org/richfaces/service/tree-model-rules.xml)
===================================================================
--- trunk/samples/treeModelDemo/src/main/resources/org/richfaces/tree-model-rules.xml
(rev 0)
+++
trunk/samples/treeModelDemo/src/main/resources/org/richfaces/tree-model-rules.xml 2008-07-15
00:27:44 UTC (rev 9589)
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+<!DOCTYPE digester-rules SYSTEM "digester-rules.dtd">
+ -->
+
+<digester-rules>
+ <pattern value="*/project">
+ <object-create-rule classname="org.richfaces.model.Project" />
+ <set-next-rule methodname="add" />
+ <set-properties-rule>
+ <alias attr-name="name" prop-name="name" />
+ </set-properties-rule>
+ </pattern>
+
+ <pattern value="*/sourceDirectory">
+ <object-create-rule classname="org.richfaces.model.SourceDirectory" />
+ <set-next-rule methodname="addSrcDir" />
+ <set-properties-rule>
+ <alias attr-name="name" prop-name="name" />
+ </set-properties-rule>
+ </pattern>
+
+ <pattern value="*/directory">
+ <object-create-rule classname="org.richfaces.model.Directory" />
+ <set-next-rule methodname="addDir" />
+ <set-properties-rule>
+ <alias attr-name="name" prop-name="name" />
+ </set-properties-rule>
+ </pattern>
+
+ <pattern value="*/file">
+ <object-create-rule classname="org.richfaces.model.File" />
+ <set-next-rule methodname="addFile" />
+ <set-properties-rule>
+ <alias attr-name="name" prop-name="name" />
+ </set-properties-rule>
+ </pattern>
+
+ <pattern value="*/archive">
+ <object-create-rule classname="org.richfaces.model.ArchiveFile" />
+ <set-next-rule methodname="addFile" />
+ <set-properties-rule>
+ <alias attr-name="name" prop-name="name" />
+ </set-properties-rule>
+ </pattern>
+
+ <pattern value="*/archiveEntry">
+ <object-create-rule classname="org.richfaces.model.ArchiveEntry" />
+ <set-next-rule methodname="addArchiveEntry" />
+ <set-properties-rule>
+ <alias attr-name="name" prop-name="name" />
+ </set-properties-rule>
+ </pattern>
+
+ <pattern value="*/package">
+ <object-create-rule classname="org.richfaces.model.Package" />
+ <set-next-rule methodname="addPackage" />
+ <set-properties-rule>
+ <alias attr-name="name" prop-name="name" />
+ </set-properties-rule>
+ </pattern>
+
+ <pattern value="*/class">
+ <object-create-rule classname="org.richfaces.model.Class" />
+ <set-next-rule methodname="addClass" />
+ <set-properties-rule>
+ <alias attr-name="name" prop-name="name" />
+ </set-properties-rule>
+ </pattern>
+</digester-rules>
\ No newline at end of file
Modified: trunk/samples/treeModelDemo/src/main/webapp/WEB-INF/faces-config.xml
===================================================================
--- trunk/samples/treeModelDemo/src/main/webapp/WEB-INF/faces-config.xml 2008-07-15
00:27:05 UTC (rev 9588)
+++ trunk/samples/treeModelDemo/src/main/webapp/WEB-INF/faces-config.xml 2008-07-15
00:27:44 UTC (rev 9589)
@@ -4,17 +4,13 @@
<faces-config>
<managed-bean>
- <managed-bean-name>tree</managed-bean-name>
- <managed-bean-scope>request</managed-bean-scope>
- </managed-bean>
- <managed-bean>
<managed-bean-name>treeModelBean</managed-bean-name>
<managed-bean-class>org.richfaces.TreeModelBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>loaderBean</managed-bean-name>
- <managed-bean-class>org.richfaces.service.Loader</managed-bean-class>
- <managed-bean-scope>application</managed-bean-scope>
+ <managed-bean-class>org.richfaces.Loader</managed-bean-class>
+ <managed-bean-scope>session</managed-bean-scope>
</managed-bean>
</faces-config>
Modified: trunk/samples/treeModelDemo/src/main/webapp/pages/index.jsp
===================================================================
--- trunk/samples/treeModelDemo/src/main/webapp/pages/index.jsp 2008-07-15 00:27:05 UTC
(rev 9588)
+++ trunk/samples/treeModelDemo/src/main/webapp/pages/index.jsp 2008-07-15 00:27:44 UTC
(rev 9589)
@@ -11,6 +11,7 @@
</head>
<body>
<f:view>
+ <h:outputLink
value="#{facesContext.externalContext.requestContextPath}/pages/rf-1081.jsf">RF-1081
(DnD with tree adaptors) Demo</h:outputLink>
<h:form>
<a4j:outputPanel ajaxRendered="true">
<h:messages />
Added: trunk/samples/treeModelDemo/src/main/webapp/pages/rf-1081.jsp
===================================================================
--- trunk/samples/treeModelDemo/src/main/webapp/pages/rf-1081.jsp
(rev 0)
+++ trunk/samples/treeModelDemo/src/main/webapp/pages/rf-1081.jsp 2008-07-15 00:27:44 UTC
(rev 9589)
@@ -0,0 +1,72 @@
+<%@ taglib
uri="http://java.sun.com/jsf/html" prefix="h" %>
+<%@ taglib
uri="http://java.sun.com/jsf/core" prefix="f" %>
+
+<%@ taglib
uri="http://labs.jboss.com/jbossrichfaces/ui/treeModel"
prefix="model" %>
+<%@ taglib
uri="http://labs.jboss.com/jbossrichfaces/ui/tree"
prefix="tree" %>
+<%@ taglib
uri="http://labs.jboss.com/jbossrichfaces/ui/drag-drop"
prefix="dnd" %>
+<%@ taglib
uri="http://richfaces.org/a4j" prefix="a4j" %>
+
+<html>
+ <head>
+ <title></title>
+ </head>
+ <body>
+ <f:view>
+ <h:form>
+ <a4j:outputPanel ajaxRendered="true">
+ <h:messages />
+ </a4j:outputPanel>
+
+ <h:panelGrid columns="2">
+ <tree:tree switchType="client" id="tree"
reRender="tree" dropListener="#{loaderBean.treeDrop}">
+ <model:treeNodesAdaptor id="project"
nodes="#{loaderBean.projects}" var="project">
+ <tree:treeNode dragType="project"
acceptedTypes="srcDir,dir">
+ <h:outputText value="Project: #{project.name}" />
+ </tree:treeNode>
+
+ <model:treeNodesAdaptor id="srcDir" var="srcDir"
nodes="#{project.srcDirs}">
+ <tree:treeNode dragType="srcDir" acceptedTypes="pkg">
+ <h:outputText value="Source directory: #{srcDir.name}" />
+ </tree:treeNode>
+
+ <model:treeNodesAdaptor id="pkg" var="pkg"
nodes="#{srcDir.packages}">
+ <tree:treeNode dragType="pkg" acceptedTypes="class">
+ <h:outputText value="Package: #{pkg.name}" />
+ </tree:treeNode>
+
+ <model:treeNodesAdaptor id="class" var="class"
nodes="#{pkg.classes}">
+ <tree:treeNode dragType="class">
+ <h:outputText value="Class: #{class.name}" />
+ </tree:treeNode>
+ </model:treeNodesAdaptor>
+ </model:treeNodesAdaptor>
+
+ </model:treeNodesAdaptor>
+
+ <model:recursiveTreeNodesAdaptor id="dir" var="dir"
+ roots="#{project.dirs}" nodes="#{dir.directories}">
+ <tree:treeNode dragType="dir" acceptedTypes="file">
+ <h:outputText value="Directory: #{dir.name}" />
+ </tree:treeNode>
+
+ <model:treeNodesAdaptor id="file" var="file"
nodes="#{dir.files}">
+ <tree:treeNode dragType="file">
+ <h:outputText value="File: #{file.name}" />
+ </tree:treeNode>
+ </model:treeNodesAdaptor>
+
+ </model:recursiveTreeNodesAdaptor>
+ </model:treeNodesAdaptor>
+ </tree:tree>
+
+ <h:panelGroup id="trash" layout="block" style="border:
1px dotted navy; padding: 15px; text-align: center;">
+ <h:outputText value="Trash" />
+ <dnd:dropSupport dropListener="#{loaderBean.trashDrop}"
acceptedTypes="project,srcDir,pkg,class,dir,file" />
+ </h:panelGroup>
+ </h:panelGrid>
+
+ <a4j:log popup="false" />
+ </h:form>
+ </f:view>
+ </body>
+</html>