[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