JBoss Rich Faces SVN: r20245 - in branches/RF-8742-1: core/api/src/main/java/org/richfaces/component and 34 other directories.
                                
                                
                                
                                    
                                        by richfaces-svn-commits@lists.jboss.org
                                    
                                
                                
                                        Author: alexsmirnov
Date: 2010-11-30 14:36:09 -0500 (Tue, 30 Nov 2010)
New Revision: 20245
Added:
   branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/
   branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/TreeModelBean.java
   branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/
   branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/ArchiveEntry.java
   branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/ArchiveFile.java
   branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Class.java
   branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Directory.java
   branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Entry.java
   branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/File.java
   branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Package.java
   branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Project.java
   branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Root.java
   branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/SimpleRecursiveNode.java
   branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/SourceDirectory.java
   branches/RF-8742-1/examples/iteration-demo/src/main/resources/org/richfaces/demo/model/
   branches/RF-8742-1/examples/iteration-demo/src/main/resources/org/richfaces/demo/model/tree/
   branches/RF-8742-1/examples/iteration-demo/src/main/resources/org/richfaces/demo/model/tree/tree-model-data.xml
   branches/RF-8742-1/examples/iteration-demo/src/main/webapp/images/compress.png
   branches/RF-8742-1/examples/iteration-demo/src/main/webapp/images/folder.png
   branches/RF-8742-1/examples/iteration-demo/src/main/webapp/images/folder_key.png
   branches/RF-8742-1/examples/iteration-demo/src/main/webapp/images/folder_page.png
   branches/RF-8742-1/examples/iteration-demo/src/main/webapp/images/page_white_cup.png
   branches/RF-8742-1/examples/iteration-demo/src/main/webapp/treeModel.xhtml
   branches/RF-8742-1/examples/output-demo/src/main/webapp/examples/toolbar.xhtml
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/GridSeparatorImage.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/arrow.png
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/copy.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/create_doc.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/create_folder.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/cut.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/delete.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/edit.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/filter.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/find.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/ico_new_group.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/ico_new_item.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/open.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/paste.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/redo.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/reload.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/repeat.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/save.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/save_all.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/save_as.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/undo.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/verify.gif
   branches/RF-8742-1/ui/iteration/api/src/main/java/org/richfaces/model/DeclarativeTreeDataModelTuple.java
   branches/RF-8742-1/ui/iteration/api/src/main/java/org/richfaces/model/DeclarativeTreeModel.java
   branches/RF-8742-1/ui/iteration/api/src/main/java/org/richfaces/model/TreeDataModelTuple.java
   branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/component/AbstractTreeModelAdaptor.java
   branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/component/AbstractTreeModelRecursiveAdaptor.java
   branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/component/TreeModelAdaptor.java
   branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/component/TreeModelRecursiveAdaptor.java
   branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/model/DeclarativeModelKey.java
   branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/model/DeclarativeTreeDataModelImpl.java
   branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/component/AbstractToolBar.java
   branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/component/AbstractToolBarGroup.java
   branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/ToolBarGroupRenderer.java
   branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/ToolBarRendererBase.java
   branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/
   branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/DotSeparatorImage.java
   branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/GridSeparatorImage.java
   branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/LineSeparatorImage.java
   branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/SquareSeparatorImage.java
   branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/ToolBarSeparatorImage.java
   branches/RF-8742-1/ui/output/ui/src/main/resources/META-INF/resources/org.richfaces/toolBar.ecss
   branches/RF-8742-1/ui/output/ui/src/main/templates/toolBar.template.xml
Removed:
   branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/TreeModelBean.java
   branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/
   branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/ArchiveEntry.java
   branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/ArchiveFile.java
   branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Class.java
   branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Directory.java
   branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Entry.java
   branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/File.java
   branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Package.java
   branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Project.java
   branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Root.java
   branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/SimpleRecursiveNode.java
   branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/SourceDirectory.java
   branches/RF-8742-1/examples/iteration-demo/src/main/resources/org/richfaces/demo/model/tree/
   branches/RF-8742-1/examples/iteration-demo/src/main/resources/org/richfaces/demo/model/tree/tree-model-data.xml
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/GridSeparatorImage.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/arrow.png
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/copy.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/create_doc.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/create_folder.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/cut.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/delete.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/edit.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/filter.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/find.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/ico_new_group.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/ico_new_item.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/open.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/paste.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/redo.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/reload.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/repeat.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/save.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/save_all.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/save_as.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/undo.gif
   branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/verify.gif
   branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/model/ExtendedTreeDataModelImpl.java
   branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/model/SequenceRowKeyIterator.java
   branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/DotSeparatorImage.java
   branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/GridSeparatorImage.java
   branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/LineSeparatorImage.java
   branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/SquareSeparatorImage.java
   branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/ToolBarSeparatorImage.java
   branches/RF-8742-1/ui/validator/ui/src/test/java/org/richfaces/convert/DateTimeConverterTest.java
Modified:
   branches/RF-8742-1/
   branches/RF-8742-1/core/api/src/main/java/org/richfaces/component/ComponentPredicates.java
   branches/RF-8742-1/core/api/src/main/java/org/richfaces/log/RichfacesLogger.java
   branches/RF-8742-1/examples/input-demo/src/main/webapp/examples/calendar.xhtml
   branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/LazyTreeNode.java
   branches/RF-8742-1/examples/iteration-demo/src/main/webapp/index.xhtml
   branches/RF-8742-1/examples/output-demo/src/main/java/org/richfaces/ProgressBarBean.java
   branches/RF-8742-1/examples/output-demo/src/main/webapp/WEB-INF/faces-config.xml
   branches/RF-8742-1/examples/output-demo/src/main/webapp/examples/progressbar.xhtml
   branches/RF-8742-1/examples/output-demo/src/main/webapp/examples/togglePanel.xhtml
   branches/RF-8742-1/examples/output-demo/src/main/webapp/templates/template.xhtml
   branches/RF-8742-1/ui/common/ui/src/main/java/org/richfaces/component/RowKeyContextEventWrapper.java
   branches/RF-8742-1/ui/common/ui/src/main/java/org/richfaces/component/UIDataAdaptor.java
   branches/RF-8742-1/ui/core/ui/src/main/java/org/richfaces/view/facelets/tag/AjaxBehaviorRule.java
   branches/RF-8742-1/ui/core/ui/src/main/java/org/richfaces/view/facelets/tag/BehaviorRule.java
   branches/RF-8742-1/ui/input/ui/src/main/java/org/richfaces/renderkit/CalendarRendererBase.java
   branches/RF-8742-1/ui/input/ui/src/main/resources/META-INF/resources/org.richfaces/calendar-utils.js
   branches/RF-8742-1/ui/iteration/api/src/main/java/org/richfaces/model/TreeDataModel.java
   branches/RF-8742-1/ui/iteration/api/src/main/java/org/richfaces/model/TreeDataVisitor.java
   branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/component/AbstractTree.java
   branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/component/TreeRange.java
   branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/model/SwingTreeNodeDataModelImpl.java
   branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/model/TreeSequenceKeyModel.java
   branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/renderkit/TreeEncoderBase.java
   branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/renderkit/TreeNodeRendererBase.java
   branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/renderkit/TreeNodeState.java
   branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/renderkit/TreeRendererBase.java
   branches/RF-8742-1/ui/iteration/ui/src/main/resources/META-INF/resources/org.richfaces/tree.js
   branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/ProgressBarBaseRenderer.java
   branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/ProgressBarState.java
   branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/ProgressBarStateEncoder.java
   branches/RF-8742-1/ui/output/ui/src/main/resources/META-INF/pn.faces-config.xml
   branches/RF-8742-1/ui/output/ui/src/main/resources/META-INF/pn.taglib.xml
   branches/RF-8742-1/ui/output/ui/src/main/resources/META-INF/resources/org.richfaces/progressBar.ecss
   branches/RF-8742-1/ui/output/ui/src/main/resources/META-INF/resources/org.richfaces/progressBar.js
   branches/RF-8742-1/ui/output/ui/src/main/templates/progressBar.template.xml
Log:
Merged revisions 20212-20217,20221-20222,20224,20226-20235 via svnmerge from 
https://svn.jboss.org/repos/richfaces/trunk
.......
  r20212 | nbelaevski | 2010-11-29 12:14:12 -0800 (Mon, 29 Nov 2010) | 4 lines
  
  Small progress bar fixes:
  - Incorrect state displayed when no 'initial' or 'finish' facet was provided
  - rf-pb class was not encoded
  - Incorrect alignment in IE7
.......
  r20213 | nbelaevski | 2010-11-29 12:28:16 -0800 (Mon, 29 Nov 2010) | 5 lines
  
  RF-9680:
  - Added children() method to TreeDataModel & tuples
  - Related refactorings for UIDataAdaptor
  - Redesign API for walking over model
  - Renderer updated for new API
.......
  r20214 | nbelaevski | 2010-11-29 12:36:39 -0800 (Mon, 29 Nov 2010) | 1 line
  
  Added TODO to AbstractTree
.......
  r20215 | nbelaevski | 2010-11-29 12:44:15 -0800 (Mon, 29 Nov 2010) | 1 line
  
  RF-9680
.......
  r20216 | nbelaevski | 2010-11-29 12:52:25 -0800 (Mon, 29 Nov 2010) | 1 line
  
  https://jira.jboss.org/browse/RF-9680
.......
  r20217 | nbelaevski | 2010-11-29 12:58:34 -0800 (Mon, 29 Nov 2010) | 1 line
  
  https://jira.jboss.org/browse/RF-9680
.......
  r20221 | abelevich | 2010-11-30 00:48:10 -0800 (Tue, 30 Nov 2010) | 1 line
  
  fix rules
.......
  r20222 | abelevich | 2010-11-30 01:11:39 -0800 (Tue, 30 Nov 2010) | 1 line
  
  move from sandbox
.......
  r20224 | abelevich | 2010-11-30 01:13:18 -0800 (Tue, 30 Nov 2010) | 1 line
.......
  r20226 | abelevich | 2010-11-30 01:35:47 -0800 (Tue, 30 Nov 2010) | 1 line
  
  add toolbar sample
.......
  r20227 | abelevich | 2010-11-30 02:01:33 -0800 (Tue, 30 Nov 2010) | 1 line
  
  fix renderer, add toolbar to the config files, remove package-info
.......
  r20228 | abelevich | 2010-11-30 02:02:58 -0800 (Tue, 30 Nov 2010) | 1 line
  
  add toolbar demo navigation case
.......
  r20229 | abelevich | 2010-11-30 02:04:46 -0800 (Tue, 30 Nov 2010) | 1 line
  
  add license headers
.......
  r20230 | amarkhel | 2010-11-30 02:13:41 -0800 (Tue, 30 Nov 2010) | 1 line
  
  RF-9871: JavaScript regular expression fixed.
.......
  r20231 | amarkhel | 2010-11-30 02:30:22 -0800 (Tue, 30 Nov 2010) | 1 line
  
  RF-9856: Check for undefined value of year, month and day added.
.......
  r20232 | nbelaevski | 2010-11-30 02:32:04 -0800 (Tue, 30 Nov 2010) | 1 line
  
  Removed DeclarativeTreeModel strangely duplicated
.......
  r20233 | nbelaevski | 2010-11-30 02:34:56 -0800 (Tue, 30 Nov 2010) | 1 line
  
  Corrected diagnostic exception message in TreeRendererBase.java
.......
  r20234 | amarkhel | 2010-11-30 04:00:33 -0800 (Tue, 30 Nov 2010) | 1 line
  
  RF-9837: Server side support for seconds pattern was added. 
.......
  r20235 | nbelaevski | 2010-11-30 06:37:17 -0800 (Tue, 30 Nov 2010) | 1 line
  
  Removed DateTimeConverterTest
.......
Property changes on: branches/RF-8742-1
___________________________________________________________________
Name: svnmerge-integrated
   - /trunk:1-20207
   + /trunk:1-20241
Modified: branches/RF-8742-1/core/api/src/main/java/org/richfaces/component/ComponentPredicates.java
===================================================================
--- branches/RF-8742-1/core/api/src/main/java/org/richfaces/component/ComponentPredicates.java	2010-11-30 18:55:37 UTC (rev 20244)
+++ branches/RF-8742-1/core/api/src/main/java/org/richfaces/component/ComponentPredicates.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -31,6 +31,21 @@
  */
 public final class ComponentPredicates {
 
+    private static final class WithIdPredicate implements Predicate<UIComponent> {
+        
+        private final String id;
+
+        public WithIdPredicate(String id) {
+            super();
+            this.id = id;
+        }
+        
+        public boolean apply(UIComponent input) {
+            return id.equals(input.getId());
+        }
+        
+    }
+    
     private static final Predicate<UIComponent> IS_RENDERED = new Predicate<UIComponent>() {
         public boolean apply(UIComponent input) {
             return input.isRendered();
@@ -42,4 +57,12 @@
     public static Predicate<UIComponent> isRendered() {
         return IS_RENDERED;
     }
+    
+    public static Predicate<UIComponent> withId(String id) {
+        if (id == null) {
+            throw new NullPointerException("id");
+        }
+        
+        return new WithIdPredicate(id);
+    }
 }
Modified: branches/RF-8742-1/core/api/src/main/java/org/richfaces/log/RichfacesLogger.java
===================================================================
--- branches/RF-8742-1/core/api/src/main/java/org/richfaces/log/RichfacesLogger.java	2010-11-30 18:55:37 UTC (rev 20244)
+++ branches/RF-8742-1/core/api/src/main/java/org/richfaces/log/RichfacesLogger.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -8,9 +8,9 @@
  *
  */
 public enum RichfacesLogger {
-    RESOURCE("Resource"), RENDERKIT("Renderkit"), CONFIG("Config"), CONNECTION("Connection"),
-    APPLICATION("Application"),
-    CACHE("Cache"), CONTEXT("Context"), COMPONENTS("Components"), WEBAPP("Webapp"), UTIL("Util");
+    RESOURCE("Resource"), RENDERKIT("Renderkit"), CONFIG("Config"), CONNECTION("Connection"), 
+    APPLICATION("Application"), CACHE("Cache"), CONTEXT("Context"), COMPONENTS("Components"), 
+    WEBAPP("Webapp"), UTIL("Util"), MODEL("Model");
 
     private static final String LOGGER_NAME_PREFIX = "org.richfaces.log.";
     private String loggerName;
Modified: branches/RF-8742-1/examples/input-demo/src/main/webapp/examples/calendar.xhtml
===================================================================
--- branches/RF-8742-1/examples/input-demo/src/main/webapp/examples/calendar.xhtml	2010-11-30 18:55:37 UTC (rev 20244)
+++ branches/RF-8742-1/examples/input-demo/src/main/webapp/examples/calendar.xhtml	2010-11-30 19:36:09 UTC (rev 20245)
@@ -43,6 +43,7 @@
 					datePattern="#{calendarBean.pattern}"
 					dataModel="#{calendarDataModel}"
 					mode="#{calendarBean.mode}"
+					disabled="false"
 					showApplyButton="#{calendarBean.showApply}" cellWidth="24px"
 					cellHeight="22px" style="width:200px" minDaysInFirstWeek="3"
 					oncollapse="return onEvent.call(this, event);"
Modified: branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/LazyTreeNode.java
===================================================================
--- branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/LazyTreeNode.java	2010-11-30 18:55:37 UTC (rev 20244)
+++ branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/LazyTreeNode.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -93,11 +93,7 @@
     }
 
     public boolean isLeaf() {
-        if (children == null) {
-            return false;
-        }
-        
-        return children.isEmpty();
+        return false;
     }
 
     public Enumeration children() {
Copied: branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree (from rev 20235, trunk/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree)
Deleted: branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/TreeModelBean.java
===================================================================
--- trunk/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/TreeModelBean.java	2010-11-30 14:37:17 UTC (rev 20235)
+++ branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/TreeModelBean.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -1,61 +0,0 @@
-/**
- * 
- */
-package org.richfaces.demo.model.tree;
-
-import javax.faces.FacesException;
-import javax.faces.bean.ApplicationScoped;
-import javax.faces.bean.ManagedBean;
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Unmarshaller;
-import javax.xml.bind.Unmarshaller.Listener;
-
-import org.richfaces.demo.model.tree.adaptors.Entry;
-import org.richfaces.demo.model.tree.adaptors.Root;
-
-/**
- * @author Nick Belaevski
- *         mailto:nbelaevski@exadel.com
- *         created 25.07.2007
- *
- */
-@ManagedBean
-@ApplicationScoped
-public class TreeModelBean {
-	
-    private Root root;
-    
-    private void initializeRoot() {
-        
-        try {
-            JAXBContext context = JAXBContext.newInstance(Root.class);
-            Unmarshaller unmarshaller = context.createUnmarshaller();
-            unmarshaller.setListener(new Listener() {
-                @Override
-                public void afterUnmarshal(Object target, Object parent) {
-                    super.afterUnmarshal(target, parent);
-                    
-                    if (parent instanceof Entry) {
-                        ((Entry) target).setParent((Entry) parent);
-                    }
-                    
-                }
-            });
-            
-            
-            root = (Root) unmarshaller.unmarshal(TreeModelBean.class.getResource("tree-model-data.xml"));
-        } catch (JAXBException e) {
-            throw new FacesException(e.getMessage(), e);
-        }
-    }
-    
-    public Root getRoot() {
-        if (root == null) {
-            initializeRoot();
-        }
-        
-        return root;
-    }
-
-}
Copied: branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/TreeModelBean.java (from rev 20235, trunk/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/TreeModelBean.java)
===================================================================
--- branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/TreeModelBean.java	                        (rev 0)
+++ branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/TreeModelBean.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,61 @@
+/**
+ * 
+ */
+package org.richfaces.demo.model.tree;
+
+import javax.faces.FacesException;
+import javax.faces.bean.ApplicationScoped;
+import javax.faces.bean.ManagedBean;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.bind.Unmarshaller.Listener;
+
+import org.richfaces.demo.model.tree.adaptors.Entry;
+import org.richfaces.demo.model.tree.adaptors.Root;
+
+/**
+ * @author Nick Belaevski
+ *         mailto:nbelaevski@exadel.com
+ *         created 25.07.2007
+ *
+ */
+@ManagedBean
+@ApplicationScoped
+public class TreeModelBean {
+	
+    private Root root;
+    
+    private void initializeRoot() {
+        
+        try {
+            JAXBContext context = JAXBContext.newInstance(Root.class);
+            Unmarshaller unmarshaller = context.createUnmarshaller();
+            unmarshaller.setListener(new Listener() {
+                @Override
+                public void afterUnmarshal(Object target, Object parent) {
+                    super.afterUnmarshal(target, parent);
+                    
+                    if (parent instanceof Entry) {
+                        ((Entry) target).setParent((Entry) parent);
+                    }
+                    
+                }
+            });
+            
+            
+            root = (Root) unmarshaller.unmarshal(TreeModelBean.class.getResource("tree-model-data.xml"));
+        } catch (JAXBException e) {
+            throw new FacesException(e.getMessage(), e);
+        }
+    }
+    
+    public Root getRoot() {
+        if (root == null) {
+            initializeRoot();
+        }
+        
+        return root;
+    }
+
+}
Copied: branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors (from rev 20235, trunk/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors)
Deleted: branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/ArchiveEntry.java
===================================================================
--- trunk/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/ArchiveEntry.java	2010-11-30 14:37:17 UTC (rev 20235)
+++ branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/ArchiveEntry.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -1,49 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright ${year}, Red Hat, Inc. and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software 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 software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.richfaces.demo.model.tree.adaptors;
-
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlElement;
-
-/**
- * @author Nick Belaevski
- *         mailto:nbelaevski@exadel.com
- *         created 04.08.2007
- *
- */
-public class ArchiveEntry extends Entry {
-
-    @XmlElement(name = "archiveEntry")
-    private List<ArchiveEntry> archiveEntries;
-
-    @XmlElement(name = "archiveEntryFile")
-    private List<ArchiveEntry> archiveEntryFiles;
-
-    public List<ArchiveEntry> getArchiveEntries() {
-        return archiveEntries;
-    }
-
-    public List<ArchiveEntry> getArchiveEntryFiles() {
-        return archiveEntryFiles;
-    }
-}
Copied: branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/ArchiveEntry.java (from rev 20235, trunk/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/ArchiveEntry.java)
===================================================================
--- branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/ArchiveEntry.java	                        (rev 0)
+++ branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/ArchiveEntry.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,49 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright ${year}, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.demo.model.tree.adaptors;
+
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+
+/**
+ * @author Nick Belaevski
+ *         mailto:nbelaevski@exadel.com
+ *         created 04.08.2007
+ *
+ */
+public class ArchiveEntry extends Entry {
+
+    @XmlElement(name = "archiveEntry")
+    private List<ArchiveEntry> archiveEntries;
+
+    @XmlElement(name = "archiveEntryFile")
+    private List<ArchiveEntry> archiveEntryFiles;
+
+    public List<ArchiveEntry> getArchiveEntries() {
+        return archiveEntries;
+    }
+
+    public List<ArchiveEntry> getArchiveEntryFiles() {
+        return archiveEntryFiles;
+    }
+}
Deleted: branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/ArchiveFile.java
===================================================================
--- trunk/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/ArchiveFile.java	2010-11-30 14:37:17 UTC (rev 20235)
+++ branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/ArchiveFile.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -1,45 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright ${year}, Red Hat, Inc. and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software 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 software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.richfaces.demo.model.tree.adaptors;
-
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlElement;
-
-import com.google.common.collect.Lists;
-
-/**
- * @author Nick Belaevski
- *         mailto:nbelaevski@exadel.com
- *         created 04.08.2007
- *
- */
-public class ArchiveFile extends File {
-
-    @XmlElement(name = "archiveEntry")
-    private List<ArchiveEntry> archiveEntries = Lists.newArrayList();
-
-    public List<ArchiveEntry> getArchiveEntries() {
-        return archiveEntries;
-    }
-
-}
Copied: branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/ArchiveFile.java (from rev 20235, trunk/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/ArchiveFile.java)
===================================================================
--- branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/ArchiveFile.java	                        (rev 0)
+++ branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/ArchiveFile.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,45 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright ${year}, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.demo.model.tree.adaptors;
+
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+
+import com.google.common.collect.Lists;
+
+/**
+ * @author Nick Belaevski
+ *         mailto:nbelaevski@exadel.com
+ *         created 04.08.2007
+ *
+ */
+public class ArchiveFile extends File {
+
+    @XmlElement(name = "archiveEntry")
+    private List<ArchiveEntry> archiveEntries = Lists.newArrayList();
+
+    public List<ArchiveEntry> getArchiveEntries() {
+        return archiveEntries;
+    }
+
+}
Deleted: branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Class.java
===================================================================
--- trunk/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Class.java	2010-11-30 14:37:17 UTC (rev 20235)
+++ branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Class.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -1,29 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright ${year}, Red Hat, Inc. and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software 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 software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.richfaces.demo.model.tree.adaptors;
-
-
-/**
- * @author Nick Belaevski
- */
-public class Class extends Entry {
-}
Copied: branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Class.java (from rev 20235, trunk/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Class.java)
===================================================================
--- branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Class.java	                        (rev 0)
+++ branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Class.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,29 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright ${year}, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.demo.model.tree.adaptors;
+
+
+/**
+ * @author Nick Belaevski
+ */
+public class Class extends Entry {
+}
Deleted: branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Directory.java
===================================================================
--- trunk/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Directory.java	2010-11-30 14:37:17 UTC (rev 20235)
+++ branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Directory.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -1,56 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright ${year}, Red Hat, Inc. and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software 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 software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.richfaces.demo.model.tree.adaptors;
-
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlElement;
-
-/**
- * @author Nick Belaevski
- *         mailto:nbelaevski@exadel.com
- *         created 24.07.2007
- *
- */
-public class Directory extends Entry {
-
-    @XmlElement(name = "directory")
-    private List<Directory> directories;
-    
-    @XmlElement(name = "file")
-    private List<File> files;
- 
-    @XmlElement(name = "archive")
-    private List<ArchiveFile> archiveFiles;
- 
-    public List<Directory> getDirectories() {
-        return directories;
-    }
-    
-    public List<File> getFiles() {
-        return files;
-    }
-    
-    public List<ArchiveFile> getArchiveFiles() {
-        return archiveFiles;
-    }
-}
Copied: branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Directory.java (from rev 20235, trunk/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Directory.java)
===================================================================
--- branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Directory.java	                        (rev 0)
+++ branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Directory.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,56 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright ${year}, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.demo.model.tree.adaptors;
+
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+
+/**
+ * @author Nick Belaevski
+ *         mailto:nbelaevski@exadel.com
+ *         created 24.07.2007
+ *
+ */
+public class Directory extends Entry {
+
+    @XmlElement(name = "directory")
+    private List<Directory> directories;
+    
+    @XmlElement(name = "file")
+    private List<File> files;
+ 
+    @XmlElement(name = "archive")
+    private List<ArchiveFile> archiveFiles;
+ 
+    public List<Directory> getDirectories() {
+        return directories;
+    }
+    
+    public List<File> getFiles() {
+        return files;
+    }
+    
+    public List<ArchiveFile> getArchiveFiles() {
+        return archiveFiles;
+    }
+}
Deleted: branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Entry.java
===================================================================
--- trunk/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Entry.java	2010-11-30 14:37:17 UTC (rev 20235)
+++ branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Entry.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -1,91 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright ${year}, Red Hat, Inc. and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software 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 software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.richfaces.demo.model.tree.adaptors;
-
-import java.util.List;
-
-import javax.faces.application.FacesMessage;
-import javax.faces.context.FacesContext;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-
-import com.google.common.base.Joiner;
-import com.google.common.collect.Lists;
-
-
-/**
- * @author Nick Belaevski
- *         mailto:nbelaevski@exadel.com
- *         created 29.07.2007
- *
- */
-(a)XmlAccessorType(XmlAccessType.FIELD)
-public abstract class Entry {
-
-    @XmlAttribute
-    private String name;
-
-    private Entry parent;
-    
-    public String getPath() {
-        List<Entry> entries = Lists.newLinkedList();
-        
-        Entry entry = this;
-        while (entry != null) {
-            entries.add(0, entry);
-            entry = entry.getParent();
-        }
-        
-        return Joiner.on(" -> ").join(entries);
-    }
-    
-    public void processClick() {
-        FacesContext context = FacesContext.getCurrentInstance();
-        
-        context.addMessage(null, new FacesMessage(getPath()));
-    }
-    
-    public String toString() {
-        return getClass().getSimpleName() + " [" + getName() + "]";
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public void click() {
-    }
-
-    public Entry getParent() {
-        return parent;
-    }
-    
-    public void setParent(Entry parent) {
-        this.parent = parent;
-    }
-
-}
Copied: branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Entry.java (from rev 20235, trunk/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Entry.java)
===================================================================
--- branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Entry.java	                        (rev 0)
+++ branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Entry.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,91 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright ${year}, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.demo.model.tree.adaptors;
+
+import java.util.List;
+
+import javax.faces.application.FacesMessage;
+import javax.faces.context.FacesContext;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+
+import com.google.common.base.Joiner;
+import com.google.common.collect.Lists;
+
+
+/**
+ * @author Nick Belaevski
+ *         mailto:nbelaevski@exadel.com
+ *         created 29.07.2007
+ *
+ */
+(a)XmlAccessorType(XmlAccessType.FIELD)
+public abstract class Entry {
+
+    @XmlAttribute
+    private String name;
+
+    private Entry parent;
+    
+    public String getPath() {
+        List<Entry> entries = Lists.newLinkedList();
+        
+        Entry entry = this;
+        while (entry != null) {
+            entries.add(0, entry);
+            entry = entry.getParent();
+        }
+        
+        return Joiner.on(" -> ").join(entries);
+    }
+    
+    public void processClick() {
+        FacesContext context = FacesContext.getCurrentInstance();
+        
+        context.addMessage(null, new FacesMessage(getPath()));
+    }
+    
+    public String toString() {
+        return getClass().getSimpleName() + " [" + getName() + "]";
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public void click() {
+    }
+
+    public Entry getParent() {
+        return parent;
+    }
+    
+    public void setParent(Entry parent) {
+        this.parent = parent;
+    }
+
+}
Deleted: branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/File.java
===================================================================
--- trunk/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/File.java	2010-11-30 14:37:17 UTC (rev 20235)
+++ branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/File.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -1,32 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright ${year}, Red Hat, Inc. and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software 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 software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.richfaces.demo.model.tree.adaptors;
-
-/**
- * @author Nick Belaevski
- *         mailto:nbelaevski@exadel.com
- *         created 25.07.2007
- *
- */
-public class File extends Entry {
-
-}
Copied: branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/File.java (from rev 20235, trunk/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/File.java)
===================================================================
--- branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/File.java	                        (rev 0)
+++ branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/File.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,32 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright ${year}, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.demo.model.tree.adaptors;
+
+/**
+ * @author Nick Belaevski
+ *         mailto:nbelaevski@exadel.com
+ *         created 25.07.2007
+ *
+ */
+public class File extends Entry {
+
+}
Deleted: branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Package.java
===================================================================
--- trunk/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Package.java	2010-11-30 14:37:17 UTC (rev 20235)
+++ branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Package.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -1,41 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright ${year}, Red Hat, Inc. and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software 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 software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.richfaces.demo.model.tree.adaptors;
-
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlElement;
-
-/**
- * @author Nick Belaevski mailto:nbelaevski@exadel.com created 25.07.2007
- * 
- */
-public class Package extends Entry {
-
-    @XmlElement(name = "class")
-    private List<Class> classes;
-
-    public List<Class> getClasses() {
-        return classes;
-    }
-
-}
Copied: branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Package.java (from rev 20235, trunk/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Package.java)
===================================================================
--- branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Package.java	                        (rev 0)
+++ branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Package.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,41 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright ${year}, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.demo.model.tree.adaptors;
+
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+
+/**
+ * @author Nick Belaevski mailto:nbelaevski@exadel.com created 25.07.2007
+ * 
+ */
+public class Package extends Entry {
+
+    @XmlElement(name = "class")
+    private List<Class> classes;
+
+    public List<Class> getClasses() {
+        return classes;
+    }
+
+}
Deleted: branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Project.java
===================================================================
--- trunk/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Project.java	2010-11-30 14:37:17 UTC (rev 20235)
+++ branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Project.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -1,50 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright ${year}, Red Hat, Inc. and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software 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 software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.richfaces.demo.model.tree.adaptors;
-
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlElement;
-
-
-/**
- * @author Nick Belaevski
- *         mailto:nbelaevski@exadel.com
- *         created 24.07.2007
- *
- */
-public class Project extends Entry {
-
-    @XmlElement(name = "sourceDirectory")
-    private List<SourceDirectory> sourceDirectories;
-
-    @XmlElement(name = "directory")
-    private List<Directory> commonDirectories;
-
-    public List<SourceDirectory> getSourceDirectories() {
-        return sourceDirectories;
-    }
-
-    public List<Directory> getCommonDirectories() {
-        return commonDirectories;
-    }
-}
Copied: branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Project.java (from rev 20235, trunk/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Project.java)
===================================================================
--- branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Project.java	                        (rev 0)
+++ branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Project.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,50 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright ${year}, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.demo.model.tree.adaptors;
+
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+
+
+/**
+ * @author Nick Belaevski
+ *         mailto:nbelaevski@exadel.com
+ *         created 24.07.2007
+ *
+ */
+public class Project extends Entry {
+
+    @XmlElement(name = "sourceDirectory")
+    private List<SourceDirectory> sourceDirectories;
+
+    @XmlElement(name = "directory")
+    private List<Directory> commonDirectories;
+
+    public List<SourceDirectory> getSourceDirectories() {
+        return sourceDirectories;
+    }
+
+    public List<Directory> getCommonDirectories() {
+        return commonDirectories;
+    }
+}
Deleted: branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Root.java
===================================================================
--- trunk/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Root.java	2010-11-30 14:37:17 UTC (rev 20235)
+++ branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Root.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -1,43 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2010, Red Hat, Inc. and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software 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 software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.richfaces.demo.model.tree.adaptors;
-
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-
-/**
- * @author Nick Belaevski
- * 
- */
-@XmlRootElement(name = "root")
-public class Root {
-
-    @XmlElement(name = "project")
-    private List<Project> projects;
-    
-    public List<Project> getProjects() {
-        return projects;
-    }
-
-}
Copied: branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Root.java (from rev 20235, trunk/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Root.java)
===================================================================
--- branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Root.java	                        (rev 0)
+++ branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/Root.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,43 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.demo.model.tree.adaptors;
+
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * @author Nick Belaevski
+ * 
+ */
+@XmlRootElement(name = "root")
+public class Root {
+
+    @XmlElement(name = "project")
+    private List<Project> projects;
+    
+    public List<Project> getProjects() {
+        return projects;
+    }
+
+}
Deleted: branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/SimpleRecursiveNode.java
===================================================================
--- trunk/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/SimpleRecursiveNode.java	2010-11-30 14:37:17 UTC (rev 20235)
+++ branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/SimpleRecursiveNode.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -1,76 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright ${year}, Red Hat, Inc. and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software 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 software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.richfaces.demo.model.tree.adaptors;
-
-import java.util.List;
-
-import com.google.common.collect.Lists;
-
-/**
- * @author Nick Belaevski
- * @since 3.2
- */
-
-public class SimpleRecursiveNode {
-
-    private SimpleRecursiveNode parent;
-
-    private List<SimpleRecursiveNode> children = Lists.newArrayList();
-
-    private String text;
-
-    public SimpleRecursiveNode(SimpleRecursiveNode parent, String text) {
-        super();
-        this.parent = parent;
-        if (parent != null) {
-            parent.addChild(this);
-        }
-        this.text = text;
-    }
-
-    public void addChild(SimpleRecursiveNode node) {
-        children.add(node);
-    }
-
-    public void removeChild(SimpleRecursiveNode node) {
-        children.remove(node);
-    }
-
-    public void remove() {
-        if (parent != null) {
-            parent.removeChild(this);
-        }
-    }
-
-    public SimpleRecursiveNode getParent() {
-        return parent;
-    }
-
-    public List<SimpleRecursiveNode> getChildren() {
-        return children;
-    }
-
-    public String getText() {
-        return text;
-    }
-}
Copied: branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/SimpleRecursiveNode.java (from rev 20235, trunk/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/SimpleRecursiveNode.java)
===================================================================
--- branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/SimpleRecursiveNode.java	                        (rev 0)
+++ branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/SimpleRecursiveNode.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,76 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright ${year}, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.richfaces.demo.model.tree.adaptors;
+
+import java.util.List;
+
+import com.google.common.collect.Lists;
+
+/**
+ * @author Nick Belaevski
+ * @since 3.2
+ */
+
+public class SimpleRecursiveNode {
+
+    private SimpleRecursiveNode parent;
+
+    private List<SimpleRecursiveNode> children = Lists.newArrayList();
+
+    private String text;
+
+    public SimpleRecursiveNode(SimpleRecursiveNode parent, String text) {
+        super();
+        this.parent = parent;
+        if (parent != null) {
+            parent.addChild(this);
+        }
+        this.text = text;
+    }
+
+    public void addChild(SimpleRecursiveNode node) {
+        children.add(node);
+    }
+
+    public void removeChild(SimpleRecursiveNode node) {
+        children.remove(node);
+    }
+
+    public void remove() {
+        if (parent != null) {
+            parent.removeChild(this);
+        }
+    }
+
+    public SimpleRecursiveNode getParent() {
+        return parent;
+    }
+
+    public List<SimpleRecursiveNode> getChildren() {
+        return children;
+    }
+
+    public String getText() {
+        return text;
+    }
+}
Deleted: branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/SourceDirectory.java
===================================================================
--- trunk/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/SourceDirectory.java	2010-11-30 14:37:17 UTC (rev 20235)
+++ branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/SourceDirectory.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -1,44 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright ${year}, Red Hat, Inc. and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software 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 software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.richfaces.demo.model.tree.adaptors;
-
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlElement;
-
-/**
- * @author Nick Belaevski
- *         mailto:nbelaevski@exadel.com
- *         created 24.07.2007
- *
- */
-public class SourceDirectory extends Entry {
-
-    @XmlElement(name = "package")
-    private List<Package> packages;
-
-    public List<Package> getPackages() {
-        return packages;
-    }
-
-}
Copied: branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/SourceDirectory.java (from rev 20235, trunk/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/SourceDirectory.java)
===================================================================
--- branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/SourceDirectory.java	                        (rev 0)
+++ branches/RF-8742-1/examples/iteration-demo/src/main/java/org/richfaces/demo/model/tree/adaptors/SourceDirectory.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,44 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright ${year}, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.richfaces.demo.model.tree.adaptors;
+
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+
+/**
+ * @author Nick Belaevski
+ *         mailto:nbelaevski@exadel.com
+ *         created 24.07.2007
+ *
+ */
+public class SourceDirectory extends Entry {
+
+    @XmlElement(name = "package")
+    private List<Package> packages;
+
+    public List<Package> getPackages() {
+        return packages;
+    }
+
+}
Copied: branches/RF-8742-1/examples/iteration-demo/src/main/resources/org/richfaces/demo/model (from rev 20235, trunk/examples/iteration-demo/src/main/resources/org/richfaces/demo/model)
Copied: branches/RF-8742-1/examples/iteration-demo/src/main/resources/org/richfaces/demo/model/tree (from rev 20235, trunk/examples/iteration-demo/src/main/resources/org/richfaces/demo/model/tree)
Deleted: branches/RF-8742-1/examples/iteration-demo/src/main/resources/org/richfaces/demo/model/tree/tree-model-data.xml
===================================================================
--- trunk/examples/iteration-demo/src/main/resources/org/richfaces/demo/model/tree/tree-model-data.xml	2010-11-30 14:37:17 UTC (rev 20235)
+++ branches/RF-8742-1/examples/iteration-demo/src/main/resources/org/richfaces/demo/model/tree/tree-model-data.xml	2010-11-30 19:36:09 UTC (rev 20245)
@@ -1,95 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<root>
-	<project name="ajax4jsf">
-		<sourceDirectory name="src/main/java">
-			<package name="org.ajax4jsf">
-				<class name="FastFilter.java" />
-				<class name="Filter.java" />
-			</package>
-			<package name="org.ajax4jsf.component">
-				<class name="UIDataAdaptor.java" />
-				<class name="AjaxActionComponent.java" />
-			</package>
-			<package name="org.ajax4jsf.renderkit">
-				<class name="AjaxChildrenRenderer.java" />
-				<class name="AjaxComponentRendererBase.java" />
-			</package>
-		</sourceDirectory>
-		<sourceDirectory name="src/main/resources">
-			<package name="org.ajax4jsf">
-			</package>
-			<package name="org.ajax4jsf.javascript">
-			</package>
-		</sourceDirectory>
-	</project>
-
-	<project name="richfaces">
-		<sourceDirectory name="src/main/java">
-			<package name="org.richfaces">
-			</package>
-			<package name="org.richfaces.component">
-			</package>
-			<package name="org.richfaces.model">
-			</package>
-		</sourceDirectory>
-		<sourceDirectory name="src/main/resources">
-			<package name="org.richfaces">
-			</package>
-			<package name="org.richfaces.renderkit">
-			</package>
-		</sourceDirectory>
-		<sourceDirectory name="target/generated/java">
-			<package name="org.richfaces">
-			</package>
-			<package name="org.richfaces.component">
-			</package>
-			<package name="org.richfaces.renderkit">
-			</package>
-		</sourceDirectory>
-		<directory name="design">
-			<directory name="funcspec">
-				<file name="FunctionalSpecification-1.0.doc" />
-				<file name="Requirements-1.0.doc" />
-			</directory>			
-		</directory>
-		<directory name="src">
-			<directory name="main">
-				<directory name="config">
-					<directory name="org">
-						<directory name="richfaces">
-							<directory name="component">
-								<file name="tree.config.xml" />
-								<file name="treeNode.config.xml" />
-							</directory>
-						</directory>
-					</directory>
-				</directory>
-				<directory name="templates"></directory>
-			</directory>
-			<directory name="test"></directory>
-		</directory>
-		<directory name="target">
-			<directory name="generated-component">
-			</directory>
-			<directory name="surefire-reports">
-				<file name="org.richfaces.JSFComponentTest.txt" />
-				<file name="TEST-ComponentTest.xml" />
-			</directory>
-			<file name="richfaces-3.1.0-snapshot" />
-			<file name="richfaces-3.1.0-javadoc" />
-			<archive name="richfaces-3.1.0-sources">
-				<archiveEntry name="org">
-					<archiveEntry name="richfaces">
-						<archiveEntry name="component">
-							<archiveEntryFile name="UITree" />
-							<archiveEntryFile name="UITreeNode" />
-							<archiveEntryFile name="UICalendar" />
-							<archiveEntryFile name="UIRangedNumberInput" />
-						</archiveEntry>
-					</archiveEntry>
-				</archiveEntry>
-			</archive>
-		</directory>
-	</project>
-</root>
\ No newline at end of file
Copied: branches/RF-8742-1/examples/iteration-demo/src/main/resources/org/richfaces/demo/model/tree/tree-model-data.xml (from rev 20235, trunk/examples/iteration-demo/src/main/resources/org/richfaces/demo/model/tree/tree-model-data.xml)
===================================================================
--- branches/RF-8742-1/examples/iteration-demo/src/main/resources/org/richfaces/demo/model/tree/tree-model-data.xml	                        (rev 0)
+++ branches/RF-8742-1/examples/iteration-demo/src/main/resources/org/richfaces/demo/model/tree/tree-model-data.xml	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<root>
+	<project name="ajax4jsf">
+		<sourceDirectory name="src/main/java">
+			<package name="org.ajax4jsf">
+				<class name="FastFilter.java" />
+				<class name="Filter.java" />
+			</package>
+			<package name="org.ajax4jsf.component">
+				<class name="UIDataAdaptor.java" />
+				<class name="AjaxActionComponent.java" />
+			</package>
+			<package name="org.ajax4jsf.renderkit">
+				<class name="AjaxChildrenRenderer.java" />
+				<class name="AjaxComponentRendererBase.java" />
+			</package>
+		</sourceDirectory>
+		<sourceDirectory name="src/main/resources">
+			<package name="org.ajax4jsf">
+			</package>
+			<package name="org.ajax4jsf.javascript">
+			</package>
+		</sourceDirectory>
+	</project>
+
+	<project name="richfaces">
+		<sourceDirectory name="src/main/java">
+			<package name="org.richfaces">
+			</package>
+			<package name="org.richfaces.component">
+			</package>
+			<package name="org.richfaces.model">
+			</package>
+		</sourceDirectory>
+		<sourceDirectory name="src/main/resources">
+			<package name="org.richfaces">
+			</package>
+			<package name="org.richfaces.renderkit">
+			</package>
+		</sourceDirectory>
+		<sourceDirectory name="target/generated/java">
+			<package name="org.richfaces">
+			</package>
+			<package name="org.richfaces.component">
+			</package>
+			<package name="org.richfaces.renderkit">
+			</package>
+		</sourceDirectory>
+		<directory name="design">
+			<directory name="funcspec">
+				<file name="FunctionalSpecification-1.0.doc" />
+				<file name="Requirements-1.0.doc" />
+			</directory>			
+		</directory>
+		<directory name="src">
+			<directory name="main">
+				<directory name="config">
+					<directory name="org">
+						<directory name="richfaces">
+							<directory name="component">
+								<file name="tree.config.xml" />
+								<file name="treeNode.config.xml" />
+							</directory>
+						</directory>
+					</directory>
+				</directory>
+				<directory name="templates"></directory>
+			</directory>
+			<directory name="test"></directory>
+		</directory>
+		<directory name="target">
+			<directory name="generated-component">
+			</directory>
+			<directory name="surefire-reports">
+				<file name="org.richfaces.JSFComponentTest.txt" />
+				<file name="TEST-ComponentTest.xml" />
+			</directory>
+			<file name="richfaces-3.1.0-snapshot" />
+			<file name="richfaces-3.1.0-javadoc" />
+			<archive name="richfaces-3.1.0-sources">
+				<archiveEntry name="org">
+					<archiveEntry name="richfaces">
+						<archiveEntry name="component">
+							<archiveEntryFile name="UITree" />
+							<archiveEntryFile name="UITreeNode" />
+							<archiveEntryFile name="UICalendar" />
+							<archiveEntryFile name="UIRangedNumberInput" />
+						</archiveEntry>
+					</archiveEntry>
+				</archiveEntry>
+			</archive>
+		</directory>
+	</project>
+</root>
\ No newline at end of file
Copied: branches/RF-8742-1/examples/iteration-demo/src/main/webapp/images/compress.png (from rev 20235, trunk/examples/iteration-demo/src/main/webapp/images/compress.png)
===================================================================
--- branches/RF-8742-1/examples/iteration-demo/src/main/webapp/images/compress.png	                        (rev 0)
+++ branches/RF-8742-1/examples/iteration-demo/src/main/webapp/images/compress.png	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,7 @@
+�PNG
+
+
+��BQA�t#��݈��U+YH]�.��6�,��.�t�BJ7""�U�-b��̴�������I�����܇��������3`���V��T�>wGU���ca��^=v���u�������js��kO�m�T�֘�؉�cf�n�ŕ��o��S�
+�w����{�&���
\ No newline at end of file
Copied: branches/RF-8742-1/examples/iteration-demo/src/main/webapp/images/folder.png (from rev 20235, trunk/examples/iteration-demo/src/main/webapp/images/folder.png)
===================================================================
--- branches/RF-8742-1/examples/iteration-demo/src/main/webapp/images/folder.png	                        (rev 0)
+++ branches/RF-8742-1/examples/iteration-demo/src/main/webapp/images/folder.png	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,11 @@
+�PNG
+
+
+���ݬ����2OT�O�1W��/�`z����8%�;O;�9P#�9B�����}�^��nO������;�����Ǫo��~
+���d���~�Ed�p�ɳ_��_
+�u�I�
+��B�
+�!
+CF(N��߃J,$���k����(!���TA��F*$X����(�}�f�R�/�x�Q��
+�E�q��x!��i3,�mf?Oԓn����A�Q�
\ No newline at end of file
Copied: branches/RF-8742-1/examples/iteration-demo/src/main/webapp/images/folder_key.png (from rev 20235, trunk/examples/iteration-demo/src/main/webapp/images/folder_key.png)
===================================================================
--- branches/RF-8742-1/examples/iteration-demo/src/main/webapp/images/folder_key.png	                        (rev 0)
+++ branches/RF-8742-1/examples/iteration-demo/src/main/webapp/images/folder_key.png	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,7 @@
+�PNG
+
+
+b�������l���Hɜ�#�->����J�-������
\ No newline at end of file
Copied: branches/RF-8742-1/examples/iteration-demo/src/main/webapp/images/folder_page.png (from rev 20235, trunk/examples/iteration-demo/src/main/webapp/images/folder_page.png)
===================================================================
--- branches/RF-8742-1/examples/iteration-demo/src/main/webapp/images/folder_page.png	                        (rev 0)
+++ branches/RF-8742-1/examples/iteration-demo/src/main/webapp/images/folder_page.png	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,9 @@
+�PNG
+
+
+�+��Z�։�����啗�9��n��@MLk�Z!�jȅ֯-\1�eS�s~�������J-��0e����U�l���ʖ����?]:���fh�BU�
+s��w��v����[���d@ʤ�����p Z�jU��睼p	�L�9z��)d���k`Z6��j���B�{
+	h�E?�\�F�~0_����XŻ���{lc�^-e��@&mesm�t)��P�����ԛ�ō˯����#��H��-i�s9��@�r|�
\ No newline at end of file
Copied: branches/RF-8742-1/examples/iteration-demo/src/main/webapp/images/page_white_cup.png (from rev 20235, trunk/examples/iteration-demo/src/main/webapp/images/page_white_cup.png)
===================================================================
--- branches/RF-8742-1/examples/iteration-demo/src/main/webapp/images/page_white_cup.png	                        (rev 0)
+++ branches/RF-8742-1/examples/iteration-demo/src/main/webapp/images/page_white_cup.png	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,7 @@
+�PNG
+
+
+>������,i6��V�g�ш�p����>���G�.��ç�O�m�5~}�B���yt:�3��f���9'L�\�ە��i��n�h4�e����I�R��Ár���Z.�C"��q*�b(Db�/�N���~
+�/�J铠�n�l6�|6�q��@�R�ŽL&�
+�ڥHB�$�z��=*>'�5�RyW���b1�h�Z,	�Bp:����Z!NO��B�KX�V�g�d����	h >���=��Yp*�%�h�2��#��k�M�\�:�����{�F`k��
\ No newline at end of file
Modified: branches/RF-8742-1/examples/iteration-demo/src/main/webapp/index.xhtml
===================================================================
--- branches/RF-8742-1/examples/iteration-demo/src/main/webapp/index.xhtml	2010-11-30 18:55:37 UTC (rev 20244)
+++ branches/RF-8742-1/examples/iteration-demo/src/main/webapp/index.xhtml	2010-11-30 19:36:09 UTC (rev 20245)
@@ -14,6 +14,7 @@
 		<li><h:link outcome="filteringAndSorting">filtering and sorting feature</h:link></li>
 		<li><h:link outcome="list">rich:list</h:link></li>
 		<li><h:link outcome="tree">rich:tree</h:link></li>
+		<li><h:link outcome="treeModel">rich:treeModelAdaptor and rich:treeModelRecursiveAdaptor</h:link></li>
 	</ul>
 	
 
Copied: branches/RF-8742-1/examples/iteration-demo/src/main/webapp/treeModel.xhtml (from rev 20235, trunk/examples/iteration-demo/src/main/webapp/treeModel.xhtml)
===================================================================
--- branches/RF-8742-1/examples/iteration-demo/src/main/webapp/treeModel.xhtml	                        (rev 0)
+++ branches/RF-8742-1/examples/iteration-demo/src/main/webapp/treeModel.xhtml	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,67 @@
+<!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:h="http://java.sun.com/jsf/html"
+	xmlns:f="http://java.sun.com/jsf/core"
+	xmlns:ui="http://java.sun.com/jsf/facelets"
+	xmlns:it="http://richfaces.org/iteration"
+	xmlns:a4j="http://richfaces.org/a4j">
+<f:view contentType="text/html" />
+
+<h:head>
+	<title>Richfaces Tree Models</title>
+</h:head>
+
+<h:body>
+	<a4j:outputPanel ajaxRendered="true">
+		<h:messages id="messages" />
+	</a4j:outputPanel>
+
+	<h:form id="form">
+		<it:tree id="tree" var="node" toggleType="ajax">
+			<it:treeNode>
+				<a4j:commandLink value="#{node}" action="#{node.processClick}" />
+			</it:treeNode>
+
+			<it:treeModelAdaptor nodes="#{treeModelBean.root.projects}">
+				<it:treeNode iconExpanded="/images/folder_key.png" iconCollapsed="/images/folder_key.png">
+					<a4j:commandLink value="#{node}" action="#{node.processClick}" />
+				</it:treeNode>
+			
+				<it:treeModelAdaptor nodes="#{node.sourceDirectories}">
+					<it:treeNode iconExpanded="/images/page_white_cup.png" iconCollapsed="/images/page_white_cup.png">
+						<a4j:commandLink value="#{node}" action="#{node.processClick}" />
+					</it:treeNode>
+					
+					<it:treeModelAdaptor nodes="#{node.packages}">
+						<it:treeModelAdaptor nodes="#{node.classes}" />
+					</it:treeModelAdaptor>				
+				</it:treeModelAdaptor>				
+
+				<it:treeModelRecursiveAdaptor roots="#{node.commonDirectories}" nodes="#{node.directories}">
+					<it:treeNode iconExpanded="/images/folder_page.png" iconCollapsed="/images/folder.png">
+						<a4j:commandLink value="#{node}" action="#{node.processClick}" />
+					</it:treeNode>
+					
+					<it:treeModelRecursiveAdaptor roots="#{node.archiveFiles}" nodes="#{node.archiveEntries}">
+						
+						<it:treeNode rendered="#{node.class.simpleName eq 'ArchiveFile'}" 
+							iconExpanded="/images/compress.png" 
+							iconCollapsed="/images/compress.png">
+							<a4j:commandLink value="#{node}" action="#{node.processClick}" />
+						</it:treeNode>
+
+						<it:treeModelAdaptor rendered="#{node.class.simpleName eq 'ArchiveEntry'}" 
+							nodes="#{node.archiveEntryFiles}" />
+					</it:treeModelRecursiveAdaptor>
+					<it:treeModelAdaptor nodes="#{node.files}" />
+				</it:treeModelRecursiveAdaptor>				
+			</it:treeModelAdaptor>
+		</it:tree>
+	</h:form>
+	
+	<h:panelGroup style="margin-top: 20px;">
+		<hr />
+		This demo uses icons taken from <a href="http://www.famfamfam.com/lab/icons/silk/">http://www.famfamfam.com/lab/icons/silk/</a>
+	</h:panelGroup>
+</h:body>
+</html>
Modified: branches/RF-8742-1/examples/output-demo/src/main/java/org/richfaces/ProgressBarBean.java
===================================================================
--- branches/RF-8742-1/examples/output-demo/src/main/java/org/richfaces/ProgressBarBean.java	2010-11-30 18:55:37 UTC (rev 20244)
+++ branches/RF-8742-1/examples/output-demo/src/main/java/org/richfaces/ProgressBarBean.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -31,7 +31,11 @@
     private boolean childrenRendered = false;
     
     private boolean enabled = false;
-     
+    
+    private boolean initialFacetRendered = true; 
+    
+    private boolean finishFacetRendered = true;
+    
     public boolean isEnabled() {
         return enabled;
     }
@@ -80,6 +84,22 @@
         this.childrenRendered = childrenRendered;
     }
     
+    public boolean isInitialFacetRendered() {
+        return initialFacetRendered;
+    }
+
+    public void setInitialFacetRendered(boolean renderInitialFacet) {
+        this.initialFacetRendered = renderInitialFacet;
+    }
+
+    public boolean isFinishFacetRendered() {
+        return finishFacetRendered;
+    }
+
+    public void setFinishFacetRendered(boolean renderFinishFacet) {
+        this.finishFacetRendered = renderFinishFacet;
+    }
+
     public void decreaseValueByFive() {
         value -= 5;
     }
Modified: branches/RF-8742-1/examples/output-demo/src/main/webapp/WEB-INF/faces-config.xml
===================================================================
--- branches/RF-8742-1/examples/output-demo/src/main/webapp/WEB-INF/faces-config.xml	2010-11-30 18:55:37 UTC (rev 20244)
+++ branches/RF-8742-1/examples/output-demo/src/main/webapp/WEB-INF/faces-config.xml	2010-11-30 19:36:09 UTC (rev 20245)
@@ -108,6 +108,13 @@
         <navigation-case>
             <from-outcome>qunit/tooltip</from-outcome>
             <to-view-id>/qunit/tooltip.xhtml</to-view-id>
-        </navigation-case>        
+        </navigation-case>
+        
+        <!-- Toolbar navigation -->
+        <navigation-case>
+            <from-outcome>toolbar</from-outcome>
+            <to-view-id>/examples/toolbar.xhtml</to-view-id>
+        </navigation-case>
+                
     </navigation-rule>
 </faces-config>
Modified: branches/RF-8742-1/examples/output-demo/src/main/webapp/examples/progressbar.xhtml
===================================================================
--- branches/RF-8742-1/examples/output-demo/src/main/webapp/examples/progressbar.xhtml	2010-11-30 18:55:37 UTC (rev 20244)
+++ branches/RF-8742-1/examples/output-demo/src/main/webapp/examples/progressbar.xhtml	2010-11-30 19:36:09 UTC (rev 20245)
@@ -41,6 +41,14 @@
 		
 			<br />
 			
+			'initial' facet rendered: <h:selectBooleanCheckbox value="#{progressBarBean.initialFacetRendered}" onclick="submit()" />
+		
+			<br />
+
+			'finish' facet rendered: <h:selectBooleanCheckbox value="#{progressBarBean.finishFacetRendered}" onclick="submit()" />
+		
+			<br />
+			
 			Enabled: <h:selectBooleanCheckbox value="#{progressBarBean.enabled}" onclick="submit()" />
 		</h:form>      
       
@@ -54,11 +62,15 @@
 				<h:outputText value="child + " rendered="#{progressBarBean.childrenRendered}" />
 				
 				<f:facet name="initial">
-					<h:outputText value="In initial state" />
+					<h:panelGroup rendered="#{progressBarBean.initialFacetRendered}">
+						<h:outputText value="In initial state" />
+					</h:panelGroup>
 				</f:facet>
 				
 				<f:facet name="finish">
-					<h:outputText value="Finished progress" />
+					<h:panelGroup rendered="#{progressBarBean.finishFacetRendered}">
+						<h:outputText value="Finished progress" />
+					</h:panelGroup>
 				</f:facet>
 				
 			</rich:progressBar>
@@ -78,11 +90,15 @@
 				<h:outputText value="child + " rendered="#{progressBarBean.childrenRendered}" />
 				
 				<f:facet name="initial">
-					<h:outputText value="initial ~ #{progressBarBean.currentTimeAsString}" />
+					<h:panelGroup rendered="#{progressBarBean.initialFacetRendered}">
+						<h:outputText value="initial ~ #{progressBarBean.currentTimeAsString}" />
+					</h:panelGroup>
 				</f:facet>
 				
 				<f:facet name="finish">
-					<h:outputText value="finish ~ #{progressBarBean.currentTimeAsString}" />
+					<h:panelGroup rendered="#{progressBarBean.finishFacetRendered}">
+						<h:outputText value="finish ~ #{progressBarBean.currentTimeAsString}" />
+					</h:panelGroup>
 				</f:facet>
 			</rich:progressBar>
 			
Modified: branches/RF-8742-1/examples/output-demo/src/main/webapp/examples/togglePanel.xhtml
===================================================================
--- branches/RF-8742-1/examples/output-demo/src/main/webapp/examples/togglePanel.xhtml	2010-11-30 18:55:37 UTC (rev 20244)
+++ branches/RF-8742-1/examples/output-demo/src/main/webapp/examples/togglePanel.xhtml	2010-11-30 19:36:09 UTC (rev 20245)
@@ -27,6 +27,12 @@
                 
                 Click me :) it is toggle control
             </h:outputLink>
+            <h:outputLink>
+                <pn:toggleControl targetPanel="my_id" targetItem="name1" event="click" />
+                
+                Click me :) it another toggle control
+            </h:outputLink>
+            
         </h:form>
     </ui:define>
 </ui:composition>
Copied: branches/RF-8742-1/examples/output-demo/src/main/webapp/examples/toolbar.xhtml (from rev 20235, trunk/examples/output-demo/src/main/webapp/examples/toolbar.xhtml)
===================================================================
--- branches/RF-8742-1/examples/output-demo/src/main/webapp/examples/toolbar.xhtml	                        (rev 0)
+++ branches/RF-8742-1/examples/output-demo/src/main/webapp/examples/toolbar.xhtml	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,82 @@
+<!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:f="http://java.sun.com/jsf/core"
+      xmlns:h="http://java.sun.com/jsf/html"
+      xmlns:tb="http://richfaces.org/output">
+    <h:head>
+        <title>ToolBar sample</title>
+        <style>
+            .pic {
+                margin-bottom: -4px;
+                margin-right: 2px;
+            }
+        </style>        
+    </h:head>
+    <h:body>
+        <tb:toolBar height="45" itemSeparator="grid" contentStyle="color:red;">
+        <f:facet name="itemSeparator">
+            ||
+        </f:facet>      
+          <tb:toolBarGroup itemSeparator="line" onitemclick="22">
+              <h:graphicImage value="/images/icons/create_doc.gif" styleClass="pic"/>
+              <a href="sdsd">link 1</a> Text
+              <a href="sdsd 2">link 2</a>
+              <h:graphicImage value="/images/icons/create_folder.gif" styleClass="pic" onclick="q1"/>
+              <h:graphicImage value="/images/icons/copy.gif" styleClass="pic"/>
+              <a href="sdsd">link 3</a> Text
+              <a href="sdsd 2">link 4</a>
+          </tb:toolBarGroup>
+          <tb:toolBarGroup itemSeparator="none">
+              <h:graphicImage value="/images/icons/save.gif" styleClass="pic" onclick="q2"/>
+              <h:graphicImage value="/images/icons/save.gif" styleClass="pic" onclick="q2"/>
+              <h:graphicImage value="/images/icons/save.gif" styleClass="pic" onclick="q2"/>
+              <h:graphicImage value="/images/icons/save.gif" styleClass="pic" onclick="q2"/>
+          </tb:toolBarGroup>
+          <tb:toolBarGroup itemSeparator="line">
+              <h:graphicImage value="/images/icons/save.gif" styleClass="pic" onclick="q2"/>
+              <h:graphicImage value="/images/icons/save.gif" styleClass="pic" onclick="q2"/>
+          </tb:toolBarGroup>
+          
+          <tb:toolBarGroup location="right" itemSeparator="square">
+              <h:graphicImage value="/images/icons/find.gif" styleClass="pic"/>
+              <h:graphicImage value="/images/icons/filter.gif" styleClass="pic"/>
+          </tb:toolBarGroup>
+        </tb:toolBar>
+        <br/>
+        <tb:toolBar itemSeparator="grid">
+          <tb:toolBarGroup itemSeparator="line">
+              <h:graphicImage value="/images/icons/create_doc.gif" styleClass="pic"/>
+              <h:graphicImage value="/images/icons/create_folder.gif" styleClass="pic"/>
+              <h:graphicImage value="/images/icons/copy.gif" styleClass="pic"/>
+          </tb:toolBarGroup>
+          <tb:toolBarGroup itemSeparator="disc">
+              <h:graphicImage value="/images/icons/save.gif" styleClass="pic"/>
+              <h:graphicImage value="/images/icons/save_as.gif" styleClass="pic"/>
+              <h:graphicImage value="/images/icons/save_all.gif" styleClass="pic"/>
+          </tb:toolBarGroup>
+          <tb:toolBarGroup location="right" itemSeparator="square">
+              <h:graphicImage value="/images/icons/find.gif" styleClass="pic"/>
+              <h:graphicImage value="/images/icons/filter.gif" styleClass="pic"/>
+          </tb:toolBarGroup>
+        </tb:toolBar>     
+        
+        <br/>
+        <tb:toolBar height="26" itemSeparator="grid">
+          <tb:toolBarGroup itemSeparator="line">
+              <h:graphicImage value="/images/icons/create_doc.gif" styleClass="pic"/>
+              <h:graphicImage value="/images/icons/create_folder.gif" styleClass="pic"/>
+              <h:graphicImage value="/images/icons/copy.gif" styleClass="pic"/>
+          </tb:toolBarGroup>
+          <tb:toolBarGroup itemSeparator="disc">
+              <h:graphicImage value="/images/icons/save.gif" styleClass="pic"/>
+              <h:graphicImage value="/images/icons/save_as.gif" styleClass="pic"/>
+              <h:graphicImage value="/images/icons/save_all.gif" styleClass="pic"/>
+          </tb:toolBarGroup>
+          <tb:toolBarGroup location="right" itemSeparator="square">
+              <h:graphicImage value="/images/icons/find.gif" styleClass="pic"/>
+              <h:graphicImage value="/images/icons/filter.gif" styleClass="pic"/>
+          </tb:toolBarGroup>
+        </tb:toolBar> 
+    </h:body>
+</html>
\ No newline at end of file
Copied: branches/RF-8742-1/examples/output-demo/src/main/webapp/images (from rev 20235, trunk/examples/output-demo/src/main/webapp/images)
Deleted: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/GridSeparatorImage.gif
===================================================================
(Binary files differ)
Copied: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/GridSeparatorImage.gif (from rev 20235, trunk/examples/output-demo/src/main/webapp/images/GridSeparatorImage.gif)
===================================================================
(Binary files differ)
Copied: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons (from rev 20235, trunk/examples/output-demo/src/main/webapp/images/icons)
Deleted: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/arrow.png
===================================================================
(Binary files differ)
Copied: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/arrow.png (from rev 20235, trunk/examples/output-demo/src/main/webapp/images/icons/arrow.png)
===================================================================
(Binary files differ)
Deleted: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/copy.gif
===================================================================
(Binary files differ)
Copied: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/copy.gif (from rev 20235, trunk/examples/output-demo/src/main/webapp/images/icons/copy.gif)
===================================================================
(Binary files differ)
Deleted: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/create_doc.gif
===================================================================
(Binary files differ)
Copied: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/create_doc.gif (from rev 20235, trunk/examples/output-demo/src/main/webapp/images/icons/create_doc.gif)
===================================================================
(Binary files differ)
Deleted: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/create_folder.gif
===================================================================
(Binary files differ)
Copied: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/create_folder.gif (from rev 20235, trunk/examples/output-demo/src/main/webapp/images/icons/create_folder.gif)
===================================================================
(Binary files differ)
Deleted: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/cut.gif
===================================================================
(Binary files differ)
Copied: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/cut.gif (from rev 20235, trunk/examples/output-demo/src/main/webapp/images/icons/cut.gif)
===================================================================
(Binary files differ)
Deleted: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/delete.gif
===================================================================
(Binary files differ)
Copied: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/delete.gif (from rev 20235, trunk/examples/output-demo/src/main/webapp/images/icons/delete.gif)
===================================================================
(Binary files differ)
Deleted: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/edit.gif
===================================================================
(Binary files differ)
Copied: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/edit.gif (from rev 20235, trunk/examples/output-demo/src/main/webapp/images/icons/edit.gif)
===================================================================
(Binary files differ)
Deleted: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/filter.gif
===================================================================
(Binary files differ)
Copied: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/filter.gif (from rev 20235, trunk/examples/output-demo/src/main/webapp/images/icons/filter.gif)
===================================================================
(Binary files differ)
Deleted: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/find.gif
===================================================================
(Binary files differ)
Copied: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/find.gif (from rev 20235, trunk/examples/output-demo/src/main/webapp/images/icons/find.gif)
===================================================================
(Binary files differ)
Deleted: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/ico_new_group.gif
===================================================================
(Binary files differ)
Copied: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/ico_new_group.gif (from rev 20235, trunk/examples/output-demo/src/main/webapp/images/icons/ico_new_group.gif)
===================================================================
(Binary files differ)
Deleted: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/ico_new_item.gif
===================================================================
(Binary files differ)
Copied: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/ico_new_item.gif (from rev 20235, trunk/examples/output-demo/src/main/webapp/images/icons/ico_new_item.gif)
===================================================================
(Binary files differ)
Deleted: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/open.gif
===================================================================
(Binary files differ)
Copied: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/open.gif (from rev 20235, trunk/examples/output-demo/src/main/webapp/images/icons/open.gif)
===================================================================
(Binary files differ)
Deleted: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/paste.gif
===================================================================
(Binary files differ)
Copied: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/paste.gif (from rev 20235, trunk/examples/output-demo/src/main/webapp/images/icons/paste.gif)
===================================================================
(Binary files differ)
Deleted: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/redo.gif
===================================================================
(Binary files differ)
Copied: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/redo.gif (from rev 20235, trunk/examples/output-demo/src/main/webapp/images/icons/redo.gif)
===================================================================
(Binary files differ)
Deleted: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/reload.gif
===================================================================
(Binary files differ)
Copied: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/reload.gif (from rev 20235, trunk/examples/output-demo/src/main/webapp/images/icons/reload.gif)
===================================================================
(Binary files differ)
Deleted: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/repeat.gif
===================================================================
(Binary files differ)
Copied: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/repeat.gif (from rev 20235, trunk/examples/output-demo/src/main/webapp/images/icons/repeat.gif)
===================================================================
(Binary files differ)
Deleted: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/save.gif
===================================================================
(Binary files differ)
Copied: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/save.gif (from rev 20235, trunk/examples/output-demo/src/main/webapp/images/icons/save.gif)
===================================================================
(Binary files differ)
Deleted: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/save_all.gif
===================================================================
(Binary files differ)
Copied: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/save_all.gif (from rev 20235, trunk/examples/output-demo/src/main/webapp/images/icons/save_all.gif)
===================================================================
(Binary files differ)
Deleted: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/save_as.gif
===================================================================
(Binary files differ)
Copied: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/save_as.gif (from rev 20235, trunk/examples/output-demo/src/main/webapp/images/icons/save_as.gif)
===================================================================
(Binary files differ)
Deleted: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/undo.gif
===================================================================
(Binary files differ)
Copied: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/undo.gif (from rev 20235, trunk/examples/output-demo/src/main/webapp/images/icons/undo.gif)
===================================================================
(Binary files differ)
Deleted: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/verify.gif
===================================================================
(Binary files differ)
Copied: branches/RF-8742-1/examples/output-demo/src/main/webapp/images/icons/verify.gif (from rev 20235, trunk/examples/output-demo/src/main/webapp/images/icons/verify.gif)
===================================================================
(Binary files differ)
Modified: branches/RF-8742-1/examples/output-demo/src/main/webapp/templates/template.xhtml
===================================================================
--- branches/RF-8742-1/examples/output-demo/src/main/webapp/templates/template.xhtml	2010-11-30 18:55:37 UTC (rev 20244)
+++ branches/RF-8742-1/examples/output-demo/src/main/webapp/templates/template.xhtml	2010-11-30 19:36:09 UTC (rev 20245)
@@ -143,6 +143,18 @@
                             </ul>
                         </li>
                     </ul>
+                    
+                    <p>Toolbar</p>
+                    <ul>
+                        <li>
+                            <p>Examples</p>
+                            <ul>
+                                <li>
+                                    <h:commandLink value="Toolbar" action="toolbar"/>
+                                </li>
+                            </ul>
+                        </li>
+                    </ul>
 
                     </h:form>
                 </td>
Modified: branches/RF-8742-1/ui/common/ui/src/main/java/org/richfaces/component/RowKeyContextEventWrapper.java
===================================================================
--- branches/RF-8742-1/ui/common/ui/src/main/java/org/richfaces/component/RowKeyContextEventWrapper.java	2010-11-30 18:55:37 UTC (rev 20244)
+++ branches/RF-8742-1/ui/common/ui/src/main/java/org/richfaces/component/RowKeyContextEventWrapper.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -23,26 +23,34 @@
 package org.richfaces.component;
 
 import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.event.AbortProcessingException;
 import javax.faces.event.FacesEvent;
 import javax.faces.event.FacesListener;
 import javax.faces.event.PhaseId;
 
+import org.richfaces.log.Logger;
+import org.richfaces.log.RichfacesLogger;
+
 /**
  * @author Nick Belaevski
  */
-class RowKeyContextEventWrapper extends FacesEvent {
+public class RowKeyContextEventWrapper extends FacesEvent {
 
-    /**
-     *
-     */
     private static final long serialVersionUID = -869970815228914529L;
+
+    private static final Logger LOGGER = RichfacesLogger.COMPONENTS.getLogger();
+    
     private FacesEvent event;
-    private Object rowKey;
+    private Object eventRowKey;
 
-    public RowKeyContextEventWrapper(UIComponent component, FacesEvent event, Object rowKey) {
+    private Object initialRowKey;
+    
+    public RowKeyContextEventWrapper(UIDataAdaptor component, FacesEvent event, Object eventRowKey) {
         super(component);
+
         this.event = event;
-        this.rowKey = rowKey;
+        this.eventRowKey = eventRowKey;
     }
 
     public FacesEvent getFacesEvent() {
@@ -65,10 +73,54 @@
         throw new IllegalStateException();
     }
 
-    /**
-     * @return the rowKey
-     */
-    public Object getRowKey() {
-        return rowKey;
+    public UIDataAdaptor getComponent() {
+        return (UIDataAdaptor) super.getComponent();
     }
+    
+    public Object getEventRowKey() {
+        return eventRowKey;
+    }
+    
+    protected void setupEventContext(FacesContext facesContext) {
+        getComponent().setRowKey(facesContext, getEventRowKey());
+    }
+    
+    public void broadcast(FacesContext context) throws AbortProcessingException {
+        // Set up the correct context and fire our wrapped event
+        UIDataAdaptor dataAdaptor = getComponent();
+        initialRowKey = dataAdaptor.getRowKey();
+        
+        UIComponent compositeParent = null;
+
+        UIComponent targetComponent = event.getComponent();
+        
+        try {
+            if (!UIComponent.isCompositeComponent(targetComponent)) {
+                compositeParent = UIComponent.getCompositeComponentParent(targetComponent);
+            }
+
+            if (compositeParent != null) {
+                compositeParent.pushComponentToEL(context, null);
+            }
+
+            setupEventContext(context);
+            
+            targetComponent.pushComponentToEL(context, null);
+            targetComponent.broadcast(event);
+        } finally {
+            try {
+                dataAdaptor.setRowKey(context, initialRowKey);
+            } catch (Exception e) {
+                LOGGER.error(e.getMessage(), e);
+            }
+            
+            initialRowKey = null;
+
+            targetComponent.popComponentFromEL(context);
+            
+            if (compositeParent != null) {
+                compositeParent.popComponentFromEL(context);
+            }
+        }
+    }
 }
Modified: branches/RF-8742-1/ui/common/ui/src/main/java/org/richfaces/component/UIDataAdaptor.java
===================================================================
--- branches/RF-8742-1/ui/common/ui/src/main/java/org/richfaces/component/UIDataAdaptor.java	2010-11-30 18:55:37 UTC (rev 20244)
+++ branches/RF-8742-1/ui/common/ui/src/main/java/org/richfaces/component/UIDataAdaptor.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -29,7 +29,6 @@
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.Map;
-import java.util.Set;
 
 import javax.el.ValueExpression;
 import javax.faces.FacesException;
@@ -244,6 +243,7 @@
     //TODO nick - PSH support?
     private DataComponentState componentState = null;
     private ExtendedDataModel<?> extendedDataModel = null;
+    
     private Object rowKey = null;
 
     private String clientId;
@@ -348,18 +348,6 @@
     }
 
     /*
-     * (non-Javadoc)
-     *
-     * @see org.ajax4jsf.component.AjaxChildrenEncoder#encodeAjaxChild(javax.faces.context.FacesContext,
-     * java.lang.String, java.util.Set, java.util.Set)
-     */
-    public void encodeAjaxChild(FacesContext context, String path, Set<String> ids, Set<String> renderedAreas)
-        throws IOException {
-
-        // TODO Auto-generated method stub
-    }
-
-    /*
      *  (non-Javadoc)
      * @see javax.faces.component.UniqueIdVendor#createUniqueId(javax.faces.context.FacesContext, java.lang.String)
      */
@@ -391,13 +379,17 @@
      */
     public void setRowKey(FacesContext facesContext, Object rowKey) {
         this.saveChildState(facesContext);
+        
         this.rowKey = rowKey;
-        this.clientId = null;
+        
         getExtendedDataModel().setRowKey(rowKey);
+        
+        this.clientId = null;
 
         boolean rowSelected = (rowKey != null) && isRowAvailable();
 
         setupVariable(facesContext, rowSelected);
+        
         this.restoreChildState(facesContext);
     }
 
@@ -546,13 +538,13 @@
         setRowKey(getFacesContext(), rowKey);
     }
 
-    /*
-     *  (non-Javadoc)
-     * @see javax.faces.component.UIComponentBase#queueEvent(javax.faces.event.FacesEvent)
-     */
+    protected FacesEvent wrapEvent(FacesEvent event) {
+        return new RowKeyContextEventWrapper(this, event, getRowKey());
+    }
+    
     @Override
     public void queueEvent(FacesEvent event) {
-        super.queueEvent(new RowKeyContextEventWrapper(this, event, getRowKey()));
+        super.queueEvent(wrapEvent(event));
     }
 
     /*
@@ -561,64 +553,16 @@
      */
     @Override
     public void broadcast(FacesEvent event) throws AbortProcessingException {
-        if (!(event instanceof RowKeyContextEventWrapper)) {
-            if (!broadcastLocal(event)) {
-                super.broadcast(event);
-            }
-
-            return;
+        if (event instanceof RowKeyContextEventWrapper) {
+            RowKeyContextEventWrapper eventWrapper = (RowKeyContextEventWrapper) event;
+            
+            eventWrapper.broadcast(getFacesContext());
+        } else {
+            super.broadcast(event);
         }
-
-        FacesContext context = getFacesContext();
-
-        // Set up the correct context and fire our wrapped event
-        RowKeyContextEventWrapper revent = (RowKeyContextEventWrapper) event;
-        Object oldRowKey = getRowKey();
-
-        setRowKey(context, revent.getRowKey());
-
-        FacesEvent rowEvent = revent.getFacesEvent();
-        UIComponent source = rowEvent.getComponent();
-        UIComponent compositeParent = null;
-
-        try {
-            if (!UIComponent.isCompositeComponent(source)) {
-                compositeParent = UIComponent.getCompositeComponentParent(source);
-            }
-
-            if (compositeParent != null) {
-                compositeParent.pushComponentToEL(context, null);
-            }
-
-            source.pushComponentToEL(context, null);
-            source.broadcast(rowEvent);
-        } finally {
-            source.popComponentFromEL(context);
-
-            if (compositeParent != null) {
-                compositeParent.popComponentFromEL(context);
-            }
-        }
-
-        setRowKey(context, oldRowKey);
     }
 
     /**
-     * Process events targetted for concrete implementation. Hook method called
-     * from {@link #broadcast(FacesEvent)}
-     *
-     * @param event -
-     *              processed event.
-     * @return true if event processed, false if component must continue
-     *         processing.
-     */
-
-    // TODO - is it still actual?
-    protected boolean broadcastLocal(FacesEvent event) {
-        return false;
-    }
-
-    /**
      * @return the extendedDataModel
      */
     protected ExtendedDataModel<?> getExtendedDataModel() {
Modified: branches/RF-8742-1/ui/core/ui/src/main/java/org/richfaces/view/facelets/tag/AjaxBehaviorRule.java
===================================================================
--- branches/RF-8742-1/ui/core/ui/src/main/java/org/richfaces/view/facelets/tag/AjaxBehaviorRule.java	2010-11-30 18:55:37 UTC (rev 20244)
+++ branches/RF-8742-1/ui/core/ui/src/main/java/org/richfaces/view/facelets/tag/AjaxBehaviorRule.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -72,15 +72,15 @@
                 return new ValueExpressionMetadata(name, type, attribute);
 
             } else if (meta != null && meta.getWriteMethod(name) != null) {
-                if (EXECUTE.equals(name) || RENDER.equals(name)) {
-                    return new LiteralAttributeMetadata(name, attribute.getValue());
-                }
+                return new LiteralAttributeMetadata(name, attribute.getValue());
             }
         }
 
         return null;
     }
-
+        
+    
+    
     public static final class AjaxBehaviorListenerMapper extends Metadata {
 
         private final TagAttribute attr;
Modified: branches/RF-8742-1/ui/core/ui/src/main/java/org/richfaces/view/facelets/tag/BehaviorRule.java
===================================================================
--- branches/RF-8742-1/ui/core/ui/src/main/java/org/richfaces/view/facelets/tag/BehaviorRule.java	2010-11-30 18:55:37 UTC (rev 20244)
+++ branches/RF-8742-1/ui/core/ui/src/main/java/org/richfaces/view/facelets/tag/BehaviorRule.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -83,7 +83,7 @@
                 }
                 return new ValueExpressionMetadata(name, type, attribute);
 
-            } else {
+            } else if(meta != null && meta.getWriteMethod(name) != null) {
                 return new LiteralAttributeMetadata(name, attribute.getValue());
             }
         }
Modified: branches/RF-8742-1/ui/input/ui/src/main/java/org/richfaces/renderkit/CalendarRendererBase.java
===================================================================
--- branches/RF-8742-1/ui/input/ui/src/main/java/org/richfaces/renderkit/CalendarRendererBase.java	2010-11-30 18:55:37 UTC (rev 20244)
+++ branches/RF-8742-1/ui/input/ui/src/main/java/org/richfaces/renderkit/CalendarRendererBase.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -147,6 +147,8 @@
     private static final String HOURS_VALUE = "hours";
     
     private static final String MINUTES_VALUE = "minutes";
+    
+    private static final String SECONDS_VALUE = "seconds";
 
     protected void doDecode(FacesContext context, UIComponent component) {
         if (!(component instanceof AbstractCalendar)) {
@@ -401,10 +403,12 @@
             calendar.setTime(date);
             int hours = calendar.get(Calendar.HOUR_OF_DAY);
             int minutes = calendar.get(Calendar.MINUTE);
+            int seconds = calendar.get(Calendar.SECOND); 
             
             if (hours != 12 || minutes != 0) {
                 result.put(HOURS_VALUE, hours);
                 result.put(MINUTES_VALUE, minutes);
+                result.put(SECONDS_VALUE, seconds);
             }
         }
         if (result.size() > 0) {
Modified: branches/RF-8742-1/ui/input/ui/src/main/resources/META-INF/resources/org.richfaces/calendar-utils.js
===================================================================
--- branches/RF-8742-1/ui/input/ui/src/main/resources/META-INF/resources/org.richfaces/calendar-utils.js	2010-11-30 18:55:37 UTC (rev 20244)
+++ branches/RF-8742-1/ui/input/ui/src/main/resources/META-INF/resources/org.richfaces/calendar-utils.js	2010-11-30 19:36:09 UTC (rev 20245)
@@ -93,7 +93,7 @@
 		 *	dd+ - 01-31 */
 		parseDate: function(dateString, pattern, monthNames, monthNamesShort)
 		{
-			var re = /([.*+?^<>=!:${}()[\]\/\\])/g;
+			var re = /([.*+?^<>=!:${}()\[\]\/\\])/g;
 			var monthNamesStr
 			var monthNamesShortStr;
 			if (!monthNames) {
@@ -115,7 +115,7 @@
 			var a,h,min,s;
 			var shortLabel=false;
 			
-			pattern = pattern.replace(/([.*+?^<>=!:${}()|[\]\/\\])/g, '\\$1');
+			pattern = pattern.replace(/([.*+?^<>=!:${}()|\[\]\/\\])/g, '\\$1');
 			pattern = pattern.replace(/(y+|M+|d+|a|H{1,2}|h{1,2}|m{2}|s{2})/g,
 				function($1) {
 					switch ($1) {
@@ -144,7 +144,7 @@
 
 			var re = new RegExp(pattern,'i');
 			var match = dateString.match(re);
-			if (match!=null)
+			if (match!=null && y != undefined && m != undefined && d != undefined)
 			{
 				// set default century start
 				var correctYear = false;
Copied: branches/RF-8742-1/ui/iteration/api/src/main/java/org/richfaces/model/DeclarativeTreeDataModelTuple.java (from rev 20235, trunk/ui/iteration/api/src/main/java/org/richfaces/model/DeclarativeTreeDataModelTuple.java)
===================================================================
--- branches/RF-8742-1/ui/iteration/api/src/main/java/org/richfaces/model/DeclarativeTreeDataModelTuple.java	                        (rev 0)
+++ branches/RF-8742-1/ui/iteration/api/src/main/java/org/richfaces/model/DeclarativeTreeDataModelTuple.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,50 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.model;
+
+import javax.faces.component.UIComponent;
+
+import com.google.common.base.Objects.ToStringHelper;
+
+/**
+ * @author Nick Belaevski
+ * 
+ */
+public class DeclarativeTreeDataModelTuple extends TreeDataModelTuple {
+
+    private UIComponent component;
+
+    public DeclarativeTreeDataModelTuple(Object rowKey, Object data, UIComponent component) {
+        super(rowKey, data);
+        this.component = component;
+    }
+    
+    public UIComponent getComponent() {
+        return component;
+    }
+ 
+    @Override
+    protected ToStringHelper createToStringHelper() {
+        return super.createToStringHelper().add("component", component);
+    }
+    
+}
Copied: branches/RF-8742-1/ui/iteration/api/src/main/java/org/richfaces/model/DeclarativeTreeModel.java (from rev 20235, trunk/ui/iteration/api/src/main/java/org/richfaces/model/DeclarativeTreeModel.java)
===================================================================
--- branches/RF-8742-1/ui/iteration/api/src/main/java/org/richfaces/model/DeclarativeTreeModel.java	                        (rev 0)
+++ branches/RF-8742-1/ui/iteration/api/src/main/java/org/richfaces/model/DeclarativeTreeModel.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,34 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.model;
+
+import javax.faces.component.UIComponent;
+
+/**
+ * @author Nick Belaevski
+ * 
+ */
+public interface DeclarativeTreeModel<E> extends TreeDataModel<E> {
+
+    public UIComponent getCurrentComponent();
+    
+}
Modified: branches/RF-8742-1/ui/iteration/api/src/main/java/org/richfaces/model/TreeDataModel.java
===================================================================
--- branches/RF-8742-1/ui/iteration/api/src/main/java/org/richfaces/model/TreeDataModel.java	2010-11-30 18:55:37 UTC (rev 20244)
+++ branches/RF-8742-1/ui/iteration/api/src/main/java/org/richfaces/model/TreeDataModel.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -21,10 +21,8 @@
  */
 package org.richfaces.model;
 
-import javax.faces.context.FacesContext;
+import java.util.Iterator;
 
-import org.ajax4jsf.model.DataVisitor;
-import org.ajax4jsf.model.Range;
 
 /**
  * @author Nick Belaevski
@@ -43,16 +41,16 @@
     
     public E getData();
     
-    public void walk(FacesContext context, DataVisitor visitor, Range range, Object argument);
+    public Iterator<TreeDataModelTuple> children();
 
-    public void enterNode(DataVisitor visitor);
-    
-    public void exitNode(DataVisitor visitor);
-
     public Object getParentRowKey(Object rowKey);
     
     public Object getWrappedData();
 
     public void setWrappedData(Object data);
+ 
+    public TreeDataModelTuple createSnapshot();
+
+    public void restoreFromSnapshot(TreeDataModelTuple tuple);
     
 }
Copied: branches/RF-8742-1/ui/iteration/api/src/main/java/org/richfaces/model/TreeDataModelTuple.java (from rev 20235, trunk/ui/iteration/api/src/main/java/org/richfaces/model/TreeDataModelTuple.java)
===================================================================
--- branches/RF-8742-1/ui/iteration/api/src/main/java/org/richfaces/model/TreeDataModelTuple.java	                        (rev 0)
+++ branches/RF-8742-1/ui/iteration/api/src/main/java/org/richfaces/model/TreeDataModelTuple.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,63 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.model;
+
+import com.google.common.base.Objects;
+import com.google.common.base.Objects.ToStringHelper;
+
+/**
+ * @author Nick Belaevski
+ * 
+ */
+public class TreeDataModelTuple {
+
+    private Object rowKey;
+    
+    private Object data;
+    
+    public TreeDataModelTuple(Object rowKey, Object data) {
+        super();
+        this.rowKey = rowKey;
+        this.data = data;
+    }
+    
+    public Object getRowKey() {
+        return rowKey;
+    }
+    
+    public Object getData() {
+        return data;
+    }
+
+    protected ToStringHelper createToStringHelper() {
+        ToStringHelper helper = Objects.toStringHelper(this);
+        helper.add("rowKey", rowKey);
+        helper.add("data", data);
+
+        return helper;
+    }
+    
+    @Override
+    public String toString() {
+        return createToStringHelper().toString();
+    }
+}
Modified: branches/RF-8742-1/ui/iteration/api/src/main/java/org/richfaces/model/TreeDataVisitor.java
===================================================================
--- branches/RF-8742-1/ui/iteration/api/src/main/java/org/richfaces/model/TreeDataVisitor.java	2010-11-30 18:55:37 UTC (rev 20244)
+++ branches/RF-8742-1/ui/iteration/api/src/main/java/org/richfaces/model/TreeDataVisitor.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -21,16 +21,18 @@
  */
 package org.richfaces.model;
 
-import org.ajax4jsf.model.DataVisitor;
 
 /**
  * @author Nick Belaevski
  * 
  */
-public interface TreeDataVisitor extends DataVisitor {
+public interface TreeDataVisitor {
 
     public void enterNode();
     
     public void exitNode();
-    
+
+    public void beforeChildrenVisit();
+
+    public void afterChildrenVisit();
 }
Modified: branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/component/AbstractTree.java
===================================================================
--- branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/component/AbstractTree.java	2010-11-30 18:55:37 UTC (rev 20244)
+++ branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/component/AbstractTree.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -45,11 +45,10 @@
 import javax.faces.event.ExceptionQueuedEventContext;
 import javax.faces.event.FacesEvent;
 import javax.faces.event.PhaseId;
-import javax.swing.tree.TreeNode;
 
 import org.ajax4jsf.model.DataComponentState;
+import org.ajax4jsf.model.DataVisitor;
 import org.ajax4jsf.model.ExtendedDataModel;
-import org.ajax4jsf.model.Range;
 import org.richfaces.application.MessageFactory;
 import org.richfaces.application.ServiceTracker;
 import org.richfaces.appplication.FacesMessages;
@@ -69,9 +68,12 @@
 import org.richfaces.event.TreeToggleEvent;
 import org.richfaces.event.TreeToggleListener;
 import org.richfaces.event.TreeToggleSource;
-import org.richfaces.model.ExtendedTreeDataModelImpl;
+import org.richfaces.model.DeclarativeTreeDataModelImpl;
+import org.richfaces.model.DeclarativeTreeModel;
 import org.richfaces.model.SwingTreeNodeDataModelImpl;
 import org.richfaces.model.TreeDataModel;
+import org.richfaces.model.TreeDataModelTuple;
+import org.richfaces.model.TreeDataVisitor;
 import org.richfaces.renderkit.MetaComponentRenderer;
 
 import com.google.common.base.Predicate;
@@ -90,6 +92,7 @@
     renderer = @JsfRenderer(type = "org.richfaces.TreeRenderer"),
     attributes = {"events-props.xml", "core-props.xml", "i18n-props.xml"}
 )
+//TODO add rowData caching for wrapper events
 public abstract class AbstractTree extends UIDataAdaptor implements MetaComponentResolver, MetaComponentEncoder, TreeSelectionChangeSource, TreeToggleSource {
 
     public static final String COMPONENT_TYPE = "org.richfaces.Tree";
@@ -125,31 +128,33 @@
 
     private static final Converter ROW_KEY_CONVERTER = new SequenceRowKeyConverter();
 
-    /**
-     * @author Nick Belaevski
-     * 
-     */
-    private final class TreeComponentState implements DataComponentState {
-        public Range getRange() {
-            return new TreeRange(getFacesContext(), AbstractTree.this);
-        }
-    }
-
     private enum PropertyKeys {
         selection
     }
-
+    
+    @SuppressWarnings("unused")
     @Attribute(generate = false, signature = @Signature(returnType = Void.class, parameters = TreeSelectionChangeEvent.class))
     private MethodExpression selectionChangeListener;
 
+    @SuppressWarnings("unused")
     @Attribute(generate = false, signature = @Signature(returnType = Void.class, parameters = TreeToggleListener.class))
     private MethodExpression toggleListener;
 
+    private transient TreeRange treeRange;
+    
     public AbstractTree() {
         setKeepSaved(true);
         setRendererType("org.richfaces.TreeRenderer");
     }
 
+    protected TreeRange getTreeRange() {
+        if (treeRange == null) {
+            treeRange = new TreeRange(this);
+        }
+        
+        return treeRange;
+    }
+    
     public abstract Object getValue();
 
     public abstract boolean isImmediate();
@@ -217,13 +222,6 @@
     }
 
     @Override
-    protected ExtendedDataModel<?> createExtendedDataModel() {
-        ExtendedTreeDataModelImpl<?> model = new ExtendedTreeDataModelImpl<TreeNode>(new SwingTreeNodeDataModelImpl());
-        model.setWrappedData(getValue());
-        return model;
-    }
-
-    @Override
     protected DataComponentState createComponentState() {
         // TODO Auto-generated method stub
         return null;
@@ -238,23 +236,40 @@
         return converter;
     }
 
+    protected Iterator<UIComponent> findMatchingTreeNodeComponent(String nodeType, UIComponent parentComponent) {
+        Iterator<UIComponent> children = parentComponent.getChildren().iterator();
+        if (parentComponent != this) {
+            children = Iterators.concat(children, this.getChildren().iterator());
+        }
+        
+        return Iterators.filter(children, new MatchingTreeNodePredicate(nodeType));
+    }
+
+    protected UIComponent getCurrentComponent() {
+        ExtendedDataModel<?> dataModel = getExtendedDataModel();
+        if (dataModel instanceof DeclarativeTreeModel) {
+            return ((DeclarativeTreeModel) dataModel).getCurrentComponent();
+        }
+        
+        return this;
+    }
+    
     public AbstractTreeNode findTreeNodeComponent() {
         FacesContext facesContext = getFacesContext();
 
         String nodeType = getNodeType();
-        Iterator<UIComponent> matchingNodes = Iterators.filter(getChildren().iterator(), 
-            new MatchingTreeNodePredicate(nodeType));
-
-        boolean hasNodes = matchingNodes.hasNext();
-        if (hasNodes) {
-            Iterator<UIComponent> renderedTreeNodes = Iterators.filter(matchingNodes, ComponentPredicates.isRendered());
-            if (renderedTreeNodes.hasNext()) {
-                return (AbstractTreeNode) renderedTreeNodes.next();
-            } else {
-                return null;
+        
+        Iterator<UIComponent> nodesItr = findMatchingTreeNodeComponent(nodeType, getCurrentComponent());
+        
+        if (nodesItr.hasNext()) {
+            Iterator<UIComponent> renderedNodesItr = Iterators.filter(nodesItr, ComponentPredicates.isRendered());
+            if (renderedNodesItr.hasNext()) {
+                return (AbstractTreeNode) renderedNodesItr.next();
             }
+            
+            return null;
         }
-
+        
         if (Strings.isNullOrEmpty(nodeType)) {
             if (getAttributes().put(DEFAULT_TREE_NODE_CREATED, Boolean.TRUE) != null) {
                 return null;
@@ -403,11 +418,6 @@
         }
     }
 
-    @Override
-    public DataComponentState getComponentState() {
-        return new TreeComponentState();
-    }
-    
     public void addTreeSelectionChangeListener(TreeSelectionChangeListener listener) {
         addFacesListener(listener);
     }
@@ -448,12 +458,115 @@
         return treeNode.isExpanded();
     }
 
+    //TODO review
+    protected TreeDataModel<?> getTreeDataModel() {
+        return (TreeDataModel<?>) getExtendedDataModel();
+    }
+    
     @Attribute(hidden = true)
     public boolean isLeaf() {
         if (getRowKey() == null) {
             return false;
         }
 
-        return ((TreeDataModel<?>) getExtendedDataModel()).isLeaf();
+        return getTreeDataModel().isLeaf();
     }
+    
+    @Override
+    public void walk(final FacesContext faces, final DataVisitor visitor, final Object argument) {
+        walkModel(faces, new TreeDataVisitor() {
+            
+            public void enterNode() {
+                visitor.process(faces, getRowKey(), argument);
+            }
+
+            public void exitNode() {
+            }
+
+            public void beforeChildrenVisit() {
+            }
+
+            public void afterChildrenVisit() {
+            }
+            
+        });
+    }
+    
+    @Override
+    protected ExtendedDataModel<?> createExtendedDataModel() {
+        ExtendedDataModel<?> dataModel;
+        
+        Object value = getValue();
+        if (value == null) {
+            dataModel = new DeclarativeTreeDataModelImpl(this, getVar(), getVariablesMap(getFacesContext()));
+        } else {
+            dataModel = new SwingTreeNodeDataModelImpl();
+            dataModel.setWrappedData(getValue());
+        }
+        
+        return dataModel;
+    }
+    
+    public void walkModel(FacesContext context, TreeDataVisitor dataVisitor) {
+        TreeDataModel<?> model = getTreeDataModel();
+
+        if (!getTreeRange().shouldProcessNode()) {
+            return;
+        }
+        
+        boolean isRootNode = (getRowKey() == null);
+        
+        if (!isRootNode) {
+            dataVisitor.enterNode();
+        }
+
+        walkModelChildren(context, dataVisitor, model);
+
+        if (!isRootNode) {
+            dataVisitor.exitNode();
+        }
+    }
+
+    private void walkModelChildren(FacesContext context, TreeDataVisitor dataVisitor, TreeDataModel<?> model) {
+        if (!getTreeRange().shouldIterateChildren()) {
+            return;
+        }
+        
+        dataVisitor.beforeChildrenVisit();
+        
+        Iterator<TreeDataModelTuple> childrenTuples = model.children();
+        while (childrenTuples.hasNext()) {
+            TreeDataModelTuple tuple = childrenTuples.next();
+            
+            restoreFromSnapshot(context, tuple);
+            
+            if (!getTreeRange().shouldProcessNode()) {
+                continue;
+            }
+            
+            dataVisitor.enterNode();
+            
+            walkModelChildren(context, dataVisitor, model);
+
+            dataVisitor.exitNode();
+        }
+        
+        dataVisitor.afterChildrenVisit();
+    }
+    
+    @Override
+    protected void resetDataModel() {
+        super.resetDataModel();
+        treeRange = null;
+    }
+    
+    public TreeDataModelTuple createSnapshot() {
+        return getTreeDataModel().createSnapshot();
+    }
+
+    public void restoreFromSnapshot(FacesContext context, TreeDataModelTuple tuple) {
+        getTreeDataModel().restoreFromSnapshot(tuple);
+        setRowKey(context, tuple.getRowKey());
+    }
+    
 }
Copied: branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/component/AbstractTreeModelAdaptor.java (from rev 20235, trunk/ui/iteration/ui/src/main/java/org/richfaces/component/AbstractTreeModelAdaptor.java)
===================================================================
--- branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/component/AbstractTreeModelAdaptor.java	                        (rev 0)
+++ branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/component/AbstractTreeModelAdaptor.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,39 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.component;
+
+import javax.faces.component.UIComponentBase;
+
+import org.richfaces.cdk.annotations.JsfComponent;
+import org.richfaces.cdk.annotations.Tag;
+
+/**
+ * @author Nick Belaevski
+ * 
+ */
+@JsfComponent(type = AbstractTreeModelAdaptor.COMPONENT_TYPE,
+    tag = @Tag(name = "treeModelAdaptor"))
+public abstract class AbstractTreeModelAdaptor extends UIComponentBase implements TreeModelAdaptor {
+
+    public static final String COMPONENT_TYPE = "org.richfaces.TreeModelAdaptor";
+    
+}
Copied: branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/component/AbstractTreeModelRecursiveAdaptor.java (from rev 20235, trunk/ui/iteration/ui/src/main/java/org/richfaces/component/AbstractTreeModelRecursiveAdaptor.java)
===================================================================
--- branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/component/AbstractTreeModelRecursiveAdaptor.java	                        (rev 0)
+++ branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/component/AbstractTreeModelRecursiveAdaptor.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,43 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.component;
+
+import javax.faces.component.UIComponentBase;
+
+import org.richfaces.cdk.annotations.Attribute;
+import org.richfaces.cdk.annotations.JsfComponent;
+import org.richfaces.cdk.annotations.Tag;
+
+/**
+ * @author Nick Belaevski
+ * 
+ */
+@JsfComponent(type = AbstractTreeModelRecursiveAdaptor.COMPONENT_TYPE,
+    tag = @Tag(name = "treeModelRecursiveAdaptor"))
+public abstract class AbstractTreeModelRecursiveAdaptor extends UIComponentBase implements TreeModelRecursiveAdaptor {
+
+    public static final String COMPONENT_TYPE = "org.richfaces.TreeModelRecursiveAdaptor";
+    
+    @Attribute(defaultValue = "first")
+    public abstract String getRecursionOrder();
+    
+}
Copied: branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/component/TreeModelAdaptor.java (from rev 20235, trunk/ui/iteration/ui/src/main/java/org/richfaces/component/TreeModelAdaptor.java)
===================================================================
--- branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/component/TreeModelAdaptor.java	                        (rev 0)
+++ branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/component/TreeModelAdaptor.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,32 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.component;
+
+/**
+ * @author Nick Belaevski
+ * 
+ */
+public interface TreeModelAdaptor {
+
+    public Object getNodes();
+    
+}
Copied: branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/component/TreeModelRecursiveAdaptor.java (from rev 20235, trunk/ui/iteration/ui/src/main/java/org/richfaces/component/TreeModelRecursiveAdaptor.java)
===================================================================
--- branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/component/TreeModelRecursiveAdaptor.java	                        (rev 0)
+++ branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/component/TreeModelRecursiveAdaptor.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,34 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.component;
+
+/**
+ * @author Nick Belaevski
+ * 
+ */
+public interface TreeModelRecursiveAdaptor extends TreeModelAdaptor {
+
+    public Object getRoots();
+    
+    public String getRecursionOrder();
+    
+}
Modified: branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/component/TreeRange.java
===================================================================
--- branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/component/TreeRange.java	2010-11-30 18:55:37 UTC (rev 20244)
+++ branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/component/TreeRange.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -21,8 +21,6 @@
  */
 package org.richfaces.component;
 
-import javax.faces.context.FacesContext;
-
 import org.ajax4jsf.model.Range;
 
 /**
@@ -31,26 +29,27 @@
  */
 public class TreeRange implements Range {
 
-    private FacesContext facesContext;
-    
     private AbstractTree tree;
     
     private boolean traverseAll;
     
-    public TreeRange(FacesContext facesContext, AbstractTree tree) {
+    public TreeRange(AbstractTree tree) {
         super();
-        this.facesContext = facesContext;
         this.tree = tree;
         
         traverseAll = (SwitchType.client == tree.getToggleType());
     }
 
-    public boolean shouldIterateChildren(Object rowKey) {
-        if (traverseAll) {
-            return true;
+    public boolean shouldProcessNode() {
+        return tree.findTreeNodeComponent() != null;
+    }
+    
+    public boolean shouldIterateChildren() {
+        if (tree.isLeaf()) {
+            return false;
         }
         
-        return !tree.isLeaf() && tree.isExpanded();
+        return traverseAll || tree.isExpanded();
     }
     
 }
Copied: branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/model/DeclarativeModelKey.java (from rev 20235, trunk/ui/iteration/ui/src/main/java/org/richfaces/model/DeclarativeModelKey.java)
===================================================================
--- branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/model/DeclarativeModelKey.java	                        (rev 0)
+++ branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/model/DeclarativeModelKey.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,94 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.model;
+
+import java.io.Serializable;
+
+/**
+ * @author Nick Belaevski
+ * 
+ */
+public class DeclarativeModelKey implements Serializable {
+
+    private static final long serialVersionUID = 7065813074553570168L;
+
+    private String modelId;
+
+    private Object modelKey;
+
+    public DeclarativeModelKey(String modelId, Object modelKey) {
+        super();
+        this.modelId = modelId;
+        this.modelKey = modelKey;
+    }
+
+    public String getModelId() {
+        return modelId;
+    }
+
+    public Object getModelKey() {
+        return modelKey;
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((modelId == null) ? 0 : modelId.hashCode());
+        result = prime * result + ((modelKey == null) ? 0 : modelKey.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        DeclarativeModelKey other = (DeclarativeModelKey) obj;
+        if (modelId == null) {
+            if (other.modelId != null) {
+                return false;
+            }
+        } else if (!modelId.equals(other.modelId)) {
+            return false;
+        }
+        if (modelKey == null) {
+            if (other.modelKey != null) {
+                return false;
+            }
+        } else if (!modelKey.equals(other.modelKey)) {
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        return getModelId() + "." + getModelKey();
+    }
+}
Copied: branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/model/DeclarativeTreeDataModelImpl.java (from rev 20235, trunk/ui/iteration/ui/src/main/java/org/richfaces/model/DeclarativeTreeDataModelImpl.java)
===================================================================
--- branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/model/DeclarativeTreeDataModelImpl.java	                        (rev 0)
+++ branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/model/DeclarativeTreeDataModelImpl.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,272 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.model;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.faces.component.UIComponent;
+
+import org.richfaces.component.AbstractTree;
+import org.richfaces.component.ComponentPredicates;
+import org.richfaces.component.TreeModelAdaptor;
+import org.richfaces.component.TreeModelRecursiveAdaptor;
+import org.richfaces.log.Logger;
+import org.richfaces.log.RichfacesLogger;
+
+import com.google.common.base.Predicates;
+import com.google.common.collect.ForwardingIterator;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Iterators;
+import com.google.common.collect.Lists;
+
+/**
+ * @author Nick Belaevski
+ * 
+ */
+public class DeclarativeTreeDataModelImpl extends TreeSequenceKeyModel<DeclarativeModelKey, Object> implements DeclarativeTreeModel<Object> {
+
+    private static final Logger LOGGER = RichfacesLogger.MODEL.getLogger();
+    
+    private final class DeclarativeModelIterator implements Iterator<TreeDataModelTuple> {
+        
+        private UIComponent component;
+
+        private SequenceRowKey<DeclarativeModelKey> baseKey;
+        
+        private int counter = 0;
+        
+        private Iterator<?> nodesIterator;
+        
+        public DeclarativeModelIterator(UIComponent component, SequenceRowKey<DeclarativeModelKey> baseKey, Iterator<?> nodesIterator) {
+            super();
+            this.component = component;
+            this.baseKey = baseKey;
+            this.nodesIterator = nodesIterator;
+        }
+
+        public TreeDataModelTuple next() {
+            Object nextNode = nodesIterator.next();
+            DeclarativeModelKey key = new DeclarativeModelKey(component.getId(), counter++);
+            
+            SequenceRowKey<DeclarativeModelKey> newKey = baseKey.append(key);
+            
+            return new DeclarativeTreeDataModelTuple(newKey, nextNode, component);
+        }
+        
+        public boolean hasNext() {
+            return nodesIterator.hasNext();
+        }
+        
+        public void remove() {
+            throw new UnsupportedOperationException();
+        }
+        
+    }
+    
+    private final class DeclarativeModelCompositeIterator extends ForwardingIterator<TreeDataModelTuple> {
+        
+        private UIComponent component;
+
+        private SequenceRowKey<DeclarativeModelKey> key;
+        
+        private Iterator<TreeDataModelTuple> iterator;
+        
+        public DeclarativeModelCompositeIterator(UIComponent component, SequenceRowKey<DeclarativeModelKey> key) {
+            super();
+            this.component = component;
+            this.key = key;
+        }
+
+        @Override
+        protected Iterator<TreeDataModelTuple> delegate() {
+            if (iterator == null) {
+                List<Iterator<TreeDataModelTuple>> list = Lists.newArrayList();
+                
+                if (component instanceof TreeModelRecursiveAdaptor) {
+                    TreeModelRecursiveAdaptor parentRecursiveAdaptor = (TreeModelRecursiveAdaptor) component;
+                    
+                    Collection<?> nodes = (Collection<?>) parentRecursiveAdaptor.getNodes();
+                    
+                    if (nodes != null) {
+                        list.add(new DeclarativeModelIterator(component, key, nodes.iterator()));
+                    }
+                }
+
+                if (component.getChildCount() > 0) {
+                    for (UIComponent child : Iterables.filter(component.getChildren(), ComponentPredicates.isRendered())) {
+                        Collection<?> nodes = null;
+
+                        if (child instanceof TreeModelRecursiveAdaptor) {
+                            TreeModelRecursiveAdaptor treeModelRecursiveAdaptor = (TreeModelRecursiveAdaptor) child;
+                            
+                            nodes = (Collection<?>) treeModelRecursiveAdaptor.getRoots();
+                        } else if (child instanceof TreeModelAdaptor) {
+                            TreeModelAdaptor treeModelAdaptor = (TreeModelAdaptor) child;
+                            
+                            nodes = (Collection<?>) treeModelAdaptor.getNodes();
+                        }
+
+                        if (nodes != null) {
+                            list.add(new DeclarativeModelIterator(child, key, nodes.iterator()));
+                        }
+                    }
+                }
+                
+                iterator = Iterators.concat(list.iterator());
+            }
+            
+            return iterator;
+        }
+        
+    }
+    
+    private String var;
+    
+    private Map<String, Object> contextMap;
+    
+    private UIComponent tree;
+    
+    private UIComponent currentComponent;
+    
+    public DeclarativeTreeDataModelImpl(AbstractTree tree, String var, Map<String, Object> contextMap) {
+        super();
+        this.tree = tree;
+        this.currentComponent = tree;
+        this.var = var;
+        this.contextMap = contextMap;
+    }
+
+    public UIComponent getCurrentComponent() {
+        return currentComponent;
+    }
+
+    protected void setCurrentComponent(UIComponent currentComponent) {
+        this.currentComponent = currentComponent;
+    }
+    
+    public boolean isLeaf() {
+        if (currentComponent instanceof TreeModelRecursiveAdaptor) {
+            return false;
+        }
+
+        if (currentComponent.getChildCount() == 0) {
+            return true;
+        }
+        
+        return Iterables.contains(currentComponent.getChildren(), Predicates.instanceOf(TreeModelAdaptor.class));
+    }
+
+    public Iterator<TreeDataModelTuple> children() {
+        return new DeclarativeModelCompositeIterator(currentComponent, safeGetRowKey());
+    }
+
+    /* (non-Javadoc)
+     * @see org.richfaces.model.TreeDataModel#getParentRowKey(java.lang.Object)
+     */
+    public Object getParentRowKey(Object rowKey) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public Object getWrappedData() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void setWrappedData(Object data) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    protected void walkKey(SequenceRowKey<DeclarativeModelKey> key) {
+        Object initialContextValue = null;
+
+        if (var != null) {
+            initialContextValue = contextMap.remove(var);
+        }
+        
+        try {
+            this.currentComponent = tree;
+
+            super.walkKey(key);
+        } finally {
+            if (var != null) {
+                try {
+                    contextMap.put(var, initialContextValue);
+                } catch (Exception e) {
+                    LOGGER.error(e.getMessage(), e);
+                }
+            }
+        }
+    }
+    
+    @Override
+    protected void walkNext(DeclarativeModelKey segment) {
+        String modelId = segment.getModelId();
+        
+        UIComponent modelComponent;
+
+        if (currentComponent instanceof TreeModelRecursiveAdaptor && modelId.equals(currentComponent.getId())) {
+            modelComponent = currentComponent;
+        } else {
+            modelComponent = Iterables.find(currentComponent.getChildren(), ComponentPredicates.withId(modelId));
+        }
+
+        Object nodes = null;
+        
+        if (modelComponent instanceof TreeModelRecursiveAdaptor) {
+            TreeModelRecursiveAdaptor recursiveAdaptor = (TreeModelRecursiveAdaptor) modelComponent;
+            
+            if (currentComponent.equals(modelComponent)) {
+                nodes = recursiveAdaptor.getNodes();
+            } else {
+                nodes = recursiveAdaptor.getRoots();
+            }
+        } else {
+            nodes = ((TreeModelAdaptor) modelComponent).getNodes();
+        }
+
+        Object data = Iterables.get((Iterable<?>) nodes, (Integer) segment.getModelKey());
+        setRowKeyAndData(safeGetRowKey().append(segment), data);
+        setCurrentComponent(modelComponent);
+ 
+        if (var != null) {
+            contextMap.put(var, data);
+        }
+    }
+
+    public TreeDataModelTuple createSnapshot() {
+        return new DeclarativeTreeDataModelTuple(getRowKey(), getData(), getCurrentComponent());
+    }
+
+    public void restoreFromSnapshot(TreeDataModelTuple tuple) {
+        DeclarativeTreeDataModelTuple declarativeModelTuple = (DeclarativeTreeDataModelTuple) tuple;
+
+        super.restoreFromSnapshot(declarativeModelTuple);
+        setCurrentComponent(declarativeModelTuple.getComponent());
+    }
+    
+}
Deleted: branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/model/ExtendedTreeDataModelImpl.java
===================================================================
--- branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/model/ExtendedTreeDataModelImpl.java	2010-11-30 18:55:37 UTC (rev 20244)
+++ branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/model/ExtendedTreeDataModelImpl.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -1,133 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2010, Red Hat, Inc. and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software 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 software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.richfaces.model;
-
-import javax.faces.context.FacesContext;
-
-import org.ajax4jsf.model.DataVisitor;
-import org.ajax4jsf.model.ExtendedDataModel;
-import org.ajax4jsf.model.Range;
-
-/**
- * @author Nick Belaevski
- * 
- */
-public class ExtendedTreeDataModelImpl<E> extends ExtendedDataModel<E> implements TreeDataModel<E> {
-
-    private TreeDataModel<E> wrappedModel;
-    
-    public ExtendedTreeDataModelImpl(TreeDataModel<E> wrappedModel) {
-        super();
-        this.wrappedModel = wrappedModel;
-    }
-
-    public boolean isDataAvailable() {
-        return wrappedModel.isDataAvailable();
-    }
-
-    public E getData() {
-        return wrappedModel.getData();
-    }
-
-    public Object getParentRowKey(Object rowKey) {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public void setRowKey(Object key) {
-        wrappedModel.setRowKey(key);
-    }
-
-    @Override
-    public Object getRowKey() {
-        return wrappedModel.getRowKey();
-    }
-
-    @Override
-    public void walk(FacesContext context, DataVisitor visitor, Range range, Object argument) {
-        wrappedModel.enterNode(visitor);
-        wrappedModel.walk(context, visitor, range, argument);
-        wrappedModel.exitNode(visitor);
-    }
-
-    @Override
-    public boolean isRowAvailable() {
-        return wrappedModel.isDataAvailable();
-    }
-
-    @Override
-    public int getRowCount() {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public E getRowData() {
-        return wrappedModel.getData();
-    }
-
-    @Override
-    public int getRowIndex() {
-        throw new UnsupportedOperationException();
-    }
-
-    public void setRowIndex(int rowIndex) {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public Object getWrappedData() {
-        return wrappedModel.getWrappedData();
-    }
-
-    @Override
-    public void setWrappedData(Object data) {
-        wrappedModel.setWrappedData(data);
-    }
-
-    /* (non-Javadoc)
-     * @see org.richfaces.model.TreeDataModel#isLeaf()
-     */
-    public boolean isLeaf() {
-        // TODO Auto-generated method stub
-        return wrappedModel.isLeaf();
-    }
-
-    /* (non-Javadoc)
-     * @see org.richfaces.model.TreeDataModel#enterNode(org.ajax4jsf.model.DataVisitor)
-     */
-    public void enterNode(DataVisitor visitor) {
-        // TODO Auto-generated method stub
-        
-        wrappedModel.enterNode(visitor);
-    }
-    
-    /* (non-Javadoc)
-     * @see org.richfaces.model.TreeDataModel#exitNode(org.ajax4jsf.model.DataVisitor)
-     */
-    public void exitNode(DataVisitor visitor) {
-        // TODO Auto-generated method stub
-     
-        wrappedModel.exitNode(visitor);
-    }
-
-
-}
Deleted: branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/model/SequenceRowKeyIterator.java
===================================================================
--- branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/model/SequenceRowKeyIterator.java	2010-11-30 18:55:37 UTC (rev 20244)
+++ branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/model/SequenceRowKeyIterator.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -1,98 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2010, Red Hat, Inc. and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software 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 software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.richfaces.model;
-
-import java.util.Iterator;
-
-import com.google.common.base.Objects;
-import com.google.common.base.Objects.ToStringHelper;
-
-/**
- * @author Nick Belaevski
- * 
- */
-public abstract class SequenceRowKeyIterator<K, T> implements Iterator<Object> {
-
-    private SequenceRowKey<K> baseKey;
-    
-    private Iterator<T> itr;
-
-    private T element;
-
-    private SequenceRowKey<K> elementKey;
-
-    private T baseElement;
-    
-    public SequenceRowKeyIterator(SequenceRowKey<K> baseKey, T baseElement, Iterator<T> itr) {
-        super();
-        this.baseKey = baseKey;
-        this.baseElement = baseElement;
-        this.itr = itr;
-    }
-
-    public boolean hasNext() {
-        return itr.hasNext();
-    }
-
-    protected abstract K nextKey();
-    
-    public Object next() {
-        element = itr.next();
-        
-        if (baseKey != null) {
-            elementKey = baseKey.append(nextKey());
-        } else {
-            elementKey = new SequenceRowKey<K>(nextKey());
-        }
-        
-        return elementKey;
-    }
-    
-    public T getElement() {
-        return element;
-    }
-
-    public SequenceRowKey<K> getBaseKey() {
-        return baseKey;
-    }
-    
-    public T getBaseElement() {
-        return baseElement;
-    }
-    
-    public SequenceRowKey<K> getElementKey() {
-        return elementKey;
-    }
-    
-    public void remove() {
-        throw new UnsupportedOperationException();
-    }
-    
-    @Override
-    public String toString() {
-        ToStringHelper helper = Objects.toStringHelper(this);
-        
-        helper.add("element", element).add("elementKey", elementKey);
-        
-        return helper.toString();
-    }
-}
Modified: branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/model/SwingTreeNodeDataModelImpl.java
===================================================================
--- branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/model/SwingTreeNodeDataModelImpl.java	2010-11-30 18:55:37 UTC (rev 20244)
+++ branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/model/SwingTreeNodeDataModelImpl.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -38,35 +38,47 @@
  */
 public class SwingTreeNodeDataModelImpl extends TreeSequenceKeyModel<Integer, TreeNode> {
 
-    /**
-     * @author Nick Belaevski
-     * 
-     */
-    private static final class SwingTreeNodeRowKeyIterator extends SequenceRowKeyIterator<Integer, TreeNode> {
+    private final class SwingTreeNodeRowKeyIterator implements Iterator<TreeDataModelTuple> {
+
+        private SequenceRowKey<Integer> baseKey;
         
+        private Iterator<TreeNode> children;
+        
         private int counter = 0;
 
-        /**
-         * @param baseKey
-         * @param baseElement
-         * @param itr
-         */
-        private SwingTreeNodeRowKeyIterator(SequenceRowKey<Integer> baseKey, TreeNode baseElement,
-            Iterator<TreeNode> itr) {
-            super(baseKey, baseElement, itr);
+        private SwingTreeNodeRowKeyIterator(SequenceRowKey<Integer> baseKey, Iterator<TreeNode> children) {
+            this.baseKey = baseKey;
+            this.children = children;
         }
 
-        @Override
-        protected Integer nextKey() {
+        private int getNextCounterValue() {
             return counter++;
         }
+        
+        public boolean hasNext() {
+            return children.hasNext();
+        }
+        
+        public TreeDataModelTuple next() {
+            TreeNode node = children.next();
+            
+            SequenceRowKey<Integer> key;
+            
+            if (baseKey != null) {
+                key = baseKey.append(getNextCounterValue());
+            } else {
+                key = new SequenceRowKey<Integer>(getNextCounterValue());
+            }
+            
+            return new TreeDataModelTuple(key, node);
+        }
+
+        public void remove() {
+            throw new UnsupportedOperationException();
+        }
+        
     }
 
-
-    /**
-     * @author Nick Belaevski
-     * 
-     */
     private final class FakeRootNode implements TreeNode {
         
         private Collection<TreeNode> wrappedData;
@@ -125,7 +137,9 @@
         }
     }
 
-    private Iterator<TreeNode> safeGetChildren(SequenceRowKey<Integer> key, TreeNode treeNode) {
+    private boolean asksAllowsChildren = false;
+    
+    private Iterator<TreeNode> safeGetChildren(TreeNode treeNode) {
         if (treeNode == null) {
             return Iterators.emptyIterator();
         }
@@ -138,16 +152,6 @@
         throw new UnsupportedOperationException();
     }
 
-    public boolean isLeaf() {
-        if (!isDataAvailable()) {
-            throw new IllegalStateException();
-        }
-        
-        TreeNode treeNode = getData();
-        
-        return !treeNode.getAllowsChildren() || treeNode.isLeaf();
-    }
-
     public void setWrappedData(Object data) {
         setRootNode(new FakeRootNode((Collection<TreeNode>) data));
     }
@@ -160,21 +164,29 @@
         return rootNode.getWrappedData();
     }
 
-    @Override
     protected TreeNode findChild(TreeNode parent, Integer simpleKey) {
-        int idx = simpleKey.intValue();
-        if (idx >= 0 && idx < parent.getChildCount()) {
-            return parent.getChildAt(idx);
-        }
-        
-        return null;
+        return parent.getChildAt(simpleKey.intValue());
     }
 
+    public Iterator<TreeDataModelTuple> children() {
+        return new SwingTreeNodeRowKeyIterator(getRowKey(), safeGetChildren(getData()));
+    }
 
+
+    public boolean isLeaf() {
+        if (!asksAllowsChildren) {
+            return getData().isLeaf();
+        } else {
+            return !getData().getAllowsChildren();
+        }
+    }
+    
     @Override
-    protected SequenceRowKeyIterator<Integer, TreeNode> createChildrenIterator(SequenceRowKey<Integer> baseKey,
-        TreeNode value) {
-        
-        return new SwingTreeNodeRowKeyIterator(baseKey, value, safeGetChildren(baseKey, value));
+    protected void walkNext(Integer segment) {
+        TreeNode child = findChild(getData(), segment);
+        //TODO what if node is missing?
+        //TODO - optimize - remove partial keys creation
+        setRowKeyAndData(safeGetRowKey().append(segment), child);
     }
-}
+
+}
\ No newline at end of file
Modified: branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/model/TreeSequenceKeyModel.java
===================================================================
--- branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/model/TreeSequenceKeyModel.java	2010-11-30 18:55:37 UTC (rev 20244)
+++ branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/model/TreeSequenceKeyModel.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -21,148 +21,130 @@
  */
 package org.richfaces.model;
 
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.ListIterator;
-
 import javax.faces.context.FacesContext;
 
 import org.ajax4jsf.model.DataVisitor;
+import org.ajax4jsf.model.ExtendedDataModel;
 import org.ajax4jsf.model.Range;
-import org.richfaces.component.TreeRange;
 
+
 /**
  * @author Nick Belaevski
  * 
  */
-public abstract class TreeSequenceKeyModel<K, V> implements TreeDataModel<V> {
+public abstract class TreeSequenceKeyModel<K, V> extends ExtendedDataModel<V> implements TreeDataModel<V> {
 
+    private final SequenceRowKey<K> emptyKey = new SequenceRowKey<K>();
+    
     private V rootNode;
     
-    private V currentData;
+    private V data;
     
-    private SequenceRowKey<K> currentRowKey;
+    private SequenceRowKey<K> rowKey;
     
-    private LinkedList<SequenceRowKeyIterator<K, V>> keysStack = new LinkedList<SequenceRowKeyIterator<K, V>>();
-    
     public SequenceRowKey<K> getRowKey() {
-        return currentRowKey;
+        return rowKey;
     }
 
+    protected SequenceRowKey<K> safeGetRowKey() {
+        SequenceRowKey<K> key = getRowKey();
+
+        if (key == null) {
+            key = emptyKey;
+        }
+        
+        return key;
+    }
+    
     public void setRowKey(Object rowKey) {
-        this.currentRowKey = (SequenceRowKey<K>) rowKey;
-        this.currentData = findData(currentRowKey);
+        if (this.rowKey == null || !this.rowKey.equals(rowKey)) {
+            walkKey((SequenceRowKey<K>) rowKey);
+        }
     }
 
+    protected void resetRowKeyAndData() {
+        setRowKeyAndData(null, rootNode);
+    }
+    
+    protected void setRowKeyAndData(SequenceRowKey<K> key, V data) {
+        this.rowKey = key;
+        this.data = data;
+    }
+    
     public boolean isDataAvailable() {
-        return currentRowKey == null || currentData != null;
+        return getRowKey() == null || data != null;
     }
 
-    public abstract boolean isLeaf();
-
     public V getData() {
         if (!isDataAvailable()) {
             throw new IllegalArgumentException();
         }
         
-        return currentData;
+        return data;
     }
-
-    protected boolean isRootNodeKey(SequenceRowKey<K> key) {
-        return key == null || key.getLastKeySegment() == null;
-    }
     
-    protected V findData(SequenceRowKey<K> key) {
-        if (key == null) {
-            return rootNode;
-        }
-        
-        if (!keysStack.isEmpty()) {
-            ListIterator<SequenceRowKeyIterator<K, V>> listIterator = keysStack.listIterator(keysStack.size());
-            
-            while (listIterator.hasPrevious()) {
-                SequenceRowKeyIterator<K, V> previous = listIterator.previous();
+    protected void walkKey(SequenceRowKey<K> key) {
+        resetRowKeyAndData();
 
-                V baseNode = null;
-                
-                SequenceRowKey<K> baseKey = previous.getBaseKey();
-                if (isRootNodeKey(baseKey) && isRootNodeKey(key.getParent())) {
-                    baseNode = rootNode;
-                } else if (baseKey.equals(key.getParent())) {
-                    baseNode = previous.getBaseElement();
-                }
-                
-                if (baseNode == null) {
-                    continue;
-                }
-                
-                return findChild(baseNode, key.getLastKeySegment());
+        if (key != null) {
+            for (K simpleKey: key.getSimpleKeys()) {
+                walkNext(simpleKey);
             }
         }
-        
-        V result = rootNode;
-        
-        for (K simpleKey : key.getSimpleKeys()) {
-            result = findChild(result, simpleKey);
+    }
 
-            if (result == null) {
-                break;
-            }
-        }
-        
-        return result;
+    protected abstract void walkNext(K segment);
+    
+    protected V getRootNode() {
+        return rootNode;
     }
-        
-    protected abstract V findChild(V parent, K simpleKey);
     
-    protected abstract SequenceRowKeyIterator<K, V> createChildrenIterator(SequenceRowKey<K> baseKey, V value);
+    protected void setRootNode(V rootNode) {
+        this.rootNode = rootNode;
+    }
     
-    public void enterNode(DataVisitor visitor) {
-        SequenceRowKey<K> sequenceKey = getRowKey();
-        V data = findData(sequenceKey);
-        
-        keysStack.addLast(createChildrenIterator(sequenceKey, data));
+    //TODO ExtendedDataModel legacy
+    @Override
+    public void walk(FacesContext context, DataVisitor visitor, Range range, Object argument) {
+        throw new UnsupportedOperationException();
+    }
 
-        if (visitor instanceof TreeDataVisitor) {
-            ((TreeDataVisitor) visitor).enterNode();
-        }
+
+    @Override
+    public boolean isRowAvailable() {
+        return isDataAvailable();
     }
 
-    public void walk(FacesContext context, DataVisitor visitor, Range range, Object argument) {
-        if (getRowKey() != null) {
-            visitor.process(context, getRowKey(), argument);
-        }
 
-        TreeRange treeRange = (TreeRange) range;
-        
-        if (treeRange.shouldIterateChildren(getRowKey())) {
-            enterNode(visitor);
-            Iterator<Object> keysIterator = keysStack.getLast();
-            while (keysIterator.hasNext()) {
-                Object key = (Object) keysIterator.next();
-                setRowKey(key);
-                walk(context, visitor, range, argument);
-            }
-            exitNode(visitor);
-        }
+    @Override
+    public int getRowCount() {
+        throw new UnsupportedOperationException();
     }
 
-    public void exitNode(DataVisitor visitor) {
-        if (visitor instanceof TreeDataVisitor) {
-            ((TreeDataVisitor) visitor).exitNode();
-        }
 
-        keysStack.removeLast();
+    @Override
+    public V getRowData() {
+        return getData();
     }
 
-    public abstract Object getParentRowKey(Object rowKey);
 
-    protected V getRootNode() {
-        return rootNode;
+    @Override
+    public int getRowIndex() {
+        throw new UnsupportedOperationException();
     }
-    
-    protected void setRootNode(V rootNode) {
-        this.rootNode = rootNode;
+
+
+    @Override
+    public void setRowIndex(int rowIndex) {
+        throw new UnsupportedOperationException();
     }
+
+    public TreeDataModelTuple createSnapshot() {
+        return new TreeDataModelTuple(getRowKey(), getData());
+    }
+
+    public void restoreFromSnapshot(TreeDataModelTuple tuple) {
+        setRowKeyAndData((SequenceRowKey<K>) tuple.getRowKey(), (V) tuple.getData());
+    }
     
 }
Modified: branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/renderkit/TreeEncoderBase.java
===================================================================
--- branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/renderkit/TreeEncoderBase.java	2010-11-30 18:55:37 UTC (rev 20244)
+++ branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/renderkit/TreeEncoderBase.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -30,15 +30,51 @@
 
 import org.ajax4jsf.context.AjaxContext;
 import org.ajax4jsf.javascript.JSFunction;
-import org.ajax4jsf.model.DataVisitResult;
 import org.richfaces.component.AbstractTree;
 import org.richfaces.component.AbstractTreeNode;
 import org.richfaces.component.util.HtmlUtil;
+import org.richfaces.model.TreeDataModelTuple;
 import org.richfaces.model.TreeDataVisitor;
-import org.richfaces.renderkit.TreeRendererBase.QueuedData;
 
 abstract class TreeEncoderBase implements TreeDataVisitor {
 
+    private static final class QueuedData {
+
+        private enum State {
+            initial, visited, encoded
+        }
+        
+        private State state = State.initial;
+        
+        private TreeDataModelTuple tuple;
+        
+        public QueuedData(TreeDataModelTuple tuple) {
+            super();
+            this.tuple = tuple;
+        }
+
+        public boolean isEncoded() {
+            return state == State.encoded;
+        }
+        
+        public void makeEncoded() {
+            this.state = State.encoded;
+        }
+
+        public void makeVisited() {
+            this.state = State.visited;
+        }
+        
+        public boolean isVisited() {
+            return state == State.visited;
+        }
+        
+        public TreeDataModelTuple getTuple() {
+            return tuple;
+        }
+        
+    }
+
     static final String TREE_NODE_STATE_ATTRIBUTE = "__treeNodeState";
 
     protected final FacesContext context;
@@ -49,8 +85,6 @@
 
     private LinkedList<QueuedData> queuedDataList = new LinkedList<QueuedData>();
 
-    private QueuedData queuedData;
-
     public TreeEncoderBase(FacesContext context, AbstractTree tree) {
         super();
         this.context = context;
@@ -59,30 +93,9 @@
     }
 
     protected void encodeTree() throws IOException {
-        tree.walk(context, this, null);
+        tree.walkModel(context, this);
     }
 
-    protected void flushNode() throws IOException {
-        if (!queuedData.isEncoded()) {
-            tree.setRowKey(context, queuedData.getRowKey());
-            
-            TreeNodeState state;
-            if (tree.isLeaf()) {
-                state = TreeNodeState.leaf;
-            } else {
-                if (queuedData.isVisited()) {
-                    state = TreeNodeState.leaf;
-                } else {
-                    state = TreeNodeState.collapsed;
-                }
-            }
-            
-            writeTreeNodeStartElement(state);
-        }
-
-        writeTreeNodeEndElement();
-    }
-    
     protected void flushParentNode() throws IOException {
         if (queuedDataList.isEmpty()) {
             return;
@@ -90,54 +103,64 @@
         
         QueuedData data = queuedDataList.getLast();
         if (!data.isEncoded()) {
-            data.setEncoded(true);
-            tree.setRowKey(context, data.getRowKey());
+            data.makeEncoded();
+            tree.restoreFromSnapshot(context, data.getTuple());
             
-            writeTreeNodeStartElement(tree.isExpanded() ? TreeNodeState.expanded : TreeNodeState.collapsed);
+            TreeNodeState nodeState = getNodeState(tree.isLeaf(), false);
+            
+            writeTreeNodeStartElement(nodeState);
+            tree.findTreeNodeComponent().encodeAll(context);
         }
     }
-    
-    public void enterNode() {
-        if (queuedData != null) {
-            queuedData.makeVisited();
-            queuedDataList.add(queuedData);
-            queuedData = null;
+
+    private TreeNodeState getNodeState(boolean leaf, boolean visited) {
+        TreeNodeState nodeState;
+        if (leaf) {
+            nodeState = TreeNodeState.leaf;
+        } else if (visited) {
+            nodeState = TreeNodeState.expandedNoChildren;
+        } else if (tree.isExpanded()) {
+            nodeState = TreeNodeState.expanded;
+        } else {
+            nodeState = TreeNodeState.collapsed;
         }
+        return nodeState;
     }
 
-    public DataVisitResult process(FacesContext context, Object rowKey, Object argument) {
+    public void beforeChildrenVisit() {
+        if (!queuedDataList.isEmpty()) {
+            queuedDataList.getLast().makeVisited();
+        }
+    }
+
+    public void afterChildrenVisit() {
+    }
+    
+    public void enterNode() {
+        TreeDataModelTuple tuple = tree.createSnapshot();
+        QueuedData queuedData = new QueuedData(tuple);
+        
         try {
-            if (queuedData != null) {
-                flushNode();
-                queuedData = null;
-            } else {
-                flushParentNode();
-            }
+            flushParentNode();
         } catch (IOException e) {
             throw new FacesException(e.getMessage(), e);
         }
-
-        if (rowKey != null) {
-            tree.setRowKey(context, rowKey);
-
-            if (tree.isRowAvailable() && tree.findTreeNodeComponent() != null) {
-                queuedData = new QueuedData(rowKey);
-            }
-        }
-
-        return DataVisitResult.CONTINUE;
+        
+        tree.restoreFromSnapshot(context, tuple);
+        queuedDataList.add(queuedData);
     }
+    
+    public void exitNode() {
+        QueuedData data = queuedDataList.removeLast();
 
-    public void exitNode() {
+        tree.restoreFromSnapshot(context, data.getTuple());
         try {
-            if (queuedData != null) {
-                flushNode();
-                queuedData = null;
+            if (!data.isEncoded()) {
+                writeTreeNodeStartElement(getNodeState(tree.isLeaf(), data.isVisited()));
+                tree.findTreeNodeComponent().encodeAll(context);
             }
-
-            if (!queuedDataList.isEmpty()) {
-                queuedData = queuedDataList.removeLast();
-            }
+        
+            writeTreeNodeEndElement();
         } catch (IOException e) {
             throw new FacesException(e.getMessage(), e);
         }
@@ -155,7 +178,6 @@
         responseWriter.writeAttribute(HtmlConstants.ID_ATTRIBUTE, treeNodeComponent.getClientId(context), null);
 
         emitClientToggleEvent(treeNodeComponent, nodeState);
-        treeNodeComponent.encodeAll(context);
     }
 
     protected void writeTreeNodeEndElement() throws IOException {
@@ -166,10 +188,9 @@
 
     private void emitClientToggleEvent(AbstractTreeNode treeNode, TreeNodeState nodeState) {
         if (treeNode.getClientId(context).equals(context.getAttributes().get(TreeNodeRendererBase.AJAX_TOGGLED_NODE_ATTRIBUTE))) {
-            TreeNodeState submittedState = ((Boolean) (context.getAttributes().get(TreeNodeRendererBase.AJAX_TOGGLED_NODE_STATE_ATTRIBUTE)))
-                ? TreeNodeState.expanded : TreeNodeState.collapsed;
+            TreeNodeState initialState = (TreeNodeState) context.getAttributes().get(TreeNodeRendererBase.AJAX_TOGGLED_NODE_STATE_ATTRIBUTE);
 
-            if (submittedState == nodeState || nodeState == TreeNodeState.leaf) {
+            if (initialState.isDifferentThan(nodeState)) {
                 AjaxContext ajaxContext = AjaxContext.getCurrentInstance(context);
                 ajaxContext.appendOncomplete(new JSFunction("RichFaces.ui.TreeNode.emitToggleEvent", treeNode.getClientId(context)));
             }
Modified: branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/renderkit/TreeNodeRendererBase.java
===================================================================
--- branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/renderkit/TreeNodeRendererBase.java	2010-11-30 18:55:37 UTC (rev 20244)
+++ branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/renderkit/TreeNodeRendererBase.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -63,9 +63,10 @@
 
             AbstractTreeNode treeNode = (AbstractTreeNode) component;
             
-            boolean expanded = Boolean.valueOf(newToggleState);
-            if (treeNode.isExpanded() ^ expanded) {
-                new TreeToggleEvent(treeNode, expanded).queue();
+            boolean initialState = treeNode.isExpanded();
+            boolean newState = Boolean.valueOf(newToggleState);
+            if (initialState ^ newState) {
+                new TreeToggleEvent(treeNode, newState).queue();
             }
 
             PartialViewContext pvc = context.getPartialViewContext();
@@ -73,7 +74,7 @@
                 pvc.getRenderIds().add(treeNode.getClientId(context) + MetaComponentResolver.META_COMPONENT_SEPARATOR_CHAR + AbstractTreeNode.SUBTREE_META_COMPONENT_ID);
             
                 context.getAttributes().put(AJAX_TOGGLED_NODE_ATTRIBUTE, component.getClientId(context));
-                context.getAttributes().put(AJAX_TOGGLED_NODE_STATE_ATTRIBUTE, expanded);
+                context.getAttributes().put(AJAX_TOGGLED_NODE_STATE_ATTRIBUTE, initialState ? TreeNodeState.expanded : TreeNodeState.collapsed);
             }
         }
     }
@@ -141,8 +142,8 @@
                 if (toggleType == SwitchType.client || nodeState == TreeNodeState.collapsed) {
                     encodeIconForNodeState(context, tree, treeNode, TreeNodeState.collapsed, iconCollapsed);
                 }
-                
-                if (toggleType == SwitchType.client || nodeState == TreeNodeState.expanded) {
+
+                if (toggleType == SwitchType.client || nodeState == TreeNodeState.expanded || nodeState == TreeNodeState.expandedNoChildren) {
                     encodeIconForNodeState(context, tree, treeNode, TreeNodeState.expanded, iconExpanded);
                 }
             }
@@ -162,6 +163,7 @@
     protected void addClientEventHandlers(FacesContext facesContext, UIComponent component) {
         AbstractTreeNode treeNode = (AbstractTreeNode) component;
         
+        //TODO check node state
         //TODO check toggle/selection types
         TreeRenderingContext renderingContext = TreeRenderingContext.get(facesContext);
         renderingContext.addHandlers(treeNode);
Modified: branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/renderkit/TreeNodeState.java
===================================================================
--- branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/renderkit/TreeNodeState.java	2010-11-30 18:55:37 UTC (rev 20244)
+++ branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/renderkit/TreeNodeState.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -29,28 +29,46 @@
         public boolean isLeaf() {
             return false;
         }
-    }, 
+
+        @Override
+        public boolean isDifferentThan(TreeNodeState anotherState) {
+            return anotherState != expandedNoChildren && super.isDifferentThan(anotherState);
+        }
+        
+    },
+    expandedNoChildren("rf-tr-nd-exp rf-tr-nd-exp-nc", "rf-trn-hnd-lf", "rf-trn-ico-exp") {
+        @Override
+        public boolean isLeaf() {
+            return false;
+        }
+
+        @Override
+        public boolean isDifferentThan(TreeNodeState anotherState) {
+            return anotherState != expanded && super.isDifferentThan(anotherState);
+        }
+    },
     collapsed("rf-tr-nd-colps", "rf-trn-hnd-colps", "rf-trn-ico-colps") {
         @Override
         public boolean isLeaf() {
             return false;
         }
-    }, 
+    },
     leaf("rf-tr-nd-lf", "rf-trn-hnd-lf", "rf-trn-ico-lf") {
         @Override
         public boolean isLeaf() {
             return true;
         }
+
     };
 
     private String nodeClass;
 
     private String handleClass;
-    
+
     private String iconClass;
 
     private String customIconClass;
-    
+
     private TreeNodeState(String nodeClass, String defaultHandleClass, String iconClass) {
         this.nodeClass = nodeClass;
         this.handleClass = HtmlUtil.concatClasses(defaultHandleClass, "rf-trn-hnd");
@@ -59,7 +77,11 @@
     }
 
     public abstract boolean isLeaf();
-    
+
+    public boolean isDifferentThan(TreeNodeState anotherState) {
+        return anotherState != this;
+    }
+
     public String getNodeClass() {
         return nodeClass;
     }
Modified: branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/renderkit/TreeRendererBase.java
===================================================================
--- branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/renderkit/TreeRendererBase.java	2010-11-30 18:55:37 UTC (rev 20244)
+++ branches/RF-8742-1/ui/iteration/ui/src/main/java/org/richfaces/renderkit/TreeRendererBase.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -84,39 +84,6 @@
         }
     }
 
-    static final class QueuedData {
-
-        private Object rowKey;
-
-        private boolean encoded;
-
-        private boolean visited;
-        
-        public QueuedData(Object rowKey) {
-            this.rowKey = rowKey;
-        }
-
-        public void setEncoded(boolean encoded) {
-            this.encoded = encoded;
-        }
-
-        public boolean isEncoded() {
-            return encoded;
-        }
-
-        public Object getRowKey() {
-            return rowKey;
-        }
-
-        public boolean isVisited() {
-            return visited;
-        }
-        
-        public void makeVisited() {
-            visited = true;
-        }
-    }
-
     public void encodeTree(FacesContext context, UIComponent component) throws IOException {
         AbstractTree tree = (AbstractTree) component;
 
@@ -175,7 +142,7 @@
 
         if (selectedKeys.hasNext()) {
             //TODO - better message
-            throw new IllegalArgumentException("Selection object should not contain more than selected keys!");
+            throw new IllegalArgumentException("Selection object should not contain more than one keys!");
         }
 
         writer.writeAttribute(HtmlConstants.VALUE_ATTRIBUTE, selectedNodeId, null);
Modified: branches/RF-8742-1/ui/iteration/ui/src/main/resources/META-INF/resources/org.richfaces/tree.js
===================================================================
--- branches/RF-8742-1/ui/iteration/ui/src/main/resources/META-INF/resources/org.richfaces/tree.js	2010-11-30 18:55:37 UTC (rev 20244)
+++ branches/RF-8742-1/ui/iteration/ui/src/main/resources/META-INF/resources/org.richfaces/tree.js	2010-11-30 19:36:09 UTC (rev 20245)
@@ -153,8 +153,12 @@
 			return this.__rootElt.hasClass("rf-tr-nd-lf");
 		},
 		
+		__canBeToggled: function() {
+			return !this.isLeaf() && !this.__rootElt.hasClass("rf-tr-nd-exp-nc");
+		},
+		
 		toggle: function() {
-			if (this.isLeaf()) {
+			if (!this.__canBeToggled()) {
 				return;
 			}
 			
Copied: branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/component/AbstractToolBar.java (from rev 20235, trunk/ui/output/ui/src/main/java/org/richfaces/component/AbstractToolBar.java)
===================================================================
--- branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/component/AbstractToolBar.java	                        (rev 0)
+++ branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/component/AbstractToolBar.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,82 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright ${year}, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.richfaces.component;
+
+import javax.faces.component.UIComponentBase;
+
+import org.richfaces.cdk.annotations.Attribute;
+import org.richfaces.cdk.annotations.EventName;
+import org.richfaces.cdk.annotations.JsfComponent;
+import org.richfaces.cdk.annotations.JsfRenderer;
+import org.richfaces.cdk.annotations.Tag;
+import org.richfaces.renderkit.html.ToolBarRendererBase;
+
+@JsfComponent(family = AbstractToolBar.COMPONENT_FAMILY, type = AbstractToolBar.COMPONENT_TYPE, 
+        renderer=@JsfRenderer(type = ToolBarRendererBase.RENDERER_TYPE), tag = @Tag(name="toolBar")
+)
+public abstract class AbstractToolBar extends UIComponentBase {
+
+    public static final String COMPONENT_TYPE = "org.richfaces.ToolBar";
+
+    public static final String COMPONENT_FAMILY = "org.richfaces.ToolBar";
+    
+    @Attribute
+    public abstract String getHeight();
+    
+    @Attribute
+    public abstract String getWidth();
+    
+    @Attribute
+    public abstract String getItemSeparator();
+    
+    @Attribute(events=@EventName("itemclick"))
+    public abstract String getOnitemclick();
+
+    @Attribute(events=@EventName("itemdblclick"))
+    public abstract String getOnitemdblclick();
+    
+    @Attribute(events=@EventName("itemmousedown"))
+    public abstract String getOnitemmousedown();
+    
+    @Attribute(events=@EventName("itemmouseup"))
+    public abstract String getOnitemmouseup();
+    
+    @Attribute(events=@EventName("itemmouseover"))
+    public abstract String getOnitemmouseover();
+    
+    @Attribute(events=@EventName("itemmousemove"))
+    public abstract String getOnitemmousemove();
+    
+    @Attribute(events=@EventName("itemmouseout"))
+    public abstract String getOnitemmouseout();
+    
+    @Attribute(events=@EventName("itemkeypress"))
+    public abstract String getOnitemkeypress();
+
+    @Attribute(events=@EventName("itemkeydown"))
+    public abstract String getOnitemkeydown();
+
+    @Attribute(events=@EventName("itemkeyup"))
+    public abstract String getOnitemkeyup();
+    
+}
Copied: branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/component/AbstractToolBarGroup.java (from rev 20235, trunk/ui/output/ui/src/main/java/org/richfaces/component/AbstractToolBarGroup.java)
===================================================================
--- branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/component/AbstractToolBarGroup.java	                        (rev 0)
+++ branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/component/AbstractToolBarGroup.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,106 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright ${year}, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.richfaces.component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.faces.FacesException;
+import javax.faces.component.UIComponent;
+import javax.faces.component.UIComponentBase;
+
+import org.richfaces.cdk.annotations.Attribute;
+import org.richfaces.cdk.annotations.EventName;
+import org.richfaces.cdk.annotations.JsfComponent;
+import org.richfaces.cdk.annotations.JsfRenderer;
+import org.richfaces.cdk.annotations.Tag;
+import org.richfaces.renderkit.html.ToolBarGroupRenderer;
+
+@JsfComponent(family = AbstractToolBar.COMPONENT_FAMILY, type = AbstractToolBarGroup.COMPONENT_TYPE,
+        renderer=@JsfRenderer(type = ToolBarGroupRenderer.RENDERER_TYPE), tag = @Tag(name="toolBarGroup"))
+public abstract class AbstractToolBarGroup extends UIComponentBase {
+    
+    public static final String COMPONENT_TYPE = "org.richfaces.ToolBarGroup";
+    
+    @Attribute
+    public abstract String getItemSeparator();
+    
+    @Attribute
+    public abstract String getLocation();
+    
+    @Attribute(events=@EventName("itemclick"))
+    public abstract String getOnitemclick();
+
+    @Attribute(events=@EventName("itemdblclick"))
+    public abstract String getOnitemdblclick();
+    
+    @Attribute(events=@EventName("itemmousedown"))
+    public abstract String getOnitemmousedown();
+    
+    @Attribute(events=@EventName("itemmouseup"))
+    public abstract String getOnitemmouseup();
+    
+    @Attribute(events=@EventName("itemmouseover"))
+    public abstract String getOnitemmouseover();
+    
+    @Attribute(events=@EventName("itemmousemove"))
+    public abstract String getOnitemmousemove();
+    
+    @Attribute(events=@EventName("itemmouseout"))
+    public abstract String getOnitemmouseout();
+    
+    @Attribute(events=@EventName("itemkeypress"))
+    public abstract String getOnitemkeypress();
+
+    @Attribute(events=@EventName("itemkeydown"))
+    public abstract String getOnitemkeydown();
+
+    @Attribute(events=@EventName("itemkeyup"))
+    public abstract String getOnitemkeyup();
+    
+    public AbstractToolBar getToolBar() {
+        UIComponent component = this.getParent();
+        if (component == null) {
+            throw new FacesException("The component: " + this.getClientId(getFacesContext()) + 
+                    " is not nested within " + AbstractToolBar.class.getSimpleName());
+        } else if (!(component instanceof AbstractToolBar)) {
+            throw new FacesException("The component: " + this.getClientId(getFacesContext()) + 
+                    " is not a direct child of " + AbstractToolBar.class.getSimpleName());
+        }
+        return (AbstractToolBar) component;
+    }
+    
+    public List<UIComponent> getRenderedChildren() {
+        List<UIComponent> children = this.getChildren();
+        List<UIComponent> renderedChildren = new ArrayList<UIComponent>(children.size());
+
+        for (UIComponent child : children) {
+            if (child.isRendered()) {
+                renderedChildren.add(child);
+            }
+        }
+        
+        return renderedChildren;
+    } 
+
+}
Modified: branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/ProgressBarBaseRenderer.java
===================================================================
--- branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/ProgressBarBaseRenderer.java	2010-11-30 18:55:37 UTC (rev 20244)
+++ branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/ProgressBarBaseRenderer.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -107,13 +107,24 @@
         Number minValue = NumberUtils.getNumber(component.getAttributes().get("minValue"));
         Number maxValue = NumberUtils.getNumber(component.getAttributes().get("maxValue"));
         Number value = NumberUtils.getNumber(component.getAttributes().get("value"));
+        
+        ProgressBarState result;
+        
         if (value.doubleValue() <= minValue.doubleValue()) {
-            return ProgressBarState.initialState;
+            result = ProgressBarState.initialState;
         } else if (value.doubleValue() > maxValue.doubleValue()) {
-            return ProgressBarState.finishState;
+            result = ProgressBarState.finishState;
         } else {
-            return ProgressBarState.progressState;
+            result = ProgressBarState.progressState;
         }
+        
+        if (result == ProgressBarState.initialState || result == ProgressBarState.finishState) {
+            if (!result.hasContent(context, component)) {
+                result = ProgressBarState.progressState;
+            }
+        }
+        
+        return result;
     }
     
     protected String getStateDisplayStyle(String currentState, String state) {
Modified: branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/ProgressBarState.java
===================================================================
--- branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/ProgressBarState.java	2010-11-30 18:55:37 UTC (rev 20244)
+++ branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/ProgressBarState.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -43,13 +43,16 @@
 
         @Override
         public void encodeContent(FacesContext context, UIComponent component) throws IOException {
-            UIComponent facet = component.getFacet("initial");
-            if (facet != null) {
-                facet.encodeAll(context);
-            }
+            component.getFacet("initial").encodeAll(context);
         }
 
         @Override
+        public boolean hasContent(FacesContext context, UIComponent component) {
+            UIComponent facet = component.getFacet("initial");
+            return facet != null && facet.isRendered();
+        }
+        
+        @Override
         public void encodeStateForMetaComponent(FacesContext context, UIComponent component,
             ProgressBarStateEncoder encoder) throws IOException {
             
@@ -87,6 +90,11 @@
         }
 
         @Override
+        public boolean hasContent(FacesContext context, UIComponent component) {
+            return true;
+        }
+        
+        @Override
         public void encodeStateForMetaComponent(FacesContext context, UIComponent component,
             ProgressBarStateEncoder encoder) throws IOException {
             
@@ -114,6 +122,12 @@
         }
 
         @Override
+        public boolean hasContent(FacesContext context, UIComponent component) {
+            UIComponent facet = component.getFacet("finish");
+            return facet != null && facet.isRendered();
+        }
+        
+        @Override
         public void encodeStateForMetaComponent(FacesContext context, UIComponent component,
             ProgressBarStateEncoder encoder) throws IOException {
 
@@ -127,5 +141,7 @@
 
     public abstract void encodeContent(FacesContext context, UIComponent component) throws IOException;
 
+    public abstract boolean hasContent(FacesContext context, UIComponent component);
+    
     public abstract void encodeStateForMetaComponent(FacesContext context, UIComponent component, ProgressBarStateEncoder encoder) throws IOException;
 }
\ No newline at end of file
Modified: branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/ProgressBarStateEncoder.java
===================================================================
--- branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/ProgressBarStateEncoder.java	2010-11-30 18:55:37 UTC (rev 20244)
+++ branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/ProgressBarStateEncoder.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -50,6 +50,11 @@
 
     private void encodeStateFacet(FacesContext context, UIComponent component, ProgressBarState state,
         ProgressBarState currentState) throws IOException {
+        
+        if (!state.hasContent(context, component)) {
+            return;
+        }
+        
         String clientId = state.getStateClientId(context, component);
 
         ResponseWriter responseWriter = context.getResponseWriter();
@@ -103,6 +108,11 @@
 
     public void encodeProgressStateContent(FacesContext context, UIComponent component, ProgressBarState currentState)
         throws IOException {
+        
+        if (!ProgressBarState.progressState.hasContent(context, component)) {
+            return;
+        }
+        
         ResponseWriter responseWriter = context.getResponseWriter();
         String stateClientId = ProgressBarState.progressState.getStateClientId(context, component);
 
Copied: branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/ToolBarGroupRenderer.java (from rev 20235, trunk/ui/output/ui/src/main/java/org/richfaces/renderkit/html/ToolBarGroupRenderer.java)
===================================================================
--- branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/ToolBarGroupRenderer.java	                        (rev 0)
+++ branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/ToolBarGroupRenderer.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,121 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright ${year}, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.richfaces.renderkit.html;
+
+import java.io.IOException;
+import java.util.List;
+
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.context.ResponseWriter;
+
+import org.richfaces.cdk.annotations.JsfRenderer;
+import org.richfaces.component.AbstractToolBar;
+import org.richfaces.component.AbstractToolBarGroup;
+import org.richfaces.renderkit.HtmlConstants;
+
+@JsfRenderer(type = ToolBarGroupRenderer.RENDERER_TYPE, family = AbstractToolBar.COMPONENT_FAMILY)
+public class ToolBarGroupRenderer extends ToolBarRendererBase {
+
+    public static final String RENDERER_TYPE = "org.richfaces.ToolBarGroupRenderer";
+
+    protected Class<? extends UIComponent> getComponentClass() {
+        return AbstractToolBarGroup.class;
+    }
+
+    public boolean getRendersChildren() {
+        return true;
+    }
+
+    public void encodeChildren(FacesContext facesContext, UIComponent component) throws IOException {
+        AbstractToolBarGroup toolBarGroup = (AbstractToolBarGroup) component;
+        List<UIComponent> renderedChildren = toolBarGroup.getRenderedChildren();
+        if (renderedChildren.size() <= 0) {
+            return;
+        }
+
+        ResponseWriter writer = facesContext.getResponseWriter();
+        renderChild(facesContext, toolBarGroup, writer, renderedChildren.get(0));
+        for (int i = 1; i < renderedChildren.size(); i++) {
+            insertSeparatorIfNeed(facesContext, toolBarGroup, writer);
+            renderChild(facesContext, toolBarGroup, writer, renderedChildren.get(i));
+        }
+    }
+
+    private void renderChild(FacesContext facesContext, AbstractToolBarGroup toolBarGroup, ResponseWriter writer,
+            UIComponent child) throws IOException {
+        writer.startElement(HtmlConstants.TD_ELEM, toolBarGroup);
+        writeClassValue(toolBarGroup, writer);
+        writeStyleValue(toolBarGroup, writer);
+        encodeEventsAttributes(facesContext, toolBarGroup);
+        child.encodeAll(facesContext);
+        writer.endElement(HtmlConstants.TD_ELEM);
+    }
+
+    private void writeStyleValue(AbstractToolBarGroup toolBarGroup, ResponseWriter writer) throws IOException {
+        String style = getStringAttribute(toolBarGroup, HtmlConstants.STYLE_ATTRIBUTE);
+        String contentStyle = getStringAttribute(getParentToolBar(toolBarGroup), "contentStyle");
+
+        String value = getCompoundStyleValue(contentStyle, style);
+
+        if (isPropertyRendered(value)) {
+            writer.writeAttribute(HtmlConstants.STYLE_ATTRIBUTE, value, null);
+        }
+    }
+
+    private String getCompoundStyleValue(String... styles) {
+        if (styles != null) {
+            StringBuilder result = new StringBuilder();
+            for (int styleIndex = 0; styleIndex < styles.length; styleIndex++) {
+                result.append(styles[styleIndex]);
+                if (styleIndex != styles.length - 1) {
+                    result.append("; ");
+                }
+            }
+            return result.toString();
+        }
+        return "";
+    }
+
+    private void writeClassValue(AbstractToolBarGroup toolBarGroup, ResponseWriter writer) throws IOException {
+        String styleClass = getStringAttribute(toolBarGroup, HtmlConstants.STYLE_CLASS_ATTR);
+        AbstractToolBar toolBar = getParentToolBar(toolBarGroup);
+        String contentClass = null;
+        
+        if(toolBar != null) {
+            contentClass = getStringAttribute(toolBar, "contentClass");
+        }
+        
+        writer.writeAttribute(HtmlConstants.CLASS_ATTRIBUTE, concatClasses("rf-tb-itm", contentClass, styleClass), null);
+    }
+
+    private String getStringAttribute(UIComponent toolBarGroup, String attribute) {
+        String value = (String) toolBarGroup.getAttributes().get(attribute);
+        return null == value ? "" : value;
+    }
+    
+    public AbstractToolBar getParentToolBar(UIComponent component) {
+        return (component instanceof AbstractToolBarGroup) ? ((AbstractToolBarGroup) component).getToolBar() : null;
+    }    
+
+}
\ No newline at end of file
Copied: branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/ToolBarRendererBase.java (from rev 20235, trunk/ui/output/ui/src/main/java/org/richfaces/renderkit/html/ToolBarRendererBase.java)
===================================================================
--- branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/ToolBarRendererBase.java	                        (rev 0)
+++ branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/ToolBarRendererBase.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,275 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright ${year}, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.richfaces.renderkit.html;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import javax.faces.application.ResourceDependency;
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.context.ResponseWriter;
+
+import org.richfaces.component.AbstractToolBar;
+import org.richfaces.component.AbstractToolBarGroup;
+import org.richfaces.renderkit.ComponentAttribute;
+import org.richfaces.renderkit.HtmlConstants;
+import org.richfaces.renderkit.RenderKitUtils;
+import org.richfaces.renderkit.RendererBase;
+
+
+@ResourceDependency(library = "org.richfaces", name = "toolBar.ecss")
+public abstract class ToolBarRendererBase extends RendererBase {
+
+    public static final String RENDERER_TYPE = "org.richfaces.ToolBarRenderer";
+    
+    public static final Map<String, ComponentAttribute> ITEMS_HANDLER_ATTRIBUTES = Collections
+    .unmodifiableMap(ComponentAttribute.createMap(
+            new ComponentAttribute(HtmlConstants.ONCLICK_ATTRIBUTE)
+                .setEventNames("itemclick")
+                .setComponentAttributeName("onitemclick"),
+            new ComponentAttribute(HtmlConstants.ONDBLCLICK_ATTRIBUTE)
+                .setEventNames("itemdblclick")
+                .setComponentAttributeName("onitemdblclick"), 
+            new ComponentAttribute(HtmlConstants.ONMOUSEDOWN_ATTRIBUTE)
+                .setEventNames("itemmousedown")
+                .setComponentAttributeName("onitemmousedown"),
+            new ComponentAttribute(HtmlConstants.ONMOUSEUP_ATTRIBUTE)
+                .setEventNames("itemmouseup")
+                .setComponentAttributeName("onitemmouseup"), 
+            new ComponentAttribute(HtmlConstants.ONMOUSEOVER_ATTRIBUTE)
+                .setEventNames("itemmouseover")
+                .setComponentAttributeName("onitemmouseover"), 
+            new ComponentAttribute(HtmlConstants.ONMOUSEMOVE_ATTRIBUTE)
+                .setEventNames("itemmousemove")
+                .setComponentAttributeName("onitemmousemove"), 
+            new ComponentAttribute(HtmlConstants.ONMOUSEOUT_ATTRIBUTE)
+                .setEventNames("itemmouseout")
+                .setComponentAttributeName("onitemmouseout"), 
+            new ComponentAttribute(HtmlConstants.ONKEYPRESS_ATTRIBUTE)
+                .setEventNames("itemkeypress")
+                .setComponentAttributeName("onitemkeypress"),
+            new ComponentAttribute(HtmlConstants.ONKEYDOWN_ATTRIBUTE)
+                .setEventNames("itemkeydown")
+                .setComponentAttributeName("onitemkeydown"),
+            new ComponentAttribute(HtmlConstants.ONKEYUP_ATTRIBUTE)
+                .setEventNames("itemkeyup")
+                .setComponentAttributeName("onitemkeyup")
+    ));
+
+    public enum ItemSeparators {
+        NONE, SQUARE, DISC, GRID, LINE
+    }
+
+    public enum Locations {
+        RIGHT, LEFT
+    }
+
+    @Override
+    public void encodeChildren(FacesContext context, UIComponent component) throws IOException {
+        AbstractToolBar toolBar = (AbstractToolBar) component;
+        String contentClass = (String) toolBar.getAttributes().get("contentClass");
+        String contentStyle = (String) toolBar.getAttributes().get("contentStyle");
+
+        List<UIComponent> children = toolBar.getChildren();
+
+        if (children != null) {
+            List<UIComponent> childrenToTheLeft = new LinkedList<UIComponent>();
+            List<UIComponent> childrenToTheRight = new LinkedList<UIComponent>();
+            for (UIComponent child : children) {
+                if (child.isRendered()) {
+                    if (child instanceof AbstractToolBarGroup) {
+                        AbstractToolBarGroup group = (AbstractToolBarGroup) child;
+                        String location = group.getLocation();
+                        if (location != null && location.equalsIgnoreCase(Locations.RIGHT.toString())) {
+                            childrenToTheRight.add(child);
+                        } else {
+                            childrenToTheLeft.add(child);
+                        }
+                    } else {
+                        childrenToTheLeft.add(child);
+                    }
+                }
+            }
+
+            ResponseWriter writer = context.getResponseWriter();
+            for (Iterator<UIComponent> it = childrenToTheLeft.iterator(); it.hasNext();) {
+                
+                UIComponent child = it.next();
+                
+                if (!(child instanceof AbstractToolBarGroup)) {
+                    writer.startElement(HtmlConstants.TD_ELEM, component);
+                    writer.writeAttribute(HtmlConstants.CLASS_ATTRIBUTE, concatClasses("rf-tb-itm", contentClass), null);
+                    if (isPropertyRendered(contentStyle)) {
+                        writer.writeAttribute(HtmlConstants.STYLE_ATTRIBUTE, contentStyle, null);
+                    }
+                    encodeEventsAttributes(context, toolBar);
+                }
+                
+                child.encodeAll(context);
+                
+                if (!(child instanceof AbstractToolBarGroup)) {
+                    writer.endElement(HtmlConstants.TD_ELEM);
+                }
+                
+                
+                
+                if (it.hasNext()) {
+                    insertSeparatorIfNeed(context, toolBar, writer);
+                }
+            }
+
+            writer.startElement(HtmlConstants.TD_ELEM, component);
+            writer.writeAttribute(HtmlConstants.STYLE_ATTRIBUTE, "width:100%", null);
+            writer.endElement(HtmlConstants.TD_ELEM);
+
+            for (Iterator<UIComponent> it = childrenToTheRight.iterator(); it.hasNext();) {
+                UIComponent child = it.next();
+                child.encodeAll(context);
+                if (it.hasNext()) {
+                    insertSeparatorIfNeed(context, toolBar, writer);
+                }
+            }
+        }
+    }
+    
+    public void encodeItem(FacesContext facesContext, UIComponent component, ResponseWriter writer, String contentStyle, String contentClass) throws IOException {
+        if (!(component instanceof AbstractToolBarGroup)) {
+            writer.startElement(HtmlConstants.TD_ELEM, component);
+            writer.writeAttribute(HtmlConstants.CLASS_ATTRIBUTE, concatClasses("rf-tb-itm", contentClass), null);
+            if (isPropertyRendered(contentStyle)) {
+                writer.writeAttribute(HtmlConstants.STYLE_ATTRIBUTE, contentStyle, null);
+            }
+            encodeEventsAttributes(facesContext, component);
+        }
+        
+        component.encodeAll(facesContext);
+        
+        if (!(component instanceof AbstractToolBarGroup)) {
+            writer.endElement(HtmlConstants.TD_ELEM);
+        }
+    }
+    
+    /**
+     * Inserts separator between toolbar items. Uses facet "itemSeparator" if it
+     * is set and default separator implementation if facet is not set.
+     * 
+     * @param context
+     *            - faces context
+     * @param component
+     *            - component
+     * @param writer
+     *            - response writer
+     * @throws IOException
+     *             - in case of IOException during writing to the ResponseWriter
+     */
+    protected void insertSeparatorIfNeed(FacesContext context, UIComponent component, ResponseWriter writer)
+        throws IOException {
+        UIComponent separatorFacet = component.getFacet("itemSeparator");
+        boolean isSeparatorFacetRendered = (separatorFacet != null) ? separatorFacet.isRendered() : false;
+        if (isSeparatorFacetRendered) {
+            writer.startElement(HtmlConstants.TD_ELEM, component);
+            writer.writeAttribute(HtmlConstants.CLASS_ATTRIBUTE, "rf-tb-sep", null);
+            separatorFacet.encodeAll(context);
+            writer.endElement(HtmlConstants.TD_ELEM);
+        } else {
+            insertDefaultSeparatorIfNeed(context, component, writer);
+        }
+    }
+    
+    /**
+     * Inserts default separator. Possible values are: "square", "disc", "grid",
+     * "line" - for separators provided by component implementation; "none" -
+     * for no separators between toolbar items; URI string value - for custom
+     * images specified by the page author.
+     * 
+     * @param context
+     *            - faces context
+     * @param component
+     *            - component
+     * @param writer
+     *            - response writer
+     * @throws IOException
+     *             - in case of IOException during writing to the ResponseWriter
+     */
+    protected void insertDefaultSeparatorIfNeed(FacesContext context, UIComponent component, ResponseWriter writer)
+        throws IOException {
+        String itemSeparator = (String) component.getAttributes().get("itemSeparator");
+       
+        if (itemSeparator != null && itemSeparator.trim().length() != 0
+                && !itemSeparator.equalsIgnoreCase(ItemSeparators.NONE.toString())) {
+
+            ItemSeparators separator = null;
+            if (itemSeparator.equalsIgnoreCase(ItemSeparators.SQUARE.toString())) {
+                separator = ItemSeparators.SQUARE;
+            } else if (itemSeparator.equalsIgnoreCase(ItemSeparators.DISC.toString())) {
+                separator = ItemSeparators.DISC;
+            } else if (itemSeparator.equalsIgnoreCase(ItemSeparators.GRID.toString())) {
+                separator = ItemSeparators.GRID;
+            } else if (itemSeparator.equalsIgnoreCase(ItemSeparators.LINE.toString())) {
+                separator = ItemSeparators.LINE;
+            }
+
+            writer.startElement(HtmlConstants.TD_ELEM, component);
+            String separatorClass = "rf-tb-sep";
+            
+            if (separator != null) {
+                String itemSeparatorClass = "rf-tb-sep-" + separator.toString().toLowerCase();
+                separatorClass = concatClasses(separatorClass, itemSeparatorClass, (String) component.getAttributes().get("separatorClass"));
+                writer.writeAttribute(HtmlConstants.CLASS_ATTRIBUTE, separatorClass, null);
+            } else {
+                concatClasses(separatorClass, (String) component.getAttributes().get("separatorClass"));
+                writer.writeAttribute(HtmlConstants.CLASS_ATTRIBUTE, separatorClass, null);
+                
+                String uri = RenderKitUtils.getResourceURL(itemSeparator, context);
+                writer.startElement(HtmlConstants.IMG_ELEMENT, component);
+                writer.writeAttribute(HtmlConstants.SRC_ATTRIBUTE, uri, null);
+                writer.writeAttribute(HtmlConstants.ALT_ATTRIBUTE, "", null);
+                writer.endElement(HtmlConstants.IMG_ELEMENT);
+            }
+            
+            writer.endElement(HtmlConstants.TD_ELEM);
+        }
+    }
+
+    protected Class<? extends javax.faces.component.UIComponent> getComponentClass() {
+        return AbstractToolBar.class;
+    }
+
+    public boolean getRendersChildren() {
+        return true;
+    }
+
+    protected void encodeEventsAttributes(FacesContext facesContext, UIComponent component)
+        throws IOException {
+        RenderKitUtils.renderPassThroughAttributesOptimized(facesContext, component, ITEMS_HANDLER_ATTRIBUTES);
+    }
+
+    protected boolean isPropertyRendered(String property) {
+        return ((null != property && !"".equals(property)));
+    }
+}
Copied: branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images (from rev 20235, trunk/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images)
Deleted: branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/DotSeparatorImage.java
===================================================================
--- trunk/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/DotSeparatorImage.java	2010-11-30 14:37:17 UTC (rev 20235)
+++ branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/DotSeparatorImage.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -1,71 +0,0 @@
-/**
- * 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.html.images;
-
-import java.awt.Color;
-import java.awt.Dimension;
-import java.awt.GradientPaint;
-import java.awt.Graphics2D;
-import java.awt.RenderingHints;
-import java.awt.geom.Area;
-import java.awt.geom.Ellipse2D;
-
-import org.richfaces.resource.DynamicUserResource;
-
-/**
- * @author Maksim Kaszynski
- * 
- */
-@DynamicUserResource
-public class DotSeparatorImage extends ToolBarSeparatorImage {
-
-    private static final Dimension DIMENSIONS = new Dimension(9, 9);
-
-    public Dimension getDimension() {
-        return DIMENSIONS;
-    }
-
-    public void paint(Graphics2D g2d) {
-        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
-
-        Color gradientColorStart = Color.WHITE;
-        Color gradientColorEnd = new Color(this.getHeaderBackgroundColor());
-        Ellipse2D inSquare = new Ellipse2D.Double(2, 2, DIMENSIONS.getWidth() - 4, DIMENSIONS.getHeight() - 4);
-        GradientPaint paint = new GradientPaint((float) 3, (float) 3, gradientColorStart,
-                (float) DIMENSIONS.getWidth() - 2, (float) DIMENSIONS.getHeight() - 2, gradientColorEnd);
-        g2d.setPaint(paint);
-        g2d.fill(inSquare);
-
-        Ellipse2D outSquare = new Ellipse2D.Double(0, 0, DIMENSIONS.getWidth(), DIMENSIONS.getHeight());
-        Ellipse2D midSquare = new Ellipse2D.Double(1, 1, DIMENSIONS.getWidth() - 2, DIMENSIONS.getHeight() - 2);
-
-        g2d.setColor(new Color(this.getHeaderBackgroundColor()));
-        Area area2 = new Area(outSquare);
-        area2.subtract(new Area(midSquare));
-        g2d.fill(area2);
-
-        g2d.setColor(new Color(this.getHeaderGradientColor()));
-        Area area = new Area(midSquare);
-        area.subtract(new Area(inSquare));
-        g2d.fill(area);
-    }
-}
Copied: branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/DotSeparatorImage.java (from rev 20235, trunk/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/DotSeparatorImage.java)
===================================================================
--- branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/DotSeparatorImage.java	                        (rev 0)
+++ branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/DotSeparatorImage.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,71 @@
+/**
+ * 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.html.images;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.GradientPaint;
+import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.geom.Area;
+import java.awt.geom.Ellipse2D;
+
+import org.richfaces.resource.DynamicUserResource;
+
+/**
+ * @author Maksim Kaszynski
+ * 
+ */
+@DynamicUserResource
+public class DotSeparatorImage extends ToolBarSeparatorImage {
+
+    private static final Dimension DIMENSIONS = new Dimension(9, 9);
+
+    public Dimension getDimension() {
+        return DIMENSIONS;
+    }
+
+    public void paint(Graphics2D g2d) {
+        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+
+        Color gradientColorStart = Color.WHITE;
+        Color gradientColorEnd = new Color(this.getHeaderBackgroundColor());
+        Ellipse2D inSquare = new Ellipse2D.Double(2, 2, DIMENSIONS.getWidth() - 4, DIMENSIONS.getHeight() - 4);
+        GradientPaint paint = new GradientPaint((float) 3, (float) 3, gradientColorStart,
+                (float) DIMENSIONS.getWidth() - 2, (float) DIMENSIONS.getHeight() - 2, gradientColorEnd);
+        g2d.setPaint(paint);
+        g2d.fill(inSquare);
+
+        Ellipse2D outSquare = new Ellipse2D.Double(0, 0, DIMENSIONS.getWidth(), DIMENSIONS.getHeight());
+        Ellipse2D midSquare = new Ellipse2D.Double(1, 1, DIMENSIONS.getWidth() - 2, DIMENSIONS.getHeight() - 2);
+
+        g2d.setColor(new Color(this.getHeaderBackgroundColor()));
+        Area area2 = new Area(outSquare);
+        area2.subtract(new Area(midSquare));
+        g2d.fill(area2);
+
+        g2d.setColor(new Color(this.getHeaderGradientColor()));
+        Area area = new Area(midSquare);
+        area.subtract(new Area(inSquare));
+        g2d.fill(area);
+    }
+}
Deleted: branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/GridSeparatorImage.java
===================================================================
--- trunk/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/GridSeparatorImage.java	2010-11-30 14:37:17 UTC (rev 20235)
+++ branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/GridSeparatorImage.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -1,39 +0,0 @@
-package org.richfaces.renderkit.html.images;
-
-import java.awt.Color;
-import java.awt.Dimension;
-import java.awt.Graphics2D;
-import java.awt.Rectangle;
-import java.awt.TexturePaint;
-import java.awt.image.BufferedImage;
-
-import org.richfaces.resource.DynamicUserResource;
-
-@DynamicUserResource
-public class GridSeparatorImage extends ToolBarSeparatorImage {
-
-    public Dimension getDimension() {
-        return calculateDimension();
-    }
-    
-    public void paint(Graphics2D g2d) {
-        Dimension dimensions = calculateDimension();
-        
-        BufferedImage texture = new BufferedImage(3, 3, BufferedImage.TYPE_INT_ARGB);
-        Graphics2D txG2d = texture.createGraphics();
-        txG2d.setColor(new Color(this.getHeaderBackgroundColor()));
-        txG2d.fillRect(0, 0, 2, 2);
-        txG2d.setColor(new Color(255, 255, 255, 150));
-        txG2d.fillRect(0, 0, 1, 1);
-        txG2d.dispose();
-        g2d.setPaint(new TexturePaint(texture, new Rectangle(1, 1, 3, 3)));
-        g2d.fillRect(0, 0, dimensions.width, dimensions.height);
-    }
-    
-    private Dimension calculateDimension() {
-        int h = (int)(this.getSeparatorHeight() * 0.8);
-        h = h - h % 3;
-        int w = 9;
-        return new Dimension(w, h);
-    }
-}
\ No newline at end of file
Copied: branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/GridSeparatorImage.java (from rev 20235, trunk/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/GridSeparatorImage.java)
===================================================================
--- branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/GridSeparatorImage.java	                        (rev 0)
+++ branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/GridSeparatorImage.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,39 @@
+package org.richfaces.renderkit.html.images;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics2D;
+import java.awt.Rectangle;
+import java.awt.TexturePaint;
+import java.awt.image.BufferedImage;
+
+import org.richfaces.resource.DynamicUserResource;
+
+@DynamicUserResource
+public class GridSeparatorImage extends ToolBarSeparatorImage {
+
+    public Dimension getDimension() {
+        return calculateDimension();
+    }
+    
+    public void paint(Graphics2D g2d) {
+        Dimension dimensions = calculateDimension();
+        
+        BufferedImage texture = new BufferedImage(3, 3, BufferedImage.TYPE_INT_ARGB);
+        Graphics2D txG2d = texture.createGraphics();
+        txG2d.setColor(new Color(this.getHeaderBackgroundColor()));
+        txG2d.fillRect(0, 0, 2, 2);
+        txG2d.setColor(new Color(255, 255, 255, 150));
+        txG2d.fillRect(0, 0, 1, 1);
+        txG2d.dispose();
+        g2d.setPaint(new TexturePaint(texture, new Rectangle(1, 1, 3, 3)));
+        g2d.fillRect(0, 0, dimensions.width, dimensions.height);
+    }
+    
+    private Dimension calculateDimension() {
+        int h = (int)(this.getSeparatorHeight() * 0.8);
+        h = h - h % 3;
+        int w = 9;
+        return new Dimension(w, h);
+    }
+}
\ No newline at end of file
Deleted: branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/LineSeparatorImage.java
===================================================================
--- trunk/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/LineSeparatorImage.java	2010-11-30 14:37:17 UTC (rev 20235)
+++ branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/LineSeparatorImage.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -1,31 +0,0 @@
-package org.richfaces.renderkit.html.images;
-
-import java.awt.BasicStroke;
-import java.awt.Color;
-import java.awt.Dimension;
-import java.awt.Graphics2D;
-
-import org.richfaces.resource.DynamicUserResource;
-
-@DynamicUserResource
-public class LineSeparatorImage extends ToolBarSeparatorImage {
-
-    public Dimension getDimension() {
-        return calculateDimension();
-    }
-
-    public void paint(Graphics2D g2d) {
-        Dimension dimensions = calculateDimension();
-        g2d.setStroke(new BasicStroke(1));
-        g2d.setColor(new Color(this.getHeaderBackgroundColor()));
-        g2d.fillRect(-1, -1, dimensions.width + 2, dimensions.height + 2);
-        g2d.setColor(new Color(255, 255, 255, 150));
-        g2d.drawLine(1, -1, 1, dimensions.height + 2);
-    }
-    
-    private Dimension calculateDimension() {
-        int h = this.getSeparatorHeight();     
-        int w = 2;
-        return new Dimension(w, h);
-    }
-}
Copied: branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/LineSeparatorImage.java (from rev 20235, trunk/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/LineSeparatorImage.java)
===================================================================
--- branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/LineSeparatorImage.java	                        (rev 0)
+++ branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/LineSeparatorImage.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,31 @@
+package org.richfaces.renderkit.html.images;
+
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics2D;
+
+import org.richfaces.resource.DynamicUserResource;
+
+@DynamicUserResource
+public class LineSeparatorImage extends ToolBarSeparatorImage {
+
+    public Dimension getDimension() {
+        return calculateDimension();
+    }
+
+    public void paint(Graphics2D g2d) {
+        Dimension dimensions = calculateDimension();
+        g2d.setStroke(new BasicStroke(1));
+        g2d.setColor(new Color(this.getHeaderBackgroundColor()));
+        g2d.fillRect(-1, -1, dimensions.width + 2, dimensions.height + 2);
+        g2d.setColor(new Color(255, 255, 255, 150));
+        g2d.drawLine(1, -1, 1, dimensions.height + 2);
+    }
+    
+    private Dimension calculateDimension() {
+        int h = this.getSeparatorHeight();     
+        int w = 2;
+        return new Dimension(w, h);
+    }
+}
Deleted: branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/SquareSeparatorImage.java
===================================================================
--- trunk/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/SquareSeparatorImage.java	2010-11-30 14:37:17 UTC (rev 20235)
+++ branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/SquareSeparatorImage.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -1,48 +0,0 @@
-package org.richfaces.renderkit.html.images;
-
-import java.awt.Color;
-import java.awt.Dimension;
-import java.awt.GradientPaint;
-import java.awt.Graphics2D;
-import java.awt.RenderingHints;
-import java.awt.geom.Area;
-import java.awt.geom.Rectangle2D;
-import java.awt.geom.RoundRectangle2D;
-
-import org.richfaces.resource.DynamicUserResource;
-
-@DynamicUserResource
-public class SquareSeparatorImage extends ToolBarSeparatorImage {
-
-    private static final Dimension DIMENSIONS = new Dimension(9, 9);
-
-    public Dimension getDimension() {
-        return DIMENSIONS;
-    }
-
-    public void paint(Graphics2D g2d) {
-        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
-
-        Color gradientColorStart = Color.WHITE;
-        Color gradientColorEnd = new Color(this.getHeaderBackgroundColor());
-        Rectangle2D inSquare = new Rectangle2D.Double(2, 2, DIMENSIONS.getWidth() - 4, DIMENSIONS.getHeight() - 4);
-        GradientPaint paint = new GradientPaint((float) 2, (float) 2, gradientColorStart,
-                (float) DIMENSIONS.getWidth() - 2, (float) DIMENSIONS.getHeight() - 2, gradientColorEnd);
-        g2d.setPaint(paint);
-        g2d.fill(inSquare);
-
-        RoundRectangle2D outSquare = new RoundRectangle2D.Double(0, 0, DIMENSIONS.getWidth(), DIMENSIONS.getHeight(),
-                4, 4);
-        Rectangle2D midSquare = new Rectangle2D.Double(1, 1, DIMENSIONS.getWidth() - 2, DIMENSIONS.getHeight() - 2);
-
-        g2d.setColor(new Color(this.getHeaderBackgroundColor()));
-        Area area2 = new Area(outSquare);
-        area2.subtract(new Area(midSquare));
-        g2d.fill(area2);
-
-        g2d.setColor(new Color(this.getHeaderGradientColor()));
-        Area area = new Area(midSquare);
-        area.subtract(new Area(inSquare));
-        g2d.fill(area);
-    }
-}
Copied: branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/SquareSeparatorImage.java (from rev 20235, trunk/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/SquareSeparatorImage.java)
===================================================================
--- branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/SquareSeparatorImage.java	                        (rev 0)
+++ branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/SquareSeparatorImage.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,48 @@
+package org.richfaces.renderkit.html.images;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.GradientPaint;
+import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.geom.Area;
+import java.awt.geom.Rectangle2D;
+import java.awt.geom.RoundRectangle2D;
+
+import org.richfaces.resource.DynamicUserResource;
+
+@DynamicUserResource
+public class SquareSeparatorImage extends ToolBarSeparatorImage {
+
+    private static final Dimension DIMENSIONS = new Dimension(9, 9);
+
+    public Dimension getDimension() {
+        return DIMENSIONS;
+    }
+
+    public void paint(Graphics2D g2d) {
+        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+
+        Color gradientColorStart = Color.WHITE;
+        Color gradientColorEnd = new Color(this.getHeaderBackgroundColor());
+        Rectangle2D inSquare = new Rectangle2D.Double(2, 2, DIMENSIONS.getWidth() - 4, DIMENSIONS.getHeight() - 4);
+        GradientPaint paint = new GradientPaint((float) 2, (float) 2, gradientColorStart,
+                (float) DIMENSIONS.getWidth() - 2, (float) DIMENSIONS.getHeight() - 2, gradientColorEnd);
+        g2d.setPaint(paint);
+        g2d.fill(inSquare);
+
+        RoundRectangle2D outSquare = new RoundRectangle2D.Double(0, 0, DIMENSIONS.getWidth(), DIMENSIONS.getHeight(),
+                4, 4);
+        Rectangle2D midSquare = new Rectangle2D.Double(1, 1, DIMENSIONS.getWidth() - 2, DIMENSIONS.getHeight() - 2);
+
+        g2d.setColor(new Color(this.getHeaderBackgroundColor()));
+        Area area2 = new Area(outSquare);
+        area2.subtract(new Area(midSquare));
+        g2d.fill(area2);
+
+        g2d.setColor(new Color(this.getHeaderGradientColor()));
+        Area area = new Area(midSquare);
+        area.subtract(new Area(inSquare));
+        g2d.fill(area);
+    }
+}
Deleted: branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/ToolBarSeparatorImage.java
===================================================================
--- trunk/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/ToolBarSeparatorImage.java	2010-11-30 14:37:17 UTC (rev 20235)
+++ branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/ToolBarSeparatorImage.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -1,99 +0,0 @@
-package org.richfaces.renderkit.html.images;
-
-import java.awt.Color;
-import java.io.DataInput;
-import java.io.DataOutput;
-import java.io.IOException;
-import java.util.Date;
-import java.util.Map;
-
-import javax.faces.context.FacesContext;
-
-import org.richfaces.resource.ImageType;
-import org.richfaces.resource.Java2DUserResource;
-import org.richfaces.resource.PostConstructResource;
-import org.richfaces.resource.ResourceParameter;
-import org.richfaces.resource.StateHolderResource;
-import org.richfaces.skin.Skin;
-import org.richfaces.skin.SkinFactory;
-
-public abstract class ToolBarSeparatorImage implements Java2DUserResource, StateHolderResource {
-
-    private int headerBackgroundColor;
-    private int separatorHeight;
-    private int headerGradientColor;
-
-    public int getHeaderBackgroundColor() {
-        return headerBackgroundColor;
-    }
-
-    public void setHeaderBackgroundColor(int bgColor) {
-        this.headerBackgroundColor = bgColor;
-    }
-
-    public int getSeparatorHeight() {
-        return separatorHeight;
-    }
-
-    @ResourceParameter(defaultValue = "9")
-    public void setSeparatorHeight(int separatorHeight) {
-        this.separatorHeight = separatorHeight;
-    }
-
-    public int getHeaderGradientColor() {
-        return headerGradientColor;
-    }
-
-    public void setHeaderGradientColor(int headerGradientColor) {
-        this.headerGradientColor = headerGradientColor;
-    }
-
-    public void writeState(FacesContext context, DataOutput dataOutput) throws IOException {
-        dataOutput.writeInt(headerBackgroundColor);
-        dataOutput.writeInt(separatorHeight);
-        dataOutput.writeInt(headerGradientColor);
-    }
-
-    public void readState(FacesContext context, DataInput dataInput) throws IOException {
-        this.headerBackgroundColor = dataInput.readInt();
-        this.separatorHeight = dataInput.readInt();
-        this.headerGradientColor = dataInput.readInt();
-    }
-
-    public boolean isTransient() {
-        return false;
-    }
-
-    public Map<String, String> getResponseHeaders() {
-        return null;
-    }
-
-    public Date getLastModified() {
-        return null;
-    }
-
-    public ImageType getImageType() {
-        return ImageType.GIF;
-    }
-
-    @PostConstructResource
-    public final void initialize() {
-        FacesContext context = FacesContext.getCurrentInstance();
-        Skin skin = SkinFactory.getInstance(context).getSkin(context);
-        Skin defaultSkin = SkinFactory.getInstance(context).getDefaultSkin(context);
-
-        String skinParameter = "headerBackgroundColor";
-        String tmp = (String) skin.getParameter(context, skinParameter);
-        if (null == tmp || "".equals(tmp)) {
-            tmp = (String) defaultSkin.getParameter(context, skinParameter);
-        }
-        this.setHeaderBackgroundColor(Color.decode(tmp == null ? "#224986" : tmp).getRGB());
-
-        skinParameter = "headerGradientColor";
-        tmp = (String) skin.getParameter(context, skinParameter);
-        if (null == tmp || "".equals(tmp)) {
-            tmp = (String) defaultSkin.getParameter(context, skinParameter);
-        }
-        this.setHeaderGradientColor(Color.decode(tmp == null ? "#CCCCFF" : tmp).getRGB());
-    }
-}
Copied: branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/ToolBarSeparatorImage.java (from rev 20235, trunk/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/ToolBarSeparatorImage.java)
===================================================================
--- branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/ToolBarSeparatorImage.java	                        (rev 0)
+++ branches/RF-8742-1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/images/ToolBarSeparatorImage.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,99 @@
+package org.richfaces.renderkit.html.images;
+
+import java.awt.Color;
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+import java.util.Date;
+import java.util.Map;
+
+import javax.faces.context.FacesContext;
+
+import org.richfaces.resource.ImageType;
+import org.richfaces.resource.Java2DUserResource;
+import org.richfaces.resource.PostConstructResource;
+import org.richfaces.resource.ResourceParameter;
+import org.richfaces.resource.StateHolderResource;
+import org.richfaces.skin.Skin;
+import org.richfaces.skin.SkinFactory;
+
+public abstract class ToolBarSeparatorImage implements Java2DUserResource, StateHolderResource {
+
+    private int headerBackgroundColor;
+    private int separatorHeight;
+    private int headerGradientColor;
+
+    public int getHeaderBackgroundColor() {
+        return headerBackgroundColor;
+    }
+
+    public void setHeaderBackgroundColor(int bgColor) {
+        this.headerBackgroundColor = bgColor;
+    }
+
+    public int getSeparatorHeight() {
+        return separatorHeight;
+    }
+
+    @ResourceParameter(defaultValue = "9")
+    public void setSeparatorHeight(int separatorHeight) {
+        this.separatorHeight = separatorHeight;
+    }
+
+    public int getHeaderGradientColor() {
+        return headerGradientColor;
+    }
+
+    public void setHeaderGradientColor(int headerGradientColor) {
+        this.headerGradientColor = headerGradientColor;
+    }
+
+    public void writeState(FacesContext context, DataOutput dataOutput) throws IOException {
+        dataOutput.writeInt(headerBackgroundColor);
+        dataOutput.writeInt(separatorHeight);
+        dataOutput.writeInt(headerGradientColor);
+    }
+
+    public void readState(FacesContext context, DataInput dataInput) throws IOException {
+        this.headerBackgroundColor = dataInput.readInt();
+        this.separatorHeight = dataInput.readInt();
+        this.headerGradientColor = dataInput.readInt();
+    }
+
+    public boolean isTransient() {
+        return false;
+    }
+
+    public Map<String, String> getResponseHeaders() {
+        return null;
+    }
+
+    public Date getLastModified() {
+        return null;
+    }
+
+    public ImageType getImageType() {
+        return ImageType.GIF;
+    }
+
+    @PostConstructResource
+    public final void initialize() {
+        FacesContext context = FacesContext.getCurrentInstance();
+        Skin skin = SkinFactory.getInstance(context).getSkin(context);
+        Skin defaultSkin = SkinFactory.getInstance(context).getDefaultSkin(context);
+
+        String skinParameter = "headerBackgroundColor";
+        String tmp = (String) skin.getParameter(context, skinParameter);
+        if (null == tmp || "".equals(tmp)) {
+            tmp = (String) defaultSkin.getParameter(context, skinParameter);
+        }
+        this.setHeaderBackgroundColor(Color.decode(tmp == null ? "#224986" : tmp).getRGB());
+
+        skinParameter = "headerGradientColor";
+        tmp = (String) skin.getParameter(context, skinParameter);
+        if (null == tmp || "".equals(tmp)) {
+            tmp = (String) defaultSkin.getParameter(context, skinParameter);
+        }
+        this.setHeaderGradientColor(Color.decode(tmp == null ? "#CCCCFF" : tmp).getRGB());
+    }
+}
Modified: branches/RF-8742-1/ui/output/ui/src/main/resources/META-INF/pn.faces-config.xml
===================================================================
--- branches/RF-8742-1/ui/output/ui/src/main/resources/META-INF/pn.faces-config.xml	2010-11-30 18:55:37 UTC (rev 20244)
+++ branches/RF-8742-1/ui/output/ui/src/main/resources/META-INF/pn.faces-config.xml	2010-11-30 19:36:09 UTC (rev 20245)
@@ -9,8 +9,759 @@
         <behavior-id>org.richfaces.component.behavior.ToggleControl</behavior-id>
         <behavior-class>org.richfaces.component.behavior.ToggleControl</behavior-class>
     </behavior>
-
+	
+	   <component>
+        <component-type>org.richfaces.ToolBar</component-type>
+        <component-class>org.richfaces.component.UIToolBar</component-class>
+        <property>
+            <description>
+			A mutable Map of the attributes associated with
+			this component, keyed by attribute name.
+        </description>
+            <display-name>Attributes Map</display-name>
+            <icon/>
+            <property-name>attributes</property-name>
+            <property-class>java.util.Map</property-class>
+            <property-extension>
+                <cdk:generate>false</cdk:generate>
+                <cdk:hidden>true</cdk:hidden>
+                <cdk:literal>false</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>true</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <description>The value binding expression used to wire up this
+            component to a component property of a JavaBean class</description>
+            <display-name></display-name>
+            <icon/>
+            <property-name>binding</property-name>
+            <property-class>javax.faces.component.UIComponent</property-class>
+            <property-extension>
+                <cdk:generate>false</cdk:generate>
+                <cdk:hidden>false</cdk:hidden>
+                <cdk:literal>false</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>false</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <description>
+			The number of child components associated with
+			this component.
+        </description>
+            <display-name>Child Component Count</display-name>
+            <icon/>
+            <property-name>childCount</property-name>
+            <property-class>int</property-class>
+            <property-extension>
+                <cdk:generate>false</cdk:generate>
+                <cdk:hidden>true</cdk:hidden>
+                <cdk:literal>true</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>true</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <description>
+			A mutable List of the child components associated with
+			this component.
+        </description>
+            <display-name>Child Component List</display-name>
+            <icon/>
+            <property-name>children</property-name>
+            <property-class>java.util.List</property-class>
+            <property-extension>
+                <cdk:generate>false</cdk:generate>
+                <cdk:hidden>true</cdk:hidden>
+                <cdk:literal>true</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>true</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <description>
+			A mutable Map of the facets associated with
+			this component, keyed by facet name.
+        </description>
+            <display-name>Facets Map</display-name>
+            <icon/>
+            <property-name>facets</property-name>
+            <property-class>java.util.Map</property-class>
+            <property-extension>
+                <cdk:generate>false</cdk:generate>
+                <cdk:hidden>true</cdk:hidden>
+                <cdk:literal>true</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>true</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <description>
+			The component family to which this component belongs. This property
+			is used to select an appropriate Renderer.
+        </description>
+            <display-name>Component Family</display-name>
+            <icon/>
+            <property-name>family</property-name>
+            <property-class>java.lang.String</property-class>
+            <property-extension>
+                <cdk:generate>false</cdk:generate>
+                <cdk:hidden>true</cdk:hidden>
+                <cdk:literal>true</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>true</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <description>
+			The component identifier for this component. This value must be
+			unique within the closest parent component that is a naming
+			container.
+        </description>
+            <display-name>Component Identifier</display-name>
+            <icon/>
+            <property-name>id</property-name>
+            <property-class>java.lang.String</property-class>
+            <property-extension>
+                <cdk:generate>false</cdk:generate>
+                <cdk:hidden>false</cdk:hidden>
+                <cdk:literal>false</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>false</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <description>
+			The parent component for this component. On the root component
+			in the component tree (which must be of type UIViewRoot), this
+			property is null.
+        </description>
+            <display-name>Parent Component</display-name>
+            <icon/>
+            <property-name>parent</property-name>
+            <property-class>javax.faces.component.UIComponent</property-class>
+            <property-extension>
+                <cdk:generate>false</cdk:generate>
+                <cdk:hidden>true</cdk:hidden>
+                <cdk:literal>true</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>true</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <description>
+			Flag indicating whether or not this component should be rendered
+			(during Render Response Phase), or processed on any subsequent
+			form submit. The default value for this property is true.
+        </description>
+            <display-name>Rendered Flag</display-name>
+            <icon/>
+            <property-name>rendered</property-name>
+            <property-class>boolean</property-class>
+            <property-extension>
+                <cdk:generate>false</cdk:generate>
+                <cdk:hidden>false</cdk:hidden>
+                <cdk:literal>false</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>false</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <description>
+			Identifier used (in conjunction with the "family" property) to
+			select an appropriate Renderer to encode and decode this component.
+        </description>
+            <display-name>Renderer Type</display-name>
+            <icon/>
+            <property-name>rendererType</property-name>
+            <property-class>java.lang.String</property-class>
+            <property-extension>
+                <cdk:generate>false</cdk:generate>
+                <cdk:hidden>true</cdk:hidden>
+                <cdk:literal>true</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>false</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <description>
+			Flag indicating whether or not this component takes responsibility
+			for rendering its own children. This decision is normally delegated
+			to the associated Renderer, if there is one.
+        </description>
+            <display-name>Renders Children</display-name>
+            <icon/>
+            <property-name>rendersChildren</property-name>
+            <property-class>boolean</property-class>
+            <property-extension>
+                <cdk:generate>false</cdk:generate>
+                <cdk:hidden>true</cdk:hidden>
+                <cdk:literal>true</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>true</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <property-name>width</property-name>
+            <property-class>java.lang.String</property-class>
+            <property-extension>
+                <cdk:generate>true</cdk:generate>
+                <cdk:hidden>false</cdk:hidden>
+                <cdk:literal>false</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>false</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <property-name>onitemmouseover</property-name>
+            <property-class>java.lang.String</property-class>
+            <property-extension>
+                <cdk:event-name default="false">itemmouseover</cdk:event-name>
+                <cdk:generate>true</cdk:generate>
+                <cdk:hidden>false</cdk:hidden>
+                <cdk:literal>false</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>false</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <property-name>onitemkeydown</property-name>
+            <property-class>java.lang.String</property-class>
+            <property-extension>
+                <cdk:event-name default="false">itemkeydown</cdk:event-name>
+                <cdk:generate>true</cdk:generate>
+                <cdk:hidden>false</cdk:hidden>
+                <cdk:literal>false</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>false</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <property-name>onitemmousemove</property-name>
+            <property-class>java.lang.String</property-class>
+            <property-extension>
+                <cdk:event-name default="false">itemmousemove</cdk:event-name>
+                <cdk:generate>true</cdk:generate>
+                <cdk:hidden>false</cdk:hidden>
+                <cdk:literal>false</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>false</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <property-name>onitemmousedown</property-name>
+            <property-class>java.lang.String</property-class>
+            <property-extension>
+                <cdk:event-name default="false">itemmousedown</cdk:event-name>
+                <cdk:generate>true</cdk:generate>
+                <cdk:hidden>false</cdk:hidden>
+                <cdk:literal>false</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>false</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <property-name>height</property-name>
+            <property-class>java.lang.String</property-class>
+            <property-extension>
+                <cdk:generate>true</cdk:generate>
+                <cdk:hidden>false</cdk:hidden>
+                <cdk:literal>false</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>false</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <property-name>onitemdblclick</property-name>
+            <property-class>java.lang.String</property-class>
+            <property-extension>
+                <cdk:event-name default="false">itemdblclick</cdk:event-name>
+                <cdk:generate>true</cdk:generate>
+                <cdk:hidden>false</cdk:hidden>
+                <cdk:literal>false</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>false</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <property-name>onitemclick</property-name>
+            <property-class>java.lang.String</property-class>
+            <property-extension>
+                <cdk:event-name default="false">itemclick</cdk:event-name>
+                <cdk:generate>true</cdk:generate>
+                <cdk:hidden>false</cdk:hidden>
+                <cdk:literal>false</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>false</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <property-name>onitemmouseout</property-name>
+            <property-class>java.lang.String</property-class>
+            <property-extension>
+                <cdk:event-name default="false">itemmouseout</cdk:event-name>
+                <cdk:generate>true</cdk:generate>
+                <cdk:hidden>false</cdk:hidden>
+                <cdk:literal>false</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>false</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <property-name>onitemkeyup</property-name>
+            <property-class>java.lang.String</property-class>
+            <property-extension>
+                <cdk:event-name default="false">itemkeyup</cdk:event-name>
+                <cdk:generate>true</cdk:generate>
+                <cdk:hidden>false</cdk:hidden>
+                <cdk:literal>false</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>false</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <property-name>itemSeparator</property-name>
+            <property-class>java.lang.String</property-class>
+            <property-extension>
+                <cdk:generate>true</cdk:generate>
+                <cdk:hidden>false</cdk:hidden>
+                <cdk:literal>false</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>false</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <property-name>onitemmouseup</property-name>
+            <property-class>java.lang.String</property-class>
+            <property-extension>
+                <cdk:event-name default="false">itemmouseup</cdk:event-name>
+                <cdk:generate>true</cdk:generate>
+                <cdk:hidden>false</cdk:hidden>
+                <cdk:literal>false</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>false</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <property-name>onitemkeypress</property-name>
+            <property-class>java.lang.String</property-class>
+            <property-extension>
+                <cdk:event-name default="false">itemkeypress</cdk:event-name>
+                <cdk:generate>true</cdk:generate>
+                <cdk:hidden>false</cdk:hidden>
+                <cdk:literal>false</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>false</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <component-extension>
+            <cdk:base-class>org.richfaces.component.AbstractToolBar</cdk:base-class>
+            <cdk:generate>true</cdk:generate>
+            <cdk:component-family>org.richfaces.ToolBar</cdk:component-family>
+            <cdk:renderer-type>org.richfaces.ToolBarRenderer</cdk:renderer-type>
+            <cdk:tag>
+                <cdk:generate>false</cdk:generate>
+                <cdk:tag-name>toolBar</cdk:tag-name>
+                <cdk:tag-type>Facelets</cdk:tag-type>
+            </cdk:tag>
+        </component-extension>
+    </component>
     <component>
+        <component-type>org.richfaces.ToolBarGroup</component-type>
+        <component-class>org.richfaces.component.UIToolBarGroup</component-class>
+        <property>
+            <description>
+			A mutable Map of the attributes associated with
+			this component, keyed by attribute name.
+        </description>
+            <display-name>Attributes Map</display-name>
+            <icon/>
+            <property-name>attributes</property-name>
+            <property-class>java.util.Map</property-class>
+            <property-extension>
+                <cdk:generate>false</cdk:generate>
+                <cdk:hidden>true</cdk:hidden>
+                <cdk:literal>false</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>true</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <description>The value binding expression used to wire up this
+            component to a component property of a JavaBean class</description>
+            <display-name></display-name>
+            <icon/>
+            <property-name>binding</property-name>
+            <property-class>javax.faces.component.UIComponent</property-class>
+            <property-extension>
+                <cdk:generate>false</cdk:generate>
+                <cdk:hidden>false</cdk:hidden>
+                <cdk:literal>false</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>false</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <description>
+			The number of child components associated with
+			this component.
+        </description>
+            <display-name>Child Component Count</display-name>
+            <icon/>
+            <property-name>childCount</property-name>
+            <property-class>int</property-class>
+            <property-extension>
+                <cdk:generate>false</cdk:generate>
+                <cdk:hidden>true</cdk:hidden>
+                <cdk:literal>true</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>true</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <description>
+			A mutable List of the child components associated with
+			this component.
+        </description>
+            <display-name>Child Component List</display-name>
+            <icon/>
+            <property-name>children</property-name>
+            <property-class>java.util.List</property-class>
+            <property-extension>
+                <cdk:generate>false</cdk:generate>
+                <cdk:hidden>true</cdk:hidden>
+                <cdk:literal>true</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>true</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <description>
+			A mutable Map of the facets associated with
+			this component, keyed by facet name.
+        </description>
+            <display-name>Facets Map</display-name>
+            <icon/>
+            <property-name>facets</property-name>
+            <property-class>java.util.Map</property-class>
+            <property-extension>
+                <cdk:generate>false</cdk:generate>
+                <cdk:hidden>true</cdk:hidden>
+                <cdk:literal>true</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>true</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <description>
+			The component family to which this component belongs. This property
+			is used to select an appropriate Renderer.
+        </description>
+            <display-name>Component Family</display-name>
+            <icon/>
+            <property-name>family</property-name>
+            <property-class>java.lang.String</property-class>
+            <property-extension>
+                <cdk:generate>false</cdk:generate>
+                <cdk:hidden>true</cdk:hidden>
+                <cdk:literal>true</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>true</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <description>
+			The component identifier for this component. This value must be
+			unique within the closest parent component that is a naming
+			container.
+        </description>
+            <display-name>Component Identifier</display-name>
+            <icon/>
+            <property-name>id</property-name>
+            <property-class>java.lang.String</property-class>
+            <property-extension>
+                <cdk:generate>false</cdk:generate>
+                <cdk:hidden>false</cdk:hidden>
+                <cdk:literal>false</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>false</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <description>
+			The parent component for this component. On the root component
+			in the component tree (which must be of type UIViewRoot), this
+			property is null.
+        </description>
+            <display-name>Parent Component</display-name>
+            <icon/>
+            <property-name>parent</property-name>
+            <property-class>javax.faces.component.UIComponent</property-class>
+            <property-extension>
+                <cdk:generate>false</cdk:generate>
+                <cdk:hidden>true</cdk:hidden>
+                <cdk:literal>true</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>true</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <description>
+			Flag indicating whether or not this component should be rendered
+			(during Render Response Phase), or processed on any subsequent
+			form submit. The default value for this property is true.
+        </description>
+            <display-name>Rendered Flag</display-name>
+            <icon/>
+            <property-name>rendered</property-name>
+            <property-class>boolean</property-class>
+            <property-extension>
+                <cdk:generate>false</cdk:generate>
+                <cdk:hidden>false</cdk:hidden>
+                <cdk:literal>false</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>false</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <description>
+			Identifier used (in conjunction with the "family" property) to
+			select an appropriate Renderer to encode and decode this component.
+        </description>
+            <display-name>Renderer Type</display-name>
+            <icon/>
+            <property-name>rendererType</property-name>
+            <property-class>java.lang.String</property-class>
+            <property-extension>
+                <cdk:generate>false</cdk:generate>
+                <cdk:hidden>true</cdk:hidden>
+                <cdk:literal>true</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>false</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <description>
+			Flag indicating whether or not this component takes responsibility
+			for rendering its own children. This decision is normally delegated
+			to the associated Renderer, if there is one.
+        </description>
+            <display-name>Renders Children</display-name>
+            <icon/>
+            <property-name>rendersChildren</property-name>
+            <property-class>boolean</property-class>
+            <property-extension>
+                <cdk:generate>false</cdk:generate>
+                <cdk:hidden>true</cdk:hidden>
+                <cdk:literal>true</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>true</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <property-name>location</property-name>
+            <property-class>java.lang.String</property-class>
+            <property-extension>
+                <cdk:generate>true</cdk:generate>
+                <cdk:hidden>false</cdk:hidden>
+                <cdk:literal>false</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>false</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <property-name>onitemmousedown</property-name>
+            <property-class>java.lang.String</property-class>
+            <property-extension>
+                <cdk:event-name default="false">itemmousedown</cdk:event-name>
+                <cdk:generate>true</cdk:generate>
+                <cdk:hidden>false</cdk:hidden>
+                <cdk:literal>false</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>false</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <property-name>onitemdblclick</property-name>
+            <property-class>java.lang.String</property-class>
+            <property-extension>
+                <cdk:event-name default="false">itemdblclick</cdk:event-name>
+                <cdk:generate>true</cdk:generate>
+                <cdk:hidden>false</cdk:hidden>
+                <cdk:literal>false</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>false</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <property-name>onitemclick</property-name>
+            <property-class>java.lang.String</property-class>
+            <property-extension>
+                <cdk:event-name default="false">itemclick</cdk:event-name>
+                <cdk:generate>true</cdk:generate>
+                <cdk:hidden>false</cdk:hidden>
+                <cdk:literal>false</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>false</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <property-name>onitemmouseover</property-name>
+            <property-class>java.lang.String</property-class>
+            <property-extension>
+                <cdk:event-name default="false">itemmouseover</cdk:event-name>
+                <cdk:generate>true</cdk:generate>
+                <cdk:hidden>false</cdk:hidden>
+                <cdk:literal>false</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>false</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <property-name>onitemmouseout</property-name>
+            <property-class>java.lang.String</property-class>
+            <property-extension>
+                <cdk:event-name default="false">itemmouseout</cdk:event-name>
+                <cdk:generate>true</cdk:generate>
+                <cdk:hidden>false</cdk:hidden>
+                <cdk:literal>false</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>false</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <property-name>onitemkeyup</property-name>
+            <property-class>java.lang.String</property-class>
+            <property-extension>
+                <cdk:event-name default="false">itemkeyup</cdk:event-name>
+                <cdk:generate>true</cdk:generate>
+                <cdk:hidden>false</cdk:hidden>
+                <cdk:literal>false</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>false</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <property-name>itemSeparator</property-name>
+            <property-class>java.lang.String</property-class>
+            <property-extension>
+                <cdk:generate>true</cdk:generate>
+                <cdk:hidden>false</cdk:hidden>
+                <cdk:literal>false</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>false</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <property-name>onitemmouseup</property-name>
+            <property-class>java.lang.String</property-class>
+            <property-extension>
+                <cdk:event-name default="false">itemmouseup</cdk:event-name>
+                <cdk:generate>true</cdk:generate>
+                <cdk:hidden>false</cdk:hidden>
+                <cdk:literal>false</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>false</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <property-name>onitemkeydown</property-name>
+            <property-class>java.lang.String</property-class>
+            <property-extension>
+                <cdk:event-name default="false">itemkeydown</cdk:event-name>
+                <cdk:generate>true</cdk:generate>
+                <cdk:hidden>false</cdk:hidden>
+                <cdk:literal>false</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>false</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <property-name>onitemmousemove</property-name>
+            <property-class>java.lang.String</property-class>
+            <property-extension>
+                <cdk:event-name default="false">itemmousemove</cdk:event-name>
+                <cdk:generate>true</cdk:generate>
+                <cdk:hidden>false</cdk:hidden>
+                <cdk:literal>false</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>false</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <property>
+            <property-name>onitemkeypress</property-name>
+            <property-class>java.lang.String</property-class>
+            <property-extension>
+                <cdk:event-name default="false">itemkeypress</cdk:event-name>
+                <cdk:generate>true</cdk:generate>
+                <cdk:hidden>false</cdk:hidden>
+                <cdk:literal>false</cdk:literal>
+                <cdk:pass-through>false</cdk:pass-through>
+                <cdk:read-only>false</cdk:read-only>
+                <cdk:required>false</cdk:required>
+            </property-extension>
+        </property>
+        <component-extension>
+            <cdk:base-class>org.richfaces.component.AbstractToolBarGroup</cdk:base-class>
+            <cdk:generate>true</cdk:generate>
+            <cdk:component-family>org.richfaces.ToolBar</cdk:component-family>
+            <cdk:renderer-type>org.richfaces.ToolBarGroupRenderer</cdk:renderer-type>
+            <cdk:tag>
+                <cdk:generate>false</cdk:generate>
+                <cdk:tag-name>toolBarGroup</cdk:tag-name>
+                <cdk:tag-type>Facelets</cdk:tag-type>
+            </cdk:tag>
+        </component-extension>
+    </component>
+ 
+    <component>
         <component-type>org.richfaces.Tooltip</component-type>
         <component-class>org.richfaces.component.html.HtmlTooltip</component-class>
         <property>
@@ -951,12 +1702,28 @@
 
     <render-kit>
         <render-kit-id>HTML_BASIC</render-kit-id>
+		
+		<renderer>
+            <component-family>org.richfaces.ToolBar</component-family>
+            <renderer-type>org.richfaces.ToolBarRenderer</renderer-type>
+            <renderer-class>org.richfaces.renderkit.html.ToolBarRenderer</renderer-class>
+            <renderer-extension>
+                <cdk:renders-children>false</cdk:renders-children>
+            </renderer-extension>
+        </renderer>
+         <renderer>
+            <component-family>org.richfaces.ToolBar</component-family>
+            <renderer-type>org.richfaces.ToolBarGroupRenderer</renderer-type>
+            <renderer-class>org.richfaces.renderkit.html.ToolBarGroupRenderer</renderer-class>
+            <renderer-extension>
+                <cdk:renders-children>false</cdk:renders-children>
+            </renderer-extension>
+        </renderer>
         <renderer>
             <component-family>org.richfaces.Tooltip</component-family>
             <renderer-type>org.richfaces.Tooltip</renderer-type>
             <renderer-class>org.richfaces.renderkit.html.TooltipRenderer</renderer-class>
         </renderer>
-        
         <renderer>
             <component-family>org.richfaces.CollapsiblePanel</component-family>
             <renderer-type>org.richfaces.CollapsiblePanel</renderer-type>
Modified: branches/RF-8742-1/ui/output/ui/src/main/resources/META-INF/pn.taglib.xml
===================================================================
--- branches/RF-8742-1/ui/output/ui/src/main/resources/META-INF/pn.taglib.xml	2010-11-30 18:55:37 UTC (rev 20244)
+++ branches/RF-8742-1/ui/output/ui/src/main/resources/META-INF/pn.taglib.xml	2010-11-30 19:36:09 UTC (rev 20245)
@@ -6,8 +6,163 @@
                 http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd" version="2.0" id="output">
     <namespace>http://richfaces.org/output</namespace>
 
-
+	    <tag>
+        <tag-name>toolBar</tag-name>
+        <component>
+            <component-type>org.richfaces.ToolBar</component-type>
+            <renderer-type>org.richfaces.ToolBarRenderer</renderer-type>
+        </component>
+        <attribute>
+            <description>The value binding expression used to wire up this component to a component property of a JavaBean class</description>
+            <icon/>
+            <name>binding</name>
+            <type>javax.faces.component.UIComponent</type>
+        </attribute>
+        <attribute>
+            <name>height</name>
+            <type>java.lang.String</type>
+        </attribute>
+        <attribute>
+            <description>The component identifier for this component. This value must be unique within the closest parent component that is a naming container.</description>
+            <display-name>Component Identifier</display-name>
+            <icon/>
+            <name>id</name>
+            <type>java.lang.String</type>
+        </attribute>
+        <attribute>
+            <name>itemSeparator</name>
+            <type>java.lang.String</type>
+        </attribute>
+        <attribute>
+            <name>onitemclick</name>
+            <type>java.lang.String</type>
+        </attribute>
+        <attribute>
+            <name>onitemdblclick</name>
+            <type>java.lang.String</type>
+        </attribute>
+        <attribute>
+            <name>onitemkeydown</name>
+            <type>java.lang.String</type>
+        </attribute>
+        <attribute>
+            <name>onitemkeypress</name>
+            <type>java.lang.String</type>
+        </attribute>
+        <attribute>
+            <name>onitemkeyup</name>
+            <type>java.lang.String</type>
+        </attribute>
+        <attribute>
+            <name>onitemmousedown</name>
+            <type>java.lang.String</type>
+        </attribute>
+        <attribute>
+            <name>onitemmousemove</name>
+            <type>java.lang.String</type>
+        </attribute>
+        <attribute>
+            <name>onitemmouseout</name>
+            <type>java.lang.String</type>
+        </attribute>
+        <attribute>
+            <name>onitemmouseover</name>
+            <type>java.lang.String</type>
+        </attribute>
+        <attribute>
+            <name>onitemmouseup</name>
+            <type>java.lang.String</type>
+        </attribute>
+        <attribute>
+            <description>Flag indicating whether or not this component should be rendered (during Render Response Phase), or processed on any subsequent form submit. The default value for this property is true.</description>
+            <display-name>Rendered Flag</display-name>
+            <icon/>
+            <name>rendered</name>
+            <type>boolean</type>
+        </attribute>
+        <attribute>
+            <name>width</name>
+            <type>java.lang.String</type>
+        </attribute>
+    </tag>
     <tag>
+        <tag-name>toolBarGroup</tag-name>
+        <component>
+            <component-type>org.richfaces.ToolBarGroup</component-type>
+            <renderer-type>org.richfaces.ToolBarGroupRenderer</renderer-type>
+        </component>
+        <attribute>
+            <description>The value binding expression used to wire up this component to a component property of a JavaBean class</description>
+            <icon/>
+            <name>binding</name>
+            <type>javax.faces.component.UIComponent</type>
+        </attribute>
+        <attribute>
+            <description>The component identifier for this component. This value must be unique within the closest parent component that is a naming container.</description>
+            <display-name>Component Identifier</display-name>
+            <icon/>
+            <name>id</name>
+            <type>java.lang.String</type>
+        </attribute>
+        <attribute>
+            <name>itemSeparator</name>
+            <type>java.lang.String</type>
+        </attribute>
+        <attribute>
+            <name>location</name>
+            <type>java.lang.String</type>
+        </attribute>
+        <attribute>
+            <name>onitemclick</name>
+            <type>java.lang.String</type>
+        </attribute>
+        <attribute>
+            <name>onitemdblclick</name>
+            <type>java.lang.String</type>
+        </attribute>
+        <attribute>
+            <name>onitemkeydown</name>
+            <type>java.lang.String</type>
+        </attribute>
+        <attribute>
+            <name>onitemkeypress</name>
+            <type>java.lang.String</type>
+        </attribute>
+        <attribute>
+            <name>onitemkeyup</name>
+            <type>java.lang.String</type>
+        </attribute>
+        <attribute>
+            <name>onitemmousedown</name>
+            <type>java.lang.String</type>
+        </attribute>
+        <attribute>
+            <name>onitemmousemove</name>
+            <type>java.lang.String</type>
+        </attribute>
+        <attribute>
+            <name>onitemmouseout</name>
+            <type>java.lang.String</type>
+        </attribute>
+        <attribute>
+            <name>onitemmouseover</name>
+            <type>java.lang.String</type>
+        </attribute>
+        <attribute>
+            <name>onitemmouseup</name>
+            <type>java.lang.String</type>
+        </attribute>
+        <attribute>
+            <description>Flag indicating whether or not this component should be rendered (during Render Response Phase), or processed on any subsequent form submit. The default value for this property is true.</description>
+            <display-name>Rendered Flag</display-name>
+            <icon/>
+            <name>rendered</name>
+            <type>boolean</type>
+        </attribute>
+    </tag>
+	
+	
+    <tag>
         <tag-name>toggleControl</tag-name>
         <behavior>
             <behavior-id>org.richfaces.component.behavior.ToggleControl</behavior-id>
Modified: branches/RF-8742-1/ui/output/ui/src/main/resources/META-INF/resources/org.richfaces/progressBar.ecss
===================================================================
--- branches/RF-8742-1/ui/output/ui/src/main/resources/META-INF/resources/org.richfaces/progressBar.ecss	2010-11-30 18:55:37 UTC (rev 20244)
+++ branches/RF-8742-1/ui/output/ui/src/main/resources/META-INF/resources/org.richfaces/progressBar.ecss	2010-11-30 19:36:09 UTC (rev 20245)
@@ -15,7 +15,6 @@
 	font-size: '#{richSkin.generalSizeFont}';
 	font-weight: bold;
 	
-	text-align: center;
 	text-color: '#{richSkin.controlTextColor}';
 
 	background-color: '#{richSkin.controlBackgroundColor}';
Modified: branches/RF-8742-1/ui/output/ui/src/main/resources/META-INF/resources/org.richfaces/progressBar.js
===================================================================
--- branches/RF-8742-1/ui/output/ui/src/main/resources/META-INF/resources/org.richfaces/progressBar.js	2010-11-30 18:55:37 UTC (rev 20244)
+++ branches/RF-8742-1/ui/output/ui/src/main/resources/META-INF/resources/org.richfaces/progressBar.js	2010-11-30 19:36:09 UTC (rev 20245)
@@ -110,6 +110,11 @@
 			
 			__showState: function (state) {
 				var stateElt = $(stateSelectors[state], this.__elt);
+				
+				if (stateElt.length == 0 && (state == 'initial' || state == 'finish')) {
+					stateElt = $(stateSelectors['progress'], this.__elt)
+				}
+				
 				stateElt.show().siblings().hide();
 			},
 			
@@ -125,19 +130,24 @@
 				if (this.__isInitialState()) {
 					this.__showState("initial");
 				} else if (this.__isFinishState()) {
-					rf.Event.callHandler(this.__elt, "finish");
 					this.__showState("finish");
 				} else {
 					this.__showState("progress");
-
-					var p = this.__calculatePercent(this.value);
-					$(".rf-pb-prgs", this.__elt).css('width', p + "%");
 				}
+				
+				var p = this.__calculatePercent(this.value);
+				$(".rf-pb-prgs", this.__elt).css('width', p + "%");
 			},
 			
 			setValue: function(val) {
+				var wasInFinishState = this.__isFinishState();
+				
 				this.__setValue(val);
 				this.__updateVisualState();
+				
+				if (!wasInFinishState && this.__isFinishState()) {
+					rf.Event.callHandler(this.__elt, "finish");
+				}
 			},
 			
 			getMaxValue: function() {
Copied: branches/RF-8742-1/ui/output/ui/src/main/resources/META-INF/resources/org.richfaces/toolBar.ecss (from rev 20235, trunk/ui/output/ui/src/main/resources/META-INF/resources/org.richfaces/toolBar.ecss)
===================================================================
--- branches/RF-8742-1/ui/output/ui/src/main/resources/META-INF/resources/org.richfaces/toolBar.ecss	                        (rev 0)
+++ branches/RF-8742-1/ui/output/ui/src/main/resources/META-INF/resources/org.richfaces/toolBar.ecss	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,48 @@
+.rf-tb {
+    border:1px solid;
+    border-color:'#{richSkin.panelBorderColor}';
+    color:'#{richSkin.headerTextColor}';
+    font-family:'#{richSkin.headerFamilyFont}';
+    font-size:'#{richSkin.headerSizeFont}';
+    font-weight:'#{richSkin.headerWeightFont}';
+    padding:0px;
+    background-color:'#{richSkin.headerBackgroundColor}';    
+    background-position:left top;
+    background-repeat:repeat-x;
+    /*check gradient  from headerGradientColor to headerBackgroundColor*/ 
+    background-image:url("#{resource['org.richfaces.renderkit.html.GradientA']}");
+	height:36px;
+	width:100%;
+}
+
+.rf-tb-itm {
+	padding:0 8px;
+	white-space:nowrap;
+}
+
+.rf-tb-sep {
+	padding:0 10px;
+	text-align:center;
+	background-repeat:no-repeat;
+	background-position:center center; 
+}
+
+.rf-tb-cntr{
+	vertical-align:middle;
+}
+
+.rf-tb-sep-grid {
+    background-image:url("#{resource['org.richfaces.renderkit.html.images.GridSeparatorImage']}");
+}
+
+.rf-tb-sep-line {
+    background-image:url("#{resource['org.richfaces.renderkit.html.images.LineSeparatorImage']}");
+}
+
+.rf-tb-sep-disc {
+    background-image:url("#{resource['org.richfaces.renderkit.html.images.DotSeparatorImage']}");
+}
+
+.rf-tb-sep-square {
+    background-image:url("#{resource['org.richfaces.renderkit.html.images.SquareSeparatorImage']}");
+}
\ No newline at end of file
Modified: branches/RF-8742-1/ui/output/ui/src/main/templates/progressBar.template.xml
===================================================================
--- branches/RF-8742-1/ui/output/ui/src/main/templates/progressBar.template.xml	2010-11-30 18:55:37 UTC (rev 20244)
+++ branches/RF-8742-1/ui/output/ui/src/main/templates/progressBar.template.xml	2010-11-30 19:36:09 UTC (rev 20245)
@@ -16,7 +16,7 @@
 
 	<cc:implementation>
 
-		<div id="#{clientId}" cdk:passThroughWithExclusions="">
+		<div id="#{clientId}" cdk:passThroughWithExclusions="" class="#{concatClasses('rf-pb', component.attributes['styleClass'])}">
             <cdk:object name="encoder" value="#{getEncoder(facesContext, component)}" type="ProgressBarStateEncoder" />
             <cdk:object name="currentState" value="#{getCurrentState(facesContext, component)}" type="ProgressBarState" />
         
Copied: branches/RF-8742-1/ui/output/ui/src/main/templates/toolBar.template.xml (from rev 20235, trunk/ui/output/ui/src/main/templates/toolBar.template.xml)
===================================================================
--- branches/RF-8742-1/ui/output/ui/src/main/templates/toolBar.template.xml	                        (rev 0)
+++ branches/RF-8742-1/ui/output/ui/src/main/templates/toolBar.template.xml	2010-11-30 19:36:09 UTC (rev 20245)
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<cdk:root xmlns="http://jboss.org/schema/richfaces/cdk/xhtml-el"
+    xmlns:cdk="http://jboss.org/schema/richfaces/cdk/core"
+    xmlns:c="http://jboss.org/schema/richfaces/cdk/jstl/core"
+    xmlns:cc="http://jboss.org/schema/richfaces/cdk/jsf/composite"
+    xmlns:javaee="http://java.sun.com/xml/ns/javaee">
+
+    <cc:interface>
+        <cdk:class>org.richfaces.renderkit.html.ToolBarRenderer</cdk:class>
+        <cdk:superclass>org.richfaces.renderkit.html.ToolBarRendererBase</cdk:superclass>
+        <cdk:component-family>org.richfaces.ToolBar</cdk:component-family>
+        <cdk:renderer-type>org.richfaces.ToolBarRenderer</cdk:renderer-type>  
+    </cc:interface>
+      
+    <cc:implementation>
+        <table border="0" cellpadding="0" cellspacing="0" id="#{clientId}" width="#{component.attributes['width']}" 
+		    height="#{component.attributes['height']}" class="rf-tb #{component.attributes['styleClass']}" 
+		    style="#{component.attributes['style']}" 
+            cdk:passThroughWithExclusions="">
+		    <tr class="rf-tb-cntr">
+		        <cdk:body />
+		    </tr>
+		</table>
+    </cc:implementation>
+</cdk:root>
Deleted: branches/RF-8742-1/ui/validator/ui/src/test/java/org/richfaces/convert/DateTimeConverterTest.java
===================================================================
--- branches/RF-8742-1/ui/validator/ui/src/test/java/org/richfaces/convert/DateTimeConverterTest.java	2010-11-30 18:55:37 UTC (rev 20244)
+++ branches/RF-8742-1/ui/validator/ui/src/test/java/org/richfaces/convert/DateTimeConverterTest.java	2010-11-30 19:36:09 UTC (rev 20245)
@@ -1,63 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2010, Red Hat, Inc. and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software 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 software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.richfaces.convert;
-
-import javax.faces.convert.DateTimeConverter;
-
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-/**
- * @author Nick Belaevski
- * 
- */
-(a)RunWith(ConverterTestRunner.class)
-@Ignore
-public class DateTimeConverterTest extends BaseTest {
-
-    public DateTimeConverterTest() {
-        super("org/richfaces/convert/testConverter.js");
-    }
-
-    @Test
-    @TestDataHolder(
-        successes = {
-            @TestData(submittedValue = "18-10-2010")
-            // ,@TestData(submittedValue = "17-10-2010")
-        },
-        failures = {
-            // @TestData(submittedValue = "10/17/2010")
-        }
-    )
-    
-    public void testPattern() throws Exception {
-        setClientFunction("org.rf.DateTimeConverter");
-        setObjectId(DateTimeConverter.CONVERTER_ID);
-        setAttribute("pattern", "dd-MM-yyyy");
-    }
-
-    @Test
-    public void testNoPattern() throws Exception {
-
-    }
-}
                                
                         
                        
                                
                                14 years, 11 months
                        
                        
                 
         
 
        
            
        
        
        
                
                        
                                
                                
                                        
                                
                         
                        
                                
                                
                                        
                                                
                                        
                                        
                                        JBoss Rich Faces SVN: r20244 - in sandbox/trunk/examples/fileupload-demo/src/main: webapp and 1 other directory.
                                
                                
                                
                                    
                                        by richfaces-svn-commits@lists.jboss.org
                                    
                                
                                
                                        Author: konstantin.mishin
Date: 2010-11-30 13:55:37 -0500 (Tue, 30 Nov 2010)
New Revision: 20244
Modified:
   sandbox/trunk/examples/fileupload-demo/src/main/java/org/richfaces/demo/FileUploadBean.java
   sandbox/trunk/examples/fileupload-demo/src/main/webapp/fileupload.xhtml
Log:
RF-9501
Modified: sandbox/trunk/examples/fileupload-demo/src/main/java/org/richfaces/demo/FileUploadBean.java
===================================================================
--- sandbox/trunk/examples/fileupload-demo/src/main/java/org/richfaces/demo/FileUploadBean.java	2010-11-30 18:54:31 UTC (rev 20243)
+++ sandbox/trunk/examples/fileupload-demo/src/main/java/org/richfaces/demo/FileUploadBean.java	2010-11-30 18:55:37 UTC (rev 20244)
@@ -35,7 +35,9 @@
 @SessionScoped
 public class FileUploadBean {
     
+    private String acceptedTypes;
     private boolean enabled = true;
+    private boolean noDuplicate = false;
     private UploadItem item;
     
     public UploadItem getItem() {
@@ -47,8 +49,10 @@
 //    }
     
     public void listener(UploadEvent event) throws Exception {
-        item.getFile().delete();
         item = event.getUploadItem();
+        if (item != null) {
+            item.getFile().delete();
+        }
     }
 
     public void setEnabled(boolean enabled) {
@@ -57,6 +61,22 @@
 
     public boolean isEnabled() {
         return enabled;
+    }
+
+    public void setNoDuplicate(boolean noDuplicate) {
+        this.noDuplicate = noDuplicate;
+    }
+
+    public boolean isNoDuplicate() {
+        return noDuplicate;
+    }
+
+    public void setAcceptedTypes(String acceptedTypes) {
+        this.acceptedTypes = acceptedTypes;
+    }
+
+    public String getAcceptedTypes() {
+        return acceptedTypes;
     }  
 
 }
Modified: sandbox/trunk/examples/fileupload-demo/src/main/webapp/fileupload.xhtml
===================================================================
--- sandbox/trunk/examples/fileupload-demo/src/main/webapp/fileupload.xhtml	2010-11-30 18:54:31 UTC (rev 20243)
+++ sandbox/trunk/examples/fileupload-demo/src/main/webapp/fileupload.xhtml	2010-11-30 18:55:37 UTC (rev 20244)
@@ -58,15 +58,27 @@
 			};
 			//-->
 			</script>
-			<fu:fileUpload id="fu" enabled="#{fileUploadBean.enabled}" fileUploadListener="#{fileUploadBean.listener}" onfilesubmit="onfilesubmit(event)" onuploadcomplete="onuploadcomplete(event)"/>
+			<fu:fileUpload id="fu" acceptedTypes="#{fileUploadBean.acceptedTypes}" enabled="#{fileUploadBean.enabled}"
+					fileUploadListener="#{fileUploadBean.listener}" noDuplicate="#{fileUploadBean.noDuplicate}"
+					onfilesubmit="onfilesubmit(event)" onuploadcomplete="onuploadcomplete(event)"/>
 			<h:outputText value="File name:" />
 			<a4j:outputPanel ajaxRendered="true">#{fileUploadBean.item.fileName}</a4j:outputPanel>
             <br />
+            <h:outputText value="AcceptedTypes: " />
+            <h:inputText value="#{fileUploadBean.acceptedTypes}">
+                    <f:ajax render="fu"/>
+            </h:inputText>
+            <br />
             <h:outputText value="Enabled: " />
             <h:selectBooleanCheckbox value="#{fileUploadBean.enabled}">
                     <f:ajax render="fu"/>
             </h:selectBooleanCheckbox>
             <br />
+            <h:outputText value="NoDuplicate: " />
+            <h:selectBooleanCheckbox value="#{fileUploadBean.noDuplicate}">
+                    <f:ajax render="fu"/>
+            </h:selectBooleanCheckbox>
+            <br />
 			<input type="submit" />
 			<a4j:log />
 		</h:form>
                                
                         
                        
                                
                                14 years, 11 months
                        
                        
                 
         
 
        
            
        
        
        
                
                        
                                
                                
                                        
                                
                         
                        
                                
                                
                                        
                                                
                                        
                                        
                                        JBoss Rich Faces SVN: r20243 - in sandbox/trunk/ui/fileupload/ui/src/main: templates and 1 other directory.
                                
                                
                                
                                    
                                        by richfaces-svn-commits@lists.jboss.org
                                    
                                
                                
                                        Author: konstantin.mishin
Date: 2010-11-30 13:54:31 -0500 (Tue, 30 Nov 2010)
New Revision: 20243
Modified:
   sandbox/trunk/ui/fileupload/ui/src/main/resources/META-INF/resources/org.richfaces/fileupload.js
   sandbox/trunk/ui/fileupload/ui/src/main/templates/fileupload.template.xml
Log:
RF-9496
Modified: sandbox/trunk/ui/fileupload/ui/src/main/resources/META-INF/resources/org.richfaces/fileupload.js
===================================================================
--- sandbox/trunk/ui/fileupload/ui/src/main/resources/META-INF/resources/org.richfaces/fileupload.js	2010-11-30 18:51:54 UTC (rev 20242)
+++ sandbox/trunk/ui/fileupload/ui/src/main/resources/META-INF/resources/org.richfaces/fileupload.js	2010-11-30 18:54:31 UTC (rev 20243)
@@ -49,6 +49,9 @@
 	    init: function(id, options) {
 	        this.id = id;
 	        jQuery.extend(this, options);
+	        if (this.acceptedTypes) {
+	        	this.acceptedTypes = jQuery.trim(this.acceptedTypes).split(/\s*,\s*/);
+	        }
 	        this.element = jQuery(this.attachToDom());
 	        this.form = this.element.parents("form:first");
 	        var header = this.element.children(".rf-fu-hdr:first");
@@ -59,8 +62,9 @@
 	        this.inputContainer = this.addButton.find(".rf-fu-inp-cntr:first");
 	        this.input = this.inputContainer.children("input");
 	        this.list = header.next();
-	        this.progressBar = this.list.next();
-	        this.iframe = this.progressBar.next();
+	        this.progressBarElement = this.list.next();
+	        this.progressBar = richfaces.$(this.progressBarElement);
+	        this.iframe = this.progressBarElement.next();
 	        this.cleanInput = this.input.clone();
 	        this.addProxy =  jQuery.proxy(this.__addItem, this);
 	        this.input.change(this.addProxy);
@@ -76,15 +80,18 @@
 	    },
 	    
 	    __addItem: function() {
-	    	this.input.hide();
-	        this.input.unbind("change", this.addProxy);
-	    	var item = new Item(this);
-	    	this.list.append(item.getJQuery());
-	    	this.items.push(item);
-	    	this.input = this.cleanInput.clone();
-	    	this.inputContainer.append(this.input);
-	        this.input.change(this.addProxy);
-	    	this.__updateButtons();
+	    	var fileName = this.input.val();
+	    	if (this.__accept(fileName) && (!this.noDuplicate || !this.__isFileAlreadyAdded(fileName))) {
+		    	this.input.hide();
+		        this.input.unbind("change", this.addProxy);
+		    	var item = new Item(this);
+		    	this.list.append(item.getJQuery());
+		    	this.items.push(item);
+		    	this.input = this.cleanInput.clone();
+		    	this.inputContainer.append(this.input);
+		        this.input.change(this.addProxy);
+		    	this.__updateButtons();
+	    	}
 	    },
 	    
 	    __removeItem: function(item) {
@@ -126,7 +133,7 @@
 	    	var originalEncoding = this.form.attr("encoding");
 	    	var originalEnctype = this.form.attr("enctype");
 	    	try {
-	    		this.form.attr("action", originalAction + "?" + UID + "=1");
+	    		this.form.attr("action", originalAction + "?" + UID + "=" + this.loadableItem.uid);
 	    		this.form.attr("encoding", "multipart/form-data");
 	    		this.form.attr("enctype", "multipart/form-data");
 	    		richfaces.submitForm(this.form, {"org.richfaces.ajax.component": this.id}, this.id);
@@ -167,6 +174,27 @@
 					}
 				}
 			}
+	    },
+	    
+	    __accept: function(fileName) {
+	    	var result = !this.acceptedTypes;
+	    	for (var i = 0; !result && i < this.acceptedTypes.length; i++) {
+	    		var extension = this.acceptedTypes[i];
+	    		result = fileName.indexOf(extension, fileName.length - extension.length) !== -1;
+			}
+	    	return result;
+	    },
+	    
+	    __isFileAlreadyAdded: function(fileName) {
+	    	var result = false;
+	    	for (var i = 0; !result && i < this.items.length; i++) {
+	    		result = this.items[i].model.name == fileName;
+			}
+	    	result = result || (this.loadableItem && this.loadableItem.model.name == fileName);
+	    	for (var i = 0; !result && i < this.uploadedItems.length; i++) {
+	    		result = this.uploadedItems[i].model.name == fileName;
+			}
+	    	return result;
 	    }
 	});
 	
@@ -196,16 +224,23 @@
 	    },
 	    
 	    startUploading: function() {
-//    		this.state.html(this.fileUpload.progressBar.detach());
-//    		richfaces.$(this.fileUpload.progressBar).poll();
 	    	this.state.css("display", "block");
 			this.link.html("");
     		this.input.attr("name", this.fileUpload.id);
 			this.model.state = ITEM_STATE.UPLOADING;
+			this.uid = Math.random();
 	    	this.fileUpload.__submit();
+    		var params = {};
+    		params[UID] = this.uid;
+    		this.fileUpload.progressBar.setValue(0);
+    		this.state.html(this.fileUpload.progressBarElement.detach());
+    		this.fileUpload.progressBar.enable(params);
 	    },
 	    
 	    finishUploading: function() {
+	    	this.fileUpload.progressBar.disable();
+    		this.fileUpload.progressBar.setValue(101);
+    		this.fileUpload.element.append(this.fileUpload.progressBarElement.detach());
 	    	this.input.remove();
 	    	this.state.html("Done");
 			this.link.html("Clear");
Modified: sandbox/trunk/ui/fileupload/ui/src/main/templates/fileupload.template.xml
===================================================================
--- sandbox/trunk/ui/fileupload/ui/src/main/templates/fileupload.template.xml	2010-11-30 18:51:54 UTC (rev 20242)
+++ sandbox/trunk/ui/fileupload/ui/src/main/templates/fileupload.template.xml	2010-11-30 18:54:31 UTC (rev 20243)
@@ -39,7 +39,8 @@
 	</cc:interface>
 	<cc:implementation>
 		<cdk:object name="enabled" value="#{component.attributes['enabled']}"/>
-		<div id="#{clientId}" class="rf-fu">
+		<div id="#{clientId}" class="rf-fu #{component.attributes['styleClass']}"
+				cdk:passThroughWithExclusions="">
 			<div class="rf-fu-hdr">
 				<span class="rf-fu-btns-lft">
 					<span class="rf-fu-btn-add#{enabled ? '' : '-dis'}">
@@ -74,7 +75,7 @@
 				</c:if>
 				<iframe name="#{clientId}" class="rf-fu-frm"/>
 				<cdk:scriptObject name="options">
-					<cdk:scriptOption attributes="onfilesubmit onuploadcomplete"/>
+					<cdk:scriptOption attributes="acceptedTypes noDuplicate onfilesubmit onuploadcomplete"/>
 				</cdk:scriptObject>
 				<script type="text/javascript">new RichFaces.ui.FileUpload(#{toScriptArgs(clientId, options)});</script>
 			</c:if>
                                
                         
                        
                                
                                14 years, 11 months
                        
                        
                 
         
 
        
            
        
        
        
                
                        
                                
                                
                                        
                                
                         
                        
                                
                                
                                        
                                                
                                        
                                        
                                        JBoss Rich Faces SVN: r20242 - in sandbox/trunk/ui/fileupload/ui/src/main/java/org/richfaces: context and 1 other directories.
                                
                                
                                
                                    
                                        by richfaces-svn-commits@lists.jboss.org
                                    
                                
                                
                                        Author: konstantin.mishin
Date: 2010-11-30 13:51:54 -0500 (Tue, 30 Nov 2010)
New Revision: 20242
Modified:
   sandbox/trunk/ui/fileupload/ui/src/main/java/org/richfaces/component/AbstractFileUpload.java
   sandbox/trunk/ui/fileupload/ui/src/main/java/org/richfaces/context/FileUploadPartialViewContextFactory.java
   sandbox/trunk/ui/fileupload/ui/src/main/java/org/richfaces/request/MultipartRequest.java
Log:
RF-9497
Modified: sandbox/trunk/ui/fileupload/ui/src/main/java/org/richfaces/component/AbstractFileUpload.java
===================================================================
--- sandbox/trunk/ui/fileupload/ui/src/main/java/org/richfaces/component/AbstractFileUpload.java	2010-11-30 16:45:23 UTC (rev 20241)
+++ sandbox/trunk/ui/fileupload/ui/src/main/java/org/richfaces/component/AbstractFileUpload.java	2010-11-30 18:51:54 UTC (rev 20242)
@@ -37,6 +37,7 @@
 import org.richfaces.cdk.annotations.JsfComponent;
 import org.richfaces.cdk.annotations.JsfRenderer;
 import org.richfaces.cdk.annotations.Tag;
+import org.richfaces.context.FileUploadPartialViewContextFactory;
 import org.richfaces.event.FileUploadListener;
 import org.richfaces.event.UploadEvent;
 import org.richfaces.request.MultipartRequest;
@@ -46,13 +47,20 @@
  * 
  */
 @JsfComponent(tag = @Tag(handler = "org.richfaces.view.facelets.FileUploadHandler"),
-    renderer = @JsfRenderer(type = "org.richfaces.FileUploadRenderer"))
+    renderer = @JsfRenderer(type = "org.richfaces.FileUploadRenderer"),
+    attributes = {"events-props.xml", "core-props.xml", "i18n-props.xml"})
 @ListenerFor(systemEventClass = PostAddToViewEvent.class)
 public abstract class AbstractFileUpload extends UIComponentBase implements ComponentSystemEventListener {
     
+    @Attribute
+    public abstract String getAcceptedTypes();
+
     @Attribute(defaultValue = "true")
     public abstract boolean isEnabled();
 
+    @Attribute(defaultValue = "false")
+    public abstract boolean isNoDuplicate();
+
     @Attribute(events = @EventName("filesubmit"))
     public abstract String getOnfilesubmit();
 
@@ -68,21 +76,23 @@
         }
     }
     
-    public boolean isListenerForSource(Object source) {
-        return true;
-    }
-    
     public void processEvent(ComponentSystemEvent event) throws AbortProcessingException {
+        FacesContext context = getFacesContext();
         Map<String, UIComponent> facets = getFacets();
         UIComponent component = facets.get("progress");
         if (component == null) {
-            FacesContext context = getFacesContext();
-            UIComponent pb = context.getApplication().createComponent(context, AbstractProgressBar.COMPONENT_TYPE,
+            component = context.getApplication().createComponent(context, AbstractProgressBar.COMPONENT_TYPE,
                 "org.richfaces.ProgressBarRenderer");
-            pb.setId(getId() + "_pb");
-            facets.put("progress", pb);
+            component.setId(getId() + "_pb");
+            facets.put("progress", component);
         }
+        component.setValueExpression("value", context.getApplication().getExpressionFactory()
+            .createValueExpression(context.getELContext(),
+                "#{" + MultipartRequest.PERCENT_BEAN_NAME + "[param['"
+                + FileUploadPartialViewContextFactory.UID_KEY + "']]}", Integer.class));
+
     }
+    
     /**
      * <p>Add a new {@link FileUploadListener} to the set of listeners
      * interested in being notified when {@link UploadEvent}s occur.</p>
@@ -95,7 +105,6 @@
         addFacesListener(listener);
     }
 
-
     /**
      * <p>Return the set of registered {@link FileUploadListener}s for this
      * {@link AbstractFileUpload} instance.  If there are no registered listeners,
@@ -105,7 +114,6 @@
         return (FileUploadListener[]) getFacesListeners(FileUploadListener.class);
     }
 
-
     /**
      * <p>Remove an existing {@link FileUploadListener} (if any) from the
      * set of listeners interested in being notified when
Modified: sandbox/trunk/ui/fileupload/ui/src/main/java/org/richfaces/context/FileUploadPartialViewContextFactory.java
===================================================================
--- sandbox/trunk/ui/fileupload/ui/src/main/java/org/richfaces/context/FileUploadPartialViewContextFactory.java	2010-11-30 16:45:23 UTC (rev 20241)
+++ sandbox/trunk/ui/fileupload/ui/src/main/java/org/richfaces/context/FileUploadPartialViewContextFactory.java	2010-11-30 18:51:54 UTC (rev 20242)
@@ -48,6 +48,8 @@
  */
 public class FileUploadPartialViewContextFactory extends PartialViewContextFactory {
 
+    public static final String UID_KEY = "rf_fu_uid";
+
     private static enum ResponseState {
         size_exceeded, stopped, server_error
     };
@@ -56,12 +58,10 @@
 
     private static final Pattern AMPERSAND = Pattern.compile("&+");
 
-    private static final String UID_KEY = "rf_fu_uid";
-
     private PartialViewContextFactory parentFactory;
 
     /** Flag indicating whether a temporary file should be used to cache the uploaded file */
-    private boolean createTempFiles = false;
+    private boolean createTempFiles = true;
 
     private String tempFilesDirectory;
 
@@ -74,12 +74,8 @@
         String param = context.getInitParameter("createTempFiles");
         if (param != null) {
             this.createTempFiles = Boolean.parseBoolean(param);
-        } else {
-            this.createTempFiles = true;
         }
-
         this.tempFilesDirectory = context.getInitParameter("tempFilesDirectory");
-
         param = context.getInitParameter("maxRequestSize");
         if (param != null) {
             this.maxRequestSize = Integer.parseInt(param);
Modified: sandbox/trunk/ui/fileupload/ui/src/main/java/org/richfaces/request/MultipartRequest.java
===================================================================
--- sandbox/trunk/ui/fileupload/ui/src/main/java/org/richfaces/request/MultipartRequest.java	2010-11-30 16:45:23 UTC (rev 20241)
+++ sandbox/trunk/ui/fileupload/ui/src/main/java/org/richfaces/request/MultipartRequest.java	2010-11-30 18:51:54 UTC (rev 20242)
@@ -53,6 +53,9 @@
 
     public static final String TEXT_HTML = "text/html";
 
+    /** Session bean name where progress bar's percent map will be stored */
+    public static final String PERCENT_BEAN_NAME = "_richfaces_upload_percents";
+
     private static final BytesHandler NOOP_HANDLER = new BytesHandler() {
         public void handle(byte[] bytes, int length) {
             // do nothing
@@ -62,9 +65,6 @@
     /** Session bean name where request size will be stored */
     private static final String REQUEST_SIZE_BEAN_NAME = "_richfaces_request_size";
 
-    /** Session bean name where progress bar's percent map will be stored */
-    private static final String PERCENT_BEAN_NAME = "_richfaces_upload_percents";
-
     private static final String PARAM_NAME = "name";
     private static final String PARAM_FILENAME = "filename";
     private static final String PARAM_CONTENT_TYPE = "Content-Type";
@@ -77,8 +77,8 @@
 
     private static final byte CR = 0x0d;
     private static final byte LF = 0x0a;
-    private static final byte[] CR_LF = { CR, LF };
-    private static final byte[] HYPHENS = { 0x2d, 0x2d }; // '--'
+    private static final byte[] CR_LF = {CR, LF};
+    private static final byte[] HYPHENS = {0x2d, 0x2d}; // '--'
 
     private static final Pattern PARAM_VALUE_PATTERN = Pattern.compile("^\\s*([^\\s=]+)\\s*[=:]\\s*(.+)\\s*$");
 
@@ -592,7 +592,7 @@
                 vals.toArray(values);
                 return values;
             } else {
-                return new String[] { (String) vp.getValue() };
+                return new String[] {(String) vp.getValue()};
             }
         } else {
             return super.getParameterValues(name);
                                
                         
                        
                                
                                14 years, 11 months
                        
                        
                 
         
 
        
            
        
        
        
                
                        
                                
                                
                                        
                                
                         
                        
                                
                                
                                        
                                                
                                        
                                        
                                        JBoss Rich Faces SVN: r20241 - modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/richTogglePanel.
                                
                                
                                
                                    
                                        by richfaces-svn-commits@lists.jboss.org
                                    
                                
                                
                                        Author: ppitonak(a)redhat.com
Date: 2010-11-30 11:45:23 -0500 (Tue, 30 Nov 2010)
New Revision: 20241
Modified:
   modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/richTogglePanel/TestRichTogglePanel.java
Log:
* unnecessary imports removed
Modified: modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/richTogglePanel/TestRichTogglePanel.java
===================================================================
--- modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/richTogglePanel/TestRichTogglePanel.java	2010-11-30 16:20:11 UTC (rev 20240)
+++ modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/richTogglePanel/TestRichTogglePanel.java	2010-11-30 16:45:23 UTC (rev 20241)
@@ -29,7 +29,6 @@
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertTrue;
-import static org.testng.Assert.assertNotSame;
 
 import java.net.URL;
 
@@ -37,7 +36,6 @@
 
 import org.jboss.test.selenium.dom.Event;
 import org.jboss.test.selenium.encapsulated.JavaScript;
-import org.jboss.test.selenium.locator.ElementLocator;
 import org.jboss.test.selenium.locator.JQueryLocator;
 import org.jboss.test.selenium.waiting.EventFiredCondition;
 import org.richfaces.tests.metamer.ftest.AbstractMetamerTest;
                                
                         
                        
                                
                                14 years, 11 months
                        
                        
                 
         
 
        
            
        
        
        
                
                        
                                
                                
                                        
                                
                         
                        
                                
                                
                                        
                                                
                                        
                                        
                                        JBoss Rich Faces SVN: r20240 - management/design-4x/dropDownMenu-new.
                                
                                
                                
                                    
                                        by richfaces-svn-commits@lists.jboss.org
                                    
                                
                                
                                        Author: nbelaevski
Date: 2010-11-30 11:20:11 -0500 (Tue, 30 Nov 2010)
New Revision: 20240
Modified:
   management/design-4x/dropDownMenu-new/dropDownMenu_new.html
Log:
Committed updated DDM markup
Modified: management/design-4x/dropDownMenu-new/dropDownMenu_new.html
===================================================================
--- management/design-4x/dropDownMenu-new/dropDownMenu_new.html	2010-11-30 16:19:06 UTC (rev 20239)
+++ management/design-4x/dropDownMenu-new/dropDownMenu_new.html	2010-11-30 16:20:11 UTC (rev 20240)
@@ -47,7 +47,8 @@
 			}
 			.rf-ddm-lst { 
 				border:1px solid #bfbfc0;  /*panelBorderColor*/
-				background-color: #e7f2fb;  /*additionalBackgroundColor*/ 
+				background-color: #e7f2fb;  /*additionalBackgroundColor*/
+				min-width:250px;
 				position:absolute;
 			}
 			.rf-ddm-sublst {
@@ -57,7 +58,6 @@
 			}
 			.rf-ddm-lst-bg {
 				border: 1px solid #e7f2fb;   /*additionalBackgroundColor*/
-				border-bottom:0;
 				background: url(images/menu_list_bg.gif) repeat-y left;  /*from additionalBackgroundColor (left) to tabBackgroundColor (right)*/
 			}
 			.rf-ddm-itm {
@@ -109,15 +109,8 @@
 				position : absolute; 
 			}
 			.rf-ddm-itm-dis .rf-ddm-nd {
-				background-position :  bottom;
+				background-position:  bottom;
 			}
-			.rf-ddm-strut{
-				font-size: 0px; 
-				border: 0px; 
-				margin: 0px;
-				width: 250px;
-				background: #e7f2fb; /*additionalBackgroundColor*/
-			}
 			
 			/*--- styleClass ---*/
 			.icon{
@@ -194,7 +187,6 @@
 																<span class="rf-ddm-itm-ic"><img width="16" height="16" src="images/spacer.gif" alt="Menu item icon"></span>
 																<span class="rf-ddm-itm-lbl"><a href="#">testString 3.5 testString 3.5 testString 3.5</a></span>
 															</div>
-															<div class="rf-ddm-strut"><img src="images/spacer.gif" width="1" height="1" alt="" border="0"/></div>
 														</div>
 													</div>
 												</div>
@@ -209,7 +201,6 @@
 												<span class="rf-ddm-itm-ic"><img width="16" height="16" src="images/spacer.gif" alt="Menu item icon"></span>
 												<span class="rf-ddm-itm-lbl">testString 2.5</span>
 											</div>
-											<div class="rf-ddm-strut"><img src="images/spacer.gif" width="1" height="1" alt="" border="0"/></div>
 										</div>
 									</div>
 								</div>
@@ -225,7 +216,6 @@
 								<span class="rf-ddm-itm-lbl">testString 1.5</span>
 							</div>				
 						</div>
-						<div class="rf-ddm-strut"><img src="images/spacer.gif" width="1" height="1" alt="" border="0"/></div>
 					</div>
 				</div>
 			</div>
                                
                         
                        
                                
                                14 years, 11 months
                        
                        
                 
         
 
        
            
        
        
        
                
                        
                                
                                
                                        
                                
                         
                        
                                
                                
                                        
                                                
                                        
                                        
                                        JBoss Rich Faces SVN: r20239 - modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/richTabPanel.
                                
                                
                                
                                    
                                        by richfaces-svn-commits@lists.jboss.org
                                    
                                
                                
                                        Author: ppitonak(a)redhat.com
Date: 2010-11-30 11:19:06 -0500 (Tue, 30 Nov 2010)
New Revision: 20239
Modified:
   modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/richTabPanel/TestRichTabPanel.java
Log:
* removed unnecessary imports
Modified: modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/richTabPanel/TestRichTabPanel.java
===================================================================
--- modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/richTabPanel/TestRichTabPanel.java	2010-11-30 16:18:30 UTC (rev 20238)
+++ modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/richTabPanel/TestRichTabPanel.java	2010-11-30 16:19:06 UTC (rev 20239)
@@ -37,8 +37,6 @@
 
 import org.jboss.test.selenium.dom.Event;
 import org.jboss.test.selenium.encapsulated.JavaScript;
-import org.jboss.test.selenium.locator.Attribute;
-import org.jboss.test.selenium.locator.AttributeLocator;
 import org.jboss.test.selenium.locator.ElementLocator;
 import org.jboss.test.selenium.locator.JQueryLocator;
 import org.jboss.test.selenium.waiting.EventFiredCondition;
                                
                         
                        
                                
                                14 years, 11 months
                        
                        
                 
         
 
        
            
        
        
        
                
                        
                                
                                
                                        
                                
                         
                        
                                
                                
                                        
                                                
                                        
                                        
                                        JBoss Rich Faces SVN: r20238 - in modules/tests/metamer/trunk: application/src/main/webapp/components/richTogglePanel and 2 other directories.
                                
                                
                                
                                    
                                        by richfaces-svn-commits@lists.jboss.org
                                    
                                
                                
                                        Author: ppitonak(a)redhat.com
Date: 2010-11-30 11:18:30 -0500 (Tue, 30 Nov 2010)
New Revision: 20238
Added:
   modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/richTogglePanel/
   modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/richTogglePanel/TestRichTogglePanel.java
Modified:
   modules/tests/metamer/trunk/application/src/main/java/org/richfaces/tests/metamer/bean/RichTogglePanelBean.java
   modules/tests/metamer/trunk/application/src/main/webapp/components/richTogglePanel/simple.xhtml
Log:
https://jira.jboss.org/browse/RFPL-675
* toggle panel's sample improved
* added 29 tests for toggle panel
Modified: modules/tests/metamer/trunk/application/src/main/java/org/richfaces/tests/metamer/bean/RichTogglePanelBean.java
===================================================================
--- modules/tests/metamer/trunk/application/src/main/java/org/richfaces/tests/metamer/bean/RichTogglePanelBean.java	2010-11-30 16:18:25 UTC (rev 20237)
+++ modules/tests/metamer/trunk/application/src/main/java/org/richfaces/tests/metamer/bean/RichTogglePanelBean.java	2010-11-30 16:18:30 UTC (rev 20238)
@@ -28,6 +28,7 @@
 import javax.faces.bean.ViewScoped;
 
 import org.richfaces.component.html.HtmlTogglePanel;
+import org.richfaces.event.ItemChangeEvent;
 import org.richfaces.tests.metamer.Attributes;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -70,4 +71,8 @@
     public void setAttributes(Attributes attributes) {
         this.attributes = attributes;
     }
+
+    public void itemChangeListener(ItemChangeEvent event) {
+        RichBean.logToPage("* item changed " + event.getOldItem() + " -> " + event.getNewItem());
+    }
 }
Modified: modules/tests/metamer/trunk/application/src/main/webapp/components/richTogglePanel/simple.xhtml
===================================================================
--- modules/tests/metamer/trunk/application/src/main/webapp/components/richTogglePanel/simple.xhtml	2010-11-30 16:18:25 UTC (rev 20237)
+++ modules/tests/metamer/trunk/application/src/main/webapp/components/richTogglePanel/simple.xhtml	2010-11-30 16:18:30 UTC (rev 20238)
@@ -2,7 +2,7 @@
 <!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:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"
       xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:metamer="http://java.sun.com/jsf/composite/metamer"
-      xmlns:rich="http://richfaces.org/rich">
+      xmlns:rich="http://richfaces.org/rich" xmlns:a4j="http://richfaces.org/a4j">
 
     <!--
 JBoss, Home of Professional Open Source
@@ -41,18 +41,35 @@
 
         <ui:define name="component">
 
-            <h:commandLink id="tcLink1" value="Toggle Panel Item 1">
+            <h:commandLink id="tcLink1" value="Item 1">
                 <rich:toggleControl targetPanel="richTogglePanel" targetItem="item1" />
             </h:commandLink>
             <h:outputText value=" | " />
-            <h:commandLink id="tcLink2" value="Toggle Panel Item 2">
+            <h:commandLink id="tcLink2" value="Item 2">
                 <rich:toggleControl targetPanel="richTogglePanel" targetItem="item2" />
             </h:commandLink>
             <h:outputText value=" | " />
-            <h:commandLink id="tcLink3" value="Toggle Panel Item 3">
+            <h:commandLink id="tcLink3" value="Item 3">
                 <rich:toggleControl targetPanel="richTogglePanel" targetItem="item3" />
             </h:commandLink>
 
+            <br/>
+            <h:commandLink id="tcFirst" value="First Item">
+                <rich:toggleControl targetPanel="richTogglePanel" targetItem="@first" />
+            </h:commandLink>
+            <h:outputText value=" | " />
+            <h:commandLink id="tcPrev" value="Prev Item">
+                <rich:toggleControl targetPanel="richTogglePanel" targetItem="@prev" />
+            </h:commandLink>
+            <h:outputText value=" | " />
+            <h:commandLink id="tcNext" value="Next Item">
+                <rich:toggleControl targetPanel="richTogglePanel" targetItem="@next" />
+            </h:commandLink>
+            <h:outputText value=" | " />
+            <h:commandLink id="tcLast" value="Last Item">
+                <rich:toggleControl targetPanel="richTogglePanel" targetItem="@last" />
+            </h:commandLink>
+
             <br/><br/>
 
             <rich:togglePanel id="richTogglePanel"
@@ -63,6 +80,7 @@
                               dir="#{richTogglePanelBean.attributes['dir'].value}"
                               execute="#{richTogglePanelBean.attributes['execute'].value}"
                               immediate="#{richTogglePanelBean.attributes['immediate'].value}"
+                              itemChangeListener="#{richTogglePanelBean.itemChangeListener}"
                               lang="#{richTogglePanelBean.attributes['lang'].value}"
                               limitToList="#{richTogglePanelBean.attributes['limitToList'].value}"
                               onbeforeitemchange="#{richTogglePanelBean.attributes['onbeforeitemchange'].value}"
Added: modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/richTogglePanel/TestRichTogglePanel.java
===================================================================
--- modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/richTogglePanel/TestRichTogglePanel.java	                        (rev 0)
+++ modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/richTogglePanel/TestRichTogglePanel.java	2010-11-30 16:18:30 UTC (rev 20238)
@@ -0,0 +1,409 @@
+/*******************************************************************************
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ *******************************************************************************/
+package org.richfaces.tests.metamer.ftest.richTogglePanel;
+
+import static org.jboss.test.selenium.guard.request.RequestTypeGuardFactory.guardHttp;
+import static org.jboss.test.selenium.guard.request.RequestTypeGuardFactory.guardNoRequest;
+import static org.jboss.test.selenium.guard.request.RequestTypeGuardFactory.guardXhr;
+import static org.jboss.test.selenium.locator.LocatorFactory.jq;
+import static org.jboss.test.selenium.utils.URLUtils.buildUrl;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.assertNotSame;
+
+import java.net.URL;
+
+import javax.faces.event.PhaseId;
+
+import org.jboss.test.selenium.dom.Event;
+import org.jboss.test.selenium.encapsulated.JavaScript;
+import org.jboss.test.selenium.locator.ElementLocator;
+import org.jboss.test.selenium.locator.JQueryLocator;
+import org.jboss.test.selenium.waiting.EventFiredCondition;
+import org.richfaces.tests.metamer.ftest.AbstractMetamerTest;
+import org.richfaces.tests.metamer.ftest.annotations.IssueTracking;
+import org.testng.annotations.Test;
+
+/**
+ * Test case for page /faces/components/richTogglePanel/simple.xhtml
+ * 
+ * @author <a href="mailto:ppitonak@redhat.com">Pavol Pitonak</a>
+ * @version $Revision$
+ */
+public class TestRichTogglePanel extends AbstractMetamerTest {
+
+    private JQueryLocator panel = pjq("div[id$=richTogglePanel]");
+    private JQueryLocator item1 = pjq("div[id$=item1]");
+    private JQueryLocator item2 = pjq("div[id$=item2]");
+    private JQueryLocator item3 = pjq("div[id$=item3]");
+    // toggle controls
+    private JQueryLocator tc1 = pjq("a[id$=tcLink1]");
+    private JQueryLocator tc2 = pjq("a[id$=tcLink2]");
+    private JQueryLocator tc3 = pjq("a[id$=tcLink3]");
+    private JQueryLocator tcFirst = pjq("a[id$=tcFirst]");
+    private JQueryLocator tcPrev = pjq("a[id$=tcPrev]");
+    private JQueryLocator tcNext = pjq("a[id$=tcNext]");
+    private JQueryLocator tcLast = pjq("a[id$=tcLast]");
+
+    @Override
+    public URL getTestUrl() {
+        return buildUrl(contextPath, "faces/components/richTogglePanel/simple.xhtml");
+    }
+
+    @Test
+    public void testInit() {
+        assertTrue(selenium.isElementPresent(panel), "Toggle panel is not present on the page.");
+        assertTrue(selenium.isVisible(panel), "Toggle panel is not visible.");
+        assertTrue(selenium.isElementPresent(item1), "Item 1 is not present on the page.");
+        assertTrue(selenium.isVisible(item1), "Item 1 is not visible.");
+        assertTrue(selenium.isElementPresent(item2), "Item 2 is not present on the page.");
+        assertFalse(selenium.isVisible(item2), "Item 2 should not be visible.");
+        assertTrue(selenium.isElementPresent(item3), "Item 3 is not present on the page.");
+        assertFalse(selenium.isVisible(item3), "Item 3 should not be visible.");
+    }
+
+    @Test
+    public void testSwitchTypeNull() {
+        guardXhr(selenium).click(tc3);
+        waitGui.failWith("Item 3 is not displayed.").until(isDisplayed.locator(item3));
+        assertFalse(selenium.isVisible(item1), "Item 1 should not be visible.");
+        assertFalse(selenium.isVisible(item2), "Item 2 should not be visible.");
+
+        guardXhr(selenium).click(tc2);
+        waitGui.failWith("Item 2 is not displayed.").until(isDisplayed.locator(item2));
+        assertFalse(selenium.isVisible(item1), "Item 1 should not be visible.");
+        assertFalse(selenium.isVisible(item3), "Item 3 should not be visible.");
+
+        guardXhr(selenium).click(tc1);
+        waitGui.failWith("Item 1 is not displayed.").until(isDisplayed.locator(item1));
+        assertFalse(selenium.isVisible(item2), "Item 2 should not be visible.");
+        assertFalse(selenium.isVisible(item3), "Item 3 should not be visible.");
+    }
+
+    @Test
+    public void testSwitchTypeAjax() {
+        selenium.click(pjq("input[name$=switchTypeInput][value=ajax]"));
+        selenium.waitForPageToLoad();
+
+        testSwitchTypeNull();
+    }
+
+    @Test
+    public void testSwitchTypeClient() {
+        selenium.click(pjq("input[name$=switchTypeInput][value=client]"));
+        selenium.waitForPageToLoad();
+
+        guardNoRequest(selenium).click(tc3);
+        waitGui.failWith("Item 3 is not displayed.").until(isDisplayed.locator(item3));
+        assertFalse(selenium.isVisible(item1), "Item 1 should not be visible.");
+        assertFalse(selenium.isVisible(item2), "Item 2 should not be visible.");
+
+        guardNoRequest(selenium).click(tc2);
+        waitGui.failWith("Item 2 is not displayed.").until(isDisplayed.locator(item2));
+        assertFalse(selenium.isVisible(item1), "Item 1 should not be visible.");
+        assertFalse(selenium.isVisible(item3), "Item 3 should not be visible.");
+
+        guardNoRequest(selenium).click(tc1);
+        waitGui.failWith("Item 1 is not displayed.").until(isDisplayed.locator(item1));
+        assertFalse(selenium.isVisible(item2), "Item 2 should not be visible.");
+        assertFalse(selenium.isVisible(item3), "Item 3 should not be visible.");
+    }
+
+    @Test
+    public void testSwitchTypeServer() {
+        selenium.click(pjq("input[name$=switchTypeInput][value=server]"));
+        selenium.waitForPageToLoad();
+
+        guardHttp(selenium).click(tc3);
+        assertTrue(selenium.isVisible(item3), "Item 3 should be visible.");
+        assertFalse(selenium.isElementPresent(item1), "Item 1 should not be present.");
+        assertFalse(selenium.isElementPresent(item2), "Item 2 should not be present.");
+
+        guardHttp(selenium).click(tc2);
+        assertTrue(selenium.isVisible(item2), "Item 2 should be visible.");
+        assertFalse(selenium.isElementPresent(item1), "Item 1 should not be present.");
+        assertFalse(selenium.isElementPresent(item3), "Item 3 should not be present.");
+
+        guardHttp(selenium).click(tc1);
+        assertTrue(selenium.isVisible(item1), "Item 1 should be visible.");
+        assertFalse(selenium.isElementPresent(item2), "Item 2 should not be present.");
+        assertFalse(selenium.isElementPresent(item3), "Item 3 should not be present.");
+    }
+
+    @Test
+    public void testFirstLastPrevNextSwitchNull() {
+        guardXhr(selenium).click(tcNext);
+        waitGui.failWith("Next item (2) is not displayed.").until(isDisplayed.locator(item2));
+        assertFalse(selenium.isVisible(item1), "Item 1 should not be visible.");
+        assertFalse(selenium.isVisible(item3), "Item 3 should not be visible.");
+
+        guardXhr(selenium).click(tcPrev);
+        waitGui.failWith("Previous item (1) is not displayed.").until(isDisplayed.locator(item1));
+        assertFalse(selenium.isVisible(item2), "Item 2 should not be visible.");
+        assertFalse(selenium.isVisible(item3), "Item 3 should not be visible.");
+
+        guardXhr(selenium).click(tcLast);
+        waitGui.failWith("Last item (3) is not displayed.").until(isDisplayed.locator(item3));
+        assertFalse(selenium.isVisible(item1), "Item 1 should not be visible.");
+        assertFalse(selenium.isVisible(item2), "Item 2 should not be visible.");
+
+        guardXhr(selenium).click(tcFirst);
+        waitGui.failWith("First item (1) is not displayed.").until(isDisplayed.locator(item1));
+        assertFalse(selenium.isVisible(item2), "Item 2 should not be visible.");
+        assertFalse(selenium.isVisible(item3), "Item 3 should not be visible.");
+    }
+
+    @Test
+    public void testFirstLastPrevNextSwitchAjax() {
+        selenium.click(pjq("input[name$=switchTypeInput][value=ajax]"));
+        selenium.waitForPageToLoad();
+
+        testFirstLastPrevNextSwitchNull();
+    }
+
+    @Test
+    public void testFirstLastPrevNextSwitchClient() {
+        selenium.click(pjq("input[name$=switchTypeInput][value=client]"));
+        selenium.waitForPageToLoad();
+
+        guardNoRequest(selenium).click(tcNext);
+        waitGui.failWith("Next item (2) is not displayed.").until(isDisplayed.locator(item2));
+        assertFalse(selenium.isVisible(item1), "Item 1 should not be visible.");
+        assertFalse(selenium.isVisible(item3), "Item 3 should not be visible.");
+
+        guardNoRequest(selenium).click(tcPrev);
+        waitGui.failWith("Previous item (1) is not displayed.").until(isDisplayed.locator(item1));
+        assertFalse(selenium.isVisible(item2), "Item 2 should not be visible.");
+        assertFalse(selenium.isVisible(item3), "Item 3 should not be visible.");
+
+        guardNoRequest(selenium).click(tcLast);
+        waitGui.failWith("Last item (3) is not displayed.").until(isDisplayed.locator(item3));
+        assertFalse(selenium.isVisible(item1), "Item 1 should not be visible.");
+        assertFalse(selenium.isVisible(item2), "Item 2 should not be visible.");
+
+        guardNoRequest(selenium).click(tcFirst);
+        waitGui.failWith("First item (1) is not displayed.").until(isDisplayed.locator(item1));
+        assertFalse(selenium.isVisible(item2), "Item 2 should not be visible.");
+        assertFalse(selenium.isVisible(item3), "Item 3 should not be visible.");
+    }
+
+    @Test
+    public void testFirstLastPrevNextSwitchServer() {
+        selenium.click(pjq("input[name$=switchTypeInput][value=server]"));
+        selenium.waitForPageToLoad();
+
+        guardHttp(selenium).click(tcNext);
+        assertTrue(selenium.isVisible(item2), "Next item (2) should be visible.");
+        assertFalse(selenium.isElementPresent(item1), "Item 1 should not be present.");
+        assertFalse(selenium.isElementPresent(item3), "Item 3 should not be present.");
+
+        guardHttp(selenium).click(tcPrev);
+        assertTrue(selenium.isVisible(item1), "Previous item (2) should be visible.");
+        assertFalse(selenium.isElementPresent(item2), "Item 2 should not be present.");
+        assertFalse(selenium.isElementPresent(item3), "Item 3 should not be present.");
+
+        guardHttp(selenium).click(tcLast);
+        assertTrue(selenium.isVisible(item3), "Last item (3) should be visible.");
+        assertFalse(selenium.isElementPresent(item1), "Item 1 should not be present.");
+        assertFalse(selenium.isElementPresent(item2), "Item 2 should not be present.");
+
+        guardHttp(selenium).click(tcFirst);
+        assertTrue(selenium.isVisible(item1), "First item (1) should be visible.");
+        assertFalse(selenium.isElementPresent(item2), "Item 2 should not be present.");
+        assertFalse(selenium.isElementPresent(item3), "Item 3 should not be present.");
+    }
+
+    @Test
+    public void testBypassUpdates() {
+        JQueryLocator input = pjq("input[type=radio][name$=bypassUpdatesInput][value=true]");
+        selenium.click(input);
+        selenium.waitForPageToLoad();
+
+        selenium.click(tc3);
+        waitGui.failWith("Item 3 is not displayed.").until(isDisplayed.locator(item3));
+
+        assertPhases(PhaseId.RESTORE_VIEW, PhaseId.APPLY_REQUEST_VALUES, PhaseId.PROCESS_VALIDATIONS,
+                PhaseId.RENDER_RESPONSE);
+
+        String listenerOutput = selenium.getText(jq("div#phasesPanel li:eq(3)"));
+        assertEquals(listenerOutput, "* item changed item1 -> item3", "Item change listener's output");
+    }
+
+    @Test
+    public void testCycledSwitching() {
+        selenium.click(pjq("input[type=radio][name$=cycledSwitchingInput][value=true]"));
+        selenium.waitForPageToLoad();
+
+        guardXhr(selenium).click(tcPrev);
+        waitGui.failWith("Previous item (3) is not displayed.").until(isDisplayed.locator(item3));
+        guardXhr(selenium).click(tcNext);
+        waitGui.failWith("Next item (1) is not displayed.").until(isDisplayed.locator(item1));
+    }
+
+    @Test
+    public void testDir() {
+        super.testDir(panel);
+    }
+
+    @Test
+    public void testImmediate() {
+        JQueryLocator input = pjq("input[type=radio][name$=immediateInput][value=true]");
+        selenium.click(input);
+        selenium.waitForPageToLoad();
+
+        selenium.click(tc3);
+        waitGui.failWith("Item 3 is not displayed.").until(isDisplayed.locator(item3));
+
+        assertPhases(PhaseId.RESTORE_VIEW, PhaseId.APPLY_REQUEST_VALUES, PhaseId.RENDER_RESPONSE);
+
+        String listenerOutput = selenium.getText(jq("div#phasesPanel li:eq(2)"));
+        assertEquals(listenerOutput, "* item changed item1 -> item3", "Item change listener's output");
+    }
+
+    @Test
+    public void testLang() {
+        testLang(panel);
+    }
+
+    @Test
+    @IssueTracking("https://jira.jboss.org/browse/RF-9881")
+    public void testLimitToList() {
+        JQueryLocator timeLoc = jq("span[id$=requestTime]");
+
+        selenium.type(pjq("input[type=text][id$=renderInput]"), "@this");
+        selenium.waitForPageToLoad();
+
+        selenium.click(pjq("input[type=radio][name$=limitToListInput][value=true]"));
+        selenium.waitForPageToLoad();
+
+        String time = selenium.getText(timeLoc);
+
+        guardXhr(selenium).click(tc2);
+        waitGui.failWith("Item 2 is not displayed.").until(isDisplayed.locator(item2));
+
+        String newTime = selenium.getText(timeLoc);
+        assertEquals(newTime, time, "Panel with ajaxRendered=true should not be rerendered.");
+    }
+
+    @Test
+    public void testOnbeforeitemchange() {
+        selenium.type(pjq("input[id$=onbeforeitemchangeInput]"), "metamerEvents += \"onbeforeitemchange \"");
+        selenium.waitForPageToLoad();
+
+        guardXhr(selenium).click(tc2);
+        waitGui.failWith("Item 2 is not displayed.").until(isDisplayed.locator(item2));
+
+        waitGui.failWith("onbeforeitemchange attribute does not work correctly").until(new EventFiredCondition(new Event("beforeitemchange")));
+    }
+
+    @Test
+    public void testItemchangeEvents() {
+        JQueryLocator time = jq("span[id$=requestTime]");
+
+        selenium.type(pjq("input[type=text][id$=onbeforeitemchangeInput]"), "metamerEvents += \"beforeitemchange \"");
+        selenium.waitForPageToLoad();
+        selenium.type(pjq("input[type=text][id$=onitemchangeInput]"), "metamerEvents += \"itemchange \"");
+        selenium.waitForPageToLoad();
+
+        selenium.getEval(new JavaScript("window.metamerEvents = \"\";"));
+        String time1Value = selenium.getText(time);
+
+        guardXhr(selenium).click(tc2);
+        waitGui.failWith("Page was not updated").waitForChange(time1Value, retrieveText.locator(time));
+
+        String[] events = selenium.getEval(new JavaScript("window.metamerEvents")).split(" ");
+
+        assertEquals(events[0], "beforeitemchange", "Attribute onbeforeitemchange doesn't work");
+        assertEquals(events[1], "itemchange", "Attribute onbeforeitemchange doesn't work");
+    }
+
+    @Test
+    public void testOnclick() {
+        testFireEvent(Event.CLICK, panel);
+    }
+
+    @Test
+    public void testOndblclick() {
+        testFireEvent(Event.DBLCLICK, panel);
+    }
+
+    @Test
+    public void testOnitemchange() {
+        selenium.type(pjq("input[id$=onitemchangeInput]"), "metamerEvents += \"onitemchange \"");
+        selenium.waitForPageToLoad(TIMEOUT);
+
+        guardXhr(selenium).click(tc2);
+        waitGui.failWith("Item 2 is not displayed.").until(isDisplayed.locator(item2));
+
+        waitGui.failWith("onitemchange attribute does not work correctly").until(new EventFiredCondition(new Event("itemchange")));
+    }
+
+    @Test
+    public void testOnmousedown() {
+        testFireEvent(Event.MOUSEDOWN, panel);
+    }
+
+    @Test
+    public void testOnmousemove() {
+        testFireEvent(Event.MOUSEMOVE, panel);
+    }
+
+    @Test
+    public void testOnmouseout() {
+        testFireEvent(Event.MOUSEOUT, panel);
+    }
+
+    @Test
+    public void testOnmouseover() {
+        testFireEvent(Event.MOUSEOVER, panel);
+    }
+
+    @Test
+    public void testOnmouseup() {
+        testFireEvent(Event.MOUSEUP, panel);
+    }
+
+    @Test
+    public void testRendered() {
+        JQueryLocator input = pjq("input[type=radio][name$=renderedInput][value=false]");
+        selenium.click(input);
+        selenium.waitForPageToLoad();
+
+        assertFalse(selenium.isElementPresent(panel), "Toggle panel should not be rendered when rendered=false.");
+    }
+
+    @Test
+    public void testStyle() {
+        testStyle(panel, "style");
+    }
+
+    @Test
+    public void testStyleClass() {
+        testStyleClass(panel, "styleClass");
+    }
+
+    @Test
+    public void testTitle() {
+        testTitle(panel);
+    }
+}
Property changes on: modules/tests/metamer/trunk/ftest-source/src/main/java/org/richfaces/tests/metamer/ftest/richTogglePanel/TestRichTogglePanel.java
___________________________________________________________________
Name: svn:keywords
   + Revision
                                
                         
                        
                                
                                14 years, 11 months
                        
                        
                 
         
 
        
            
        
        
        
                
                        
                                
                                
                                        
                                
                         
                        
                                
                                
                                        
                                                
                                        
                                        
                                        JBoss Rich Faces SVN: r20237 - modules/tests/metamer/trunk/application/src/main/webapp/resources/metamer.
                                
                                
                                
                                    
                                        by richfaces-svn-commits@lists.jboss.org
                                    
                                
                                
                                        Author: lfryc(a)redhat.com
Date: 2010-11-30 11:18:25 -0500 (Tue, 30 Nov 2010)
New Revision: 20237
Modified:
   modules/tests/metamer/trunk/application/src/main/webapp/resources/metamer/attributes.xhtml
Log:
metamer:attributes made implicitly ajaxRendered
Modified: modules/tests/metamer/trunk/application/src/main/webapp/resources/metamer/attributes.xhtml
===================================================================
--- modules/tests/metamer/trunk/application/src/main/webapp/resources/metamer/attributes.xhtml	2010-11-30 16:17:53 UTC (rev 20236)
+++ modules/tests/metamer/trunk/application/src/main/webapp/resources/metamer/attributes.xhtml	2010-11-30 16:18:25 UTC (rev 20237)
@@ -19,40 +19,42 @@
             
             <a4j:jsFunction id="submitAjaxFunction" name="submitAjax" execute="#{cc.attrs.execute}" render="#{cc.attrs.render}" />
 
-            <h:panelGrid id="#{cc.attrs.id}" columns="#{cc.attrs.columns * 2}" styleClass="attributes"
-                         columnClasses="attributes-first-column, attributes-second-column, attributes-first-column, attributes-second-column">
-                <c:forEach items="#{cc.attrs.value}" var="entry">
-                    <h:panelGroup layout="block">
-                        <h:outputLabel id="#{entry.key}Label" value="#{entry.key}" style="margin-right: 5px;" for="#{entry.key}Input"/>
-                        <h:graphicImage value="/resources/images/help.png" title="#{entry.value.help}"
-                                        rendered="#{entry.value.help != null}" height="18px;"
-                                        style="vertical-align: middle;" styleClass="attribute-help" >
-                        </h:graphicImage>
-                    </h:panelGroup>
-
-                    <c:choose>
-                        <c:when test="#{entry.value.bool}">
-                            <h:selectOneRadio id="#{entry.key}Input" value="#{entry.value.value}" onchange="#{cc.attrs.type == 'server' ? 'submit()' : 'submitAjax()'}">
-                                <f:selectItem itemValue="null" itemLabel="null"/>
-                                <f:selectItem itemValue="true" itemLabel="true"/>
-                                <f:selectItem itemValue="false" itemLabel="false"/>
-                            </h:selectOneRadio>
-                        </c:when>
-
-                        <c:when test="#{entry.value.selectOptions != null}">
-                            <h:selectOneRadio id="#{entry.key}Input" value="#{entry.value.value}" onchange="#{cc.attrs.type == 'server' ? 'submit()' : 'submitAjax()'}"
-                                              layout="pageDirection">
-                                <f:selectItems value="#{entry.value.selectOptions}" />
-                            </h:selectOneRadio>
-                        </c:when>
-
-                        <c:otherwise>
-                            <h:inputText id="#{entry.key}Input" value="#{entry.value.value}" style="width: 200px;" onchange="#{cc.attrs.type == 'server' ? 'submit()' : 'submitAjax()'}" />
-                        </c:otherwise>
-                    </c:choose>
-
-                </c:forEach>
-            </h:panelGrid>
+			<a4j:outputPanel ajaxRendered="true">
+	            <h:panelGrid id="#{cc.attrs.id}" columns="#{cc.attrs.columns * 2}" styleClass="attributes"
+	                         columnClasses="attributes-first-column, attributes-second-column, attributes-first-column, attributes-second-column">
+	                <c:forEach items="#{cc.attrs.value}" var="entry">
+	                    <h:panelGroup layout="block">
+	                        <h:outputLabel id="#{entry.key}Label" value="#{entry.key}" style="margin-right: 5px;" for="#{entry.key}Input"/>
+	                        <h:graphicImage value="/resources/images/help.png" title="#{entry.value.help}"
+	                                        rendered="#{entry.value.help != null}" height="18px;"
+	                                        style="vertical-align: middle;" styleClass="attribute-help" >
+	                        </h:graphicImage>
+	                    </h:panelGroup>
+	
+	                    <c:choose>
+	                        <c:when test="#{entry.value.bool}">
+	                            <h:selectOneRadio id="#{entry.key}Input" value="#{entry.value.value}" onchange="#{cc.attrs.type == 'server' ? 'submit()' : 'submitAjax()'}">
+	                                <f:selectItem itemValue="null" itemLabel="null"/>
+	                                <f:selectItem itemValue="true" itemLabel="true"/>
+	                                <f:selectItem itemValue="false" itemLabel="false"/>
+	                            </h:selectOneRadio>
+	                        </c:when>
+	
+	                        <c:when test="#{entry.value.selectOptions != null}">
+	                            <h:selectOneRadio id="#{entry.key}Input" value="#{entry.value.value}" onchange="#{cc.attrs.type == 'server' ? 'submit()' : 'submitAjax()'}"
+	                                              layout="pageDirection">
+	                                <f:selectItems value="#{entry.value.selectOptions}" />
+	                            </h:selectOneRadio>
+	                        </c:when>
+	
+	                        <c:otherwise>
+	                            <h:inputText id="#{entry.key}Input" value="#{entry.value.value}" style="width: 200px;" onchange="#{cc.attrs.type == 'server' ? 'submit()' : 'submitAjax()'}" />
+	                        </c:otherwise>
+	                    </c:choose>
+	
+	                </c:forEach>
+	            </h:panelGrid>
+            </a4j:outputPanel>
         </composite:implementation>
     </h:body>
 </html>
                                
                         
                        
                                
                                14 years, 11 months
                        
                        
                 
         
 
        
            
        
        
        
                
                        
                                
                                
                                        
                                
                         
                        
                                
                                
                                        
                                                
                                        
                                        
                                        JBoss Rich Faces SVN: r20236 - in modules/tests/metamer/trunk/application: src/main/java/org/richfaces/tests/metamer and 3 other directories.
                                
                                
                                
                                    
                                        by richfaces-svn-commits@lists.jboss.org
                                    
                                
                                
                                        Author: lfryc(a)redhat.com
Date: 2010-11-30 11:17:53 -0500 (Tue, 30 Nov 2010)
New Revision: 20236
Added:
   modules/tests/metamer/trunk/application/src/main/webapp/components/richDataTable/facets.xhtml
Modified:
   modules/tests/metamer/trunk/application/pom.xml
   modules/tests/metamer/trunk/application/src/main/java/org/richfaces/tests/metamer/Attribute.java
   modules/tests/metamer/trunk/application/src/main/java/org/richfaces/tests/metamer/bean/RichDataTableBean.java
   modules/tests/metamer/trunk/application/src/main/resources/org/richfaces/tests/metamer/bean/RichDataTableBean.properties
   modules/tests/metamer/trunk/application/src/main/webapp/components/richDataTable/list.xhtml
   modules/tests/metamer/trunk/application/src/main/webapp/components/richDataTable/scroller.xhtml
   modules/tests/metamer/trunk/application/src/main/webapp/components/richDataTable/simple.xhtml
   modules/tests/metamer/trunk/application/src/main/webapp/components/richDataTable/sorting-using-column.xhtml
   modules/tests/metamer/trunk/application/src/main/webapp/components/richDataTable/sorting-using-component-control.xhtml
Log:
rich:dataTable - pre-automating component preparation (RFPL-912)
Modified: modules/tests/metamer/trunk/application/pom.xml
===================================================================
--- modules/tests/metamer/trunk/application/pom.xml	2010-11-30 14:37:17 UTC (rev 20235)
+++ modules/tests/metamer/trunk/application/pom.xml	2010-11-30 16:17:53 UTC (rev 20236)
@@ -82,6 +82,12 @@
             <groupId>javax.servlet</groupId>
             <artifactId>jstl</artifactId>
         </dependency>
+        
+        <dependency>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+            <version>2.5</version>
+        </dependency>
 
         <dependency>
             <groupId>org.slf4j</groupId>
Modified: modules/tests/metamer/trunk/application/src/main/java/org/richfaces/tests/metamer/Attribute.java
===================================================================
--- modules/tests/metamer/trunk/application/src/main/java/org/richfaces/tests/metamer/Attribute.java	2010-11-30 14:37:17 UTC (rev 20235)
+++ modules/tests/metamer/trunk/application/src/main/java/org/richfaces/tests/metamer/Attribute.java	2010-11-30 16:17:53 UTC (rev 20236)
@@ -22,6 +22,8 @@
 package org.richfaces.tests.metamer;
 
 import java.io.Serializable;
+import java.util.Arrays;
+import java.util.Collection;
 import java.util.List;
 
 import javax.faces.model.SelectItem;
@@ -29,6 +31,7 @@
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
+import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -73,6 +76,12 @@
     }
 
     public void setValue(Object value) {
+        if (value instanceof String) {
+            if (type == Collection.class) {
+                String[] splitted = StringUtils.split((String) value, ",[]");
+                value = Arrays.asList(splitted);
+            }
+        }
         this.value = value;
     }
 
Modified: modules/tests/metamer/trunk/application/src/main/java/org/richfaces/tests/metamer/bean/RichDataTableBean.java
===================================================================
--- modules/tests/metamer/trunk/application/src/main/java/org/richfaces/tests/metamer/bean/RichDataTableBean.java	2010-11-30 14:37:17 UTC (rev 20235)
+++ modules/tests/metamer/trunk/application/src/main/java/org/richfaces/tests/metamer/bean/RichDataTableBean.java	2010-11-30 16:17:53 UTC (rev 20236)
@@ -22,9 +22,12 @@
 package org.richfaces.tests.metamer.bean;
 
 import java.io.Serializable;
+import java.util.Collection;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Map.Entry;
+
 import javax.annotation.PostConstruct;
 
 import javax.faces.bean.ManagedBean;
@@ -67,6 +70,8 @@
     private String titleFilter;
     private int kidsFilter;
     private int kidsFilter2;
+    // facets
+    private Map<String, String> facets = new HashMap<String, String>();
 
     /**
      * Initializes the managed bean.
@@ -80,19 +85,45 @@
 
         attributes.setAttribute("rendered", true);
         attributes.setAttribute("rows", 10);
-
+        attributes.get("sortPriority").setType(Collection.class);
+        
+        // hidden attributes
+        attributes.remove("filteringListeners");
+        attributes.remove("sortingListeners");
+        attributes.remove("filterVar");
+        attributes.remove("iterationState");
+        attributes.remove("iterationStatusVar");
+        attributes.remove("rowAvailable");
+        attributes.remove("rowCount");
+        attributes.remove("rowData");
+        attributes.remove("rowIndex");
+        attributes.remove("rowKey");
+        attributes.remove("rowKeyConverter");
+        attributes.remove("relativeRowIndex");
+        
         // TODO these must be tested in other way
         attributes.remove("componentState");
         attributes.remove("rowKeyVar");
         attributes.remove("stateVar");
+        attributes.remove("selection");
         attributes.remove("var");
         attributes.remove("value");
+        attributes.remove("keepSaved");
 
         // TODO can be these set as attributes or only as facets?
         attributes.remove("caption");
         attributes.remove("header");
         attributes.remove("footer");
         attributes.remove("noData");
+        
+        // facets initial values
+        facets.put("noData", "There is no data.");
+        facets.put("caption", "Caption");
+        facets.put("header", "Header");
+        facets.put("columnStateHeader", "State Header");
+        facets.put("columnStateFooter", "State Footer");
+        facets.put("columnCapitalHeader", "Capital Header");
+        facets.put("columnCapitalFooter", "Capital Footer");
     }
 
     public Attributes getAttributes() {
@@ -212,6 +243,11 @@
             setStatesOrder(SortOrder.ascending);
         }
     }
+    
+    public void sortReset() {
+        setStatesOrder(SortOrder.ascending);
+        setCapitalsOrder(SortOrder.unsorted);
+    }
 
     public Filter<?> getFilterSexImpl() {
         return new Filter<Employee>() {
@@ -238,8 +274,8 @@
             }
         };
     }
-
-    public void sortingListener(SortingEvent event) {
-        System.out.println(event.getSortOrder());
+    
+    public Map<String, String> getFacets() {
+        return facets;
     }
 }
Modified: modules/tests/metamer/trunk/application/src/main/resources/org/richfaces/tests/metamer/bean/RichDataTableBean.properties
===================================================================
--- modules/tests/metamer/trunk/application/src/main/resources/org/richfaces/tests/metamer/bean/RichDataTableBean.properties	2010-11-30 14:37:17 UTC (rev 20235)
+++ modules/tests/metamer/trunk/application/src/main/resources/org/richfaces/tests/metamer/bean/RichDataTableBean.properties	2010-11-30 16:17:53 UTC (rev 20236)
@@ -0,0 +1,2 @@
+attr.sortMode.single=single
+attr.sortMode.multi=multi
\ No newline at end of file
Copied: modules/tests/metamer/trunk/application/src/main/webapp/components/richDataTable/facets.xhtml (from rev 20207, modules/tests/metamer/trunk/application/src/main/webapp/components/richDataTable/simple.xhtml)
===================================================================
--- modules/tests/metamer/trunk/application/src/main/webapp/components/richDataTable/facets.xhtml	                        (rev 0)
+++ modules/tests/metamer/trunk/application/src/main/webapp/components/richDataTable/facets.xhtml	2010-11-30 16:17:53 UTC (rev 20236)
@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!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:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"
+      xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:a4j="http://richfaces.org/a4j"
+      xmlns:metamer="http://java.sun.com/jsf/composite/metamer" xmlns:rich="http://richfaces.org/rich">
+
+    <!--
+JBoss, Home of Professional Open Source
+Copyright 2010, Red Hat, Inc. and individual contributors
+by the @authors tag. See the copyright.txt in the distribution for a
+full listing of individual contributors.
+
+This is free software; you can redistribute it and/or modify it
+under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation; either version 2.1 of
+the License, or (at your option) any later version.
+
+This software 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 software; if not, write to the Free
+Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+02110-1301 USA, or see the FSF site: http://www.fsf.org.
+    -->
+
+    <ui:composition template="/templates/template.xhtml">
+
+        <ui:define name="head">
+            <f:metadata>
+                <f:viewParam name="templates" value="#{templateBean.templates}">
+                    <f:converter converterId="templatesListConverter" />
+                </f:viewParam>
+            </f:metadata>
+            <h:outputStylesheet library="css" name="richDataTable.css"/>
+        </ui:define>
+
+        <ui:define name="outOfTemplateBefore">
+            <br/>
+            <h:outputText value="Show data in table: " />
+            <h:selectBooleanCheckbox id="noDataCheckbox" value="#{richDataTableBean.state}">
+                <a4j:ajax render="richDataTable scroller1"/>
+            </h:selectBooleanCheckbox>
+            <br/><br/>
+        </ui:define>
+
+        <ui:define name="component">
+			
+            <rich:dataTable id="richDataTable"
+                            first="#{richDataTableBean.attributes['first'].value}"
+                            keepSaved="#{richDataTableBean.attributes['keepSaved'].value}"
+                            noDataLabel="#{richDataTableBean.attributes['noDataLabel'].value}"
+                            rendered="#{richDataTableBean.attributes['rendered'].value}"
+                            rows="#{richDataTableBean.attributes['rows'].value}"
+                            sortMode="#{richDataTableBean.attributes['sortMode'].value}"
+                            sortPriority="#{richDataTableBean.attributes['sortPriority'].value}"
+                            value="#{richDataTableBean.state ? model.capitals : null}"
+                            var="record"
+                            >
+
+                <f:facet name="noData">
+                    <h:outputText id="noData" value="#{richDataTableBean.facets['noData']}" style="color: red;"
+                    				rendered="#{not empty richDataTableBean.facets['noData']}"/>
+                </f:facet>
+
+                <f:facet name="caption">
+                    <h:outputText 	id="caption" value="#{richDataTableBean.facets['caption']}"
+                    				rendered="#{not empty richDataTableBean.facets['caption']}"/>
+                </f:facet>
+
+                <f:facet name="header">
+                    <h:outputText 	id="header" value="#{richDataTableBean.facets['header']}"
+                    				rendered="#{not empty richDataTableBean.facets['header']}" />
+                </f:facet>
+
+                <rich:column id="columnState" sortBy="#{record.state}">
+                    <f:facet name="header">
+                        <h:outputText id="columnHeaderState" value="#{richDataTableBean.facets['columnStateHeader']}"
+                        				rendered="#{not empty richDataTableBean.facets['columnStateHeader']}"/>
+                    </f:facet>
+
+                    <h:outputText value="#{record.state}" />
+                    <f:facet name="footer">
+                        <h:outputText id="columnFooterState" value="#{richDataTableBean.facets['columnStateFooter']}"
+                        				rendered="#{not empty richDataTableBean.facets['columnStateFooter']}"/>
+                    </f:facet>
+                </rich:column>
+
+                <rich:column id="columnCapital" sortBy="#{record.name}">
+                    <f:facet name="header">
+                        <h:outputText id="columnHeaderCapital" value="#{richDataTableBean.facets['columnCapitalHeader']}"
+                        				rendered="#{not empty richDataTableBean.facets['columnCapitalHeader']}"/>
+                    </f:facet>
+
+                    <h:outputText value="#{record.name}" />
+                    <f:facet name="footer">
+                        <h:outputText id="columnFooterCapital" value="#{richDataTableBean.facets['columnCapitalFooter']}"
+                        				rendered="#{not empty richDataTableBean.facets['columnCapitalFooter']}"/>
+                    </f:facet>
+                </rich:column>
+
+            </rich:dataTable>
+        </ui:define>
+
+        <ui:define name="outOfTemplateAfter">
+        	
+        	<a4j:ajax render="richDataTable">
+	        	<h:panelGrid columns="2">
+		        	<h:outputLabel value="No Data Facet: " />
+	        		<h:inputText id="noDataInput" value="#{richDataTableBean.facets['noData']}" />
+	        		
+	        		<h:outputLabel value="Caption Facet: " />
+	        		<h:inputText id="captionInput" value="#{richDataTableBean.facets['caption']}" />
+	        		
+	        		<h:outputLabel value="Header Facet:" />
+	        		<h:inputText id="headerInput" value="#{richDataTableBean.facets['header']}" />
+	        		
+	        		<h:outputLabel value="State Column Header:" />
+	        		<h:inputText id="columnStateHeaderInput" value="#{richDataTableBean.facets['columnStateHeader']}" />
+	        		
+	        		<h:outputLabel value="State Column Footer:" />
+	        		<h:inputText id="columnStateFooterInput" value="#{richDataTableBean.facets['columnStateFooter']}" />
+	        		
+	        		<h:outputLabel value="Capital Column Header:" />
+	        		<h:inputText id="columnCapitalHeaderInput" value="#{richDataTableBean.facets['columnCapitalHeader']}" />
+	        		
+	        		<h:outputLabel value="Capital Column Footer:" />
+	        		<h:inputText id="columnCapitalFooterInput" value="#{richDataTableBean.facets['columnCapitalFooter']}" />
+	        	</h:panelGrid>
+        	</a4j:ajax>
+        	            
+            <br/><br/>
+
+            <metamer:attributes value="#{richDataTableBean.attributes}" id="attributes" />
+        </ui:define>
+
+    </ui:composition>
+</html>
\ No newline at end of file
Modified: modules/tests/metamer/trunk/application/src/main/webapp/components/richDataTable/list.xhtml
===================================================================
--- modules/tests/metamer/trunk/application/src/main/webapp/components/richDataTable/list.xhtml	2010-11-30 14:37:17 UTC (rev 20235)
+++ modules/tests/metamer/trunk/application/src/main/webapp/components/richDataTable/list.xhtml	2010-11-30 16:17:53 UTC (rev 20236)
@@ -34,6 +34,10 @@
             <metamer:testPageLink id="simple" outcome="simple" value="Simple">
                 Simple page that contains <b>rich:dataTable</b> (with model containing capitals) and input boxes for all its attributes.
             </metamer:testPageLink>
+            
+            <metamer:testPageLink id="facets" outcome="facets" value="Facets">
+                Simple page that contains <b>rich:dataTable</b> (with model containing capitals) and input boxes for all its attributes.
+            </metamer:testPageLink>
 
             <metamer:testPageLink id="scroller" outcome="scroller" value="Data Scroller">
                 Page that contains <b>rich:dataTable</b> (with model containing capitals), data scroller and input boxes for all its attributes.
@@ -57,7 +61,7 @@
                 <b>rich:dataTable</b> (with model containing states and capitals) custom sorting by <b>rich:column</b>'s attribute @sortBy, @sortOrder. 
             </metamer:testPageLink>
 
-            <metamer:testPageLink id="filtering" outcome="filtering" value="Table filtering">
+            <metamer:testPageLink id="filtering" outcome="filtering" value="Table Filtering">
                 Page that contains filterable <b>rich:dataTable</b> (with model containing capitals) and input boxes for all its attributes.
             </metamer:testPageLink>
 
Modified: modules/tests/metamer/trunk/application/src/main/webapp/components/richDataTable/scroller.xhtml
===================================================================
--- modules/tests/metamer/trunk/application/src/main/webapp/components/richDataTable/scroller.xhtml	2010-11-30 14:37:17 UTC (rev 20235)
+++ modules/tests/metamer/trunk/application/src/main/webapp/components/richDataTable/scroller.xhtml	2010-11-30 16:17:53 UTC (rev 20236)
@@ -115,18 +115,7 @@
         </ui:define>
 
         <ui:define name="outOfTemplateAfter">
-            <h:commandButton id="sortStatesButton" value="sort state">
-                <rich:componentControl event="click" target="richDataTable" operation="sort"/>
-            </h:commandButton>
 
-            <h:commandButton id="sortCapitalsButton" value="sort capital">
-                <rich:componentControl event="click" target="richDataTable" operation="sort">
-                    <f:param value="columnCapital" />
-                </rich:componentControl>
-            </h:commandButton>
-
-            <br/><br/>
-
             <fieldset>
                 <legend>scroller1</legend>
 
Modified: modules/tests/metamer/trunk/application/src/main/webapp/components/richDataTable/simple.xhtml
===================================================================
--- modules/tests/metamer/trunk/application/src/main/webapp/components/richDataTable/simple.xhtml	2010-11-30 14:37:17 UTC (rev 20235)
+++ modules/tests/metamer/trunk/application/src/main/webapp/components/richDataTable/simple.xhtml	2010-11-30 16:17:53 UTC (rev 20236)
@@ -49,88 +49,30 @@
         <ui:define name="component">
 			
             <rich:dataTable id="richDataTable"
-                            filterVar="#{richDataTableBean.attributes['filterVar'].value}"
-                            filteringListeners="#{richDataTableBean.attributes['filteringListeners'].value}"
                             first="#{richDataTableBean.attributes['first'].value}"
-                            iterationState="#{richDataTableBean.attributes['iterationState'].value}"
-                            iterationStatusVar="#{richDataTableBean.attributes['iterationStatusVar'].value}"
                             keepSaved="#{richDataTableBean.attributes['keepSaved'].value}"
                             noDataLabel="#{richDataTableBean.attributes['noDataLabel'].value}"
-                            relativeRowIndex="#{richDataTableBean.attributes['relativeRowIndex'].value}"
                             rendered="#{richDataTableBean.attributes['rendered'].value}"
-                            rowAvailable="#{richDataTableBean.attributes['rowAvailable'].value}"
-                            rowCount="#{richDataTableBean.attributes['rowCount'].value}"
-                            rowData="#{richDataTableBean.attributes['rowData'].value}"
-                            rowIndex="#{richDataTableBean.attributes['rowIndex'].value}"
-                            rowKey="#{richDataTableBean.attributes['rowKey'].value}"
-                            rowKeyConverter="#{richDataTableBean.attributes['rowKeyConverter'].value}"
                             rows="#{richDataTableBean.attributes['rows'].value}"
                             sortMode="#{richDataTableBean.attributes['sortMode'].value}"
                             sortPriority="#{richDataTableBean.attributes['sortPriority'].value}"
-                            sortingListeners="#{richDataTableBean.attributes['sortingListeners'].value}"
                             value="#{richDataTableBean.state ? model.capitals : null}"
                             var="record"
                             >
 
-                <f:facet name="noData">
-                    <h:outputText value="There is no data." style="color: red;"/>
-                </f:facet>
-
-                <f:facet name="caption">
-                    <h:outputText id="captionFacet" value="Caption Facet" />
-                </f:facet>
-
-                <f:facet name="header">
-                    <h:outputText value="Header Facet" />
-                </f:facet>
-
                 <rich:column id="columnState" sortBy="#{record.state}">
-                    <f:facet name="header">
-                        <h:outputText id="columnHeaderState" value="State Header" />
-                    </f:facet>
-
                     <h:outputText value="#{record.state}" />
-                    <f:facet name="footer">
-                        <h:outputText id="columnFooterState" value="State Footer" />
-                    </f:facet>
                 </rich:column>
 
                 <rich:column id="columnCapital" sortBy="#{record.name}">
-                    <f:facet name="header">
-                        <h:outputText id="columnHeaderCapital" value="Capital Header" />
-                    </f:facet>
-
                     <h:outputText value="#{record.name}" />
-                    <f:facet name="footer">
-                        <h:outputText id="columnFooterCapital" value="Capital Footer" />
-                    </f:facet>
                 </rich:column>
 
             </rich:dataTable>
         </ui:define>
 
         <ui:define name="outOfTemplateAfter">
-            
-            <h:commandButton id="sortStatesButton" value="sort states">
-                <rich:componentControl event="click" target="richDataTable" operation="sort">
-                	<f:param value="columnState" />
-                </rich:componentControl>
-            </h:commandButton>
 
-            <h:commandButton id="sortCapitalsButton" value="sort capitals">
-                <rich:componentControl event="click" target="richDataTable" operation="sort">
-                    <f:param value="columnCapital" />
-                </rich:componentControl>
-            </h:commandButton>
-			
-			<br/><br/>
-			
-			<h:commandButton id="sortTableButton" value="sort table">
-                <rich:componentControl event="click" target="richDataTable" operation="sort" />
-            </h:commandButton>
-            
-            <br/><br/>
-
             <metamer:attributes value="#{richDataTableBean.attributes}" id="attributes" />
         </ui:define>
 
Modified: modules/tests/metamer/trunk/application/src/main/webapp/components/richDataTable/sorting-using-column.xhtml
===================================================================
--- modules/tests/metamer/trunk/application/src/main/webapp/components/richDataTable/sorting-using-column.xhtml	2010-11-30 14:37:17 UTC (rev 20235)
+++ modules/tests/metamer/trunk/application/src/main/webapp/components/richDataTable/sorting-using-column.xhtml	2010-11-30 16:17:53 UTC (rev 20236)
@@ -79,7 +79,7 @@
 
                 <rich:column id="columnState" sortBy="#{record.state}" sortOrder="#{richDataTableBean.statesOrder}">
                     <f:facet name="header">
-                        <a4j:commandLink id="columnHeaderState" value="State" render="richDataTable" action="#{richDataTableBean.sortByStates}"/>
+                        <a4j:commandLink id="sortStates" value="State" render="richDataTable" action="#{richDataTableBean.sortByStates}"/>
                     </f:facet>
 
                     <h:outputText value="#{record.state}" />
@@ -90,7 +90,7 @@
 
                 <rich:column id="columnCapital" sortBy="#{record.name}" sortOrder="#{richDataTableBean.capitalsOrder}" sortingListeners="#{richDataTableBean.sortingListener}">
                     <f:facet name="header">
-                        <a4j:commandLink id="columnHeaderCapital" value="Capital" render="richDataTable" action="#{richDataTableBean.sortByCapitals}"/>
+                        <a4j:commandLink id="sortCapitals" value="Capital" render="richDataTable" action="#{richDataTableBean.sortByCapitals}"/>
                     </f:facet>
 
                     <h:outputText value="#{record.name}" />
@@ -104,6 +104,9 @@
                 </f:facet>
 
             </rich:dataTable>
+            
+            <a4j:commandButton id="sortReset" value="Reset Sorting" render="richDataTable" action="#{richDataTableBean.sortReset}"/>
+            
         </ui:define>
 
         <ui:define name="outOfTemplateAfter">
Modified: modules/tests/metamer/trunk/application/src/main/webapp/components/richDataTable/sorting-using-component-control.xhtml
===================================================================
--- modules/tests/metamer/trunk/application/src/main/webapp/components/richDataTable/sorting-using-component-control.xhtml	2010-11-30 14:37:17 UTC (rev 20235)
+++ modules/tests/metamer/trunk/application/src/main/webapp/components/richDataTable/sorting-using-component-control.xhtml	2010-11-30 16:17:53 UTC (rev 20236)
@@ -79,7 +79,11 @@
 
                 <rich:column id="columnState" sortBy="#{record.state}" sortOrder="#{richDataTableBean.statesOrder}">
                     <f:facet name="header">
-                        State
+                        <h:commandLink id="sortStates" value="State">
+			                <rich:componentControl event="click" target="richDataTable" operation="sort">
+			                	<f:param value="columnState" />
+			                </rich:componentControl>
+			            </h:commandLink>
                     </f:facet>
 
                     <h:outputText value="#{record.state}" />
@@ -90,7 +94,11 @@
 
                 <rich:column id="columnCapital" sortBy="#{record.name}" sortOrder="#{richDataTableBean.capitalsOrder}">
                     <f:facet name="header">
-                        Capital
+                        <h:commandLink id="sortCapitals" value="Capital">
+			                <rich:componentControl event="click" target="richDataTable" operation="sort">
+			                    <f:param value="columnCapital" />
+			                </rich:componentControl>
+			            </h:commandLink>
                     </f:facet>
 
                     <h:outputText value="#{record.name}" />
@@ -104,29 +112,13 @@
                 </f:facet>
 
             </rich:dataTable>
-        </ui:define>
-
-        <ui:define name="outOfTemplateAfter">
-            <h:commandButton id="sortStatesButton" value="sort state">
-                <rich:componentControl event="click" target="richDataTable" operation="sort">
-                	<f:param value="columnState" />
-                </rich:componentControl>
-            </h:commandButton>
-
-            <h:commandButton id="sortCapitalsButton" value="sort capital">
-                <rich:componentControl event="click" target="richDataTable" operation="sort">
-                    <f:param value="columnCapital" />
-                </rich:componentControl>
-            </h:commandButton>
-
-            <br/><br/>
             
-            <h:commandButton id="sortTableButton" value="sort table">
+            <h:commandButton id="sortReset" value="Reset Sorting">
                 <rich:componentControl event="click" target="richDataTable" operation="sort" />
             </h:commandButton>
+        </ui:define>
 
-            <br/><br/>
-
+        <ui:define name="outOfTemplateAfter">
             <metamer:attributes value="#{richDataTableBean.attributes}" id="attributes" />
         </ui:define>
 
                                
                         
                        
                                
                                14 years, 11 months