Author: abelevich
Date: 2010-04-23 13:17:15 -0400 (Fri, 23 Apr 2010)
New Revision: 16801
Added:
root/ui-sandbox/trunk/components/componentcontrol/
root/ui-sandbox/trunk/components/componentcontrol/pom.xml
root/ui-sandbox/trunk/components/componentcontrol/src/
root/ui-sandbox/trunk/components/componentcontrol/src/main/
root/ui-sandbox/trunk/components/componentcontrol/src/main/config/
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/org/
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/org/richfaces/
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/org/richfaces/BehaviorStateHelper.java
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/org/richfaces/component/
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/org/richfaces/component/UIHashParameter.java
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/org/richfaces/component/behavior/
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/org/richfaces/component/behavior/ClientBehavior.java
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/org/richfaces/component/behavior/ComponentControlBehavior.java
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/org/richfaces/renderkit/
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/org/richfaces/renderkit/ComponentControlBehaviorRenderer.java
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/org/richfaces/tag/
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/org/richfaces/tag/BehaviorRule.java
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/org/richfaces/tag/BehaviorTagHandlerDelegate.java
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/org/richfaces/taglib/
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/org/richfaces/taglib/ComponentControlHandler.java
root/ui-sandbox/trunk/components/componentcontrol/src/main/resources/
root/ui-sandbox/trunk/components/componentcontrol/src/main/resources/META-INF/
root/ui-sandbox/trunk/components/componentcontrol/src/main/resources/META-INF/cc.taglib.xml
root/ui-sandbox/trunk/components/componentcontrol/src/main/resources/META-INF/faces-config.xml
root/ui-sandbox/trunk/components/componentcontrol/src/main/resources/META-INF/resources/
root/ui-sandbox/trunk/components/componentcontrol/src/main/resources/META-INF/resources/script/
root/ui-sandbox/trunk/components/componentcontrol/src/main/resources/META-INF/resources/script/component-control.js
Log:
initial commit ...
Added: root/ui-sandbox/trunk/components/componentcontrol/pom.xml
===================================================================
--- root/ui-sandbox/trunk/components/componentcontrol/pom.xml (rev
0)
+++ root/ui-sandbox/trunk/components/componentcontrol/pom.xml 2010-04-23 17:17:15 UTC (rev
16801)
@@ -0,0 +1,39 @@
+<project
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <parent>
+ <groupId>org.richfaces.ui</groupId>
+ <artifactId>components</artifactId>
+ <version>4.0.0-SNAPSHOT</version>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.richfaces.sandbox.ui.components</groupId>
+ <artifactId>componentControl</artifactId>
+ <name>RichFaces Component Control</name>
+ <packaging>jar</packaging>
+
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.richfaces.cdk</groupId>
+ <artifactId>maven-cdk-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.richfaces.cdk</groupId>
+ <artifactId>annotations</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.richfaces.framework</groupId>
+ <artifactId>richfaces-impl</artifactId>
+ </dependency>
+
+ </dependencies>
+
+</project>
\ No newline at end of file
Added:
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/org/richfaces/BehaviorStateHelper.java
===================================================================
---
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/org/richfaces/BehaviorStateHelper.java
(rev 0)
+++
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/org/richfaces/BehaviorStateHelper.java 2010-04-23
17:17:15 UTC (rev 16801)
@@ -0,0 +1,31 @@
+package org.richfaces;
+
+import javax.el.ValueExpression;
+import javax.faces.context.FacesContext;
+
+import org.richfaces.component.behavior.ClientBehavior;
+
+
+/**
+ * @author Anton Belevich
+ *
+ */
+public class BehaviorStateHelper extends PartialStateHolderHelper {
+
+ private ClientBehavior behavior;
+
+ public BehaviorStateHelper(ClientBehavior behavior) {
+ super(behavior);
+ this.behavior = behavior;
+ }
+
+ @Override
+ protected Object getValueExpressionValue(String name) {
+ Object retVal = null;
+ ValueExpression ve = behavior.getValueExpression(name);
+ if (ve != null) {
+ retVal = ve.getValue(FacesContext.getCurrentInstance().getELContext());
+ }
+ return retVal;
+ }
+}
Added:
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/org/richfaces/component/UIHashParameter.java
===================================================================
---
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/org/richfaces/component/UIHashParameter.java
(rev 0)
+++
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/org/richfaces/component/UIHashParameter.java 2010-04-23
17:17:15 UTC (rev 16801)
@@ -0,0 +1,70 @@
+package org.richfaces.component;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.faces.FacesException;
+import javax.faces.component.UIComponent;
+import javax.faces.component.UIComponentBase;
+import javax.faces.component.UIParameter;
+
+
+/**
+ * @author Anton Belevich
+ *
+ */
+public class UIHashParameter extends UIComponentBase {
+
+ public static final String COMPONENT_TYPE = "org.richfaces.HashParameter";
+
+ public static final String COMPONENT_FAMILY =
"org.richfaces.HashParameter";
+
+ enum PropertyKeys {
+ name
+ }
+
+
+ public UIHashParameter() {
+ super();
+ setRendererType(null);
+ }
+
+ public String getName() {
+ return (String)getStateHelper().eval(PropertyKeys.name);
+ }
+
+ public void setName(String name) {
+ getStateHelper().put(PropertyKeys.name, name);
+ }
+
+ public Map<String, Object> getValue() {
+ List<UIComponent> children = getChildren();
+ Map <String, Object> parameters = new HashMap<String, Object>();
+
+ for(UIComponent child: children) {
+ if(child instanceof UIParameter) {
+ UIParameter parameter = (UIParameter)child;
+ parameters.put(parameter.getName(),(String)parameter.getValue());
+ }
+
+ if(child instanceof UIHashParameter) {
+ UIHashParameter hashParameter = (UIHashParameter)child;
+ String name = hashParameter.getName();
+ Map<String, Object> value = hashParameter.getValue();
+ if(name == null) {
+ throw new FacesException("attribute 'name' for the
nested " + UIHashParameter.class.getName() + " component (id = '"
+hashParameter.getClientId()+"') should not be 'null'");
+ }else {
+ parameters.put(name, value);
+ }
+ }
+ }
+
+ return parameters;
+ }
+
+ @Override
+ public String getFamily() {
+ return (COMPONENT_FAMILY);
+ }
+}
Added:
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/org/richfaces/component/behavior/ClientBehavior.java
===================================================================
---
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/org/richfaces/component/behavior/ClientBehavior.java
(rev 0)
+++
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/org/richfaces/component/behavior/ClientBehavior.java 2010-04-23
17:17:15 UTC (rev 16801)
@@ -0,0 +1,165 @@
+package org.richfaces.component.behavior;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.el.ELContext;
+import javax.el.ELException;
+import javax.el.ValueExpression;
+import javax.faces.FacesException;
+import javax.faces.component.StateHelper;
+import javax.faces.component.UIComponentBase;
+import javax.faces.component.behavior.ClientBehaviorBase;
+import javax.faces.context.FacesContext;
+
+import org.richfaces.BehaviorStateHelper;
+
+
+/**
+ * @author Anton Belevich
+ *
+ * base class for the client behaviors
+ */
+public class ClientBehavior extends ClientBehaviorBase {
+
+ private StateHelper behaviorStateHelper = null;
+
+ private Map<String, ValueExpression> bindings;
+
+
+ public StateHelper getStateHelper() {
+ if(behaviorStateHelper == null) {
+ behaviorStateHelper = new BehaviorStateHelper(this);
+ }
+ return behaviorStateHelper;
+ }
+
+ public ValueExpression getValueExpression(String name) {
+ if (name == null) {
+ throw new NullPointerException();
+ }
+
+ return ((bindings == null) ? null : bindings.get(name));
+ }
+
+ public void setValueExpression(String name, ValueExpression valueExpression) {
+ if (name == null) {
+ throw new NullPointerException();
+ }
+
+ if (valueExpression != null) {
+
+ if (valueExpression.isLiteralText()) {
+ setLiteralValue(name, valueExpression);
+ } else {
+ if (bindings == null) {
+ bindings = new HashMap<String, ValueExpression>(6,1.0f);
+ }
+ bindings.put(name, valueExpression);
+ }
+
+ } else {
+ if (bindings != null) {
+ bindings.remove(name);
+ if (bindings.isEmpty()) {
+ bindings = null;
+ }
+ }
+ }
+ clearInitialState();
+ }
+
+ protected FacesContext getFacesContext() {
+ return FacesContext.getCurrentInstance();
+ }
+
+ public void setLiteralValue(String name, ValueExpression expression) {
+ assert(expression.isLiteralText());
+ ELContext context = getFacesContext().getELContext();
+
+ try {
+ setLiteral(name, expression.getValue(context));
+ } catch (ELException ele) {
+ throw new FacesException(ele);
+ }
+ }
+
+ public void setLiteral(String name, Object value) {
+ //TODO override this method
+ }
+
+ @Override
+ public Object saveState(FacesContext context) {
+ Object [] state = null;
+
+ Object parentState = super.saveState(context);
+ if(initialStateMarked()) {
+ if(parentState != null) {
+ state = new Object[] {parentState};
+ }
+ } else {
+ state = new Object[3];
+ state[0] = parentState;
+
+ Object attrs = null;
+ if(behaviorStateHelper != null) {
+ attrs = behaviorStateHelper.saveState(context);
+ }
+ state[1] = attrs;
+ state[2] = saveBindings(context, bindings);
+
+ }
+ return state;
+ }
+
+ @Override
+ public void restoreState(FacesContext context, Object state) {
+ if(state != null) {
+ Object [] stateObject = (Object[])state;
+ super.restoreState(context, stateObject[0]);
+ if(stateObject.length > 1) {
+ if(behaviorStateHelper != null) {
+ behaviorStateHelper.restoreState(context, stateObject[1]);
+ }
+ }
+ restoreBindings(context, stateObject[2]);
+ }
+ }
+
+ // Utility for saving bindings state
+ private static Object saveBindings(FacesContext context, Map<String,
ValueExpression> bindings) {
+
+ if (bindings == null) {
+ return (null);
+ }
+
+ Object values[] = new Object[2];
+ values[0] = bindings.keySet().toArray(new String[bindings.size()]);
+
+ Object[] bindingValues = bindings.values().toArray();
+ for (int i = 0; i < bindingValues.length; i++) {
+ bindingValues[i] = UIComponentBase.saveAttachedState(context,
bindingValues[i]);
+ }
+
+ values[1] = bindingValues;
+
+ return (values);
+ }
+
+ // Utility for restoring bindings from state
+ private static Map<String, ValueExpression> restoreBindings(FacesContext
context, Object state) {
+
+ if (state == null) {
+ return (null);
+ }
+
+ Object values[] = (Object[]) state;
+ String names[] = (String[]) values[0];
+ Object states[] = (Object[]) values[1];
+ Map<String, ValueExpression> bindings = new HashMap<String,
ValueExpression>(names.length);
+ for (int i = 0; i < names.length; i++) {
+ bindings.put(names[i], (ValueExpression)
UIComponentBase.restoreAttachedState(context, states[i]));
+ }
+ return (bindings);
+ }
+}
Added:
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/org/richfaces/component/behavior/ComponentControlBehavior.java
===================================================================
---
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/org/richfaces/component/behavior/ComponentControlBehavior.java
(rev 0)
+++
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/org/richfaces/component/behavior/ComponentControlBehavior.java 2010-04-23
17:17:15 UTC (rev 16801)
@@ -0,0 +1,87 @@
+package org.richfaces.component.behavior;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.faces.component.UIComponent;
+import javax.faces.component.behavior.FacesBehavior;
+
+(a)FacesBehavior(value="org.richfaces.behavior.ComponentControlBehavior")
+public class ComponentControlBehavior extends ClientBehavior {
+
+ public static final String BEHAVIOR_ID =
"org.richfaces.behavior.ComponentControlBehavior";
+
+ public static final String LIST_TYPE = "list";
+
+
+ enum PropertyKeys {
+ event, target, parameters, operation, type
+ }
+
+ private List<UIComponent> children;
+
+
+ public List<UIComponent> getChildren() {
+ if(children == null) {
+ children = new ArrayList<UIComponent>();
+ }
+ return children;
+ }
+
+ public String getEvent() {
+ return (String)getStateHelper().eval(PropertyKeys.event);
+ }
+
+ public void setEvent(String eventName) {
+ getStateHelper().eval(PropertyKeys.event, eventName);
+ }
+
+ public String getType() {
+ return (String)getStateHelper().eval(PropertyKeys.type, LIST_TYPE);
+ }
+
+ public void setType(String type) {
+ getStateHelper().put(PropertyKeys.type, type);
+ }
+
+ public String getTarget() {
+ return (String)getStateHelper().eval(PropertyKeys.target);
+ }
+
+ public void setTarget(String target) {
+ getStateHelper().eval(PropertyKeys.target, target);
+ }
+
+ public String getOperation() {
+ return (String)getStateHelper().eval(PropertyKeys.operation);
+ }
+
+ public void setOperation(String operation) {
+ getStateHelper().eval(PropertyKeys.operation, operation);
+ }
+
+ @Override
+ public String getRendererType() {
+ return BEHAVIOR_ID;
+ }
+
+ @Override
+ public void setLiteral(String name, Object value) {
+ if(compare(PropertyKeys.operation, name)) {
+ setOperation((String)value);
+ } else if(compare(PropertyKeys.target, name)) {
+ setTarget((String)value);
+ }
+ }
+
+ private boolean compare(Serializable key, String name) {
+ boolean retValue = false;
+ if(key != null) {
+ String keyName = key.toString();
+ retValue = keyName.equals(name);
+ }
+ return retValue;
+ }
+
+}
Added:
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/org/richfaces/renderkit/ComponentControlBehaviorRenderer.java
===================================================================
---
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/org/richfaces/renderkit/ComponentControlBehaviorRenderer.java
(rev 0)
+++
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/org/richfaces/renderkit/ComponentControlBehaviorRenderer.java 2010-04-23
17:17:15 UTC (rev 16801)
@@ -0,0 +1,99 @@
+package org.richfaces.renderkit;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.faces.application.ResourceDependencies;
+import javax.faces.application.ResourceDependency;
+import javax.faces.component.UIComponent;
+import javax.faces.component.UIParameter;
+import javax.faces.component.behavior.ClientBehavior;
+import javax.faces.component.behavior.ClientBehaviorContext;
+import javax.faces.render.ClientBehaviorRenderer;
+import javax.faces.render.FacesBehaviorRenderer;
+import javax.faces.render.RenderKitFactory;
+
+import org.ajax4jsf.javascript.JSFunction;
+import org.richfaces.component.UIHashParameter;
+import org.richfaces.component.behavior.ComponentControlBehavior;
+
+
+(a)FacesBehaviorRenderer(rendererType="org.richfaces.behavior.ComponentControlBehavior",
renderKitId=RenderKitFactory.HTML_BASIC_RENDER_KIT)
+@ResourceDependencies( {@ResourceDependency(library = "javax.faces", name =
"jsf.js"),
+ @ResourceDependency(name = "jquery.js"),
+ @ResourceDependency(name = "richfaces.js"),
+ @ResourceDependency(name= "richfaces-event.js"),
+ @ResourceDependency(name = "richfaces-queue.js"),
+ @ResourceDependency(name = "richfaces-base-component.js"),
+ @ResourceDependency(name = "script/component-control.js")
+})
+public class ComponentControlBehaviorRenderer extends ClientBehaviorRenderer{
+
+ private static final String FUNC_NAME =
"RichFaces.ui.ComponentControl.execute";
+
+ private static final String API_FUNCTION = "operation";
+
+ private static final String API_ARGUMENTS = "args";
+
+
+ public static final String SEPARATOR = "\\.";
+
+
+
+ @Override
+ public String getScript(ClientBehaviorContext behaviorContext, ClientBehavior
behavior) {
+ ComponentControlBehavior controlBehavior = (ComponentControlBehavior)behavior;
+ Map<String, Object> parameters = new HashMap<String, Object>();
+ //JSFunctionDefenition
+ String target = controlBehavior.getTarget();
+
+ String apiFunctionName = controlBehavior.getOperation();
+ parameters.put(API_FUNCTION, apiFunctionName);
+
+ List<Object> apiFunctionParams = createSignature(controlBehavior);
+ parameters.put(API_ARGUMENTS, apiFunctionParams.toArray());
+
+ JSFunction eventFunction = new JSFunction(FUNC_NAME);
+ eventFunction.addParameter(target);
+ eventFunction.addParameter(parameters);
+
+ return (eventFunction != null ? eventFunction.toScript() : null);
+ }
+
+ protected List<Object> createSignature(ComponentControlBehavior behavior) {
+ List<Object> elements = new ArrayList<Object>();
+ List<UIComponent> children = behavior.getChildren();
+
+ for(UIComponent child: children) {
+ if(child instanceof UIParameter) {
+ UIParameter parameter = (UIParameter)child;
+ Object value = parameter.getValue();
+
+ if(value != null) {
+ elements.add(value);
+ }
+ }
+
+ if(child instanceof UIHashParameter) {
+ UIHashParameter parameter = (UIHashParameter)child;
+ String name = parameter.getName();
+ Map<String, Object> value = parameter.getValue();
+
+ if(value != null) {
+ if(name != null) {
+ Map<String, Object> map = new HashMap<String,
Object>();
+ map.put(name, value);
+ elements.add(map);
+ } else {
+ elements.add(value);
+ }
+ }
+ }
+ }
+ return elements;
+ }
+}
+
Added:
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/org/richfaces/tag/BehaviorRule.java
===================================================================
---
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/org/richfaces/tag/BehaviorRule.java
(rev 0)
+++
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/org/richfaces/tag/BehaviorRule.java 2010-04-23
17:17:15 UTC (rev 16801)
@@ -0,0 +1,74 @@
+package org.richfaces.tag;
+
+import javax.faces.view.facelets.FaceletContext;
+import javax.faces.view.facelets.MetaRule;
+import javax.faces.view.facelets.Metadata;
+import javax.faces.view.facelets.MetadataTarget;
+import javax.faces.view.facelets.TagAttribute;
+
+import org.richfaces.component.behavior.ClientBehavior;
+import org.richfaces.log.RichfacesLogger;
+import org.slf4j.Logger;
+
+public class BehaviorRule extends MetaRule {
+
+ private static Logger log = RichfacesLogger.CONNECTION.getLogger();
+
+ final static class LiteralAttributeMetadata extends Metadata {
+
+ private final String name;
+ private final String value;
+
+ public LiteralAttributeMetadata(String name, String value) {
+ this.value = value;
+ this.name = name;
+ }
+
+ public void applyMetadata(FaceletContext ctx, Object instance) {
+ ((ClientBehavior) instance).setLiteral(this.name, this.value);
+ }
+ }
+
+ final static class ValueExpressionMetadata extends Metadata {
+
+ private final String name;
+
+ private final TagAttribute attr;
+
+ private final Class type;
+
+ public ValueExpressionMetadata(String name, Class type,
+ TagAttribute attr) {
+ this.name = name;
+ this.attr = attr;
+ this.type = type;
+ }
+
+ public void applyMetadata(FaceletContext ctx, Object instance) {
+ ((ClientBehavior) instance).setValueExpression(this.name,
this.attr.getValueExpression(ctx, this.type));
+ }
+
+ }
+
+ @Override
+ public Metadata applyRule(String name, TagAttribute attribute, MetadataTarget meta)
{
+ if(meta.isTargetInstanceOf(ClientBehavior.class)) {
+ if(!attribute.isLiteral()) {
+
+ Class type = meta.getPropertyType(name);
+ if (type == null) {
+ type = Object.class;
+ }
+ return new ValueExpressionMetadata(name, type, attribute);
+ } else if(meta.getWriteMethod(name) == null) {
+
+ if(log.isDebugEnabled()) {
+ log.debug(attribute + " Property '" + name +
"' is not on type: " + meta.getTargetClass().getName());
+ }
+ return new LiteralAttributeMetadata(name, attribute.getValue());
+ }
+ }
+
+ return null;
+ }
+}
Added:
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/org/richfaces/tag/BehaviorTagHandlerDelegate.java
===================================================================
---
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/org/richfaces/tag/BehaviorTagHandlerDelegate.java
(rev 0)
+++
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/org/richfaces/tag/BehaviorTagHandlerDelegate.java 2010-04-23
17:17:15 UTC (rev 16801)
@@ -0,0 +1,128 @@
+package org.richfaces.tag;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.faces.component.UIComponent;
+import javax.faces.component.UIParameter;
+import javax.faces.component.behavior.ClientBehavior;
+import javax.faces.component.behavior.ClientBehaviorHolder;
+import javax.faces.context.FacesContext;
+import javax.faces.view.AttachedObjectHandler;
+import javax.faces.view.facelets.ComponentConfig;
+import javax.faces.view.facelets.ComponentHandler;
+import javax.faces.view.facelets.CompositeFaceletHandler;
+import javax.faces.view.facelets.FaceletContext;
+import javax.faces.view.facelets.FaceletHandler;
+import javax.faces.view.facelets.MetaRuleset;
+import javax.faces.view.facelets.TagHandlerDelegate;
+
+import org.richfaces.component.UIHashParameter;
+import org.richfaces.component.behavior.ComponentControlBehavior;
+
+
+public class BehaviorTagHandlerDelegate extends TagHandlerDelegate implements
AttachedObjectHandler{
+
+ private TagHandlerDelegate tagHandlerDelegate;
+
+ private List<UIComponent> children;
+
+ public BehaviorTagHandlerDelegate(TagHandlerDelegate tagHandlerDelegate) {
+ this.tagHandlerDelegate = tagHandlerDelegate;
+ }
+
+ @Override
+ public void apply(FaceletContext ctx, UIComponent parent) throws IOException {
+ this.tagHandlerDelegate.apply(ctx, parent);
+ }
+
+ public void apply(FaceletContext ctx, UIComponent parent, FaceletHandler nextHandler)
throws IOException {
+ apply(ctx, parent);
+ processAttachedObject(ctx, parent, nextHandler);
+ }
+
+ @Override
+ public MetaRuleset createMetaRuleset(Class type) {
+ MetaRuleset metaRuleset = this.tagHandlerDelegate.createMetaRuleset(type);
+ metaRuleset.addRule(new BehaviorRule());
+ return metaRuleset;
+ }
+
+ public void applyAttachedObject(FacesContext context, UIComponent parent) {
+ if(tagHandlerDelegate instanceof AttachedObjectHandler) {
+ ((AttachedObjectHandler)tagHandlerDelegate).applyAttachedObject(context,
parent);
+ }
+ }
+
+ public String getFor() {
+ String retValue = null;
+ if(tagHandlerDelegate instanceof AttachedObjectHandler) {
+ retValue = ((AttachedObjectHandler)tagHandlerDelegate).getFor();
+ }
+ return retValue;
+ }
+
+
+ public void processNextHandler(FaceletContext ctx, FaceletHandler nextHandler,
UIComponent parent) throws IOException {
+ if(nextHandler instanceof CompositeFaceletHandler) {
+ FaceletHandler [] children =
((CompositeFaceletHandler)nextHandler).getHandlers();
+ for (FaceletHandler handler: children) {
+ collectParameters(ctx, handler, parent);
+ }
+ } else {
+ collectParameters(ctx, nextHandler, parent);
+ }
+ }
+
+ private void processAttachedObject(FaceletContext ctx, UIComponent parent,
FaceletHandler nextHandler) throws IOException{
+ ClientBehaviorHolder holder = (ClientBehaviorHolder)parent;
+ Map<String, List<ClientBehavior>> behaviors =
holder.getClientBehaviors();
+ Set<Map.Entry<String,List<ClientBehavior>>> entries =
behaviors.entrySet();
+
+ for(Map.Entry<String, List<ClientBehavior>>entry: entries) {
+ for(ClientBehavior behavior: entry.getValue()) {
+ if(behavior instanceof ComponentControlBehavior) {
+ processNextHandler(ctx, nextHandler, parent);
+ ((ComponentControlBehavior)
behavior).getChildren().addAll(getChildren());
+ //reset collected children after save to the behavior;
+ children = null;
+ }
+ }
+ }
+ }
+
+ private void collectParameters(FaceletContext ctx, FaceletHandler handler,
UIComponent parent) throws IOException {
+ ComponentHandler componentHandler = (ComponentHandler) handler;
+
+ ComponentConfig componentConfig = componentHandler.getComponentConfig();
+ String componentType = componentConfig.getComponentType();
+ if(isUIParameter(componentType)) {
+
+ FacesContext facesContext = ctx.getFacesContext();
+ UIComponent component =
(UIComponent)facesContext.getApplication().createComponent(facesContext, componentType,
null);
+ if((component instanceof UIParameter) || (component instanceof
UIHashParameter)) {
+ componentHandler.setAttributes(ctx, component);
+ getChildren().add(component);
+ }
+
+ if(component instanceof UIHashParameter) {
+ componentHandler.applyNextHandler(ctx, component);
+ }
+ }
+ }
+
+ private boolean isUIParameter(String type) {
+ return (UIParameter.COMPONENT_TYPE.equals(type) ||
UIHashParameter.COMPONENT_TYPE.equals(type));
+ }
+
+ public List<UIComponent> getChildren() {
+ if(this.children == null) {
+ this.children = new ArrayList<UIComponent>();
+ }
+ return this.children;
+ }
+
+}
Added:
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/org/richfaces/taglib/ComponentControlHandler.java
===================================================================
---
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/org/richfaces/taglib/ComponentControlHandler.java
(rev 0)
+++
root/ui-sandbox/trunk/components/componentcontrol/src/main/java/org/richfaces/taglib/ComponentControlHandler.java 2010-04-23
17:17:15 UTC (rev 16801)
@@ -0,0 +1,40 @@
+package org.richfaces.taglib;
+
+import java.io.IOException;
+
+import javax.faces.component.UIComponent;
+import javax.faces.view.facelets.BehaviorConfig;
+import javax.faces.view.facelets.BehaviorHandler;
+import javax.faces.view.facelets.FaceletContext;
+import javax.faces.view.facelets.TagHandlerDelegate;
+
+import org.richfaces.tag.BehaviorTagHandlerDelegate;
+
+public class ComponentControlHandler extends BehaviorHandler {
+
+ private BehaviorTagHandlerDelegate helper;
+
+
+ public ComponentControlHandler(BehaviorConfig config) {
+ super(config);
+ }
+
+ public BehaviorTagHandlerDelegate getBehaviorTagHandlerDelegate() {
+ return (BehaviorTagHandlerDelegate)getTagHandlerDelegate();
+ }
+
+ @Override
+ public void apply(FaceletContext ctx, UIComponent parent) throws IOException {
+ getBehaviorTagHandlerDelegate().apply(ctx, parent, nextHandler);
+ }
+
+ @Override
+ protected TagHandlerDelegate getTagHandlerDelegate() {
+ if(helper == null){
+ helper = new BehaviorTagHandlerDelegate(super.getTagHandlerDelegate());
+ }
+ return helper;
+ }
+
+}
+
Added:
root/ui-sandbox/trunk/components/componentcontrol/src/main/resources/META-INF/cc.taglib.xml
===================================================================
---
root/ui-sandbox/trunk/components/componentcontrol/src/main/resources/META-INF/cc.taglib.xml
(rev 0)
+++
root/ui-sandbox/trunk/components/componentcontrol/src/main/resources/META-INF/cc.taglib.xml 2010-04-23
17:17:15 UTC (rev 16801)
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<facelet-taglib
xmlns="http://java.sun.com/xml/ns/javaee"
+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
+ version="2.0"
+ id="cc">
+ <
namespace>http://richfaces.org/componentControl</namespace>
+ <tag>
+ <tag-name>componentControl</tag-name>
+ <behavior>
+ <behavior-id>org.richfaces.behavior.ComponentControlBehavior</behavior-id>
+ <handler-class>org.richfaces.taglib.ComponentControlHandler</handler-class>
+ </behavior>
+ </tag>
+ <tag>
+ <tag-name>hashParameter</tag-name>
+ <component>
+ <component-type>org.richfaces.HashParameter</component-type>
+ <handler-class>javax.faces.view.facelets.ComponentHandler</handler-class>
+ </component>
+
+ </tag>
+</facelet-taglib>
\ No newline at end of file
Added:
root/ui-sandbox/trunk/components/componentcontrol/src/main/resources/META-INF/faces-config.xml
===================================================================
---
root/ui-sandbox/trunk/components/componentcontrol/src/main/resources/META-INF/faces-config.xml
(rev 0)
+++
root/ui-sandbox/trunk/components/componentcontrol/src/main/resources/META-INF/faces-config.xml 2010-04-23
17:17:15 UTC (rev 16801)
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"
standalone="yes"?>
+<faces-config version="2.0" metadata-complete="false"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:cdk="http://richfaces.org/cdk/extensions"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+
+<component>
+ <component-type>org.richfaces.HashParameter</component-type>
+ <component-class>org.richfaces.component.UIHashParameter</component-class>
+ <component-extension>
+ <cdk:generate
xmlns:cdk="http://richfaces.org/cdk/extensions">false</cd...
+ </component-extension>
+ </component>
+</faces-config>
\ No newline at end of file
Added:
root/ui-sandbox/trunk/components/componentcontrol/src/main/resources/META-INF/resources/script/component-control.js
===================================================================
---
root/ui-sandbox/trunk/components/componentcontrol/src/main/resources/META-INF/resources/script/component-control.js
(rev 0)
+++
root/ui-sandbox/trunk/components/componentcontrol/src/main/resources/META-INF/resources/script/component-control.js 2010-04-23
17:17:15 UTC (rev 16801)
@@ -0,0 +1,22 @@
+(function (jQuery, richfaces) {
+
+ richfaces = richfaces || {};
+ richfaces.ui.ComponentControl = richfaces.ui.ComponentControl || {};
+
+ jQuery.extend(richfaces.ui.ComponentControl, {
+
+ execute: function(id, parameters) {
+ richfaces.ui.ComponentControl.eachComponent();
+
+ },
+
+ eachComponent : function(forAttr, callback) {
+ jQuery(forAttr.replace(/:/g, "\\:").each(function() {
+ if (this.component) {
+ callback(this.component);
+ }
+ });
+ }
+ });
+
+})(jQuery, window.RichFaces);
\ No newline at end of file