JBoss Rich Faces SVN: r17692 - in root/cdk/branches/RF8755/plugins/generator/src: main/java/org/richfaces/cdk/generate/freemarker and 10 other directories.
                                
                                
                                
                                    
                                        by richfaces-svn-commits@lists.jboss.org
                                    
                                
                                
                                        Author: alexsmirnov
Date: 2010-06-30 19:15:43 -0400 (Wed, 30 Jun 2010)
New Revision: 17692
Added:
   root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/freemarker/FreeMarkerWriter.java
   root/cdk/branches/RF8755/plugins/generator/src/test/java/org/richfaces/cdk/templatecompiler/model/TemplateParserTest.java
Removed:
   root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/taghandler/TagHandlerModule.java
   root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/FreeMarkerRenderer.java
   root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/TemplateStatementsContainerBase.java
   root/cdk/branches/RF8755/plugins/generator/src/test/java/org/richfaces/cdk/templatecompiler/model/TemplateTest.java
Modified:
   root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/Generator.java
   root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/freemarker/CdkConfiguration.java
   root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/freemarker/FreeMakerModule.java
   root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/freemarker/FreeMarkerRenderer.java
   root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/BehaviorClassGenerator.java
   root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/ClassGeneratorModule.java
   root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/ComponentClassGenerator.java
   root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/ConverterClassGenerator.java
   root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/EventSourceInterfaceGenerator.java
   root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/ValidatorClassGenerator.java
   root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/taghandler/ListenerTagHandlerGenerator.java
   root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/taghandler/TagHandlerClassGenerator.java
   root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/JavaClassConfiguration.java
   root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/JavaClassModelWrapper.java
   root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/RendererClassGenerator.java
   root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/RendererClassVisitor.java
   root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/TemplateModule.java
   root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/builder/model/JavaClass.java
   root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/builder/model/JavaImport.java
   root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/el/ELVisitor.java
   root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/el/types/NullType.java
   root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/ConstantReturnMethodBodyStatement.java
   root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/DefineObjectStatement.java
   root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/ElementStatement.java
   root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/EncodeMethodPrefaceStatement.java
   root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/EndElementStatement.java
   root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/ForEachStatement.java
   root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/HelperMethodFactoryImpl.java
   root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/IfElseStatement.java
   root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/StartElementStatement.java
   root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/StatementsContainer.java
   root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/TemplateStatementBase.java
   root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/WriteAttributeStatement.java
   root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/WriteAttributesSetStatement.java
   root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/WriteTextStatement.java
   root/cdk/branches/RF8755/plugins/generator/src/test/java/org/richfaces/cdk/LibraryBuilderTest.java
   root/cdk/branches/RF8755/plugins/generator/src/test/java/org/richfaces/cdk/generate/java/AbstractClassGeneratorTest.java
Log:
improve template-based statements
Modified: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/Generator.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/Generator.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/Generator.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -36,7 +36,6 @@
 import org.richfaces.cdk.apt.AptModule;
 import org.richfaces.cdk.generate.freemarker.FreeMakerModule;
 import org.richfaces.cdk.generate.java.ClassGeneratorModule;
-import org.richfaces.cdk.generate.java.taghandler.TagHandlerModule;
 import org.richfaces.cdk.generate.taglib.TaglibModule;
 import org.richfaces.cdk.model.ModelModule;
 import org.richfaces.cdk.model.validator.ValidatorImpl;
@@ -48,9 +47,7 @@
 import com.google.inject.Guice;
 import com.google.inject.Injector;
 import com.google.inject.Stage;
-import com.google.inject.TypeLiteral;
 import com.google.inject.name.Names;
-import com.google.inject.util.Providers;
 
 /**
  * @author asmirnov
@@ -118,7 +115,7 @@
     public void init() {
         injector =
             Guice.createInjector(Stage.PRODUCTION, new CdkConfigurationModule(), new AptModule(), new ModelModule(),
-                new ClassGeneratorModule(), new TagHandlerModule(), new FreeMakerModule(), new TemplateModule(),
+                new FreeMakerModule(),new ClassGeneratorModule(),  new TemplateModule(),
                 new XmlModule(), new TaglibModule());
 
         if (!log.isDebugEnabled()) {
@@ -179,16 +176,9 @@
             }
             bind(NamingConventions.class).to(RichFacesConventions.class);
             bind(ModelValidator.class).to(ValidatorImpl.class);
-
-            bind(new TypeLiteral<Map<String, String>>() {
-            }).annotatedWith(Names.named(OPTIONS)).toInstance(options);
-            bindOption(RENDERER_UTILS_CLASS);
+            Names.bindProperties(binder(), options);
         }
 
-        private void bindOption(String name) {
-            bind(String.class).annotatedWith(Names.named(name)).toProvider(
-                Providers.of(options.get(name)));
-        }
 
     }
 
Modified: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/freemarker/CdkConfiguration.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/freemarker/CdkConfiguration.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/freemarker/CdkConfiguration.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -23,22 +23,30 @@
 
 package org.richfaces.cdk.generate.freemarker;
 
+import java.io.IOException;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.util.Map;
+
 import org.richfaces.cdk.Logger;
 
 import com.google.inject.Inject;
 
 import freemarker.template.Configuration;
 import freemarker.template.ObjectWrapper;
+import freemarker.template.TemplateException;
+import freemarker.template.TemplateModelException;
 
 /**
- * <p class="changed_added_4_0"></p>
- *
+ * <p class="changed_added_4_0">
+ * </p>
+ * 
  * @author asmirnov(a)exadel.com
  */
-public class CdkConfiguration extends Configuration {
-    
+public class CdkConfiguration extends Configuration implements FreeMarkerRenderer {
+
     private static final String TEMPLATES = "/META-INF/templates";
-    
+
     private Logger log;
 
     @Inject
@@ -47,12 +55,56 @@
         this.log = log;
 
         // load templates from plugin classloader.
-        setClassForTemplateLoading(this.getClass(), TEMPLATES);
+        setClassForTemplateLoading(this.getClass(), getTemplatesFolder());
         setTemplateUpdateDelay(10000);// Forever...
         setSharedVariable("utils", utils);
         setObjectWrapper(wrapper);
-
         // Add context variables
-//        this.setSharedVariable("context", new BeanModel(context, new BeansWrapper()));
+        // this.setSharedVariable("context", new BeanModel(context, new BeansWrapper()));
     }
+
+    @Inject(optional=true)
+    protected void setSharedVariables(Map<String,Object> variables) {
+        // template method for subclasses.
+        for (Map.Entry<String,Object> entry : variables.entrySet()) {
+            try {
+                setSharedVariable(entry.getKey(), entry.getValue());
+            } catch (TemplateModelException e) {
+                log.error("Error to set shared variable "+entry.getKey(), e);
+            }
+        }
+    }
+
+    @Override
+    public void writeTemplate(String templateName, Object object, Writer writer) throws IOException, TemplateException {
+        getTemplate(templateName).process(object, writer);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.richfaces.cdk.templatecompiler.FreeMarkerRenderer#renderSnippet(java.lang.String, java.lang.Object)
+     */
+    @Override
+    public String renderTemplate(String templateName, Object object) {
+        StringWriter writer = new StringWriter();
+        try {
+            writeTemplate(templateName, object, writer);
+            return writer.toString();
+        } catch (IOException e) {
+            log.error("Error rendering template", e);
+            return e.getMessage();
+        } catch (TemplateException e) {
+            log.error("Error rendering template", e);
+            return e.getMessage();
+        }
+    }
+
+    /**
+     * <p class="changed_added_4_0"></p>
+     * @return the templates
+     */
+    public static String getTemplatesFolder() {
+        return TEMPLATES;
+    }
 }
Modified: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/freemarker/FreeMakerModule.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/freemarker/FreeMakerModule.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/freemarker/FreeMakerModule.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -25,9 +25,6 @@
 
 import com.google.inject.AbstractModule;
 
-import freemarker.template.Configuration;
-import freemarker.template.ObjectWrapper;
-
 /**
  * <p class="changed_added_4_0"></p>
  * @author asmirnov(a)exadel.com
@@ -37,8 +34,7 @@
 
     @Override
     protected void configure() {
-        bind(Configuration.class).to(CdkConfiguration.class);
-        bind(ObjectWrapper.class).to(LibraryModelWrapper.class);
+        bind(FreeMarkerRenderer.class).to(CdkConfiguration.class);
     }
 
 }
Modified: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/freemarker/FreeMarkerRenderer.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/freemarker/FreeMarkerRenderer.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/freemarker/FreeMarkerRenderer.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -1,104 +1,15 @@
-/*
- * $Id$
- *
- * License Agreement.
- *
- * Rich Faces - Natural Ajax for Java Server Faces (JSF)
- *
- * 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.cdk.generate.freemarker;
 
-import java.io.File;
 import java.io.IOException;
 import java.io.Writer;
 
-import org.richfaces.cdk.CdkException;
-import org.richfaces.cdk.CdkWriter;
-import org.richfaces.cdk.FileManager;
-import org.richfaces.cdk.model.ClassName;
-import org.richfaces.cdk.model.ComponentLibrary;
-import org.richfaces.cdk.model.ModelElementBase;
-import org.richfaces.cdk.model.Trackable;
-
-import freemarker.template.Configuration;
 import freemarker.template.TemplateException;
 
-/**
- * <p class="changed_added_4_0">Base class for all output file buildes that use FreeMarker as template engine.</p>
- * @author asmirnov(a)exadel.com
- *
- */
-public abstract class FreeMarkerRenderer<C> implements CdkWriter {
+public interface FreeMarkerRenderer {
 
+    public void writeTemplate(String templateName, Object object, Writer writer)
+        throws IOException, TemplateException;
 
-    private final Configuration configuration;
+    public String renderTemplate(String templateName, Object object);
 
-    private final FileManager output;
-
-    public FreeMarkerRenderer(Configuration configuration, FileManager output) {
-        this.configuration = configuration;
-        this.output = output;
-    }
-
-    public void generate(ComponentLibrary library,C c) throws CdkException {
-        try {
-            Writer out = getOutput(library, c);
-            if(null != out){
-                configuration.getTemplate(getTemplateName()).process(c, out);
-                out.close();
-            }
-        } catch (IOException e) {
-            throw new CdkException(e);
-        } catch (TemplateException e) {
-            throw new CdkException(e);
-        }
-    }
-
-    protected Writer getOutput(ComponentLibrary library, C c) throws CdkException {
-        long lastModified = Long.MIN_VALUE;
-
-        if (c instanceof Trackable) {
-            Trackable trackuble = (Trackable) c;
-            lastModified = trackuble.lastModified();
-        }
-
-        try {
-            return output.createOutput(getOutputFileName(c), lastModified);
-        } catch (IOException e) {
-            throw new CdkException(e);
-        }
-    }
-
-    protected String getOutputFileName(C c) throws CdkException {
-        if (c instanceof ModelElementBase) {
-            ModelElementBase modelElement = (ModelElementBase) c;
-            return modelElement.getTargetClass().getName().replace('.', File.separatorChar) + ".java";
-        } else {
-            throw new CdkException("Unknown model object " + c);
-        }
-    }
-    
-    protected String getJavaFileName(ClassName targetClass){
-        return targetClass.getName().replace('.', File.separatorChar) + ".java";
-    }
-
-    protected abstract String getTemplateName();
-
-}
+}
\ No newline at end of file
Copied: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/freemarker/FreeMarkerWriter.java (from rev 17685, root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/freemarker/FreeMarkerRenderer.java)
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/freemarker/FreeMarkerWriter.java	                        (rev 0)
+++ root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/freemarker/FreeMarkerWriter.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -0,0 +1,103 @@
+/*
+ * $Id$
+ *
+ * License Agreement.
+ *
+ * Rich Faces - Natural Ajax for Java Server Faces (JSF)
+ *
+ * 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.cdk.generate.freemarker;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.Writer;
+
+import org.richfaces.cdk.CdkException;
+import org.richfaces.cdk.CdkWriter;
+import org.richfaces.cdk.FileManager;
+import org.richfaces.cdk.model.ClassName;
+import org.richfaces.cdk.model.ComponentLibrary;
+import org.richfaces.cdk.model.ModelElementBase;
+import org.richfaces.cdk.model.Trackable;
+
+import freemarker.template.TemplateException;
+
+/**
+ * <p class="changed_added_4_0">Base class for all output file buildes that use FreeMarker as template engine.</p>
+ * @author asmirnov(a)exadel.com
+ *
+ */
+public abstract class FreeMarkerWriter<C> implements CdkWriter {
+
+
+    private final FreeMarkerRenderer configuration;
+
+    private final FileManager output;
+
+    public FreeMarkerWriter(FreeMarkerRenderer configuration, FileManager output) {
+        this.configuration = configuration;
+        this.output = output;
+    }
+
+    public void generate(ComponentLibrary library,C c) throws CdkException {
+        try {
+            Writer out = getOutput(library, c);
+            if(null != out){
+                configuration.writeTemplate(getTemplateName(),c, out);
+                out.close();
+            }
+        } catch (IOException e) {
+            throw new CdkException(e);
+        } catch (TemplateException e) {
+            throw new CdkException(e);
+        }
+    }
+
+    protected Writer getOutput(ComponentLibrary library, C c) throws CdkException {
+        long lastModified = Long.MIN_VALUE;
+
+        if (c instanceof Trackable) {
+            Trackable trackuble = (Trackable) c;
+            lastModified = trackuble.lastModified();
+        }
+
+        try {
+            return output.createOutput(getOutputFileName(c), lastModified);
+        } catch (IOException e) {
+            throw new CdkException(e);
+        }
+    }
+
+    protected String getOutputFileName(C c) throws CdkException {
+        if (c instanceof ModelElementBase) {
+            ModelElementBase modelElement = (ModelElementBase) c;
+            return modelElement.getTargetClass().getName().replace('.', File.separatorChar) + ".java";
+        } else {
+            throw new CdkException("Unknown model object " + c);
+        }
+    }
+    
+    protected String getJavaFileName(ClassName targetClass){
+        return targetClass.getName().replace('.', File.separatorChar) + ".java";
+    }
+
+    protected abstract String getTemplateName();
+
+}
Property changes on: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/freemarker/FreeMarkerWriter.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + LastChangedDate LastChangedRevision LastChangedBy HeadURL Id
Modified: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/BehaviorClassGenerator.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/BehaviorClassGenerator.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/BehaviorClassGenerator.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -30,21 +30,20 @@
 import org.richfaces.cdk.Output;
 import org.richfaces.cdk.Outputs;
 import org.richfaces.cdk.generate.freemarker.FreeMarkerRenderer;
+import org.richfaces.cdk.generate.freemarker.FreeMarkerWriter;
 import org.richfaces.cdk.model.BehaviorModel;
 import org.richfaces.cdk.model.ComponentLibrary;
 
 import com.google.inject.Inject;
 
-import freemarker.template.Configuration;
-
 /**
  * @author akolonitsky
  * @since Jan 21, 2010
  */
-public class BehaviorClassGenerator extends FreeMarkerRenderer<BehaviorModel> implements CdkWriter {
+public class BehaviorClassGenerator extends FreeMarkerWriter<BehaviorModel> implements CdkWriter {
 
     @Inject
-    public BehaviorClassGenerator(Configuration configuration, 
+    public BehaviorClassGenerator(FreeMarkerRenderer configuration, 
                                   @Output(Outputs.JAVA_CLASSES) FileManager output) {
         super(configuration, output);
     }
Modified: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/ClassGeneratorModule.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/ClassGeneratorModule.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/ClassGeneratorModule.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -23,19 +23,31 @@
 
 package org.richfaces.cdk.generate.java;
 
+import java.util.Set;
+
 import org.richfaces.cdk.CdkWriter;
+import org.richfaces.cdk.generate.freemarker.LibraryModelWrapper;
+import org.richfaces.cdk.generate.java.taghandler.ListenerTagHandlerGenerator;
+import org.richfaces.cdk.generate.java.taghandler.TagHandlerWriter;
 
-import com.google.inject.AbstractModule;
+import com.google.inject.PrivateModule;
+import com.google.inject.TypeLiteral;
 import com.google.inject.multibindings.Multibinder;
 
+import freemarker.template.ObjectWrapper;
+
 /**
- * <p class="changed_added_4_0"></p>
+ * <p class="changed_added_4_0">
+ * </p>
+ * 
  * @author asmirnov(a)exadel.com
- *
+ * 
  */
-public class ClassGeneratorModule extends AbstractModule {
+public class ClassGeneratorModule extends PrivateModule {
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see com.google.inject.AbstractModule#configure()
      */
     @Override
@@ -46,6 +58,11 @@
         setBinder.addBinding().to(ValidatorClassGenerator.class);
         setBinder.addBinding().to(BehaviorClassGenerator.class);
         setBinder.addBinding().to(EventSourceInterfaceGenerator.class);
+        setBinder.addBinding().to(TagHandlerWriter.class);
+        setBinder.addBinding().to(ListenerTagHandlerGenerator.class);
+        TypeLiteral<Set<CdkWriter>> writersType = new TypeLiteral<Set<CdkWriter>>(){};
+        expose(writersType);
+        bind(ObjectWrapper.class).to(LibraryModelWrapper.class);
     }
 
 }
Modified: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/ComponentClassGenerator.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/ComponentClassGenerator.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/ComponentClassGenerator.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -33,22 +33,21 @@
 import org.richfaces.cdk.Output;
 import org.richfaces.cdk.Outputs;
 import org.richfaces.cdk.generate.freemarker.FreeMarkerRenderer;
+import org.richfaces.cdk.generate.freemarker.FreeMarkerWriter;
 import org.richfaces.cdk.model.ComponentLibrary;
 import org.richfaces.cdk.model.ComponentModel;
 
 import com.google.inject.Inject;
 
-import freemarker.template.Configuration;
-
 /**
  * <p class="changed_added_4_0"></p>
  * @author asmirnov(a)exadel.com
  *
  */
-public class ComponentClassGenerator extends FreeMarkerRenderer<ComponentModel> implements CdkWriter {
+public class ComponentClassGenerator extends FreeMarkerWriter<ComponentModel> implements CdkWriter {
 
     @Inject
-    public ComponentClassGenerator(Configuration configuration,  @Output(Outputs.JAVA_CLASSES) FileManager output) {
+    public ComponentClassGenerator(FreeMarkerRenderer configuration,  @Output(Outputs.JAVA_CLASSES) FileManager output) {
         super(configuration, output);
     }
 
Modified: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/ConverterClassGenerator.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/ConverterClassGenerator.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/ConverterClassGenerator.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -30,21 +30,20 @@
 import org.richfaces.cdk.Output;
 import org.richfaces.cdk.Outputs;
 import org.richfaces.cdk.generate.freemarker.FreeMarkerRenderer;
+import org.richfaces.cdk.generate.freemarker.FreeMarkerWriter;
 import org.richfaces.cdk.model.ComponentLibrary;
 import org.richfaces.cdk.model.ConverterModel;
 
 import com.google.inject.Inject;
 
-import freemarker.template.Configuration;
-
 /**
  * @author akolonitsky
  * @since Jan 20, 2010
  */
-public class ConverterClassGenerator extends FreeMarkerRenderer<ConverterModel> implements CdkWriter {
+public class ConverterClassGenerator extends FreeMarkerWriter<ConverterModel> implements CdkWriter {
 
     @Inject
-    public ConverterClassGenerator(Configuration configuration, 
+    public ConverterClassGenerator(FreeMarkerRenderer configuration, 
         @Output(Outputs.JAVA_CLASSES) FileManager output) {
         super(configuration,  output);
     }
Modified: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/EventSourceInterfaceGenerator.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/EventSourceInterfaceGenerator.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/EventSourceInterfaceGenerator.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -31,21 +31,20 @@
 import org.richfaces.cdk.Output;
 import org.richfaces.cdk.Outputs;
 import org.richfaces.cdk.generate.freemarker.FreeMarkerRenderer;
+import org.richfaces.cdk.generate.freemarker.FreeMarkerWriter;
 import org.richfaces.cdk.model.ComponentLibrary;
 import org.richfaces.cdk.model.EventModel;
 
 import com.google.inject.Inject;
 
-import freemarker.template.Configuration;
-
 /**
  * @author asmirnov
  * @since Jan 20, 2010
  */
-public class EventSourceInterfaceGenerator extends FreeMarkerRenderer<EventModel> implements CdkWriter {
+public class EventSourceInterfaceGenerator extends FreeMarkerWriter<EventModel> implements CdkWriter {
 
     @Inject
-    public EventSourceInterfaceGenerator(Configuration configuration, 
+    public EventSourceInterfaceGenerator(FreeMarkerRenderer configuration, 
         @Output(Outputs.JAVA_CLASSES) FileManager output) {
         super(configuration,  output);
     }
Modified: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/ValidatorClassGenerator.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/ValidatorClassGenerator.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/ValidatorClassGenerator.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -30,21 +30,20 @@
 import org.richfaces.cdk.Output;
 import org.richfaces.cdk.Outputs;
 import org.richfaces.cdk.generate.freemarker.FreeMarkerRenderer;
+import org.richfaces.cdk.generate.freemarker.FreeMarkerWriter;
 import org.richfaces.cdk.model.ComponentLibrary;
 import org.richfaces.cdk.model.ValidatorModel;
 
 import com.google.inject.Inject;
 
-import freemarker.template.Configuration;
-
 /**
  * @author akolonitsky
  * @since Jan 15, 2010
  */
-public class ValidatorClassGenerator extends FreeMarkerRenderer<ValidatorModel> implements CdkWriter {
+public class ValidatorClassGenerator extends FreeMarkerWriter<ValidatorModel> implements CdkWriter {
     
     @Inject
-    public ValidatorClassGenerator(Configuration configuration, @Output(Outputs.JAVA_CLASSES) FileManager output) {
+    public ValidatorClassGenerator(FreeMarkerRenderer configuration, @Output(Outputs.JAVA_CLASSES) FileManager output) {
         super(configuration, output);
     }
 
Modified: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/taghandler/ListenerTagHandlerGenerator.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/taghandler/ListenerTagHandlerGenerator.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/taghandler/ListenerTagHandlerGenerator.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -32,22 +32,21 @@
 import org.richfaces.cdk.Outputs;
 import org.richfaces.cdk.annotations.TagType;
 import org.richfaces.cdk.generate.freemarker.FreeMarkerRenderer;
+import org.richfaces.cdk.generate.freemarker.FreeMarkerWriter;
 import org.richfaces.cdk.model.ComponentLibrary;
 import org.richfaces.cdk.model.EventModel;
 import org.richfaces.cdk.model.TagModel;
 
 import com.google.inject.Inject;
 
-import freemarker.template.Configuration;
-
 /**
  * @author akolonitsky
  * @since Jan 20, 2010
  */
-public class ListenerTagHandlerGenerator extends FreeMarkerRenderer<TagWithModel<EventModel>> implements CdkWriter {
+public class ListenerTagHandlerGenerator extends FreeMarkerWriter<TagWithModel<EventModel>> implements CdkWriter {
 
     @Inject
-    public ListenerTagHandlerGenerator(Configuration configuration, 
+    public ListenerTagHandlerGenerator(FreeMarkerRenderer configuration, 
         @Output(Outputs.JAVA_CLASSES) FileManager output) {
         super(configuration, output);
     }
Modified: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/taghandler/TagHandlerClassGenerator.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/taghandler/TagHandlerClassGenerator.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/taghandler/TagHandlerClassGenerator.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -30,13 +30,13 @@
 import org.richfaces.cdk.FileManager;
 import org.richfaces.cdk.Output;
 import org.richfaces.cdk.Outputs;
+import org.richfaces.cdk.generate.freemarker.FreeMarkerRenderer;
 import org.richfaces.cdk.model.ModelElementBase;
 import org.richfaces.cdk.model.TagModel;
 import org.richfaces.cdk.model.Trackable;
 
 import com.google.inject.Inject;
 
-import freemarker.template.Configuration;
 import freemarker.template.TemplateException;
 
 /**
@@ -49,10 +49,10 @@
 
     private final FileManager output;
 
-    private final Configuration configuration;
+    private final FreeMarkerRenderer configuration;
 
     @Inject
-    public TagHandlerClassGenerator(Configuration configuration, @Output(Outputs.JAVA_CLASSES) FileManager output) {
+    public TagHandlerClassGenerator(FreeMarkerRenderer configuration, @Output(Outputs.JAVA_CLASSES) FileManager output) {
         this.configuration = configuration;
         this.output = output;
     }
@@ -60,7 +60,7 @@
     public boolean process(ModelElementBase model, TagModel tag) throws CdkException {
         try {
             Writer writer = getOutput(tag);
-            configuration.getTemplate(TAGHANDLER_TEMPLATE).process(new TagWithModel<ModelElementBase>(tag, model),
+            configuration.writeTemplate(TAGHANDLER_TEMPLATE,new TagWithModel<ModelElementBase>(tag, model),
                 writer);
             writer.close();
         } catch (IOException e) {
Deleted: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/taghandler/TagHandlerModule.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/taghandler/TagHandlerModule.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/taghandler/TagHandlerModule.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -1,44 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright , 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.cdk.generate.java.taghandler;
-
-import org.richfaces.cdk.CdkWriter;
-
-import com.google.inject.AbstractModule;
-import com.google.inject.multibindings.Multibinder;
-
-/**
- * @author akolonitsky
- * @since Feb 22, 2010
- */
-public class TagHandlerModule extends AbstractModule {
-
-    @Override
-    protected void configure() {
-        Multibinder<CdkWriter> multibinder = Multibinder.newSetBinder(binder(), CdkWriter.class);
-        multibinder
-                .addBinding().to(TagHandlerWriter.class);
-        multibinder
-                .addBinding().to(ListenerTagHandlerGenerator.class);
-    }
-}
Deleted: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/FreeMarkerRenderer.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/FreeMarkerRenderer.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/FreeMarkerRenderer.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -1,15 +0,0 @@
-package org.richfaces.cdk.templatecompiler;
-
-import java.io.IOException;
-import java.io.Writer;
-
-import freemarker.template.TemplateException;
-
-public interface FreeMarkerRenderer {
-
-    public void writeSnippet(String templateName, Object object, Writer writer)
-        throws IOException, TemplateException;
-
-    public String renderSnippet(String templateName, Object object);
-
-}
\ No newline at end of file
Modified: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/JavaClassConfiguration.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/JavaClassConfiguration.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/JavaClassConfiguration.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -29,6 +29,8 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import org.richfaces.cdk.generate.freemarker.FreeMarkerRenderer;
+
 import freemarker.template.Configuration;
 import freemarker.template.Template;
 import freemarker.template.TemplateException;
@@ -47,7 +49,7 @@
         setClassForTemplateLoading(this.getClass(), TEMPLATES);
 
         // TODO create an object wrapper for library model.
-        setObjectWrapper(new JavaClassModelWrapper(this));
+        setObjectWrapper(new JavaClassModelWrapper());
 
         // Add context variables
 //        this.setSharedVariable("context", new BeanModel(context, new BeansWrapper()));
@@ -56,7 +58,7 @@
     /* (non-Javadoc)
      * @see org.richfaces.cdk.templatecompiler.FreeMarkerRenderer#writeSnippet(java.lang.String, java.lang.Object, java.io.Writer)
      */
-    public void writeSnippet(String templateName, Object object, Writer writer) throws IOException, TemplateException {
+    public void writeTemplate(String templateName, Object object, Writer writer) throws IOException, TemplateException {
         Template t = getTemplate(templateName + ".ftl");
         Map<String, Object> rootMap = new HashMap<String, Object>();
         rootMap.put("modelItem", object);
@@ -72,10 +74,10 @@
     /* (non-Javadoc)
     * @see org.richfaces.cdk.templatecompiler.FreeMarkerRenderer#renderSnippet(java.lang.String, java.lang.Object)
     */
-    public String renderSnippet(String templateName, Object object) {
+    public String renderTemplate(String templateName, Object object) {
         StringWriter writer = new StringWriter();
         try {
-            writeSnippet(templateName, object, writer);
+            writeTemplate(templateName, object, writer);
 
             return writer.toString();
         } catch (IOException e) {
Modified: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/JavaClassModelWrapper.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/JavaClassModelWrapper.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/JavaClassModelWrapper.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -9,10 +9,8 @@
 
 public class JavaClassModelWrapper extends BeansWrapper implements ObjectWrapper {
 
-    private final JavaClassConfiguration configuration;
 
-    public JavaClassModelWrapper(JavaClassConfiguration configuration) {
-        this.configuration = configuration;
+    public JavaClassModelWrapper() {
     }
 
     @Override
@@ -30,13 +28,5 @@
         return templateModel;
     }
 
-    /**
-     * <p class="changed_added_4_0"></p>
-     *
-     * @return the configuration
-     */
-    public JavaClassConfiguration getConfiguration() {
-        return configuration;
-    }
 
 }
Modified: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/RendererClassGenerator.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/RendererClassGenerator.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/RendererClassGenerator.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -33,6 +33,7 @@
 import org.richfaces.cdk.Logger;
 import org.richfaces.cdk.Output;
 import org.richfaces.cdk.Outputs;
+import org.richfaces.cdk.generate.freemarker.FreeMarkerRenderer;
 import org.richfaces.cdk.model.ComponentLibrary;
 import org.richfaces.cdk.model.ComponentModel;
 import org.richfaces.cdk.model.ModelSet;
@@ -115,7 +116,7 @@
                             output.createOutput(fullName.replace('.', '/') + ".java", library.lastModified());
 
                         if (null != outFile) {
-                            this.renderer.writeSnippet("class", javaClass, outFile);
+                            this.renderer.writeTemplate("class", javaClass, outFile);
                             outFile.close();
                         }
                     } catch (IOException e) {
Modified: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/RendererClassVisitor.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/RendererClassVisitor.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/RendererClassVisitor.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -104,6 +104,7 @@
 
 import com.google.common.base.Function;
 import com.google.common.collect.Collections2;
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.inject.Injector;
 
@@ -145,6 +146,13 @@
      */
     static final String CLIENT_ID_VARIABLE = "clientId";
 
+    static final ImmutableMap<String, Object> ENCODE_METHOD_VARIABLES = ImmutableMap.<String, Object>builder()
+    .put("facesContextVariable", RendererClassVisitor.FACES_CONTEXT_VARIABLE)
+    .put("componentVariable", RendererClassVisitor.COMPONENT_VARIABLE)
+    .put("responseWriterVariable", RendererClassVisitor.RESPONSE_WRITER_VARIABLE)
+    .put("clientIdVariable", RendererClassVisitor.CLIENT_ID_VARIABLE)
+     .build();
+
     /**
      *
      */
Modified: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/TemplateModule.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/TemplateModule.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/TemplateModule.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -23,6 +23,9 @@
 
 package org.richfaces.cdk.templatecompiler;
 
+import java.util.Map;
+import java.util.Set;
+
 import org.richfaces.cdk.CdkWriter;
 import org.richfaces.cdk.ModelBuilder;
 import org.richfaces.cdk.attributes.Schema;
@@ -33,18 +36,20 @@
 import org.richfaces.cdk.templatecompiler.statements.HelperMethodFactory;
 import org.richfaces.cdk.templatecompiler.statements.HelperMethodFactoryImpl;
 
-import com.google.inject.AbstractModule;
+import com.google.inject.PrivateModule;
 import com.google.inject.Singleton;
 import com.google.inject.TypeLiteral;
 import com.google.inject.multibindings.Multibinder;
 import com.google.inject.name.Names;
 
+import freemarker.template.ObjectWrapper;
+
 /**
  * <p class="changed_added_4_0"></p>
  * @author asmirnov(a)exadel.com
  *
  */
-public class TemplateModule extends AbstractModule {
+public class TemplateModule extends PrivateModule {
 
     /* (non-Javadoc)
      * @see com.google.inject.AbstractModule#configure()
@@ -53,13 +58,19 @@
     protected void configure() {
         Multibinder<ModelBuilder> modelBinder = Multibinder.newSetBinder(binder(), ModelBuilder.class);
         modelBinder.addBinding().to(RendererTemplateParser.class);
+        TypeLiteral<Set<ModelBuilder>> buildersType = new TypeLiteral<Set<ModelBuilder>>(){};
+        expose(buildersType);
         Multibinder.newSetBinder(binder(), CdkWriter.class).addBinding().to(RendererClassGenerator.class);
+        TypeLiteral<Set<CdkWriter>> writersType = new TypeLiteral<Set<CdkWriter>>(){};
+        expose(writersType);
+        // Private bindings.
         bind(new TypeLiteral<TemplateVisitorFactory<RendererClassVisitor>>(){}).to(VisitorFactoryImpl.class).in(Singleton.class);
-        bind(FreeMarkerRenderer.class).to(JavaClassConfiguration.class);
         bind(TypesFactory.class).to(TypesFactoryImpl.class);
         bind(ELParser.class).to(ELParserImpl.class);
         bind(HelperMethodFactory.class).to(HelperMethodFactoryImpl.class).in(Singleton.class);
         bind(Schema.class).annotatedWith(Names.named(Template.XHTML_EL_NAMESPACE)).toProvider(XhtmlElSchemaProvider.class).in(Singleton.class);
+        bind(ObjectWrapper.class).to(JavaClassModelWrapper.class);
+        bind(new TypeLiteral<Map<String,Object>>(){}).toInstance(RendererClassVisitor.ENCODE_METHOD_VARIABLES);
     }
 
 }
Modified: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/builder/model/JavaClass.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/builder/model/JavaClass.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/builder/model/JavaClass.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -22,7 +22,6 @@
 package org.richfaces.cdk.templatecompiler.builder.model;
 
 import java.util.ArrayList;
-import java.util.Comparator;
 import java.util.List;
 import java.util.Set;
 import java.util.TreeSet;
@@ -40,11 +39,7 @@
     private static final ClassName DEFAULT_SUPERCLASS = ClassName.get(Renderer.class);
     private List<JavaField> fields = new ArrayList<JavaField>();
     private List<JavaMethod> methods = new ArrayList<JavaMethod>();
-    private Set<JavaImport> imports = new TreeSet<JavaImport>(new Comparator<JavaImport>() {
-        public int compare(JavaImport o1, JavaImport o2) {
-            return o1.getName().compareTo(o2.getName());
-        }
-    });
+    private Set<JavaImport> imports = new TreeSet<JavaImport>(JavaImport.COMPARATOR);
     private ClassName superClass = DEFAULT_SUPERCLASS;
 
     private final JavaPackage pakg;
Modified: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/builder/model/JavaImport.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/builder/model/JavaImport.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/builder/model/JavaImport.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -21,10 +21,18 @@
 
 package org.richfaces.cdk.templatecompiler.builder.model;
 
+import java.util.Comparator;
+
 /**
  * @author Maksim Kaszynski
  */
 public interface JavaImport {
-    public String getName();
-    public boolean isDefault();
+    public Comparator<? super JavaImport> COMPARATOR = new Comparator<JavaImport>() {
+        public int compare(JavaImport o1, JavaImport o2) {
+            return o1.getName().compareTo(o2.getName());
+        }
+    };
+    String getName();
+    
+    boolean isDefault();
 }
Modified: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/el/ELVisitor.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/el/ELVisitor.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/el/ELVisitor.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -94,6 +94,7 @@
 import org.richfaces.cdk.templatecompiler.el.types.ELType;
 import org.richfaces.cdk.templatecompiler.el.types.TypesFactory;
 import org.richfaces.cdk.templatecompiler.statements.HelperMethod;
+import org.richfaces.cdk.templatecompiler.statements.StatementsContainer;
 import org.richfaces.cdk.templatecompiler.statements.TypedTemplateStatement;
 /**
  * Entry point for parsing EL expressions. @see parse() method.
@@ -117,6 +118,8 @@
     private boolean mixedExpression;
     
     private boolean literal = true;
+
+    private StatementsContainer parent;
     
     
     public ELVisitor(Logger log, TypesFactory typesFactory) {
@@ -364,4 +367,10 @@
         return treeNode;
     }
 
+
+    @Override
+    public void setParent(StatementsContainer parent) {
+        this.parent = parent;
+    }
+
 }
Modified: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/el/types/NullType.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/el/types/NullType.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/el/types/NullType.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -85,7 +85,7 @@
      */
     @Override
     public String toString() {
-        return getClass().getName();
+        return "null";
     }
 
     /* (non-Javadoc)
Modified: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/ConstantReturnMethodBodyStatement.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/ConstantReturnMethodBodyStatement.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/ConstantReturnMethodBodyStatement.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -21,7 +21,7 @@
  */
 package org.richfaces.cdk.templatecompiler.statements;
 
-import org.richfaces.cdk.templatecompiler.FreeMarkerRenderer;
+import org.richfaces.cdk.generate.freemarker.FreeMarkerRenderer;
 
 import com.google.inject.Inject;
 
Modified: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/DefineObjectStatement.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/DefineObjectStatement.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/DefineObjectStatement.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -21,8 +21,14 @@
  */
 package org.richfaces.cdk.templatecompiler.statements;
 
+import org.richfaces.cdk.generate.freemarker.FreeMarkerRenderer;
+import org.richfaces.cdk.templatecompiler.ELParser;
+import org.richfaces.cdk.templatecompiler.el.ParsingException;
 import org.richfaces.cdk.templatecompiler.el.types.ELType;
+import org.richfaces.cdk.templatecompiler.el.types.TypesFactory;
 
+import com.google.inject.Inject;
+
 /**
  * @author Nick Belaevski
  */
@@ -32,17 +38,52 @@
 
     private String name;
 
-    private String initializationExpression;
+    private final ELParser parser;
 
-    public DefineObjectStatement(ELType type, String name, String initializationExpression) {
-        super("define-object");
+    private TypedTemplateStatement initializationStatement;
 
+    @Inject
+    public DefineObjectStatement(FreeMarkerRenderer renderer, ELParser parser) {
+        super(renderer, "define-object");
+        this.parser = parser;
+    }
+
+    /**
+     * <p class="changed_added_4_0">
+     * </p>
+     * 
+     * @param type
+     *            the type to set
+     */
+    public void setType(ELType type) {
         this.type = type;
+    }
+
+    /**
+     * <p class="changed_added_4_0">
+     * </p>
+     * 
+     * @param name
+     *            the name to set
+     */
+    public void setName(String name) {
         this.name = name;
-        this.initializationExpression = initializationExpression != null ? initializationExpression : "";
     }
 
     /**
+     * <p class="changed_added_4_0">
+     * </p>
+     * 
+     * @param initializationExpression
+     *            the initializationExpression to set
+     * @throws ParsingException
+     */
+    public void setInitializationExpression(String initializationExpression) throws ParsingException {
+        initializationStatement = parser.parse(initializationExpression, this, TypesFactory.OBJECT_TYPE);
+        initializationStatement.setParent(this);
+    }
+
+    /**
      * @return the type
      */
     public ELType getType() {
@@ -59,8 +100,8 @@
     /**
      * @return the initializationExpression
      */
-    public String getInitializationExpression() {
-        return initializationExpression;
+    public TemplateStatement getInitializationExpression() {
+        return initializationStatement;
     }
 
 }
Modified: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/ElementStatement.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/ElementStatement.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/ElementStatement.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -21,7 +21,7 @@
  */
 package org.richfaces.cdk.templatecompiler.statements;
 
-import org.richfaces.cdk.templatecompiler.FreeMarkerRenderer;
+import org.richfaces.cdk.generate.freemarker.FreeMarkerRenderer;
 
 /**
  * @author Nick Belaevski
Modified: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/EncodeMethodPrefaceStatement.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/EncodeMethodPrefaceStatement.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/EncodeMethodPrefaceStatement.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -21,7 +21,7 @@
  */
 package org.richfaces.cdk.templatecompiler.statements;
 
-import org.richfaces.cdk.templatecompiler.FreeMarkerRenderer;
+import org.richfaces.cdk.generate.freemarker.FreeMarkerRenderer;
 
 import com.google.inject.Inject;
 
Modified: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/EndElementStatement.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/EndElementStatement.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/EndElementStatement.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -21,7 +21,7 @@
  */
 package org.richfaces.cdk.templatecompiler.statements;
 
-import org.richfaces.cdk.templatecompiler.FreeMarkerRenderer;
+import org.richfaces.cdk.generate.freemarker.FreeMarkerRenderer;
 
 import com.google.inject.Inject;
 
Modified: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/ForEachStatement.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/ForEachStatement.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/ForEachStatement.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -21,10 +21,14 @@
  */
 package org.richfaces.cdk.templatecompiler.statements;
 
+import org.richfaces.cdk.generate.freemarker.FreeMarkerRenderer;
+
+import com.google.inject.Inject;
+
 /**
  * @author Nick Belaevski
  */
-public class ForEachStatement extends TemplateStatementsContainerBase {
+public class ForEachStatement extends TemplateStatementBase {
 
     private String itemsExpression;
 
@@ -32,12 +36,9 @@
 
     private String varType;
 
-    public ForEachStatement(String itemsExpression,
-                            String var, String varType) {
-        super("for-each");
-        this.itemsExpression = itemsExpression;
-        this.var = var;
-        this.varType = varType;
+    @Inject
+    public ForEachStatement(FreeMarkerRenderer renderer) {
+        super(renderer,"for-each");
     }
 
     /**
@@ -61,4 +62,28 @@
         return varType;
     }
 
+    /**
+     * <p class="changed_added_4_0"></p>
+     * @param itemsExpression the itemsExpression to set
+     */
+    public void setItemsExpression(String itemsExpression) {
+        this.itemsExpression = itemsExpression;
+    }
+
+    /**
+     * <p class="changed_added_4_0"></p>
+     * @param var the var to set
+     */
+    public void setVar(String var) {
+        this.var = var;
+    }
+
+    /**
+     * <p class="changed_added_4_0"></p>
+     * @param varType the varType to set
+     */
+    public void setVarType(String varType) {
+        this.varType = varType;
+    }
+
 }
Modified: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/HelperMethodFactoryImpl.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/HelperMethodFactoryImpl.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/HelperMethodFactoryImpl.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -26,7 +26,8 @@
 import java.util.EnumMap;
 
 import org.richfaces.cdk.Generator;
-import org.richfaces.cdk.templatecompiler.FreeMarkerRenderer;
+import org.richfaces.cdk.Logger;
+import org.richfaces.cdk.generate.freemarker.FreeMarkerRenderer;
 import org.richfaces.cdk.templatecompiler.builder.model.Argument;
 import org.richfaces.cdk.templatecompiler.builder.model.JavaMethod;
 import org.richfaces.cdk.templatecompiler.builder.model.JavaModifier;
@@ -35,7 +36,6 @@
 
 import com.google.common.collect.Maps;
 import com.google.inject.Inject;
-import com.google.inject.internal.Nullable;
 import com.google.inject.name.Named;
 
 /**
@@ -47,30 +47,43 @@
  */
 public class HelperMethodFactoryImpl implements HelperMethodFactory {
 
-    private final FreeMarkerRenderer renderer;
-    private final TypesFactory typesFactory;
-    private final String rendererUtilsClass;
-    private final EnumMap<HelperMethod, JavaMethod> helperMethods =
-        Maps.newEnumMap(HelperMethod.class);
+    private TypesFactory typesFactory;
 
+    @Inject(optional = true)
+    @Named(Generator.RENDERER_UTILS_CLASS)
+    private String rendererUtilsClass = "org.richfaces.renderkit.RenderKitUtils";
 
+    private FreeMarkerRenderer renderer;
+    private final EnumMap<HelperMethod, JavaMethod> helperMethods = Maps.newEnumMap(HelperMethod.class);
+
+    private final Logger log;
+
     @Inject
-    public HelperMethodFactoryImpl(FreeMarkerRenderer renderer, TypesFactory typesFactory,
-        @Named(Generator.RENDERER_UTILS_CLASS) @Nullable String rendererUtilsClass) {
+    public HelperMethodFactoryImpl(Logger log) {
+        this.log = log;
+    }
+
+    /**
+     * <p class="changed_added_4_0">
+     * Initialization code. It should be called after field injection, so render kit utils class name should have proper
+     * value here.
+     * </p>
+     * 
+     * @param renderer
+     * @param typesFactory
+     */
+    @Inject
+    public void initHelperMethods(FreeMarkerRenderer renderer, TypesFactory typesFactory) {
         this.renderer = renderer;
         this.typesFactory = typesFactory;
-        this.rendererUtilsClass = rendererUtilsClass;
-        initHelperMethods();
-    }
-
-    protected void initHelperMethods() {
         buildHelperMethod(HelperMethod.EMPTINESS_CHECK, false, "emptiness-check-method", "object");
         buildHelperMethod(HelperMethod.EQUALS_CHECK, false, "equals-check-method", "o1", "o2");
-        buildHelperMethod(HelperMethod.TO_BOOLEAN_CONVERSION, false,"conversion-to-boolean-method", "object");
+        buildHelperMethod(HelperMethod.TO_BOOLEAN_CONVERSION, false, "conversion-to-boolean-method", "object");
         buildHelperMethod(HelperMethod.TO_STRING_CONVERSION, false, "conversion-to-string-method", "object");
     }
 
-    private JavaMethod buildHelperMethod(HelperMethod helperMethod, boolean utilsMethod, String templateName, String... argumentNames) {
+    private JavaMethod buildHelperMethod(HelperMethod helperMethod, boolean utilsMethod, String templateName,
+        String... argumentNames) {
         JavaMethod helperJavaMethod;
         if (utilsMethod && null != rendererUtilsClass) {
             helperJavaMethod = new RendererUtilsMethod(helperMethod, rendererUtilsClass);
Modified: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/IfElseStatement.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/IfElseStatement.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/IfElseStatement.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -21,14 +21,19 @@
  */
 package org.richfaces.cdk.templatecompiler.statements;
 
+import org.richfaces.cdk.generate.freemarker.FreeMarkerRenderer;
+
+import com.google.inject.Inject;
+
 /**
  * @author Nick Belaevski
  * @since 4.0
  */
-public class IfElseStatement extends TemplateStatementsContainerBase {
+public class IfElseStatement extends TemplateStatementBase {
 
-    public IfElseStatement() {
-        super("if-else");
+    @Inject
+    public IfElseStatement(FreeMarkerRenderer renderer) {
+        super(renderer,"if-else");
     }
 
 }
Modified: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/StartElementStatement.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/StartElementStatement.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/StartElementStatement.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -21,7 +21,7 @@
  */
 package org.richfaces.cdk.templatecompiler.statements;
 
-import org.richfaces.cdk.templatecompiler.FreeMarkerRenderer;
+import org.richfaces.cdk.generate.freemarker.FreeMarkerRenderer;
 
 import com.google.inject.Inject;
 
Modified: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/StatementsContainer.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/StatementsContainer.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/StatementsContainer.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -67,7 +67,7 @@
             }
         };
 
-    private List<TemplateStatement> statements = new ArrayList<TemplateStatement>();
+    private final List<TemplateStatement> statements = new ArrayList<TemplateStatement>();
 
     private StatementsContainer parent;
 
@@ -79,12 +79,12 @@
 
     public void addStatement(TemplateStatement statement) {
         statement.setParent(this);
-        statements.add(statement);
+        getStatements().add(statement);
     }
 
     public void addStatement(int index, TemplateStatement statement) {
         statement.setParent(this);
-        statements.add(index, statement);
+        getStatements().add(index, statement);
     }
 
     /**
@@ -109,7 +109,7 @@
     }
 
     public boolean isEmpty() {
-        return statements.isEmpty();
+        return getStatements().isEmpty();
     }
 
     /*
@@ -120,7 +120,7 @@
     @Override
     public String getCode() {
         StringBuilder sb = new StringBuilder();
-        for (TemplateStatement statement : statements) {
+        for (TemplateStatement statement : getStatements()) {
             sb.append(statement.getCode());
             sb.append('\n');
         }
@@ -154,7 +154,7 @@
     }
 
     private <T> Iterable<T> concatStatements(Function<TemplateStatement, Iterable<T>> transform) {
-        Iterable<T> imports = Iterables.concat(Iterables.transform(statements, transform));
+        Iterable<T> imports = Iterables.concat(Iterables.transform(getStatements(), transform));
         return imports;
     }
 
Modified: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/TemplateStatementBase.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/TemplateStatementBase.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/TemplateStatementBase.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -21,23 +21,38 @@
  */
 package org.richfaces.cdk.templatecompiler.statements;
 
-import java.util.Collections;
 import java.util.EnumSet;
+import java.util.List;
+import java.util.Set;
 
-import org.richfaces.cdk.templatecompiler.FreeMarkerRenderer;
+import org.richfaces.cdk.generate.freemarker.FreeMarkerRenderer;
 import org.richfaces.cdk.templatecompiler.builder.model.JavaField;
 import org.richfaces.cdk.templatecompiler.builder.model.JavaImport;
+import org.richfaces.cdk.templatecompiler.builder.model.JavaModifier;
+import org.richfaces.cdk.templatecompiler.builder.model.RuntimeImport;
+import org.richfaces.cdk.templatecompiler.builder.model.StatementImpl;
+import org.richfaces.cdk.templatecompiler.el.types.ReferencedType;
+import org.richfaces.cdk.util.Strings;
 
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+
 /**
  * @author Nick Belaevski
  * 
  */
-public class TemplateStatementBase implements TemplateStatement {
+public class TemplateStatementBase extends StatementsContainer {
 
     protected StatementsContainer parent;
     private final String templateName;
     private final FreeMarkerRenderer renderer;
+    private final Set<JavaImport> imports = Sets.newTreeSet(JavaImport.COMPARATOR);
     private final EnumSet<HelperMethod> requiredMethods = EnumSet.noneOf(HelperMethod.class);
+    private final List<JavaField> fields = Lists.newArrayList();
+    
+    private boolean parsed = false;
+    private String code;
 
     protected TemplateStatementBase(FreeMarkerRenderer renderer, String templateName) {
         super();
@@ -45,29 +60,36 @@
         this.templateName = templateName;
     }
 
-    @Override
-    public void setParent(StatementsContainer parent) {
-        this.parent = parent;
-    }
 
     @Override
     public String getCode() {
-        return renderer.renderSnippet(templateName, this);
+        parse();
+        return code;
     }
 
+    private void parse() {
+        if(!parsed){
+            code = renderer.renderTemplate(templateName, this);
+            parsed = true;
+        }
+    }
+
     @Override
     public Iterable<JavaImport> getRequiredImports() {
-        return Collections.emptySet();
+        parse();
+        return Iterables.concat(super.getRequiredImports(),imports);
     }
 
     @Override
     public Iterable<JavaField> getRequiredFields() {
-        return Collections.emptySet();
+        parse();
+        return Iterables.concat(super.getRequiredFields(),fields);
     }
 
     @Override
     public Iterable<HelperMethod> getRequiredMethods() {
-        return requiredMethods;
+        parse();
+        return Iterables.concat(super.getRequiredMethods(),requiredMethods);
     }
 
     protected void addRequiredMethods(HelperMethod... methods) {
@@ -75,4 +97,24 @@
             requiredMethods.add(helperMethod);
         }
     }
+
+    public void addConstant(String type, String name, String code) {
+        JavaField field = new JavaField(new ReferencedType(type),name);
+        field.addModifier(JavaModifier.PRIVATE);
+        field.addModifier(JavaModifier.STATIC);
+        field.addModifier(JavaModifier.FINAL);
+        if(!Strings.isEmpty(code)){
+            field.setValue(new StatementImpl(code));
+        }
+        fields.add(field);
+    }
+    
+    public void addImport(String name) {
+        imports.add(new RuntimeImport(name));
+    }
+    
+    public void addRequiredMethod(String helperMethodName) {
+        HelperMethod helperMethod = HelperMethod.valueOf(helperMethodName);
+        requiredMethods.add(helperMethod);
+    }
 }
\ No newline at end of file
Deleted: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/TemplateStatementsContainerBase.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/TemplateStatementsContainerBase.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/TemplateStatementsContainerBase.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -1,46 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2009, 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.cdk.templatecompiler.statements;
-
-import org.richfaces.cdk.templatecompiler.FreeMarkerRenderer;
-
-
-/**
- * @author Nick Belaevski
- */
-public class TemplateStatementsContainerBase extends StatementsContainer {
-
-    private final String templateName;
-    private final FreeMarkerRenderer renderer;
-
-    protected TemplateStatementsContainerBase(FreeMarkerRenderer renderer,String templateName) {
-        super();
-        this.renderer = renderer;
-        this.templateName = templateName;
-    }
-
-    @Override
-    public String getCode() {
-        return renderer.renderSnippet(templateName, this);
-    }
-
-}
Modified: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/WriteAttributeStatement.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/WriteAttributeStatement.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/WriteAttributeStatement.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -21,7 +21,7 @@
  */
 package org.richfaces.cdk.templatecompiler.statements;
 
-import org.richfaces.cdk.templatecompiler.FreeMarkerRenderer;
+import org.richfaces.cdk.generate.freemarker.FreeMarkerRenderer;
 
 import com.google.inject.Inject;
 
Modified: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/WriteAttributesSetStatement.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/WriteAttributesSetStatement.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/WriteAttributesSetStatement.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -21,17 +21,30 @@
  */
 package org.richfaces.cdk.templatecompiler.statements;
 
+import java.util.concurrent.atomic.AtomicInteger;
 
+import org.richfaces.cdk.generate.freemarker.FreeMarkerRenderer;
+
+import com.google.inject.Inject;
+
 /**
  * @author Nick Belaevski
  */
 public class WriteAttributesSetStatement extends TemplateStatementBase {
 
+    /**
+    *
+    */
+    private static final String PASS_THROUGH_ATTRIBUTES_FIELD_NAME = "PASS_THROUGH_ATTRIBUTES";
+
+    private static AtomicInteger fieldCounter = new AtomicInteger(0);
+
     private String passThroughFieldName;
 
-    public WriteAttributesSetStatement(String passThroughFieldName) {
-        super("write-attributes-set");
-        this.passThroughFieldName = passThroughFieldName;
+    @Inject
+    public WriteAttributesSetStatement(FreeMarkerRenderer renderer) {
+        super(renderer, "write-attributes-set");
+        passThroughFieldName = PASS_THROUGH_ATTRIBUTES_FIELD_NAME + fieldCounter.getAndIncrement();
     }
 
     /**
@@ -40,5 +53,5 @@
     public String getPassThroughFieldName() {
         return passThroughFieldName;
     }
-    
+
 }
Modified: root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/WriteTextStatement.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/WriteTextStatement.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/statements/WriteTextStatement.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -21,20 +21,46 @@
  */
 package org.richfaces.cdk.templatecompiler.statements;
 
+import java.util.Collections;
+import java.util.List;
+
+import org.richfaces.cdk.generate.freemarker.FreeMarkerRenderer;
+import org.richfaces.cdk.templatecompiler.ELParser;
+import org.richfaces.cdk.templatecompiler.el.ParsingException;
+import org.richfaces.cdk.templatecompiler.el.types.TypesFactory;
+
+import com.google.inject.Inject;
+
 /**
  * @author Nick Belaevski
  */
 public class WriteTextStatement extends TemplateStatementBase {
 
-    private String textExpression;
+    private TemplateStatement textStatement;
+    private final ELParser parser;
 
-    public WriteTextStatement(String textExpression) {
-        super("write-text");
-        this.textExpression = textExpression;
+    @Inject
+    public WriteTextStatement(FreeMarkerRenderer renderer,ELParser parser) {
+        super(renderer,"write-text");
+        this.parser = parser;
     }
 
-    public String getTextExpression() {
-        return textExpression;
+    public TemplateStatement getTextStatement() {
+        return textStatement;
     }
 
+    @Override
+    public List<TemplateStatement> getStatements() {
+        return Collections.singletonList(textStatement);
+    }
+    /**
+     * <p class="changed_added_4_0"></p>
+     * @param textExpression the textExpression to set
+     * @throws ParsingException 
+     */
+    public void setExpression(String textExpression) throws ParsingException {
+        textStatement = parser.parse(textExpression,this,TypesFactory.OBJECT_TYPE);
+        textStatement.setParent(this);
+    }
+
 }
Modified: root/cdk/branches/RF8755/plugins/generator/src/test/java/org/richfaces/cdk/LibraryBuilderTest.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/test/java/org/richfaces/cdk/LibraryBuilderTest.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/test/java/org/richfaces/cdk/LibraryBuilderTest.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -7,6 +7,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -14,7 +15,6 @@
 import org.apache.maven.model.FileSet;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.codehaus.plexus.util.DirectoryScanner;
-import org.junit.Ignore;
 import org.junit.Test;
 
 /**
@@ -25,7 +25,7 @@
     private static final String[] JAVA_INCLUDES = new String[] { "**/*.java" };
     private static final String MAIN_CONFIG = "src/main/config";
     private static final String MAIN_TEMPLATES = "src/main/templates";
-    private static final String PROJECT_BASE = "E:\\_richfaces\\svn\\richfaces_root\\ui\\components\\core\\";
+    private static final String PROJECT_BASE = "";
     private static final String[] STRINGS_ARRAY = new String[0];
     private static final String XML_INCLUDES = "**/*.xml";
 
@@ -45,15 +45,11 @@
      * @param type
      */
     private static void setOutput(Generator generator, File directory, Outputs type) {
-        if (!directory.exists()) {
-            directory.mkdirs();
-        }
     
         generator.addOutputFolder(type, directory);
     }
 
     @Test
-    @Ignore
     public void createInstance() throws Exception {
         List<String> compileSourceRoots = Arrays.asList("");
 
@@ -89,7 +85,6 @@
             // Build JSF library.
             // LibraryBuilder builder = LibraryBuilder.createInstance(context);
             generator.init();
-            generator.execute();
         } catch (CdkException e) {
             throw new MojoExecutionException("CDK build error", e);
         }
@@ -110,102 +105,16 @@
         return new CdkClassLoader(this.getClass().getClassLoader());
     }
 
-    /**
-     * Skan Array of filesets for selected resources.
-     * 
-     * @param filesets
-     * @return
-     * @throws MojoExecutionException
-     */
-    @SuppressWarnings("unchecked")
-    protected Collection<File> doScan(FileSet[] filesets) throws MojoExecutionException {
-        List<File> files = new ArrayList<File>();
-
-        if (null != filesets) {
-            for (FileSet fileSet : filesets) {
-                String[] includes = (String[]) fileSet.getIncludes().toArray(STRINGS_ARRAY);
-                String[] excludes = (String[]) fileSet.getExcludes().toArray(STRINGS_ARRAY);
-                File fileSetDirectory = resolveRelativePath(new File(fileSet.getDirectory()));
-                String[] scan = doScan(includes, excludes, fileSetDirectory);
-
-                for (String filename : scan) {
-                    files.add(resolveRelativePath(new File(fileSetDirectory, filename)));
-                }
-            }
-        }
-
-        return files;
-    }
-
-    protected String[] doScan(String[] includes, String[] excludes, File rootFolder) throws MojoExecutionException {
-        try {
-            DirectoryScanner directoryScanner = new DirectoryScanner();
-
-            directoryScanner.setFollowSymlinks(true);
-            directoryScanner.setBasedir(rootFolder);
-            directoryScanner.setExcludes(excludes);
-            directoryScanner.setIncludes(includes);
-            directoryScanner.addDefaultExcludes();
-            directoryScanner.scan();
-
-            return directoryScanner.getIncludedFiles();
-        } catch (IllegalStateException e) {
-            throw new MojoExecutionException("Error scanning source root: \'" + rootFolder + "\'", e);
-        }
-    }
-
     private Iterable<File> findFacesConfigFiles() throws MojoExecutionException {
-        FileSet[] facesConfigs = null;
-        File defaultDirectory = resolveRelativePath(new File(MAIN_CONFIG));
 
-        if (defaultDirectory.exists() && defaultDirectory.isDirectory()) {
-            FileSet fileSet = new FileSet();
-
-            fileSet.setDirectory(MAIN_CONFIG);
-            fileSet.addInclude(XML_INCLUDES);
-            facesConfigs = new FileSet[] { fileSet };
-        }
-
-        return doScan(facesConfigs);
+        return Collections.emptySet();
     }
 
     private Iterable<File> findJavaFiles() throws MojoExecutionException {
-        Set<File> javaSources = new HashSet<File>();
-        String[] includes = JAVA_INCLUDES;
-        String[] compileSourceRoots = new String[] { PROJECT_BASE + "\\src\\main\\java" };
-        for (String compileRoot : compileSourceRoots) {
-            File rootFolder = new File(compileRoot);
-            String[] sources = doScan(includes, null, rootFolder);
-
-            for (String src : sources) {
-                javaSources.add(new File(rootFolder, src));
-            }
-        }
-
-        return javaSources;
+        return Collections.emptySet();
     }
 
     private Iterable<File> findTemplateFiles() throws MojoExecutionException {
-        FileSet[] templates = null;
-        File defaultDirectory = resolveRelativePath(new File(MAIN_TEMPLATES));
-
-        if (defaultDirectory.exists() && defaultDirectory.isDirectory()) {
-            FileSet fileSet = new FileSet();
-
-            fileSet.setDirectory(MAIN_TEMPLATES);
-            fileSet.addInclude(XML_INCLUDES);
-            templates = new FileSet[] { fileSet };
-        }
-
-        return doScan(templates);
+        return Collections.emptySet();
     }
-
-    private File resolveRelativePath(File file) {
-        File result = file;
-        if (!result.isAbsolute()) {
-            result = new File(PROJECT_BASE, result.getPath());
-        }
-
-        return result;
-    }
 }
Modified: root/cdk/branches/RF8755/plugins/generator/src/test/java/org/richfaces/cdk/generate/java/AbstractClassGeneratorTest.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/test/java/org/richfaces/cdk/generate/java/AbstractClassGeneratorTest.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/test/java/org/richfaces/cdk/generate/java/AbstractClassGeneratorTest.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -1,5 +1,5 @@
 /*
- * JBoss, Home of Professional Open Source
+Fr * JBoss, Home of Professional Open Source
  * Copyright , Red Hat, Inc. and individual contributors
  * by the @authors tag. See the copyright.txt in the distribution for a
  * full listing of individual contributors.
@@ -39,6 +39,7 @@
 import org.richfaces.cdk.Output;
 import org.richfaces.cdk.Outputs;
 import org.richfaces.cdk.generate.freemarker.CdkConfiguration;
+import org.richfaces.cdk.generate.freemarker.FreeMarkerRenderer;
 import org.richfaces.cdk.generate.freemarker.LibraryModelWrapper;
 import org.richfaces.cdk.model.ClassName;
 import org.richfaces.cdk.model.ComponentLibrary;
@@ -48,7 +49,6 @@
 
 import com.google.inject.Inject;
 
-import freemarker.template.Configuration;
 import freemarker.template.ObjectWrapper;
 
 /**
@@ -59,7 +59,7 @@
 
     @Inject
     @As(CdkConfiguration.class)
-    protected Configuration configuration;
+    protected FreeMarkerRenderer configuration;
 
     @Inject
     protected ComponentLibrary library;
Copied: root/cdk/branches/RF8755/plugins/generator/src/test/java/org/richfaces/cdk/templatecompiler/model/TemplateParserTest.java (from rev 17685, root/cdk/branches/RF8755/plugins/generator/src/test/java/org/richfaces/cdk/templatecompiler/model/TemplateTest.java)
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/test/java/org/richfaces/cdk/templatecompiler/model/TemplateParserTest.java	                        (rev 0)
+++ root/cdk/branches/RF8755/plugins/generator/src/test/java/org/richfaces/cdk/templatecompiler/model/TemplateParserTest.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -0,0 +1,400 @@
+/*
+ * $Id$
+ *
+ * License Agreement.
+ *
+ * Rich Faces - Natural Ajax for Java Server Faces (JSF)
+ *
+ * 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.cdk.templatecompiler.model;
+
+import static org.junit.Assert.*;
+
+import java.util.List;
+
+import org.junit.Test;
+import org.richfaces.cdk.model.ClassName;
+import org.richfaces.cdk.model.FacesId;
+import org.richfaces.cdk.xmlconfig.JaxbTestBase;
+
+/**
+ * <p class="changed_added_4_0">
+ * </p>
+ * 
+ * @author asmirnov(a)exadel.com
+ * 
+ */
+public class TemplateParserTest extends JaxbTestBase {
+
+    public static final String TEMPLATE_PROLOG =
+        "<cdk:root xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:cdk=\"http://richfaces.org/cdk/core\" xmlns:c=\"http://richfaces.org/cdk/jstl/core\" xmlns:cc=\"http://richfaces.org/cdk/jsf/composite\"><cc:interface>";
+    private static final Object DEFAULT_ATTRIBUTE_TYPE = new ClassName(Object.class);
+    private static final String TEMPLATE_EPILOG = "</cc:implementation></cdk:root>";
+    private static final String TEMPLATE_MIDDLE = "</cc:interface><cc:implementation>";
+
+    @Test
+    public void testAttributes() throws Exception {
+        Template template =
+            unmarshal(
+                Template.class,
+                TEMPLATE_PROLOG
+                    + "<cdk:renders-children>true</cdk:renders-children>"
+                    + "<cc:attribute name=\"onclick\" />"
+                    + "<cc:attribute name=\"mode\" default=\"ajax\" />"
+                    + "<cc:attribute name=\"action\" method-signature=\"void action()\" />"
+                    + "<cc:attribute name=\"changeListener\" method-signature=\"void changeListener(ValueChangeEvent)\" targets=\"changes changes1\" />"
+                    + "<cc:attribute name=\"disabled\" type=\"boolean\" />"
+                    + "<cc:attribute name=\"delay\" type=\"java.lang.Integer\" />"
+                    + "<cc:attribute name=\"id\" required=\"true\" />"
+                    + "<cc:attribute name=\"experts\" shortDescription=\"For use by experts\" displayName=\"Expert attribute\" expert=\"true\" />"
+                    + "<cc:attribute name=\"preferred\" shortDescription=\"It's a preferred attribute\" displayName=\"Preferred attribute\" preferred=\"true\" />"
+                    + "<cc:attribute name=\"onchange\">" + "<cc:clientBehavior event=\"change\" />"
+                    + "<cc:clientBehavior event=\"valueChange\" default=\"true\" />" + "</cc:attribute>"
+                    + TEMPLATE_MIDDLE + TEMPLATE_EPILOG);
+
+        CompositeInterface interfaceSection = template.getInterface();
+        assertNotNull(interfaceSection);
+
+        List<Attribute> attributes = interfaceSection.getAttributes();
+        assertNotNull(attributes);
+        assertEquals(10, attributes.size());
+
+        Attribute attribute;
+
+        attribute = attributes.get(0);
+        assertNotNull(attribute);
+        assertEquals("onclick", attribute.getName());
+        assertNull(attribute.getDefaultValue());
+        assertNull(attribute.getMethodSignature());
+        assertEquals(DEFAULT_ATTRIBUTE_TYPE, attribute.getType());
+        assertNull(attribute.getTargets());
+        assertFalse(attribute.isRequired());
+        assertFalse(attribute.isExpert());
+        assertFalse(attribute.isPreferred());
+
+        attribute = attributes.get(1);
+        assertNotNull(attribute);
+        assertEquals("mode", attribute.getName());
+        assertEquals("ajax", attribute.getDefaultValue());
+        assertNull(attribute.getMethodSignature());
+        assertEquals(DEFAULT_ATTRIBUTE_TYPE, attribute.getType());
+        assertNull(attribute.getTargets());
+        assertFalse(attribute.isRequired());
+        assertFalse(attribute.isExpert());
+        assertFalse(attribute.isPreferred());
+
+        attribute = attributes.get(2);
+        assertNotNull(attribute);
+        assertEquals("action", attribute.getName());
+        assertNull(attribute.getDefaultValue());
+        assertEquals("void action()", attribute.getMethodSignature());
+        assertEquals(DEFAULT_ATTRIBUTE_TYPE, attribute.getType());
+        assertNull(attribute.getTargets());
+        assertFalse(attribute.isRequired());
+        assertFalse(attribute.isExpert());
+        assertFalse(attribute.isPreferred());
+
+        attribute = attributes.get(3);
+        assertNotNull(attribute);
+        assertEquals("changeListener", attribute.getName());
+        assertNull(attribute.getDefaultValue());
+        assertEquals("void changeListener(ValueChangeEvent)", attribute.getMethodSignature());
+        assertEquals(DEFAULT_ATTRIBUTE_TYPE, attribute.getType());
+        assertEquals("changes changes1", attribute.getTargets());
+        assertFalse(attribute.isRequired());
+        assertFalse(attribute.isExpert());
+        assertFalse(attribute.isPreferred());
+
+        attribute = attributes.get(4);
+        assertNotNull(attribute);
+        assertEquals("disabled", attribute.getName());
+        assertNull(attribute.getDefaultValue());
+        assertNull(attribute.getMethodSignature());
+        assertEquals(ClassName.parseName("boolean"), attribute.getType());
+        assertNull(attribute.getTargets());
+        assertFalse(attribute.isRequired());
+        assertFalse(attribute.isExpert());
+        assertFalse(attribute.isPreferred());
+
+        attribute = attributes.get(5);
+        assertNotNull(attribute);
+        assertEquals("delay", attribute.getName());
+        assertNull(attribute.getDefaultValue());
+        assertNull(attribute.getMethodSignature());
+        assertEquals(ClassName.parseName("java.lang.Integer"), attribute.getType());
+        assertNull(attribute.getTargets());
+        assertFalse(attribute.isRequired());
+        assertFalse(attribute.isExpert());
+        assertFalse(attribute.isPreferred());
+
+        attribute = attributes.get(6);
+        assertNotNull(attribute);
+        assertEquals("id", attribute.getName());
+        assertNull(attribute.getDefaultValue());
+        assertNull(attribute.getMethodSignature());
+        assertEquals(DEFAULT_ATTRIBUTE_TYPE, attribute.getType());
+        assertNull(attribute.getTargets());
+        assertTrue(attribute.isRequired());
+        assertFalse(attribute.isExpert());
+        assertFalse(attribute.isPreferred());
+
+        attribute = attributes.get(7);
+        assertNotNull(attribute);
+        assertFalse(attribute.isRequired());
+        assertEquals("experts", attribute.getName());
+        assertNull(attribute.getDefaultValue());
+        assertNull(attribute.getMethodSignature());
+        assertEquals(DEFAULT_ATTRIBUTE_TYPE, attribute.getType());
+        assertNull(attribute.getTargets());
+        assertEquals("For use by experts", attribute.getShortDescription());
+        assertEquals("Expert attribute", attribute.getDisplayName());
+        assertTrue(attribute.isExpert());
+        assertFalse(attribute.isPreferred());
+
+        attribute = attributes.get(8);
+        assertNotNull(attribute);
+        assertFalse(attribute.isRequired());
+        assertFalse(attribute.isExpert());
+        assertEquals("preferred", attribute.getName());
+        assertNull(attribute.getDefaultValue());
+        assertNull(attribute.getMethodSignature());
+        assertEquals(DEFAULT_ATTRIBUTE_TYPE, attribute.getType());
+        assertEquals("It's a preferred attribute", attribute.getShortDescription());
+        assertEquals("Preferred attribute", attribute.getDisplayName());
+        assertTrue(attribute.isPreferred());
+
+        attribute = attributes.get(9);
+        assertNotNull(attribute);
+        assertEquals("onchange", attribute.getName());
+
+        List<ClientBehavior> clientBehaviors = attribute.getClientBehaviors();
+        assertNotNull(clientBehaviors);
+        assertEquals(2, clientBehaviors.size());
+
+        ClientBehavior clientBehavior;
+
+        clientBehavior = clientBehaviors.get(0);
+        assertNotNull(clientBehavior);
+        assertEquals("change", clientBehavior.getEvent());
+        assertFalse(clientBehavior.isDefaultEvent());
+
+        clientBehavior = clientBehaviors.get(1);
+        assertNotNull(clientBehavior);
+        assertEquals("valueChange", clientBehavior.getEvent());
+        assertTrue(clientBehavior.isDefaultEvent());
+
+        assertEquals(Boolean.TRUE, interfaceSection.getRendersChildren());
+    }
+
+    @Test
+    public void testImpl() throws Exception {
+        Template template =
+            unmarshal(
+                Template.class,
+                TEMPLATE_PROLOG
+                    + TEMPLATE_MIDDLE
+                    + "<cdk:call expression=\"#{cc.clientId}\"/><table width=\"200\"><tbody><cdk:call expression=\"#{cc.fooMethod(clientId)}\"/></tbody></table>Header<div class='bar'>foo</div>"
+                    + TEMPLATE_EPILOG);
+
+        CompositeImplementation implementation = template.getImplementation();
+        assertNotNull(implementation);
+        List<Object> children = implementation.getChildren();
+        assertNotNull(children);
+        assertEquals(4, children.size());
+        assertEquals(CdkCallElement.class, children.get(0).getClass());
+        assertEquals(AnyElement.class, children.get(1).getClass());
+        assertEquals(String.class, children.get(2).getClass());
+    }
+
+    @Test
+    public void testInterface() throws Exception {
+        Template template =
+            unmarshal(Template.class, TEMPLATE_PROLOG
+                + "<cdk:class>org.richfaces.renderkit.html.TreeRenderer</cdk:class>"
+                + "<cdk:superclass>org.richfaces.renderkit.TreeRendererBase</cdk:superclass>"
+                + "<cdk:component-family>org.richfaces.TreeFamily</cdk:component-family>"
+                + "<cdk:renderer-type>org.richfaces.TreeRenderer</cdk:renderer-type>"
+                + "<cdk:renderkit-id>RF4_XHTML</cdk:renderkit-id>"
+                + "<cdk:renders-children>false</cdk:renders-children>" + TEMPLATE_MIDDLE + TEMPLATE_EPILOG);
+
+        CompositeInterface interfaceSection = template.getInterface();
+        assertNotNull(interfaceSection);
+
+        assertEquals(ClassName.parseName("org.richfaces.renderkit.html.TreeRenderer"), interfaceSection.getJavaClass());
+        assertEquals(ClassName.parseName("org.richfaces.renderkit.TreeRendererBase"), interfaceSection.getBaseClass());
+        assertEquals(FacesId.parseId("org.richfaces.TreeFamily"), interfaceSection.getComponentFamily());
+        assertEquals(FacesId.parseId("org.richfaces.TreeRenderer"), interfaceSection.getRendererType());
+        assertEquals("RF4_XHTML", interfaceSection.getRenderKitId());
+        assertEquals(Boolean.FALSE, interfaceSection.getRendersChildren());
+
+    }
+
+    @Test
+    public void testJstlCoreElements() throws Exception {
+        Template template =
+            unmarshal(Template.class, TEMPLATE_PROLOG + TEMPLATE_MIDDLE + "start"
+                + "<c:if test=\"#{someTest}\">if content</c:if>" + "<c:choose>"
+                + "<c:when test=\"#{anotherTest}\">when content</c:when>" + "<c:when test=\"#{coolTest}\">"
+                + "<c:if test=\"#{nestedIfTest}\">nested if content</c:if>" + "</c:when>"
+                + "<c:otherwise>otherwise content</c:otherwise>" + "</c:choose>"
+                + "<c:forEach items=\"#{someCollection}\" var=\"iterationVar\">" + "forEach content" + "</c:forEach>"
+                + "finish" + TEMPLATE_EPILOG);
+
+        CompositeImplementation implementation = template.getImplementation();
+        assertNotNull(implementation);
+
+        List<Object> children = implementation.getChildren();
+        assertNotNull(children);
+        assertEquals(5, children.size());
+        assertEquals("start", children.get(0));
+        assertEquals(CdkIfElement.class, children.get(1).getClass());
+        CdkIfElement ifElement = (CdkIfElement) children.get(1);
+        assertEquals("#{someTest}", ifElement.getTest());
+        List<Object> ifChildren = ifElement.getChildren();
+        assertNotNull(ifChildren);
+        assertEquals(1, ifChildren.size());
+        assertEquals("if content", ifChildren.get(0));
+
+        assertEquals(CdkChooseElement.class, children.get(2).getClass());
+        CdkChooseElement chooseElement = (CdkChooseElement) children.get(2);
+        List<Object> chooseChildren = chooseElement.getChildren();
+        assertNotNull(chooseChildren);
+        assertEquals(3, chooseChildren.size());
+
+        assertEquals(CdkWhenElement.class, chooseChildren.get(0).getClass());
+        CdkWhenElement firstWhen = (CdkWhenElement) chooseChildren.get(0);
+        assertEquals("#{anotherTest}", firstWhen.getTest());
+        List<Object> childrenOfFirstWhen = firstWhen.getChildren();
+        assertNotNull(childrenOfFirstWhen);
+        assertEquals(1, childrenOfFirstWhen.size());
+        assertEquals("when content", childrenOfFirstWhen.get(0));
+
+        assertEquals(CdkWhenElement.class, chooseChildren.get(1).getClass());
+        CdkWhenElement secondWhen = (CdkWhenElement) chooseChildren.get(1);
+        assertEquals("#{coolTest}", secondWhen.getTest());
+
+        List<Object> childrenOfSecondWhen = secondWhen.getChildren();
+        assertNotNull(childrenOfSecondWhen);
+        assertEquals(1, childrenOfSecondWhen.size());
+
+        assertEquals(CdkIfElement.class, childrenOfSecondWhen.get(0).getClass());
+        CdkIfElement nestedIf = (CdkIfElement) childrenOfSecondWhen.get(0);
+        assertEquals("#{nestedIfTest}", nestedIf.getTest());
+        List<Object> childrenOfNestedIf = nestedIf.getChildren();
+        assertNotNull(childrenOfNestedIf);
+        assertEquals(1, childrenOfNestedIf.size());
+        assertEquals("nested if content", childrenOfNestedIf.get(0));
+
+        assertEquals(CdkOtherwiseElement.class, chooseChildren.get(2).getClass());
+        CdkOtherwiseElement otherwiseElement = (CdkOtherwiseElement) chooseChildren.get(2);
+        List<Object> childrenOfOtherwiseElement = otherwiseElement.getChildren();
+        assertNotNull(childrenOfOtherwiseElement);
+        assertEquals(1, childrenOfOtherwiseElement.size());
+        assertEquals("otherwise content", childrenOfOtherwiseElement.get(0));
+
+        assertEquals(CdkForEachElement.class, children.get(3).getClass());
+        CdkForEachElement forEachElement = (CdkForEachElement) children.get(3);
+        assertEquals("#{someCollection}", forEachElement.getItems());
+        assertEquals("iterationVar", forEachElement.getVar());
+
+        List<Object> forEachChildren = forEachElement.getChildren();
+        assertNotNull(forEachChildren);
+        assertEquals(1, forEachChildren.size());
+        assertEquals("forEach content", forEachChildren.get(0));
+
+        assertEquals("finish", children.get(4));
+    }
+
+    @Test
+    public void testObject() throws Exception {
+        Template template =
+            unmarshal(Template.class, TEMPLATE_PROLOG + TEMPLATE_MIDDLE
+                + "<cdk:object name=\"rowCount\" type=\"int\" value=\"#{getRowCount(context)}\" />"
+                + "<cdk:object name=\"bodyExpression\" type=\"java.lang.String\">"
+                + "\"test expression\" +\n\"second line\"" + "</cdk:object>" +
+
+                TEMPLATE_EPILOG);
+
+        CompositeImplementation implementation = template.getImplementation();
+        assertNotNull(implementation);
+
+        List<Object> children = implementation.getChildren();
+        assertNotNull(children);
+        assertEquals(2, children.size());
+
+        assertEquals(CdkObjectElement.class, children.get(0).getClass());
+        CdkObjectElement firstObject = (CdkObjectElement) children.get(0);
+        assertNotNull(firstObject);
+        assertEquals("rowCount", firstObject.getName());
+        assertEquals("int", firstObject.getType());
+        assertEquals("#{getRowCount(context)}", firstObject.getValue());
+
+        assertEquals(CdkObjectElement.class, children.get(1).getClass());
+        CdkObjectElement secondObject = (CdkObjectElement) children.get(1);
+        assertNotNull(secondObject);
+        assertEquals("bodyExpression", secondObject.getName());
+        assertEquals("java.lang.String", secondObject.getType());
+        assertEquals("\"test expression\" +\n\"second line\"", secondObject.getBodyValue());
+    }
+
+    @Test
+    public void testResourceDependencies() throws Exception {
+        Template template =
+            unmarshal(Template.class, TEMPLATE_PROLOG + "<cdk:resource-dependency name=\"jquery.js\" />"
+                + "<cdk:resource-dependency name=\"richfaces.css\" library=\"org.richfaces\" />"
+                + "<cdk:resource-dependency name=\"richfaces.js\" library=\"org.richfaces\" target=\"body\" /> "
+
+                + TEMPLATE_MIDDLE + TEMPLATE_EPILOG);
+
+        CompositeInterface interfaceSection = template.getInterface();
+        assertNotNull(interfaceSection);
+
+        assertNull(interfaceSection.getRendersChildren());
+
+        List<ResourceDependency> resourceDependencies = interfaceSection.getResourceDependencies();
+        assertNotNull(resourceDependencies);
+        assertEquals(3, resourceDependencies.size());
+
+        ResourceDependency resourceDependency;
+
+        resourceDependency = resourceDependencies.get(0);
+        assertNotNull(resourceDependency);
+        assertEquals("jquery.js", resourceDependency.getName());
+        assertNull(resourceDependency.getLibrary());
+        assertEquals("head", resourceDependency.getTarget());
+
+        resourceDependency = resourceDependencies.get(1);
+        assertNotNull(resourceDependency);
+        assertEquals("richfaces.css", resourceDependency.getName());
+        assertEquals("org.richfaces", resourceDependency.getLibrary());
+        assertEquals("head", resourceDependency.getTarget());
+
+        resourceDependency = resourceDependencies.get(2);
+        assertNotNull(resourceDependency);
+        assertEquals("richfaces.js", resourceDependency.getName());
+        assertEquals("org.richfaces", resourceDependency.getLibrary());
+        assertEquals("body", resourceDependency.getTarget());
+    }
+
+    @Test
+    public void testTemplate() throws Exception {
+        Template template = unmarshal(Template.class, TEMPLATE_PROLOG + TEMPLATE_MIDDLE + TEMPLATE_EPILOG);
+        assertNotNull(template.getInterface());
+        assertNotNull(template.getImplementation());
+    }
+}
Property changes on: root/cdk/branches/RF8755/plugins/generator/src/test/java/org/richfaces/cdk/templatecompiler/model/TemplateParserTest.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + LastChangedDate LastChangedRevision LastChangedBy HeadURL Id
Deleted: root/cdk/branches/RF8755/plugins/generator/src/test/java/org/richfaces/cdk/templatecompiler/model/TemplateTest.java
===================================================================
--- root/cdk/branches/RF8755/plugins/generator/src/test/java/org/richfaces/cdk/templatecompiler/model/TemplateTest.java	2010-06-30 19:46:12 UTC (rev 17691)
+++ root/cdk/branches/RF8755/plugins/generator/src/test/java/org/richfaces/cdk/templatecompiler/model/TemplateTest.java	2010-06-30 23:15:43 UTC (rev 17692)
@@ -1,400 +0,0 @@
-/*
- * $Id$
- *
- * License Agreement.
- *
- * Rich Faces - Natural Ajax for Java Server Faces (JSF)
- *
- * 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.cdk.templatecompiler.model;
-
-import static org.junit.Assert.*;
-
-import java.util.List;
-
-import org.junit.Test;
-import org.richfaces.cdk.model.ClassName;
-import org.richfaces.cdk.model.FacesId;
-import org.richfaces.cdk.xmlconfig.JaxbTestBase;
-
-/**
- * <p class="changed_added_4_0">
- * </p>
- * 
- * @author asmirnov(a)exadel.com
- * 
- */
-public class TemplateTest extends JaxbTestBase {
-
-    public static final String TEMPLATE_PROLOG =
-        "<cdk:root xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:cdk=\"http://richfaces.org/cdk/core\" xmlns:c=\"http://richfaces.org/cdk/jstl/core\" xmlns:cc=\"http://richfaces.org/cdk/jsf/composite\"><cc:interface>";
-    private static final Object DEFAULT_ATTRIBUTE_TYPE = new ClassName(Object.class);
-    private static final String TEMPLATE_EPILOG = "</cc:implementation></cdk:root>";
-    private static final String TEMPLATE_MIDDLE = "</cc:interface><cc:implementation>";
-
-    @Test
-    public void testAttributes() throws Exception {
-        Template template =
-            unmarshal(
-                Template.class,
-                TEMPLATE_PROLOG
-                    + "<cdk:renders-children>true</cdk:renders-children>"
-                    + "<cc:attribute name=\"onclick\" />"
-                    + "<cc:attribute name=\"mode\" default=\"ajax\" />"
-                    + "<cc:attribute name=\"action\" method-signature=\"void action()\" />"
-                    + "<cc:attribute name=\"changeListener\" method-signature=\"void changeListener(ValueChangeEvent)\" targets=\"changes changes1\" />"
-                    + "<cc:attribute name=\"disabled\" type=\"boolean\" />"
-                    + "<cc:attribute name=\"delay\" type=\"java.lang.Integer\" />"
-                    + "<cc:attribute name=\"id\" required=\"true\" />"
-                    + "<cc:attribute name=\"experts\" shortDescription=\"For use by experts\" displayName=\"Expert attribute\" expert=\"true\" />"
-                    + "<cc:attribute name=\"preferred\" shortDescription=\"It's a preferred attribute\" displayName=\"Preferred attribute\" preferred=\"true\" />"
-                    + "<cc:attribute name=\"onchange\">" + "<cc:clientBehavior event=\"change\" />"
-                    + "<cc:clientBehavior event=\"valueChange\" default=\"true\" />" + "</cc:attribute>"
-                    + TEMPLATE_MIDDLE + TEMPLATE_EPILOG);
-
-        CompositeInterface interfaceSection = template.getInterface();
-        assertNotNull(interfaceSection);
-
-        List<Attribute> attributes = interfaceSection.getAttributes();
-        assertNotNull(attributes);
-        assertEquals(10, attributes.size());
-
-        Attribute attribute;
-
-        attribute = attributes.get(0);
-        assertNotNull(attribute);
-        assertEquals("onclick", attribute.getName());
-        assertNull(attribute.getDefaultValue());
-        assertNull(attribute.getMethodSignature());
-        assertEquals(DEFAULT_ATTRIBUTE_TYPE, attribute.getType());
-        assertNull(attribute.getTargets());
-        assertFalse(attribute.isRequired());
-        assertFalse(attribute.isExpert());
-        assertFalse(attribute.isPreferred());
-
-        attribute = attributes.get(1);
-        assertNotNull(attribute);
-        assertEquals("mode", attribute.getName());
-        assertEquals("ajax", attribute.getDefaultValue());
-        assertNull(attribute.getMethodSignature());
-        assertEquals(DEFAULT_ATTRIBUTE_TYPE, attribute.getType());
-        assertNull(attribute.getTargets());
-        assertFalse(attribute.isRequired());
-        assertFalse(attribute.isExpert());
-        assertFalse(attribute.isPreferred());
-
-        attribute = attributes.get(2);
-        assertNotNull(attribute);
-        assertEquals("action", attribute.getName());
-        assertNull(attribute.getDefaultValue());
-        assertEquals("void action()", attribute.getMethodSignature());
-        assertEquals(DEFAULT_ATTRIBUTE_TYPE, attribute.getType());
-        assertNull(attribute.getTargets());
-        assertFalse(attribute.isRequired());
-        assertFalse(attribute.isExpert());
-        assertFalse(attribute.isPreferred());
-
-        attribute = attributes.get(3);
-        assertNotNull(attribute);
-        assertEquals("changeListener", attribute.getName());
-        assertNull(attribute.getDefaultValue());
-        assertEquals("void changeListener(ValueChangeEvent)", attribute.getMethodSignature());
-        assertEquals(DEFAULT_ATTRIBUTE_TYPE, attribute.getType());
-        assertEquals("changes changes1", attribute.getTargets());
-        assertFalse(attribute.isRequired());
-        assertFalse(attribute.isExpert());
-        assertFalse(attribute.isPreferred());
-
-        attribute = attributes.get(4);
-        assertNotNull(attribute);
-        assertEquals("disabled", attribute.getName());
-        assertNull(attribute.getDefaultValue());
-        assertNull(attribute.getMethodSignature());
-        assertEquals(ClassName.parseName("boolean"), attribute.getType());
-        assertNull(attribute.getTargets());
-        assertFalse(attribute.isRequired());
-        assertFalse(attribute.isExpert());
-        assertFalse(attribute.isPreferred());
-
-        attribute = attributes.get(5);
-        assertNotNull(attribute);
-        assertEquals("delay", attribute.getName());
-        assertNull(attribute.getDefaultValue());
-        assertNull(attribute.getMethodSignature());
-        assertEquals(ClassName.parseName("java.lang.Integer"), attribute.getType());
-        assertNull(attribute.getTargets());
-        assertFalse(attribute.isRequired());
-        assertFalse(attribute.isExpert());
-        assertFalse(attribute.isPreferred());
-
-        attribute = attributes.get(6);
-        assertNotNull(attribute);
-        assertEquals("id", attribute.getName());
-        assertNull(attribute.getDefaultValue());
-        assertNull(attribute.getMethodSignature());
-        assertEquals(DEFAULT_ATTRIBUTE_TYPE, attribute.getType());
-        assertNull(attribute.getTargets());
-        assertTrue(attribute.isRequired());
-        assertFalse(attribute.isExpert());
-        assertFalse(attribute.isPreferred());
-
-        attribute = attributes.get(7);
-        assertNotNull(attribute);
-        assertFalse(attribute.isRequired());
-        assertEquals("experts", attribute.getName());
-        assertNull(attribute.getDefaultValue());
-        assertNull(attribute.getMethodSignature());
-        assertEquals(DEFAULT_ATTRIBUTE_TYPE, attribute.getType());
-        assertNull(attribute.getTargets());
-        assertEquals("For use by experts", attribute.getShortDescription());
-        assertEquals("Expert attribute", attribute.getDisplayName());
-        assertTrue(attribute.isExpert());
-        assertFalse(attribute.isPreferred());
-
-        attribute = attributes.get(8);
-        assertNotNull(attribute);
-        assertFalse(attribute.isRequired());
-        assertFalse(attribute.isExpert());
-        assertEquals("preferred", attribute.getName());
-        assertNull(attribute.getDefaultValue());
-        assertNull(attribute.getMethodSignature());
-        assertEquals(DEFAULT_ATTRIBUTE_TYPE, attribute.getType());
-        assertEquals("It's a preferred attribute", attribute.getShortDescription());
-        assertEquals("Preferred attribute", attribute.getDisplayName());
-        assertTrue(attribute.isPreferred());
-
-        attribute = attributes.get(9);
-        assertNotNull(attribute);
-        assertEquals("onchange", attribute.getName());
-
-        List<ClientBehavior> clientBehaviors = attribute.getClientBehaviors();
-        assertNotNull(clientBehaviors);
-        assertEquals(2, clientBehaviors.size());
-
-        ClientBehavior clientBehavior;
-
-        clientBehavior = clientBehaviors.get(0);
-        assertNotNull(clientBehavior);
-        assertEquals("change", clientBehavior.getEvent());
-        assertFalse(clientBehavior.isDefaultEvent());
-
-        clientBehavior = clientBehaviors.get(1);
-        assertNotNull(clientBehavior);
-        assertEquals("valueChange", clientBehavior.getEvent());
-        assertTrue(clientBehavior.isDefaultEvent());
-
-        assertEquals(Boolean.TRUE, interfaceSection.getRendersChildren());
-    }
-
-    @Test
-    public void testImpl() throws Exception {
-        Template template =
-            unmarshal(
-                Template.class,
-                TEMPLATE_PROLOG
-                    + TEMPLATE_MIDDLE
-                    + "<cdk:call expression=\"#{cc.clientId}\"/><table width=\"200\"><tbody><cdk:call expression=\"#{cc.fooMethod(clientId)}\"/></tbody></table>Header<div class='bar'>foo</div>"
-                    + TEMPLATE_EPILOG);
-
-        CompositeImplementation implementation = template.getImplementation();
-        assertNotNull(implementation);
-        List<Object> children = implementation.getChildren();
-        assertNotNull(children);
-        assertEquals(4, children.size());
-        assertEquals(CdkCallElement.class, children.get(0).getClass());
-        assertEquals(AnyElement.class, children.get(1).getClass());
-        assertEquals(String.class, children.get(2).getClass());
-    }
-
-    @Test
-    public void testInterface() throws Exception {
-        Template template =
-            unmarshal(Template.class, TEMPLATE_PROLOG
-                + "<cdk:class>org.richfaces.renderkit.html.TreeRenderer</cdk:class>"
-                + "<cdk:superclass>org.richfaces.renderkit.TreeRendererBase</cdk:superclass>"
-                + "<cdk:component-family>org.richfaces.TreeFamily</cdk:component-family>"
-                + "<cdk:renderer-type>org.richfaces.TreeRenderer</cdk:renderer-type>"
-                + "<cdk:renderkit-id>RF4_XHTML</cdk:renderkit-id>"
-                + "<cdk:renders-children>false</cdk:renders-children>" + TEMPLATE_MIDDLE + TEMPLATE_EPILOG);
-
-        CompositeInterface interfaceSection = template.getInterface();
-        assertNotNull(interfaceSection);
-
-        assertEquals(ClassName.parseName("org.richfaces.renderkit.html.TreeRenderer"), interfaceSection.getJavaClass());
-        assertEquals(ClassName.parseName("org.richfaces.renderkit.TreeRendererBase"), interfaceSection.getBaseClass());
-        assertEquals(FacesId.parseId("org.richfaces.TreeFamily"), interfaceSection.getComponentFamily());
-        assertEquals(FacesId.parseId("org.richfaces.TreeRenderer"), interfaceSection.getRendererType());
-        assertEquals("RF4_XHTML", interfaceSection.getRenderKitId());
-        assertEquals(Boolean.FALSE, interfaceSection.getRendersChildren());
-
-    }
-
-    @Test
-    public void testJstlCoreElements() throws Exception {
-        Template template =
-            unmarshal(Template.class, TEMPLATE_PROLOG + TEMPLATE_MIDDLE + "start"
-                + "<c:if test=\"#{someTest}\">if content</c:if>" + "<c:choose>"
-                + "<c:when test=\"#{anotherTest}\">when content</c:when>" + "<c:when test=\"#{coolTest}\">"
-                + "<c:if test=\"#{nestedIfTest}\">nested if content</c:if>" + "</c:when>"
-                + "<c:otherwise>otherwise content</c:otherwise>" + "</c:choose>"
-                + "<c:forEach items=\"#{someCollection}\" var=\"iterationVar\">" + "forEach content" + "</c:forEach>"
-                + "finish" + TEMPLATE_EPILOG);
-
-        CompositeImplementation implementation = template.getImplementation();
-        assertNotNull(implementation);
-
-        List<Object> children = implementation.getChildren();
-        assertNotNull(children);
-        assertEquals(5, children.size());
-        assertEquals("start", children.get(0));
-        assertEquals(CdkIfElement.class, children.get(1).getClass());
-        CdkIfElement ifElement = (CdkIfElement) children.get(1);
-        assertEquals("#{someTest}", ifElement.getTest());
-        List<Object> ifChildren = ifElement.getChildren();
-        assertNotNull(ifChildren);
-        assertEquals(1, ifChildren.size());
-        assertEquals("if content", ifChildren.get(0));
-
-        assertEquals(CdkChooseElement.class, children.get(2).getClass());
-        CdkChooseElement chooseElement = (CdkChooseElement) children.get(2);
-        List<Object> chooseChildren = chooseElement.getChildren();
-        assertNotNull(chooseChildren);
-        assertEquals(3, chooseChildren.size());
-
-        assertEquals(CdkWhenElement.class, chooseChildren.get(0).getClass());
-        CdkWhenElement firstWhen = (CdkWhenElement) chooseChildren.get(0);
-        assertEquals("#{anotherTest}", firstWhen.getTest());
-        List<Object> childrenOfFirstWhen = firstWhen.getChildren();
-        assertNotNull(childrenOfFirstWhen);
-        assertEquals(1, childrenOfFirstWhen.size());
-        assertEquals("when content", childrenOfFirstWhen.get(0));
-
-        assertEquals(CdkWhenElement.class, chooseChildren.get(1).getClass());
-        CdkWhenElement secondWhen = (CdkWhenElement) chooseChildren.get(1);
-        assertEquals("#{coolTest}", secondWhen.getTest());
-
-        List<Object> childrenOfSecondWhen = secondWhen.getChildren();
-        assertNotNull(childrenOfSecondWhen);
-        assertEquals(1, childrenOfSecondWhen.size());
-
-        assertEquals(CdkIfElement.class, childrenOfSecondWhen.get(0).getClass());
-        CdkIfElement nestedIf = (CdkIfElement) childrenOfSecondWhen.get(0);
-        assertEquals("#{nestedIfTest}", nestedIf.getTest());
-        List<Object> childrenOfNestedIf = nestedIf.getChildren();
-        assertNotNull(childrenOfNestedIf);
-        assertEquals(1, childrenOfNestedIf.size());
-        assertEquals("nested if content", childrenOfNestedIf.get(0));
-
-        assertEquals(CdkOtherwiseElement.class, chooseChildren.get(2).getClass());
-        CdkOtherwiseElement otherwiseElement = (CdkOtherwiseElement) chooseChildren.get(2);
-        List<Object> childrenOfOtherwiseElement = otherwiseElement.getChildren();
-        assertNotNull(childrenOfOtherwiseElement);
-        assertEquals(1, childrenOfOtherwiseElement.size());
-        assertEquals("otherwise content", childrenOfOtherwiseElement.get(0));
-
-        assertEquals(CdkForEachElement.class, children.get(3).getClass());
-        CdkForEachElement forEachElement = (CdkForEachElement) children.get(3);
-        assertEquals("#{someCollection}", forEachElement.getItems());
-        assertEquals("iterationVar", forEachElement.getVar());
-
-        List<Object> forEachChildren = forEachElement.getChildren();
-        assertNotNull(forEachChildren);
-        assertEquals(1, forEachChildren.size());
-        assertEquals("forEach content", forEachChildren.get(0));
-
-        assertEquals("finish", children.get(4));
-    }
-
-    @Test
-    public void testObject() throws Exception {
-        Template template =
-            unmarshal(Template.class, TEMPLATE_PROLOG + TEMPLATE_MIDDLE
-                + "<cdk:object name=\"rowCount\" type=\"int\" value=\"#{getRowCount(context)}\" />"
-                + "<cdk:object name=\"bodyExpression\" type=\"java.lang.String\">"
-                + "\"test expression\" +\n\"second line\"" + "</cdk:object>" +
-
-                TEMPLATE_EPILOG);
-
-        CompositeImplementation implementation = template.getImplementation();
-        assertNotNull(implementation);
-
-        List<Object> children = implementation.getChildren();
-        assertNotNull(children);
-        assertEquals(2, children.size());
-
-        assertEquals(CdkObjectElement.class, children.get(0).getClass());
-        CdkObjectElement firstObject = (CdkObjectElement) children.get(0);
-        assertNotNull(firstObject);
-        assertEquals("rowCount", firstObject.getName());
-        assertEquals("int", firstObject.getType());
-        assertEquals("#{getRowCount(context)}", firstObject.getValue());
-
-        assertEquals(CdkObjectElement.class, children.get(1).getClass());
-        CdkObjectElement secondObject = (CdkObjectElement) children.get(1);
-        assertNotNull(secondObject);
-        assertEquals("bodyExpression", secondObject.getName());
-        assertEquals("java.lang.String", secondObject.getType());
-        assertEquals("\"test expression\" +\n\"second line\"", secondObject.getBodyValue());
-    }
-
-    @Test
-    public void testResourceDependencies() throws Exception {
-        Template template =
-            unmarshal(Template.class, TEMPLATE_PROLOG + "<cdk:resource-dependency name=\"jquery.js\" />"
-                + "<cdk:resource-dependency name=\"richfaces.css\" library=\"org.richfaces\" />"
-                + "<cdk:resource-dependency name=\"richfaces.js\" library=\"org.richfaces\" target=\"body\" /> "
-
-                + TEMPLATE_MIDDLE + TEMPLATE_EPILOG);
-
-        CompositeInterface interfaceSection = template.getInterface();
-        assertNotNull(interfaceSection);
-
-        assertNull(interfaceSection.getRendersChildren());
-
-        List<ResourceDependency> resourceDependencies = interfaceSection.getResourceDependencies();
-        assertNotNull(resourceDependencies);
-        assertEquals(3, resourceDependencies.size());
-
-        ResourceDependency resourceDependency;
-
-        resourceDependency = resourceDependencies.get(0);
-        assertNotNull(resourceDependency);
-        assertEquals("jquery.js", resourceDependency.getName());
-        assertNull(resourceDependency.getLibrary());
-        assertEquals("head", resourceDependency.getTarget());
-
-        resourceDependency = resourceDependencies.get(1);
-        assertNotNull(resourceDependency);
-        assertEquals("richfaces.css", resourceDependency.getName());
-        assertEquals("org.richfaces", resourceDependency.getLibrary());
-        assertEquals("head", resourceDependency.getTarget());
-
-        resourceDependency = resourceDependencies.get(2);
-        assertNotNull(resourceDependency);
-        assertEquals("richfaces.js", resourceDependency.getName());
-        assertEquals("org.richfaces", resourceDependency.getLibrary());
-        assertEquals("body", resourceDependency.getTarget());
-    }
-
-    @Test
-    public void testTemplate() throws Exception {
-        Template template = unmarshal(Template.class, TEMPLATE_PROLOG + TEMPLATE_MIDDLE + TEMPLATE_EPILOG);
-        assertNotNull(template.getInterface());
-        assertNotNull(template.getImplementation());
-    }
-}
                                
                         
                        
                                
                                15 years, 4 months
                        
                        
                 
         
 
        
            
        
        
        
                
                        
                                
                                
                                        
                                
                         
                        
                                
                                
                                        
                                                
                                        
                                        
                                        JBoss Rich Faces SVN: r17691 - in root: core/trunk/impl/src/main/resources/META-INF/resources and 4 other directories.
                                
                                
                                
                                    
                                        by richfaces-svn-commits@lists.jboss.org
                                    
                                
                                
                                        Author: nbelaevski
Date: 2010-06-30 15:46:12 -0400 (Wed, 30 Jun 2010)
New Revision: 17691
Modified:
   root/core/trunk/impl/src/main/java/org/ajax4jsf/renderkit/AjaxRendererUtils.java
   root/core/trunk/impl/src/main/java/org/ajax4jsf/renderkit/RendererBase.java
   root/core/trunk/impl/src/main/resources/META-INF/resources/richfaces.js
   root/core/trunk/impl/src/test/resources/javascript/4_0_0.html
   root/ui/core/trunk/ui/src/main/java/org/richfaces/component/AbstractPush.java
   root/ui/core/trunk/ui/src/main/java/org/richfaces/renderkit/AjaxCommandRendererBase.java
   root/ui/core/trunk/ui/src/main/java/org/richfaces/renderkit/html/AjaxPushRenderer.java
Log:
https://jira.jboss.org/browse/RF-8744
Modified: root/core/trunk/impl/src/main/java/org/ajax4jsf/renderkit/AjaxRendererUtils.java
===================================================================
--- root/core/trunk/impl/src/main/java/org/ajax4jsf/renderkit/AjaxRendererUtils.java	2010-06-30 19:32:51 UTC (rev 17690)
+++ root/core/trunk/impl/src/main/java/org/ajax4jsf/renderkit/AjaxRendererUtils.java	2010-06-30 19:46:12 UTC (rev 17691)
@@ -360,6 +360,8 @@
                 ajaxEventOptions.set(behaviorName, handlerScript);
             }
         }
+        
+        ajaxEventOptions.set("incId", "1");
     }
 
 //  public static AjaxEventOptions buildEventOptions(FacesContext facesContext,
@@ -779,6 +781,7 @@
      * @param component for wich calculate function name
      * @return name of JavaScript function or <code>null</code>
      */
+    //TODO nick - refactor - remove this method?
     public static String getAjaxOncomplete(UIComponent component) {
         if (component instanceof AjaxComponent) {
             return ((AjaxComponent) component).getOncomplete();
@@ -793,6 +796,7 @@
      * @param component for wich calculate function name
      * @return name of JavaScript function or <code>null</code>
      */
+    //TODO nick - refactor - remove this method?
     public static String getAjaxOnBeforeDomUpdate(UIComponent component) {
         if (component instanceof AjaxComponent) {
             return ((AjaxComponent) component).getOnbeforedomupdate();
@@ -801,6 +805,7 @@
         return (String) component.getAttributes().get(ONBEFOREDOMUPDATE_ATTR_NAME);
     }
 
+    //TODO nick - refactor - remove this method?
     public static String getAjaxOnBegin(UIComponent component) {
         if (component instanceof AjaxComponent) {
             return ((AjaxComponent) component).getOnbegin();
Modified: root/core/trunk/impl/src/main/java/org/ajax4jsf/renderkit/RendererBase.java
===================================================================
--- root/core/trunk/impl/src/main/java/org/ajax4jsf/renderkit/RendererBase.java	2010-06-30 19:32:51 UTC (rev 17690)
+++ root/core/trunk/impl/src/main/java/org/ajax4jsf/renderkit/RendererBase.java	2010-06-30 19:46:12 UTC (rev 17691)
@@ -45,11 +45,6 @@
  */
 public abstract class RendererBase extends Renderer {
 
-    /**
-     * logger for common cases.
-     */
-    protected static final String JAVASCRIPT_NAMESPACE = "Exadel";
-
     private static final Logger LOG = RichfacesLogger.RENDERKIT.getLogger();
     private static final RendererUtils UTILS = RendererUtils.getInstance();
 
@@ -79,11 +74,19 @@
 
         // TODO - create set od common decoders ( UIInput, ActionSource etc. ) for process decoding.
         if (component.isRendered()) {
-            RenderKitUtils.decodeBehaviors(context, component);
+            String behaviorEventName = RenderKitUtils.decodeBehaviors(context, component);
+            if (behaviorEventName != null) {
+                queueComponentEventForBehaviorEvent(context, component, behaviorEventName);
+            }
+            
             doDecode(context, component);
         }
     }
 
+    protected void queueComponentEventForBehaviorEvent(FacesContext context, UIComponent component, String eventName) {
+        
+    }
+    
     protected void preDecode(FacesContext context, UIComponent component) {
     }
 
Modified: root/core/trunk/impl/src/main/resources/META-INF/resources/richfaces.js
===================================================================
--- root/core/trunk/impl/src/main/resources/META-INF/resources/richfaces.js	2010-06-30 19:32:51 UTC (rev 17690)
+++ root/core/trunk/impl/src/main/resources/META-INF/resources/richfaces.js	2010-06-30 19:46:12 UTC (rev 17691)
@@ -560,7 +560,6 @@
 
 	richfaces.ajax = function(source, event, options) {
 		var sourceId = (typeof source == 'object' && source.id) ? source.id : source;
-		var sourceElt = (typeof source == 'object') ? source : document.getElementById(sourceId);
 		
 		options = options || {};
 
@@ -600,7 +599,7 @@
 			}
 		}
 
-		if (!jQuery(sourceElt).is(":input:not(:submit, :button, :image, :reset)")) {
+		if (options.incId) {
 			parameters[sourceId] = sourceId;
 		}
 
Modified: root/core/trunk/impl/src/test/resources/javascript/4_0_0.html
===================================================================
--- root/core/trunk/impl/src/test/resources/javascript/4_0_0.html	2010-06-30 19:32:51 UTC (rev 17690)
+++ root/core/trunk/impl/src/test/resources/javascript/4_0_0.html	2010-06-30 19:46:12 UTC (rev 17691)
@@ -137,13 +137,27 @@
 				adapter(eventData);
 			});
 			
-			test("RichFaces.ajax test", function() {
-				expect(7);
+			test("RichFaces.ajax behavior test", function() {
+				expect(1);
+
 				var ajaxSource = "source";
 				var ajaxEvent = "event";
 				var ajaxOptions = {parameters: {'param': 'value'}};
 				jsf.ajax = {
 					request : function(source, event, options) {
+						ok(!options['source']);
+					}
+				}
+				RichFaces.ajax(ajaxSource, ajaxEvent, ajaxOptions);
+			});
+			
+			test("RichFaces.ajax component test", function() {
+				expect(7);
+				var ajaxSource = "source";
+				var ajaxEvent = "event";
+				var ajaxOptions = {parameters: {'param': 'value'}, incId: 1};
+				jsf.ajax = {
+					request : function(source, event, options) {
 						equals(source, ajaxSource);
 						equals(event, ajaxEvent);
 						equals(options['execute'], '@component');
Modified: root/ui/core/trunk/ui/src/main/java/org/richfaces/component/AbstractPush.java
===================================================================
--- root/ui/core/trunk/ui/src/main/java/org/richfaces/component/AbstractPush.java	2010-06-30 19:32:51 UTC (rev 17690)
+++ root/ui/core/trunk/ui/src/main/java/org/richfaces/component/AbstractPush.java	2010-06-30 19:46:12 UTC (rev 17691)
@@ -29,8 +29,6 @@
 import javax.el.MethodExpression;
 import javax.faces.component.NamingContainer;
 import javax.faces.context.FacesContext;
-import javax.faces.event.BehaviorEvent;
-import javax.faces.event.FacesEvent;
 import javax.servlet.http.HttpSession;
 
 import org.richfaces.cdk.annotations.Attribute;
@@ -58,8 +56,6 @@
 
     public static final String ON_DATA_AVAILABLE = "ondataavailable";
 
-    private transient boolean hasActiveBehavior = false;
-
     @Override
     public void encodeBegin(FacesContext context) throws IOException {
         MethodExpression producer = getEventProducer();
@@ -95,22 +91,6 @@
         return id.toString();
     }
 
-    @Override
-    public void queueEvent(FacesEvent e) {
-        if (e instanceof BehaviorEvent) {
-            hasActiveBehavior = true;
-        }
-
-        super.queueEvent(e);
-    }
-
-    /**
-     * @return the hasActiveBehavior
-     */
-    public boolean isHasActiveBehavior() {
-        return hasActiveBehavior;
-    }
-
     // ---------------------------------------
     @Attribute(signature = @Signature(parameters = EventListener.class))
     public abstract MethodExpression getEventProducer();
Modified: root/ui/core/trunk/ui/src/main/java/org/richfaces/renderkit/AjaxCommandRendererBase.java
===================================================================
--- root/ui/core/trunk/ui/src/main/java/org/richfaces/renderkit/AjaxCommandRendererBase.java	2010-06-30 19:32:51 UTC (rev 17690)
+++ root/ui/core/trunk/ui/src/main/java/org/richfaces/renderkit/AjaxCommandRendererBase.java	2010-06-30 19:46:12 UTC (rev 17691)
@@ -53,6 +53,15 @@
     private static final Logger LOG = RichfacesLogger.RENDERKIT.getLogger();
 
     @Override
+    protected void queueComponentEventForBehaviorEvent(FacesContext context, UIComponent component, String eventName) {
+        super.queueComponentEventForBehaviorEvent(context, component, eventName);
+        
+        if ("action".equals(eventName) || "click".equals(eventName)) {
+            new ActionEvent(component).queue();
+        } 
+    }
+    
+    @Override
     protected void doDecode(FacesContext facesContext, UIComponent uiComponent) {
         if (isSubmitted(facesContext, uiComponent)) {
             new ActionEvent(uiComponent).queue();
Modified: root/ui/core/trunk/ui/src/main/java/org/richfaces/renderkit/html/AjaxPushRenderer.java
===================================================================
--- root/ui/core/trunk/ui/src/main/java/org/richfaces/renderkit/html/AjaxPushRenderer.java	2010-06-30 19:32:51 UTC (rev 17690)
+++ root/ui/core/trunk/ui/src/main/java/org/richfaces/renderkit/html/AjaxPushRenderer.java	2010-06-30 19:46:12 UTC (rev 17691)
@@ -21,6 +21,17 @@
 
 package org.richfaces.renderkit.html;
 
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.faces.application.ResourceDependencies;
+import javax.faces.application.ResourceDependency;
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.context.ResponseWriter;
+import javax.faces.event.ActionEvent;
+
 import org.ajax4jsf.javascript.JSFunction;
 import org.ajax4jsf.javascript.JSFunctionDefinition;
 import org.ajax4jsf.javascript.JSReference;
@@ -29,28 +40,15 @@
 import org.ajax4jsf.renderkit.HandlersChain;
 import org.ajax4jsf.renderkit.RendererBase;
 import org.ajax4jsf.renderkit.RendererUtils.HTML;
+import org.richfaces.cdk.annotations.JsfRenderer;
 import org.richfaces.component.AbstractPush;
 import org.richfaces.resource.PushResource;
-import org.richfaces.cdk.annotations.JsfRenderer;
 
-import javax.faces.application.ResourceDependencies;
-import javax.faces.application.ResourceDependency;
-import javax.faces.component.UIComponent;
-import javax.faces.context.FacesContext;
-import javax.faces.context.ResponseWriter;
-import javax.faces.event.ActionEvent;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
 /**
  * @author shura
  */
-@ResourceDependencies(value = {
-        @ResourceDependency(library = "javax.faces", name = "jsf.js"),
-        @ResourceDependency(name = "jquery.js"),
-        @ResourceDependency(name = "richfaces.js")
-        })
+@ResourceDependencies({@ResourceDependency(library = "javax.faces", name = "jsf.js") ,
+    @ResourceDependency(name = "jquery.js") , @ResourceDependency(name = "richfaces.js")})
 @JsfRenderer
 public class AjaxPushRenderer extends RendererBase {
 
@@ -64,6 +62,15 @@
 
     public static final int DEFAULT_PUSH_WAIT = Integer.MIN_VALUE;
 
+    @Override
+    protected void queueComponentEventForBehaviorEvent(FacesContext context, UIComponent component, String eventName) {
+        super.queueComponentEventForBehaviorEvent(context, component, eventName);
+        
+        if (AbstractPush.DATA_AVAILABLE.equals(eventName) || AbstractPush.ON_DATA_AVAILABLE.equals(eventName)) {
+            new ActionEvent(component).queue();
+        } 
+    }
+    
     /* (non-Javadoc)
       * @see org.ajax4jsf.renderkit.RendererBase#doEncodeEnd(javax.faces.context.ResponseWriter,
       * javax.faces.context.FacesContext, javax.faces.component.UIComponent)
@@ -148,7 +155,7 @@
         AbstractPush push = (AbstractPush) component;
         if (push.isEnabled()) {
             Map<String, String> requestParameterMap = context.getExternalContext().getRequestParameterMap();
-            if (requestParameterMap.get(push.getClientId(context)) != null || push.isHasActiveBehavior()) {
+            if (requestParameterMap.get(push.getClientId(context)) != null) {
                 new ActionEvent(push).queue();
             }
         }
                                
                         
                        
                                
                                15 years, 4 months
                        
                        
                 
         
 
        
            
        
        
        
                
                        
                                
                                
                                        
                                
                         
                        
                                
                                
                                        
                                                
                                        
                                        
                                        JBoss Rich Faces SVN: r17690 - in root/commons/trunk/api/src: test/java/org/richfaces/renderkit and 1 other directory.
                                
                                
                                
                                    
                                        by richfaces-svn-commits@lists.jboss.org
                                    
                                
                                
                                        Author: nbelaevski
Date: 2010-06-30 15:32:51 -0400 (Wed, 30 Jun 2010)
New Revision: 17690
Modified:
   root/commons/trunk/api/src/main/java/org/richfaces/renderkit/RenderKitUtils.java
   root/commons/trunk/api/src/test/java/org/richfaces/renderkit/RenderKitUtilsMocksTest.java
Log:
https://jira.jboss.org/browse/RF-8744
Modified: root/commons/trunk/api/src/main/java/org/richfaces/renderkit/RenderKitUtils.java
===================================================================
--- root/commons/trunk/api/src/main/java/org/richfaces/renderkit/RenderKitUtils.java	2010-06-30 19:18:06 UTC (rev 17689)
+++ root/commons/trunk/api/src/main/java/org/richfaces/renderkit/RenderKitUtils.java	2010-06-30 19:32:51 UTC (rev 17690)
@@ -353,16 +353,16 @@
         }
     }
     
-    public static void decodeBehaviors(FacesContext context, UIComponent component) {
+    public static String decodeBehaviors(FacesContext context, UIComponent component) {
         if (!(component instanceof ClientBehaviorHolder)) {
-            return;
+            return null;
         }
 
         ClientBehaviorHolder holder = (ClientBehaviorHolder) component;
         Map<String, List<ClientBehavior>> behaviors = holder.getClientBehaviors();
 
         if (behaviors == null || behaviors.isEmpty()) {
-            return;
+            return null;
         }
 
         ExternalContext externalContext = context.getExternalContext();
@@ -370,7 +370,7 @@
         String behaviorEvent = parametersMap.get(BEHAVIOR_EVENT_NAME);
 
         if (behaviorEvent == null) {
-            return;
+            return null;
         }
 
         List<ClientBehavior> behaviorsForEvent = behaviors.get(behaviorEvent);
@@ -378,12 +378,16 @@
         String clientId = component.getClientId(context);
 
         if (behaviorSource != null && behaviorSource.equals(clientId)) {
-            if (behaviorsForEvent != null) {
+            if (behaviorsForEvent != null && !behaviorsForEvent.isEmpty()) {
                 for (ClientBehavior behavior : behaviorsForEvent) {
                     behavior.decode(context, component);
                 }
+                
+                return behaviorEvent;
             }
         }
+        
+        return null;
     }
 
 }
Modified: root/commons/trunk/api/src/test/java/org/richfaces/renderkit/RenderKitUtilsMocksTest.java
===================================================================
--- root/commons/trunk/api/src/test/java/org/richfaces/renderkit/RenderKitUtilsMocksTest.java	2010-06-30 19:18:06 UTC (rev 17689)
+++ root/commons/trunk/api/src/test/java/org/richfaces/renderkit/RenderKitUtilsMocksTest.java	2010-06-30 19:32:51 UTC (rev 17690)
@@ -25,6 +25,8 @@
 import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.expectLastCall;
 import static org.easymock.EasyMock.same;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
 import java.io.IOException;
@@ -322,7 +324,7 @@
         
         facesEnvironment.replay();
 
-        RenderKitUtils.decodeBehaviors(facesContext, component);
+        assertEquals("action", RenderKitUtils.decodeBehaviors(facesContext, component));
     }
 
     @Test
@@ -337,7 +339,7 @@
         
         facesEnvironment.replay();
 
-        RenderKitUtils.decodeBehaviors(facesContext, component);
+        assertEquals("blur", RenderKitUtils.decodeBehaviors(facesContext, component));
     }
     
     @Test
@@ -348,7 +350,7 @@
         
         facesEnvironment.replay();
 
-        RenderKitUtils.decodeBehaviors(facesContext, component);
+        assertNull(RenderKitUtils.decodeBehaviors(facesContext, component));
     }
 
     @Test
@@ -359,7 +361,7 @@
         
         facesEnvironment.replay();
 
-        RenderKitUtils.decodeBehaviors(facesContext, component);
+        assertNull(RenderKitUtils.decodeBehaviors(facesContext, component));
     }
 
     @Test
@@ -370,6 +372,6 @@
 
         facesEnvironment.replay();
 
-        RenderKitUtils.decodeBehaviors(facesContext, component);
+        assertNull(RenderKitUtils.decodeBehaviors(facesContext, component));
     }
 }
\ No newline at end of file
                                
                         
                        
                                
                                15 years, 4 months
                        
                        
                 
         
 
        
            
        
        
        
                
                        
                                
                                
                                        
                                
                         
                        
                                
                                
                                        
                                                
                                        
                                        
                                        JBoss Rich Faces SVN: r17689 - root/ui-sandbox/panels/trunk/docs.
                                
                                
                                
                                    
                                        by richfaces-svn-commits@lists.jboss.org
                                    
                                
                                
                                        Author: Alex.Kolonitsky
Date: 2010-06-30 15:18:06 -0400 (Wed, 30 Jun 2010)
New Revision: 17689
Added:
   root/ui-sandbox/panels/trunk/docs/legend.png
Modified:
   root/ui-sandbox/panels/trunk/docs/client_side_api-dev.png
   root/ui-sandbox/panels/trunk/docs/client_side_api.png
   root/ui-sandbox/panels/trunk/docs/taglib-dev.png
   root/ui-sandbox/panels/trunk/docs/taglib.png
Log:
RF-8745	TogglePanel component
update diagrams
Modified: root/ui-sandbox/panels/trunk/docs/client_side_api-dev.png
===================================================================
(Binary files differ)
Modified: root/ui-sandbox/panels/trunk/docs/client_side_api.png
===================================================================
(Binary files differ)
Added: root/ui-sandbox/panels/trunk/docs/legend.png
===================================================================
(Binary files differ)
Property changes on: root/ui-sandbox/panels/trunk/docs/legend.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream
Modified: root/ui-sandbox/panels/trunk/docs/taglib-dev.png
===================================================================
(Binary files differ)
Modified: root/ui-sandbox/panels/trunk/docs/taglib.png
===================================================================
(Binary files differ)
                                
                         
                        
                                
                                15 years, 4 months
                        
                        
                 
         
 
        
            
        
        
        
            
        
        
        
                
                        
                        
                                
                                
                                        
                                                
                                        
                                        
                                        JBoss Rich Faces SVN: r17687 - root/commons/branches.
                                
                                
                                
                                    
                                        by richfaces-svn-commits@lists.jboss.org
                                    
                                
                                
                                        Author: alexsmirnov
Date: 2010-06-30 14:46:51 -0400 (Wed, 30 Jun 2010)
New Revision: 17687
Added:
   root/commons/branches/RF8755/
Log:
development branch
Copied: root/commons/branches/RF8755 (from rev 17685, root/commons/trunk)
                                
                         
                        
                                
                                15 years, 4 months
                        
                        
                 
         
 
        
            
        
        
        
                
                        
                                
                                
                                        
                                
                         
                        
                                
                                
                                        
                                                
                                        
                                        
                                        JBoss Rich Faces SVN: r17686 - in root: examples/iteration-demo/trunk/src/main/webapp and 3 other directories.
                                
                                
                                
                                    
                                        by richfaces-svn-commits@lists.jboss.org
                                    
                                
                                
                                        Author: konstantin.mishin
Date: 2010-06-30 14:07:32 -0400 (Wed, 30 Jun 2010)
New Revision: 17686
Added:
   root/ui/iteration/trunk/tables/api/src/main/java/org/richfaces/model/SelectionMode.java
Modified:
   root/examples/iteration-demo/trunk/src/main/java/org/richfaces/demo/DataBean.java
   root/examples/iteration-demo/trunk/src/main/webapp/extendedtable.xhtml
   root/ui/iteration/trunk/tables/ui/src/main/java/org/richfaces/renderkit/ExtendedDataTableRenderer.java
   root/ui/iteration/trunk/tables/ui/src/main/java/org/richfaces/renderkit/SelectionRenderer.java
   root/ui/iteration/trunk/tables/ui/src/main/resources/META-INF/resources/extendedDataTable.js
Log:
RF-8101
Modified: root/examples/iteration-demo/trunk/src/main/java/org/richfaces/demo/DataBean.java
===================================================================
--- root/examples/iteration-demo/trunk/src/main/java/org/richfaces/demo/DataBean.java	2010-06-30 15:52:20 UTC (rev 17685)
+++ root/examples/iteration-demo/trunk/src/main/java/org/richfaces/demo/DataBean.java	2010-06-30 18:07:32 UTC (rev 17686)
@@ -1,5 +1,6 @@
 package org.richfaces.demo;
 
+import java.util.Collection;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
@@ -12,6 +13,7 @@
 import org.richfaces.demo.model.Employee;
 import org.richfaces.demo.utils.EmployeeUtils;
 import org.richfaces.event.SortingEvent;
+import org.richfaces.model.SelectionMode;
 
 @ManagedBean(name="dataBean")
 @SessionScoped
@@ -36,6 +38,10 @@
     private List<Employee> employeeList;
     private boolean state = true;
 
+    private SelectionMode selectionMode = SelectionMode.multiple;
+    
+    private Collection<Object> selectedRowKeys;
+    
     public String getTarget() {
         return target;
     }
@@ -126,4 +132,24 @@
     public boolean isRendered() {
         return rendered;
     }
+
+    public void setSelectionMode(SelectionMode selectionMode) {
+        this.selectionMode = selectionMode;
+    }
+
+    public SelectionMode getSelectionMode() {
+        return selectionMode;
+    }
+    
+    public SelectionMode[] getSelectionModes() {
+        return SelectionMode.values();
+    }
+
+    public void setSelectedRowKeys(Collection<Object> selectedRowKeys) {
+        this.selectedRowKeys = selectedRowKeys;
+    }
+
+    public Collection<Object> getSelectedRowKeys() {
+        return selectedRowKeys;
+    }
 }
Modified: root/examples/iteration-demo/trunk/src/main/webapp/extendedtable.xhtml
===================================================================
--- root/examples/iteration-demo/trunk/src/main/webapp/extendedtable.xhtml	2010-06-30 15:52:20 UTC (rev 17685)
+++ root/examples/iteration-demo/trunk/src/main/webapp/extendedtable.xhtml	2010-06-30 18:07:32 UTC (rev 17686)
@@ -6,7 +6,7 @@
       xmlns:f="http://java.sun.com/jsf/core"
       xmlns:c="http://java.sun.com/jsp/jstl/core"
       xmlns:ui="http://java.sun.com/jsf/facelets"
-      xmlns:it="http://richfaces.org/iteration">
+      xmlns:rich="http://richfaces.org/rich">
 <!--
 JBoss, Home of Professional Open Source
 Copyright ${year}, Red Hat, Inc. and individual contributors
@@ -34,7 +34,6 @@
 	<h:head>
 	    <title>Richfaces ExtendedDataTable</title>
 		<style type="text/css">
-			@charset "utf-8";
 			.extendedDataTable{
 				width:500px;
 				height: 500px;
@@ -48,13 +47,12 @@
 	    	<h:selectBooleanCheckbox value="#{dataBean.state}">
 	    		<f:ajax render="extendedDataTable" />
 	    	</h:selectBooleanCheckbox>
-	    	<br />
-	    	<h:outputText value="Render footer" />
+	    	<h:outputText value="Render footer" style="padding-left: 30px;"/>
 	    	<h:selectBooleanCheckbox value="#{dataBean.rendered}">
 	    		<f:ajax render="extendedDataTable" />
 	    	</h:selectBooleanCheckbox>
 	    	<br />
-	    	JS API
+	    	<h:outputText value="JS API" />
 	    	<script type="text/javascript">
 <!--
 function invokeJSAPI() {
@@ -67,9 +65,21 @@
 			<input id="js_api_function_string_input" type="text" value="sort('column_title')" size="60"/>
 			<input type="button" value="Run" onclick="invokeJSAPI()" />
 			<input id="js_api_result" type="text" readonly="readonly" size="60"/>
-			<it:extendedDataTable id="extendedDataTable" clientRows="40" rows="100" frozenColumns="2"
+			<br />
+			<h:outputText value="Selection mode" />
+			<h:selectOneMenu value="#{dataBean.selectionMode}">
+				<f:selectItems value="#{dataBean.selectionModes}"/>
+				<f:ajax render="extendedDataTable" />
+			</h:selectOneMenu>
+			<h:outputText value="Lock selection" style="padding-left: 30px;"/>
+			<input id="selectionLocker" type="checkbox"/>
+			<h:outputText value="Selected rowKeys" style="padding-left: 30px;"/>
+			<h:outputText id="selectionOutput" value="#{dataBean.selectedRowKeys}"/>
+			<rich:extendedDataTable id="extendedDataTable" clientRows="40" rows="100" frozenColumns="2"
 				value="#{dataBean.state ? dataBean.employeeList : null}" var="record" noDataLabel="There isn't data."
-				styleClass="extendedDataTable" rowKeyVar="rkv" filterVar="fv" sortMode="multi">
+				styleClass="extendedDataTable" rowKeyVar="rkv" filterVar="fv" sortMode="multi" 
+				selectionMode="#{dataBean.selectionMode}" selectedRowKeys="#{dataBean.selectedRowKeys}"
+				onselectionchange="document.getElementById('submit').click();" onbeforeselectionchange="if (document.getElementById('selectionLocker').checked) return false;">
 				<f:facet name="header">
 					<h:outputText value="Current date: #{dataBean.date}"/>
 				</f:facet>
@@ -79,7 +89,7 @@
 				<f:facet name="noData">
 					<h:outputText value="There isn't data." style="border: solid black 1px;"/>
 				</f:facet>
-				<it:column id="rkv">
+				<rich:column id="rkv">
 					<f:facet name="header">
 						<h:outputText value="Index"/>
 					</f:facet>
@@ -89,8 +99,8 @@
 							<h:outputText id="footerFacet" value="index"/>
 						</f:facet>
 	     			</c:if>
-				</it:column>
-				<it:column id="column_name" filterExpression="#{fn:containsIgnoreCase(record.name, fv)}" sortBy="#{record.name}">
+				</rich:column>
+				<rich:column id="column_name" filterExpression="#{fn:containsIgnoreCase(record.name, fv)}" sortBy="#{record.name}">
 					<f:facet name="header">
 						<h:outputText id="columnHeader1" value="Column Header Facet"/>
 					</f:facet>
@@ -100,31 +110,31 @@
 							<h:outputText  id="columnFooter1"  value="Column Footer Facet"/>
 						</f:facet>
 					</c:if>
-				</it:column>
+				</rich:column>
 				
-				<it:column id="column_title" width="200px" sortBy="#{record.title}">
+				<rich:column id="column_title" width="200px" sortBy="#{record.title}">
 					<h:outputText value="#{record.title}" />
 	     			<c:if test="#{dataBean.rendered}">
 						<f:facet name="footer">
 							<h:outputText  id="columnFooter2"  value="Column Footer Facet2"/>
 						</f:facet>
 					</c:if>
-				</it:column>
+				</rich:column>
 			
-				<it:column id="column_email" width="300px">
+				<rich:column id="column_email" width="300px">
 					<h:outputText value="#{record.EMail}" />
-				</it:column>				
-				<it:column id="column_company_name" width="300px">
+				</rich:column>				
+				<rich:column id="column_company_name" width="300px">
 					<h:outputText value="#{record.companies[0].name}" />
-				</it:column>				
-				<it:column id="column_company_state">
+				</rich:column>				
+				<rich:column id="column_company_state">
 					<h:outputText value="#{record.companies[0].state}" />
-				</it:column>
-				<it:column id="column_company_phone">
+				</rich:column>
+				<rich:column id="column_company_phone">
 					<h:outputText value="#{record.companies[0].phone}" />
-				</it:column>
-			</it:extendedDataTable>
-			<input type="submit" />
+				</rich:column>
+			</rich:extendedDataTable>
+			<input id="submit" type="submit" />
 	   </h:form>
 	</h:body>
 </html>
Added: root/ui/iteration/trunk/tables/api/src/main/java/org/richfaces/model/SelectionMode.java
===================================================================
--- root/ui/iteration/trunk/tables/api/src/main/java/org/richfaces/model/SelectionMode.java	                        (rev 0)
+++ root/ui/iteration/trunk/tables/api/src/main/java/org/richfaces/model/SelectionMode.java	2010-06-30 18:07:32 UTC (rev 17686)
@@ -0,0 +1,30 @@
+/*
+ * 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.model;
+
+public enum SelectionMode {
+    none,
+    single,
+    multiple,
+    multipleKeyboardFree
+}
Modified: root/ui/iteration/trunk/tables/ui/src/main/java/org/richfaces/renderkit/ExtendedDataTableRenderer.java
===================================================================
--- root/ui/iteration/trunk/tables/ui/src/main/java/org/richfaces/renderkit/ExtendedDataTableRenderer.java	2010-06-30 15:52:20 UTC (rev 17685)
+++ root/ui/iteration/trunk/tables/ui/src/main/java/org/richfaces/renderkit/ExtendedDataTableRenderer.java	2010-06-30 18:07:32 UTC (rev 17686)
@@ -50,11 +50,14 @@
 import org.ajax4jsf.model.DataVisitor;
 import org.ajax4jsf.model.SequenceRange;
 import org.ajax4jsf.renderkit.AjaxEventOptions;
+import org.ajax4jsf.renderkit.RendererUtils;
 import org.ajax4jsf.renderkit.RendererUtils.HTML;
+import org.ajax4jsf.renderkit.RendererUtils.ScriptHashVariableWrapper;
 import org.richfaces.component.UIDataTableBase;
 import org.richfaces.component.UIExtendedDataTable;
 import org.richfaces.component.util.HtmlUtil;
 import org.richfaces.context.OnOffResponseWriter;
+import org.richfaces.model.SelectionMode;
 
 /**
  * @author Konstantin Mishin
@@ -292,7 +295,7 @@
                     writer.startElement(HTML.TBODY_ELEMENT, table);
                     writer.startElement(HTML.TR_ELEMENT, table);
                     while (columns.hasNext()) {
-                        if(columnFacetPresent) {
+                        if (columnFacetPresent) {
                             encodeHeaderOrFooterCell(context, writer, columns.next(), name);
                         } else {
                             encodeEmptyFooterCell(context, writer, columns.next());
@@ -515,6 +518,9 @@
                         + "; i++ ) richTBody.appendChild(richTBody.removeChild(richRows[0]));");
                     writer.endEval();
                 }
+                writer.startUpdate(component.getClientId(context) + ":si");
+                encodeSelectionInput(writer, context, component);
+                writer.endUpdate();
                 writer.startEval();
                 writer.write("jQuery('#" + component.getClientId(context).replace(":", "\\\\:")
                     + "').triggerHandler('rich:onajaxcomplete', {first: " + table.getClientFirst() + "});");
@@ -545,9 +551,13 @@
                     encodeFooter(state);
                 } else if (UIDataTableBase.BODY.equals(metaComponentId)) {
                     encodeBody(state);
+                    writer.startUpdate(component.getClientId(context) + ":si");
+                    encodeSelectionInput(writer, context, component);
+                    writer.endUpdate();
                     writer.startEval();
                     writer.write("jQuery('#" + component.getClientId(context).replace(":", "\\\\:")
-                        + "').triggerHandler('rich:onajaxcomplete', {first: " + table.getClientFirst() + ", rowCount: " + getRowCount(component)+ ", reinitializeBody: true});");
+                        + "').triggerHandler('rich:onajaxcomplete', {first: " + table.getClientFirst() + ", rowCount: "
+                        + getRowCount(component) + ", reinitializeBody: true});");
                     writer.endEval();
                 } else {
                     throw new IllegalArgumentException("Unsupported metaComponentIdentifier: " + metaComponentId);
@@ -627,9 +637,24 @@
         Map<String, Object> parameters = eventOptions.getParameters();
         eventOptions.set(AjaxEventOptions.PARAMETERS, new JSReference("parameters"));
         ajaxFunction.addParameter(eventOptions);
-        writer.write("new RichFaces.ExtendedDataTable('" + component.getClientId(context) + "', "
-            + getRowCount(component) + ", function(event, parameters) {" + ajaxFunction.toScript() + ";},"
-            + ScriptUtils.toScript(parameters) + ");");
+        Map<String, Object> attributes = component.getAttributes();
+        Map<String, Object> options = new HashMap<String, Object>();
+        RendererUtils utils = getUtils();
+        utils.addToScriptHash(options, "parameters", parameters);
+        utils.addToScriptHash(options, "selectionMode", attributes.get("selectionMode"),
+            SelectionMode.multiple.toString());
+        utils.addToScriptHash(options, "onbeforeselectionchange", attributes.get("onbeforeselectionchange"), null,
+            ScriptHashVariableWrapper.EVENT_HANDLER);
+        utils.addToScriptHash(options, "onselectionchange", attributes.get("onselectionchange"), null,
+            ScriptHashVariableWrapper.EVENT_HANDLER);
+        StringBuilder builder = new StringBuilder("new RichFaces.ExtendedDataTable('");
+        builder.append(component.getClientId(context)).append("', ").append(getRowCount(component))
+            .append(", function(event, parameters) {").append(ajaxFunction.toScript()).append(";}");
+        if (!options.isEmpty()) {
+            builder.append(",").append(ScriptUtils.toScript(options));
+        }
+        builder.append(");");
+        writer.write(builder.toString());
         writer.endElement(HTML.SCRIPT_ELEM);
         writer.endElement(HTML.DIV_ELEM);
     }
@@ -687,6 +712,12 @@
             }
             builder.append("rf-edt-r-a");
         }
+        if (table.getRowKey().equals(table.getAttributes().get("shiftRowKey"))) {
+            if (builder.length() > 0) {
+                builder.append(' ');
+            }
+            builder.append("rf-edt-r-t");
+        }
         if (builder.length() > 0) {
             writer.writeAttribute(HTML.CLASS_ATTRIBUTE, builder.toString(), null);
         }
Modified: root/ui/iteration/trunk/tables/ui/src/main/java/org/richfaces/renderkit/SelectionRenderer.java
===================================================================
--- root/ui/iteration/trunk/tables/ui/src/main/java/org/richfaces/renderkit/SelectionRenderer.java	2010-06-30 15:52:20 UTC (rev 17685)
+++ root/ui/iteration/trunk/tables/ui/src/main/java/org/richfaces/renderkit/SelectionRenderer.java	2010-06-30 18:07:32 UTC (rev 17686)
@@ -32,8 +32,10 @@
 
 import org.ajax4jsf.model.DataVisitResult;
 import org.ajax4jsf.model.DataVisitor;
+import org.ajax4jsf.model.SequenceRange;
 import org.ajax4jsf.renderkit.RendererUtils.HTML;
 import org.richfaces.component.UIDataTableBase;
+import org.richfaces.component.UIExtendedDataTable;
 
 /**
  * @author Konstantin Mishin
@@ -44,7 +46,10 @@
     private class ClientSelection {
         
         public static final String FLAG_RESET = "x";
-        
+        public static final String FLAG_ALL = "a";
+        public static final String FLAG_AFTER_RANGE = "d";
+        public static final String FLAG_BEFORE_RANGE = "u";
+
         private int [][] ranges;
         private int activeIndex;
         private int shiftIndex;
@@ -64,15 +69,17 @@
             } else {
                 ranges = new int[0][0];
             }
-            if (strings[1].length() > 0) {
+            if (strings[1].matches("\\d+")) {
                 activeIndex = Integer.parseInt(strings[1]);
             } else {
                 activeIndex = -1;
             }
-            if (strings[2].length() > 0) {
+            if (strings[2].matches("\\d+")) {
                 shiftIndex = Integer.parseInt(strings[2]);
+            } else if (strings[2].length() > 0) {
+                shiftIndex = -1;
             } else {
-                shiftIndex = -1;
+                shiftIndex = -2;
             }
             if (strings[3].length() > 0) {
                 selectionFlag = strings[3];
@@ -99,6 +106,10 @@
             return shiftIndex == index;
         }
 
+        public boolean isCleanShiftIndex() {
+            return shiftIndex == -2;
+        }
+
         public String getSelectionFlag() {
             return selectionFlag;
         }
@@ -114,6 +125,37 @@
         writer.writeAttribute(HTML.ID_ATTRIBUTE, component.getClientId(context) + ":si", null);
         writer.writeAttribute(HTML.NAME_ATTRIBUTE, component.getClientId(context) + ":si", null);
         writer.writeAttribute(HTML.TYPE_ATTR, HTML.INPUT_TYPE_HIDDEN, null);
+        UIDataTableBase table = (UIDataTableBase) component;
+        StringBuilder builder = new StringBuilder("|");
+        Object key = table.getRowKey();
+        table.captureOrigValue(context);
+        SequenceRange range = (SequenceRange) table.getComponentState().getRange();
+        int first = range.getFirstRow();
+        int last = first + range.getRows() - 1;
+        Map<String, Object> attributes = component.getAttributes();
+        table.setRowKey(attributes.get("activeRowKey"));
+        int activeIndex = table.getRowIndex();
+        if (activeIndex > 0) {
+            if (activeIndex < first) {
+                builder.append(ClientSelection.FLAG_BEFORE_RANGE);
+            } else if (activeIndex > last) {
+                builder.append(ClientSelection.FLAG_AFTER_RANGE);
+            }
+        }
+        builder.append("|");
+        table.setRowKey(attributes.get("shiftRowKey"));
+        int shiftIndex = table.getRowIndex();
+        if (shiftIndex > 0) {
+            if (shiftIndex < first) {
+                builder.append(ClientSelection.FLAG_BEFORE_RANGE);
+            } else if (shiftIndex > last) {
+                builder.append(ClientSelection.FLAG_AFTER_RANGE);
+            }
+        }
+        builder.append("|");
+        table.setRowKey(context, key);
+        table.restoreOrigValue(context);
+        writer.writeAttribute(HTML.VALUE_ATTRIBUTE, builder.toString(), null);
         writer.endElement(HTML.INPUT_ELEM);
     }
 
@@ -132,15 +174,53 @@
                 selectedRowKeys = new HashSet<Object>();
                 updateAttribute(context, component, "selectedRowKeys", selectedRowKeys);
             }
-            if (ClientSelection.FLAG_RESET.equals(clientSelection.getSelectionFlag())) {
+            final Collection<Object> rowKeys = selectedRowKeys;
+            if (clientSelection.getSelectionFlag() != null) {
                 selectedRowKeys.clear();
+                if (!ClientSelection.FLAG_RESET.equals(clientSelection.getSelectionFlag())) {
+                    Object key = table.getRowKey();
+                    table.captureOrigValue(context);
+                    SequenceRange range = (SequenceRange) table.getComponentState().getRange();
+                    SequenceRange newRange = null;
+                    Object rowKey = attributes.get("shiftRowKey");
+                    if (rowKey == null) {
+                        rowKey = attributes.get("activeRowKey");
+                        attributes.put("shiftRowKey", rowKey);
+                    }
+                    table.setRowKey(rowKey);
+                    int shiftIndex = table.getRowIndex();
+                    if (ClientSelection.FLAG_ALL.equals(clientSelection.getSelectionFlag())) {
+                        newRange = new SequenceRange(0, 0);
+                    } else if (shiftIndex > 0) {
+                        if (ClientSelection.FLAG_BEFORE_RANGE.equals(clientSelection.getSelectionFlag())) {
+                            newRange = new SequenceRange(shiftIndex, range.getFirstRow() - shiftIndex);
+                        } else {
+                            int last = range.getFirstRow() + range.getRows();
+                            newRange = new SequenceRange(last, shiftIndex - last + 1);
+                        }
+                    }
+                    table.setRowKey(context, key);
+                    table.restoreOrigValue(context);
+                    if (newRange != null) {
+                        ((UIExtendedDataTable) table).walk(context, new DataVisitor() { //TODO Don't use cast here.
+                            public DataVisitResult process(FacesContext context, Object rowKey, Object argument) {
+                                rowKeys.add(rowKey);
+                                return DataVisitResult.CONTINUE;
+                            }
+                        }, newRange, null);
+                    }
+                }
             }
-            final Collection<Object> rowKeys = selectedRowKeys;
+            if (clientSelection.isCleanShiftIndex()) {
+                attributes.remove("shiftRowKey");
+            }
             table.walk(context, new DataVisitor() {
                 public DataVisitResult process(FacesContext context, Object rowKey, Object argument) {
                     int index = clientSelection.nextIndex();
                     if (clientSelection.isSelected(index)) {
                         rowKeys.add(rowKey);
+                    } else {
+                        rowKeys.remove(rowKey);
                     }
                     if (clientSelection.isActiveIndex(index)) {
                         attributes.put("activeRowKey", rowKey);
Modified: root/ui/iteration/trunk/tables/ui/src/main/resources/META-INF/resources/extendedDataTable.js
===================================================================
--- root/ui/iteration/trunk/tables/ui/src/main/resources/META-INF/resources/extendedDataTable.js	2010-06-30 15:52:20 UTC (rev 17685)
+++ root/ui/iteration/trunk/tables/ui/src/main/resources/META-INF/resources/extendedDataTable.js	2010-06-30 18:07:32 UTC (rev 17686)
@@ -96,28 +96,6 @@
 			}		
 		},
 
-		remove: function(index) {
-			var i = 0;
-			while(i < this.ranges.length && index > this.ranges[i++][1]);
-			i--;
-			if(this.ranges[i]) {
-				if(index==(this.ranges[i][1]) ) {
-					if(index==(this.ranges[i][0])){
-						this.ranges.splice(i, 1);
-					} else {
-						this.ranges[i][1]--;			
-					}
-				} else {
-					if(index==(this.ranges[i][0])){
-						this.ranges[i][0]++;			
-					} else {
-					this.ranges.splice(i+1, 0, [index+1, this.ranges[i][1]]);
-					this.ranges[i][1] = index-1;
-					}
-				}
-			}		
-		},
-
 		clear: function() {
 			this.ranges = [];
 		},
@@ -143,10 +121,11 @@
 		}
 	};
 
-	richfaces.ExtendedDataTable = function(id, rowCount, ajaxFunction, ajaxParameters) {
+	richfaces.ExtendedDataTable = function(id, rowCount, ajaxFunction, options) {
 		var WIDTH_CLASS_NAME_BASE = "rf-edt-cw-";
 		var MIN_WIDTH = 20;
 		
+		options = options || {};
 		var ranges = new richfaces.utils.Ranges();
 		var element = document.getElementById(id);
 		var bodyElement, contentElement, spacerElement, dataTableElement, rows, rowHeight, parts, tbodies, shiftIndex,
@@ -172,15 +151,16 @@
 		var timeoutId = null;
 		
 		var sendAjax = function(event, map) {
-			for (key in ajaxParameters) {
+			for (key in options.parameters) {
 				if(!map[key]) {
-					map[key] = ajaxParameters[key];
+					map[key] = options.parameters[key];
 				}
 			}
 			ajaxFunction(event, map);
 		};
 		
 		var updateLayout = function() {
+			normalPartStyle.width = "auto";
 			var offsetWidth = frozenHeaderPartElement ? frozenHeaderPartElement.offsetWidth : 0;
 			var width = Math.max(0, element.clientWidth - offsetWidth);
 			if (width) {
@@ -263,7 +243,9 @@
 
 		var initialize = function() {
 			bodyElement = document.getElementById(id + ":b");
-			contentElement = jQuery(bodyElement).children("div:first")[0];
+			bodyElement.tabIndex = -1; //TODO don't use tabIndex.
+			var bodyJQuery = jQuery(bodyElement);
+			contentElement = bodyJQuery.children("div:first")[0];
 			if (contentElement) {
 				spacerElement = contentElement.firstChild;//TODO this.marginElement = Richfaces.firstDescendant(this.contentElement);
 				dataTableElement = contentElement.lastChild;//TODO this.dataTableElement = Richfaces.lastDescendant(this.contentElement);
@@ -273,9 +255,12 @@
 				if (rowCount != rows) {
 					contentElement.style.height = (rowCount * rowHeight) + "px";
 				}
-				jQuery(bodyElement).bind("scroll", bodyScrollListener)
-				tbodies.bind("click", selectionClickListener);
-				initializeSelection();
+				bodyJQuery.bind("scroll", bodyScrollListener);
+				if (options.selectionMode != "none") {
+					tbodies.bind("click", selectionClickListener);
+					bodyJQuery.bind("keydown", selectionKeyDownListener);
+					initializeSelection();
+				}
 			} else {
 				spacerElement = null;
 				dataTableElement = null;
@@ -404,17 +389,15 @@
 			}
 		}
 		
-		var deselectRow = function (index, skipUpdateModel) {
-			if (!skipUpdateModel) {
-				ranges.remove(index);
-			}
+		var deselectRow = function (index) {
+			ranges.remove(index);
 			for ( var i = 0; i < tbodies.length; i++) {
 				jQuery(tbodies[i].rows[index]).removeClass("rf-edt-r-s");
 			}
 		}
 
 		var setActiveRow = function (index) {
-			if(activeIndex != null) {
+			if(typeof activeIndex == "number") {
 				for ( var i = 0; i < tbodies.length; i++) {
 					jQuery(tbodies[i].rows[activeIndex]).removeClass("rf-edt-r-a");
 				}
@@ -426,10 +409,31 @@
 			}
 		}
 		
+		var resetShiftRow = function () {
+			if(typeof shiftIndex == "number") {
+				for ( var i = 0; i < tbodies.length; i++) {
+					jQuery(tbodies[i].rows[shiftIndex]).removeClass("rf-edt-r-t");
+				}
+				
+			}
+			shiftIndex = null;
+		}
+		
+		var setShiftRow = function (index) {
+			resetShiftRow();
+			shiftIndex = index;
+			if(typeof index == "number") {
+				for ( var i = 0; i < tbodies.length; i++) {
+					jQuery(tbodies[i].rows[shiftIndex]).addClass("rf-edt-r-t");
+				}
+			}
+		}
+		
 		var initializeSelection = function() {
 			ranges.clear();
-			activeIndex = null;
-			shiftIndex = null;
+			var strings = selectionInput.value.split("|");
+			activeIndex = strings[1] || null;
+			shiftIndex = strings[2] || null;
 			selectionFlag = null;
 			var rows = tbodies[0].rows;
 			for (var i = 0; i < rows.length; i++) {
@@ -440,87 +444,153 @@
 				if (row.hasClass("rf-edt-r-a")) {
 					activeIndex = row[0].rowIndex;
 				}
+				if (row.hasClass("rf-edt-r-t")) {
+					shiftIndex = row[0].rowIndex;
+				}
 			}
-			wtiteSelection();
+			writeSelection();
 		}
 
-		var wtiteSelection = function() {
+		var writeSelection = function() {
 			selectionInput.value = [ranges, activeIndex, shiftIndex, selectionFlag].join("|");
 		}
+		
+		var selectRows = function(range) {
+			var changed;
+			var i = 0;
+			for (; i < range[0]; i++) {
+				if (ranges.contains(i)) {
+					deselectRow(i);
+					changed = true;
+				}
+			}
+			for (; i <= range[1]; i++) {
+				if (!ranges.contains(i)) {
+					selectRow(i);
+					changed = true;
+				}
+			}
+			for (; i < rows; i++) {
+				if (ranges.contains(i)) {
+					deselectRow(i);
+					changed = true;
+				}
+			}
+			selectionFlag = typeof shiftIndex == "string" ? shiftIndex : "x";
+			return changed;
+		}
+		
+		var processSlectionWithShiftKey = function(index) {
+			if(shiftIndex == null) {
+				setShiftRow(activeIndex != null ? activeIndex : index);
+			}
+			var range;
+			if ("u" == shiftIndex) {
+				range = [0, index];
+			} else if ("d" == shiftIndex) {
+				range = [index, rows - 1];
+			} else if (index >= shiftIndex) {
+				range = [shiftIndex, index];
+			} else {
+				range = [index, shiftIndex];
+			}
+			return selectRows(range);			
+		}
+		
+		var onbeforeselectionchange = function (event) {
+			return !options.onbeforeselectionchange || options.onbeforeselectionchange(event) !== false;
+		}
+		
+		var onselectionchange = function (event, index, changed) {
+			if(!event.shiftKey) {
+				resetShiftRow();
+			}
+			if (activeIndex != index) {
+				setActiveRow(index);
+			}
+			if (changed) {
+				writeSelection();
+				if (options.onselectionchange) {
+					options.onselectionchange(event);
+				}
+			}
+		}
+		
 		var selectionClickListener = function (event) {
+			if (!onbeforeselectionchange(event)) {
+				return;
+			}
+			var changed;
 			if (event.shiftKey || event.ctrlKey) {
-				if (window.getSelection) {
-					window.getSelection().removeAllRanges(); //TODO
+				if (window.getSelection) { //TODO Try to find other way.
+					window.getSelection().removeAllRanges();
 				} else if (document.selection) {
 					document.selection.empty();
 				}
 			}
-			
 			var tr = event.target;
 			while (tbodies.index(tr.parentNode) == -1) {
 				tr = tr.parentNode;
 			}
 			var index = tr.rowIndex;
-
-			if(!event.shiftKey) {
-				shiftIndex = null;
-			}
-			if (event.shiftKey && !event.ctrlKey) {
-				if(shiftIndex == null) {
-					shiftIndex = activeIndex != null ? activeIndex : index;
-				}
-				var range;
-				if (index >= shiftIndex) {
-					range = [shiftIndex, index];
-				} else {
-					range = [index, shiftIndex];
-				}
-				var i = 0;
-				for (; i < range[0]; i++) {
-					if (ranges.contains(i)) {
-						deselectRow(i);
-					}
-				}
-				for (; i <= range[1]; i++) {
-					if (!ranges.contains(i)) {
-						selectRow(i);
-					}
-				}
-				for (; i < rows; i++) {
-					if (ranges.contains(i)) {
-						deselectRow(i);
-					}
-				}
-				selectionFlag = "x";
-			} else if (!event.shiftKey &&  event.ctrlKey) {
+			if (options.selectionMode == "single" || (options.selectionMode != "multipleKeyboardFree"
+				&& !event.shiftKey && !event.ctrlKey)) {
+				changed = selectRows([index, index]);
+			} else if (options.selectionMode == "multipleKeyboardFree" || (!event.shiftKey &&  event.ctrlKey)) {
 				if (ranges.contains(index)) {
 					deselectRow(index);
 				} else {
 					selectRow(index);
 				}
-			} else if (!event.shiftKey && !event.ctrlKey) {
-				ranges.clear();
-				for (var i = 0; i < rows; i++) {
-					if (i == index) {
-						selectRow(i);
-					} else {
-						deselectRow(i, true);
+				changed = true;
+			} else {
+				changed = processSlectionWithShiftKey(index);
+			}
+			onselectionchange(event, index, changed);
+		}
+
+		var selectionKeyDownListener = function(event) {
+			if (event.ctrlKey && options.selectionMode != "single" && (event.keyCode == 65 || event.keyCode == 97)) { //Ctrl-A
+				if(onbeforeselectionchange(event)) {
+					selectRows([0, rows]);
+					selectionFlag = "a";
+					onselectionchange(event, activeIndex, true); //TODO Is there a way to know that selection haven't changed?
+				}
+				return false;
+			}
+			if (typeof activeIndex == "number") {
+				var index;
+				if (event.keyCode == 38 && activeIndex) { //UP
+					index = activeIndex - 1;
+				} else if (event.keyCode == 40 && activeIndex < rows - 1) { //DOWN
+					index = activeIndex + 1;
+				}
+				if (index != null) {
+					if(onbeforeselectionchange(event)) {
+						var changed;
+						if (options.selectionMode == "single" || (!event.shiftKey && !event.ctrlKey)) {
+							changed = selectRows([index, index]);
+						} else if (event.shiftKey) {
+							changed = processSlectionWithShiftKey(index);
+						}
+						setActiveRow(index);
+						//showRow
+						onselectionchange(event, index, changed);
 					}
+					return false;
 				}
-				selectionFlag = "x";
 			}
-			setActiveRow(index);
-			wtiteSelection();
 		}
 
 		var ajaxComplete = function (event, data) {
 			if (data.reinitializeHeader) {
 				bindHeaderHandlers();
 			} else {
+				selectionInput = document.getElementById(id + ":si");
 				if (data.reinitializeBody) {
 					rowCount = data.rowCount;
 					initialize();
-				} else {
+				} else if (options.selectionMode != "none") {
 					initializeSelection();
 				}
 				if (spacerElement) {
                                
                         
                        
                                
                                15 years, 4 months
                        
                        
                 
         
 
        
            
        
        
        
                
                        
                                
                                
                                        
                                
                         
                        
                                
                                
                                        
                                                
                                        
                                        
                                        JBoss Rich Faces SVN: r17685 - root/ui-sandbox/inputs/trunk/autocomplete/src/main/resources/META-INF/resources/script.
                                
                                
                                
                                    
                                        by richfaces-svn-commits@lists.jboss.org
                                    
                                
                                
                                        Author: pyaschenko
Date: 2010-06-30 11:52:20 -0400 (Wed, 30 Jun 2010)
New Revision: 17685
Modified:
   root/ui-sandbox/inputs/trunk/autocomplete/src/main/resources/META-INF/resources/script/ComboBox.js
   root/ui-sandbox/inputs/trunk/autocomplete/src/main/resources/META-INF/resources/script/SelectBase.js
   root/ui-sandbox/inputs/trunk/autocomplete/src/main/resources/META-INF/resources/script/richfaces-selection.js
Log:
https://jira.jboss.org/browse/RF-8875
Modified: root/ui-sandbox/inputs/trunk/autocomplete/src/main/resources/META-INF/resources/script/ComboBox.js
===================================================================
--- root/ui-sandbox/inputs/trunk/autocomplete/src/main/resources/META-INF/resources/script/ComboBox.js	2010-06-30 11:42:30 UTC (rev 17684)
+++ root/ui-sandbox/inputs/trunk/autocomplete/src/main/resources/META-INF/resources/script/ComboBox.js	2010-06-30 15:52:20 UTC (rev 17685)
@@ -24,7 +24,7 @@
 			}
 
 			if ((!this.lastKey || key.indexOf(this.lastKey)!=0) && newCache.length > 0) {
-				console && console.log && console.log("added key:"+key+" length:" + newCache.length)
+				//console && console.log && console.log("added key:"+key+" length:" + newCache.length)
 				this.cache[key] = newCache;
 				if (newCache.length==1) {
 					this.lastKey = key;
@@ -132,7 +132,7 @@
 	var autoFill = function (inputValue, value) {
 		if( this.options.autoFill) {
 			var field = rf.getDomElement(this.fieldId);
-			field.value = field.value + value.substring(inputValue.length);
+			field.value = inputValue + value.substring(inputValue.length);
 			rf.Selection.set(field, inputValue.length, field.value.length);
 		}
 	};
@@ -149,7 +149,7 @@
  				return this.namespace;
  			},
  			
- 			selectItem: function(index, isOffset) {
+ 			selectItem: function(index, isOffset, noAutoFill) {
  				if (this.items.length==0) return;
  				
  				if (this.index!=-1) {
@@ -176,9 +176,11 @@
  					}
  					this.index = index;
  				}
-				this.items.eq(this.index).addClass(this.options.selectedItemClass);
+ 				var item = this.items.eq(this.index);
+				item.addClass(this.options.selectedItemClass);
 
  				scrollToSelectedItem.call(this);
+ 				!noAutoFill && autoFill.call(this, this.newValue, item.text());
  			},
  			
  			selectPrevItem: function () {
@@ -196,24 +198,19 @@
  			onBeforeShow: function (event) {
  			},
  			
- 			onChange: function (event, value) {
+ 			changeValue: function (event, value) {
  				// TODO: ajax call here if needed
  
- 				
  				this.selectItem();
  				var newItems = this.cache.getItems(value);
  				this.items = $(newItems);
  				$(rf.getDomElement(this.componentId+ID.ITEMS)).empty().append(newItems);
  				this.index = -1;
- 				this.selectItem(0);
- 				// getFirstValue
- 				$(this.items).first().text();
- 				if (event.which != rf.KEYS.BACKSPACE) {
- 					autoFill.call(this, value, $(this.items).first().text());
- 				}
+ 				this.newValue = value;
+ 				this.selectItem(0, false, event.which == rf.KEYS.BACKSPACE);
  			},
  			
- 			onShow: function () {
+ 			onShow: function (event) {
  				if (this.items && this.items.length>0) {
  					//??TODO it's nessesary only if not changed value
  					this.selectItem(0);
Modified: root/ui-sandbox/inputs/trunk/autocomplete/src/main/resources/META-INF/resources/script/SelectBase.js
===================================================================
--- root/ui-sandbox/inputs/trunk/autocomplete/src/main/resources/META-INF/resources/script/SelectBase.js	2010-06-30 11:42:30 UTC (rev 17684)
+++ root/ui-sandbox/inputs/trunk/autocomplete/src/main/resources/META-INF/resources/script/SelectBase.js	2010-06-30 15:52:20 UTC (rev 17685)
@@ -48,7 +48,7 @@
 		this.fieldId = fieldId;
 		this.options = $.extend({}, defaultOptions, options);
 		this.namespace = this.namespace || "."+rf.Event.createNamespace(this.name, this.selectId);
-		this.currentValue = this.getCurrentValue();
+		this.currentValue = this.getInputValue();
 		bindEventHandlers.call(this);
 	};
 	
@@ -133,16 +133,15 @@
 	};
 	
 	var onChange = function (event) {
-		var value = this.getCurrentValue();
+		var value = this.getInputValue();
 		var flag = value != this.currentValue;
 		if (event.which == rf.KEYS.LEFT || event.which == rf.KEYS.RIGHT || flag) {
-			// TODO: call onchange
-			if (flag && !this.isVisible) {
-				this.show();
-			}
 			if (flag) {
-				this.onChange(event, value);
+				this.changeValue(event, value);
 				this.currentValue = value;
+				if (!this.isVisible) {
+					this.show();
+				}
 			}
 		}
 	}
@@ -247,7 +246,7 @@
  			},
  			onBeforeShow: function () {
  			},
- 			getCurrentValue: function () {
+ 			getInputValue: function () {
  				var value = this.fieldId ? rf.getDomElement(this.fieldId).value : undefined;
  				return value;
  			}
Modified: root/ui-sandbox/inputs/trunk/autocomplete/src/main/resources/META-INF/resources/script/richfaces-selection.js
===================================================================
--- root/ui-sandbox/inputs/trunk/autocomplete/src/main/resources/META-INF/resources/script/richfaces-selection.js	2010-06-30 11:42:30 UTC (rev 17684)
+++ root/ui-sandbox/inputs/trunk/autocomplete/src/main/resources/META-INF/resources/script/richfaces-selection.js	2010-06-30 15:52:20 UTC (rev 17685)
@@ -9,8 +9,8 @@
 		} else if (field.createTextRange){
 				var range = field.createTextRange();
 				range.collapse(true);
-				range.moveEnd('character', pos);
-				range.moveStart('character', pos);
+				range.moveEnd('character', end);
+				range.moveStart('character', start);
 				range.select();
 		}
 	}
                                
                         
                        
                                
                                15 years, 4 months
                        
                        
                 
         
 
        
            
        
        
        
                
                        
                                
                                
                                        
                                
                         
                        
                                
                                
                                        
                                                
                                        
                                        
                                        JBoss Rich Faces SVN: r17684 - root/ui-sandbox/inputs/trunk/autocomplete/src/main/resources/META-INF/resources/script.
                                
                                
                                
                                    
                                        by richfaces-svn-commits@lists.jboss.org
                                    
                                
                                
                                        Author: pyaschenko
Date: 2010-06-30 07:42:30 -0400 (Wed, 30 Jun 2010)
New Revision: 17684
Modified:
   root/ui-sandbox/inputs/trunk/autocomplete/src/main/resources/META-INF/resources/script/ComboBox.js
   root/ui-sandbox/inputs/trunk/autocomplete/src/main/resources/META-INF/resources/script/SelectBase.js
Log:
https://jira.jboss.org/browse/RF-8875 working cache was added + some changes
Modified: root/ui-sandbox/inputs/trunk/autocomplete/src/main/resources/META-INF/resources/script/ComboBox.js
===================================================================
--- root/ui-sandbox/inputs/trunk/autocomplete/src/main/resources/META-INF/resources/script/ComboBox.js	2010-06-30 06:27:53 UTC (rev 17683)
+++ root/ui-sandbox/inputs/trunk/autocomplete/src/main/resources/META-INF/resources/script/ComboBox.js	2010-06-30 11:42:30 UTC (rev 17684)
@@ -2,22 +2,37 @@
 	rf.utils = rf.utils || {};
 	
 	rf.utils.Cache = function (data, options) {
-		this.data = data || [];
-		this.values = options.parse && options.parse(this.data) || this.data;
+		this.key = options.key;
+		this.cache = {}
+		this.cache[this.key] = data || [];
+		this.values = options.parse && options.parse(data) || this.cache[this.key];
 	};
 	
-	var getItems = function (str) {
-		if (!str || str.length==0) {
-			return this.data;
+	var getItems = function (key) {
+		var newCache = [];
+		
+		if (this.cache[key]) {
+			newCache = this.cache[key];
+		} else {
+			var itemsCache = this.cache[this.key];
+			for (var i = 0; i<this.values.length; i++) {
+				var value = this.values[i].toLowerCase();
+				var p = value.indexOf(key.toLowerCase());
+				if (p == 0) {
+					newCache.push(itemsCache[i]);
+				}
+			}
+
+			if ((!this.lastKey || key.indexOf(this.lastKey)!=0) && newCache.length > 0) {
+				console && console.log && console.log("added key:"+key+" length:" + newCache.length)
+				this.cache[key] = newCache;
+				if (newCache.length==1) {
+					this.lastKey = key;
+				}
+			}
 		}
-		var newData = [];
-		for (var i = 0; i<this.values.length; i++) {
-			var value = this.values[i].toLowerCase();
-			var p = value.indexOf(str.toLowerCase());
-			p == 0 && newData.push(this.data[i]);
-		}
-
-		return newData;
+		
+		return newCache;
 	};
 	
 	$.extend(rf.utils.Cache.prototype, (function () {
@@ -42,8 +57,8 @@
 		this.options = $.extend(this.options, defaultOptions, options);
 		//this.currentValue = rf.getDomElement(this.fieldId).value;
 		this.index = -1;
-		updateItemsList.call(this);
 		bindEventHandlers.call(this);
+		updateItemsList.call(this, "");
 	};
 	
 	var $p ={};
@@ -82,10 +97,11 @@
 		}
 	};
 	
-	var updateItemsList = function () {
+	var updateItemsList = function (value) {
 		this.items = $(rf.getDomElement(this.componentId+ID.ITEMS)).children();
 		this.cache = new rf.utils.Cache(this.items, {
-			parse: getData
+			parse: getData,
+			key: value
 		}); 
 	};
 	
@@ -126,6 +142,7 @@
 		return {
  			name:"CompoBox",
  			destroy: function () {
+				//TODO: add all unbind
  				$super.destroy.call(this);
  			},
  			getNamespace: function () {
@@ -176,11 +193,13 @@
  			selectPageDown: function () {
  				
  			},
- 			prepareToShow: function (event) {
- 				
+ 			onBeforeShow: function (event) {
  			},
  			
  			onChange: function (event, value) {
+ 				// TODO: ajax call here if needed
+ 
+ 				
  				this.selectItem();
  				var newItems = this.cache.getItems(value);
  				this.items = $(newItems);
@@ -195,7 +214,7 @@
  			},
  			
  			onShow: function () {
- 				if (this.items.length>0) {
+ 				if (this.items && this.items.length>0) {
  					//??TODO it's nessesary only if not changed value
  					this.selectItem(0);
  				}
Modified: root/ui-sandbox/inputs/trunk/autocomplete/src/main/resources/META-INF/resources/script/SelectBase.js
===================================================================
--- root/ui-sandbox/inputs/trunk/autocomplete/src/main/resources/META-INF/resources/script/SelectBase.js	2010-06-30 06:27:53 UTC (rev 17683)
+++ root/ui-sandbox/inputs/trunk/autocomplete/src/main/resources/META-INF/resources/script/SelectBase.js	2010-06-30 11:42:30 UTC (rev 17684)
@@ -48,7 +48,7 @@
 		this.fieldId = fieldId;
 		this.options = $.extend({}, defaultOptions, options);
 		this.namespace = this.namespace || "."+rf.Event.createNamespace(this.name, this.selectId);
-		this.currentValue = rf.getDomElement(this.fieldId).value;
+		this.currentValue = this.getCurrentValue();
 		bindEventHandlers.call(this);
 	};
 	
@@ -133,7 +133,7 @@
 	};
 	
 	var onChange = function (event) {
-		var value = rf.getDomElement(this.fieldId).value;
+		var value = this.getCurrentValue();
 		var flag = value != this.currentValue;
 		if (event.which == rf.KEYS.LEFT || event.which == rf.KEYS.RIGHT || flag) {
 			// TODO: call onchange
@@ -184,10 +184,10 @@
 			case rf.KEYS.TAB:
 			case rf.KEYS.RETURN:
 				event.preventDefault();
-				/*if( selectCurrent() ) {
+				/*if( selectCurrentItem() ) {
 					event.preventDefault();
 					//TODO: bind form submit event handler to cancel form submit under the opera
-					cancelSubmit = true;
+					//cancelSubmit = true;
 					return false;
 				}*/
 				this.hide();
@@ -210,7 +210,7 @@
 		return {
  			name:"SelectBase",
  			show: function (event) {
-				if (this.prepareToShow(event)!=false) {
+				if (this.onBeforeShow(event)!=false) {
 					$(rf.getDomElement(this.selectId)).show();
 					this.isVisible = true;
 				    this.scrollElements = rf.Event.bindScrollEventHandlers(this.selectId, this.hide, this, this.namespace);
@@ -245,8 +245,13 @@
  			},
  			selectPageDown: function () {
  			},
- 			prepareToShow: function () {
+ 			onBeforeShow: function () {
+ 			},
+ 			getCurrentValue: function () {
+ 				var value = this.fieldId ? rf.getDomElement(this.fieldId).value : undefined;
+ 				return value;
  			}
+ 			
 		};
 	})());
 })(jQuery, RichFaces);
\ No newline at end of file
                                
                         
                        
                                
                                15 years, 4 months
                        
                        
                 
         
 
        
            
        
        
        
                
                        
                                
                                
                                        
                                
                         
                        
                                
                                
                                        
                                                
                                        
                                        
                                        JBoss Rich Faces SVN: r17683 - in root/docs/trunk/Component_Reference/en-US: extras and 1 other directories.
                                
                                
                                
                                    
                                        by richfaces-svn-commits@lists.jboss.org
                                    
                                
                                
                                        Author: SeanRogers
Date: 2010-06-30 02:27:53 -0400 (Wed, 30 Jun 2010)
New Revision: 17683
Added:
   root/docs/trunk/Component_Reference/en-US/extras/exam-Component_Reference-Tables_and_grids-richdataOrderedList_example.xml_sample
   root/docs/trunk/Component_Reference/en-US/images/figu-Component_Reference-Tables_and_grids-richdataOrderedList_example.png
Modified:
   root/docs/trunk/Component_Reference/en-US/chap-Component_Reference-Tables_and_grids.xml
Log:
Added rich:dataOrderedList to docs
Modified: root/docs/trunk/Component_Reference/en-US/chap-Component_Reference-Tables_and_grids.xml
===================================================================
--- root/docs/trunk/Component_Reference/en-US/chap-Component_Reference-Tables_and_grids.xml	2010-06-30 00:47:26 UTC (rev 17682)
+++ root/docs/trunk/Component_Reference/en-US/chap-Component_Reference-Tables_and_grids.xml	2010-06-30 06:27:53 UTC (rev 17683)
@@ -661,8 +661,75 @@
 			</listitem>
 		</itemizedlist>
 		<para>
-			Incomplete
+			The <sgmltag><rich:dataOrderedList></sgmltag> component renders an ordered list of items from a data model. Specific rows can be updated dynamically without updating the entire list.
 		</para>
+		<para>
+			The <varname>type</varname> attribute defines the appearance of the numerating list markers for the list. The possible values for the <varname>type</varname> attribute are as follows:
+		</para>
+		<variablelist>
+			<varlistentry>
+				<term><literal>A</literal></term>
+				<listitem>
+					<para>
+						Numerates the list items as <wordasword>A</wordasword>, <wordasword>B</wordasword>, <wordasword>C</wordasword>, etc.
+					</para>
+				</listitem>
+			</varlistentry>
+			<varlistentry>
+				<term><literal>a</literal></term>
+				<listitem>
+					<para>
+						Numerates the list items as <wordasword>a</wordasword>, <wordasword>b</wordasword>, <wordasword>c</wordasword>, etc.
+					</para>
+				</listitem>
+			</varlistentry>
+			<varlistentry>
+				<term><literal>I</literal></term>
+				<listitem>
+					<para>
+						Numerates the list items as <wordasword>I</wordasword>, <wordasword>II</wordasword>, <wordasword>III</wordasword>, etc.
+					</para>
+				</listitem>
+			</varlistentry>
+			<varlistentry>
+				<term><literal>i</literal></term>
+				<listitem>
+					<para>
+						Numerates the list items as <wordasword>i</wordasword>, <wordasword>ii</wordasword>, <wordasword>iii</wordasword>, etc.
+					</para>
+				</listitem>
+			</varlistentry>
+			<varlistentry>
+				<term><literal>1</literal></term>
+				<listitem>
+					<para>
+						Numerates the list items as <wordasword>1</wordasword>, <wordasword>2</wordasword>, <wordasword>3</wordasword>, etc.
+					</para>
+				</listitem>
+			</varlistentry>
+		</variablelist>
+		<para>
+			The <varname>rows</varname> attribute limits the number of items in the list. The <varname>first</varname> attribute specifies the first item to start from when populating the list. The <varname>title</varname> attribute defines a pop-up title. To only update a sub-set of the rows in the list, use the <varname>ajaxKeys</varname> attribute, which points to an object that contains the specified rows.
+		</para>
+		<example id="exam-Component_Reference-Tables_and_grids-richdataOrderedList_example">
+			<title><sgmltag><rich:dataOrderedList></sgmltag> example</title>
+<programlisting language="XML" role="XML"><xi:include parse="text" href="extras/exam-Component_Reference-Tables_and_grids-richdataOrderedList_example.xml_sample" xmlns:xi="http://www.w3.org/2001/XInclude" /></programlisting>
+			<blockquote>
+				<figure id="figu-Component_Reference-Tables_and_grids-richdataOrderedList_example">
+					<title><sgmltag><rich:dataOrderedList></sgmltag> example</title>
+					<mediaobject>
+						<imageobject>
+							<imagedata fileref="images/figu-Component_Reference-Tables_and_grids-richdataOrderedList_example.png" format="PNG" />
+						</imageobject>
+						<textobject>
+							<para>
+								A list of cars displayed in a numbered list.
+							</para>
+						</textobject>
+					</mediaobject>
+				</figure>
+			</blockquote>
+		</example>
 	</section>
 	
 	<section id="sect-Component_Reference-Tables_and_grids-richdataScroller">
Added: root/docs/trunk/Component_Reference/en-US/extras/exam-Component_Reference-Tables_and_grids-richdataOrderedList_example.xml_sample
===================================================================
--- root/docs/trunk/Component_Reference/en-US/extras/exam-Component_Reference-Tables_and_grids-richdataOrderedList_example.xml_sample	                        (rev 0)
+++ root/docs/trunk/Component_Reference/en-US/extras/exam-Component_Reference-Tables_and_grids-richdataOrderedList_example.xml_sample	2010-06-30 06:27:53 UTC (rev 17683)
@@ -0,0 +1,9 @@
+<h:form>
+    <rich:dataOrderedList var="car" value="#{dataTableScrollerBean.allCars}" rows="5" type="1"  title="Car Store">
+        <h:outputText value="#{car.make} #{car.model}"/><br/>
+        <h:outputText value="Price:" styleClass="label"></h:outputText>
+        <h:outputText value="#{car.price}" /><br/>
+        <h:outputText value="Mileage:" styleClass="label"></h:outputText>
+        <h:outputText value="#{car.mileage}" /><br/>
+    </rich:dataOrderedList>
+</h:form>
Added: root/docs/trunk/Component_Reference/en-US/images/figu-Component_Reference-Tables_and_grids-richdataOrderedList_example.png
===================================================================
(Binary files differ)
Property changes on: root/docs/trunk/Component_Reference/en-US/images/figu-Component_Reference-Tables_and_grids-richdataOrderedList_example.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream
                                
                         
                        
                                
                                15 years, 4 months