[richfaces-svn-commits] JBoss Rich Faces SVN: r2185 - in trunk/ui/effect: src/main/java/org/richfaces and 3 other directories.

richfaces-svn-commits at lists.jboss.org richfaces-svn-commits at lists.jboss.org
Thu Aug 9 21:10:57 EDT 2007


Author: nbelaevski
Date: 2007-08-09 21:10:57 -0400 (Thu, 09 Aug 2007)
New Revision: 2185

Added:
   trunk/ui/effect/src/main/java/org/richfaces/renderkit/
   trunk/ui/effect/src/main/java/org/richfaces/renderkit/EffectRendererBase.java
Modified:
   trunk/ui/effect/
   trunk/ui/effect/src/main/resources/org/richfaces/renderkit/html/script/processEffect.js
   trunk/ui/effect/src/main/templates/effect.jspx
Log:
- code slightly optimized
- escapement for parameters implemented
- id parameter is expanded to clientId if applicable


Property changes on: trunk/ui/effect
___________________________________________________________________
Name: svn:ignore
   - target

   + target
.settings
.classpath
.project


Added: trunk/ui/effect/src/main/java/org/richfaces/renderkit/EffectRendererBase.java
===================================================================
--- trunk/ui/effect/src/main/java/org/richfaces/renderkit/EffectRendererBase.java	                        (rev 0)
+++ trunk/ui/effect/src/main/java/org/richfaces/renderkit/EffectRendererBase.java	2007-08-10 01:10:57 UTC (rev 2185)
@@ -0,0 +1,75 @@
+/**
+ * 
+ */
+package org.richfaces.renderkit;
+
+import java.io.IOException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+
+import org.ajax4jsf.javascript.JSEncoder;
+import org.ajax4jsf.renderkit.ComponentsVariableResolver;
+import org.ajax4jsf.renderkit.HeaderResourcesRendererBase;
+import org.richfaces.component.UIEffect;
+import org.richfaces.json.JSONException;
+import org.richfaces.json.JSONMap;
+
+/**
+ * @author Nick Belaevski
+ *         mailto:nbelaevski at exadel.com
+ *         created 09.08.2007
+ *
+ */
+public class EffectRendererBase extends HeaderResourcesRendererBase {
+
+	/* (non-Javadoc)
+	 * @see org.ajax4jsf.renderkit.RendererBase#getComponentClass()
+	 */
+	protected Class getComponentClass() {
+		return UIEffect.class;
+	}
+
+	private static final Pattern VARIABLE_PATTERN = Pattern.compile("^\\s*[_,A-Z,a-z]\\w*(?:\\.[_,A-Z,a-z]\\w*)*\\s*$");
+
+	public String convertElementParameter(Object parameter) {
+		String s = parameter.toString();
+		if (VARIABLE_PATTERN.matcher(s).matches()) {
+			return "typeof "+s+" == \"object\" ? "+s+" : $('"+s+"')";
+		} else {
+			return "'"+s+"'";
+		}
+	}
+	
+	public String convertParameters(FacesContext context, UIEffect effect) throws IOException {
+		JSEncoder encoder = new JSEncoder();
+		String params = effect.getParams();
+		if (params == null) {
+			return null;
+		}
+
+		try {
+			JSONMap map = new JSONMap("{" + params + "}");
+			Object id = map.get("id");
+			if (id != null) {
+				UIComponent component = effect.findComponent(id.toString());
+				if (component != null) {
+					id = component.getClientId(context);
+				}
+
+				map.put("id", null);
+			}
+
+			ComponentsVariableResolver.getVariables(this, effect).setVariable("pmId", id);
+
+			return map.getString();
+		} catch (JSONException e) {
+			IOException exception = new IOException(e.getMessage());
+			exception.initCause(e);
+			
+			throw exception;
+		}
+	}
+}

Modified: trunk/ui/effect/src/main/resources/org/richfaces/renderkit/html/script/processEffect.js
===================================================================
--- trunk/ui/effect/src/main/resources/org/richfaces/renderkit/html/script/processEffect.js	2007-08-09 21:21:51 UTC (rev 2184)
+++ trunk/ui/effect/src/main/resources/org/richfaces/renderkit/html/script/processEffect.js	2007-08-10 01:10:57 UTC (rev 2185)
@@ -1,15 +1,16 @@
 if (!window.Richfaces) {
 window.Richfaces = {};
 }
-Richfaces.processEffect = new Function("cid","etype","aparam","param",
-"var h=Object.extend(param.evalJSON(), aparam);"+
-"new Effect[h.type||etype]($(h.id||cid),h);");
 
-Richfaces.effectEventOnOut = new Function("ename",
-"return ename.substr(0,2)=='on'?ename.substr(2):ename;");
+Richfaces.processEffect = function(cid, etype, aparam, param) {
+	var h=Object.extend(param, aparam);
+	new Effect[h.type||etype]($(h.id||cid),h);
+};
 
+Richfaces.effectEventOnOut = function(ename) {
+	return ename.substr(0,2) == 'on' ? ename.substr(2) : ename;
+};
 
-
 /*
 Richfaces.addEffectObserve= new Function("oid", "oevent","otype","oparams","useCapture",
 "var funcpart='{}';"+

Modified: trunk/ui/effect/src/main/templates/effect.jspx
===================================================================
--- trunk/ui/effect/src/main/templates/effect.jspx	2007-08-09 21:21:51 UTC (rev 2184)
+++ trunk/ui/effect/src/main/templates/effect.jspx	2007-08-10 01:10:57 UTC (rev 2185)
@@ -6,7 +6,7 @@
 	xmlns:u=" http://ajax4jsf.org/cdk/u"
 	xmlns:x=" http://ajax4jsf.org/cdk/x"
 	class="org.richfaces.renderkit.html.EffectRenderer"
-	baseclass="org.ajax4jsf.renderkit.HeaderResourcesRendererBase"
+	baseclass="org.richfaces.renderkit.EffectRendererBase"
 	component="org.richfaces.component.UIEffect">
 	<f:clientid var="clientId"/>
 	
@@ -15,14 +15,14 @@
 	<c:set var="event" value="#{component.attributes['event']}"/>
 	<c:set var="name" value="#{component.attributes['name']}"/>
 	<c:set var="type" value="#{component.attributes['type']}"/>
-	<c:set var="params" value="#{component.attributes['params']}"/>
+	<c:set var="params" value="#{this:convertParameters(context, component)}"/>
 	<h:scripts>new org.ajax4jsf.javascript.PrototypeScript(),scripts/scriptaculous/scriptaculous.js,scripts/scriptaculous/effects.js,/org/richfaces/renderkit/html/script/processEffect.js</h:scripts>
          
 
 <jsp:scriptlet>
 <![CDATA[
-	String  sid = (String)variables.getVariable("for");
-	String  event = (String)variables.getVariable("event");
+	String sid = (String) variables.getVariable("for");
+	String event = (String) variables.getVariable("event");
 	
 	if (! "".equals(sid)) {
 		UIComponent forcomp = getUtils().findComponentFor(context, (UIComponent)component,sid);
@@ -45,7 +45,7 @@
 <c:if test="#{needsFunction}">
 <script type="text/javascript" x:passThruWithExclusions="name,type,for">
  //<![CDATA[
-#{name} = new Function("Richfaces.processEffect('#{forid}','#{type}',arguments[0]||{}, '{#{params}}');");
+#{name} = function () { return Richfaces.processEffect('#{forid}','#{type}',arguments[0]||{}, #{params}); };
 //]]>
 </script>
 </c:if>
@@ -53,11 +53,16 @@
 <script type="text/javascript" x:passThruWithExclusions="name,type,for">
  //<![CDATA[
 {
-var pm ="{"+"#{params}"+"}";var ename = Richfaces.effectEventOnOut('#{event}');
-var obj= typeof #{forid} == "object"? #{forid}:$('#{forid}');
+var pm = #{params};
+
+/* pm.id can have a special meaning, let's check */
+pm.id = #{this:convertElementParameter(pmId)};
+
+var ename = Richfaces.effectEventOnOut('#{event}');
+var obj= #{this:convertElementParameter(forid)};
 var hash = { id: obj, params: pm };
-var bindedFunction = function(event){ return Richfaces.processEffect(this.id,'#{type}',{},this.params); }.bind(hash);
-Event.observe(obj,ename, bindedFunction,{#{params}}.useCapture||false);
+var bindedFunction = function(event){ return Richfaces.processEffect(this.id,'#{type}',{},this.params); }.bindAsEventListener(hash);
+Event.observe(obj,ename, bindedFunction, pm.useCapture||false);
 }
 //]]>
 </script>




More information about the richfaces-svn-commits mailing list