Author: pyaschenko
Date: 2009-07-14 05:21:44 -0400 (Tue, 14 Jul 2009)
New Revision: 14915
Modified:
branches/community/3.3.X/ui/componentControl/src/main/java/org/richfaces/component/UIComponentControl.java
branches/community/3.3.X/ui/componentControl/src/main/java/org/richfaces/renderkit/ComponentControlRendererBase.java
branches/community/3.3.X/ui/componentControl/src/main/resources/org/richfaces/renderkit/html/script/controlUtils.js
branches/community/3.3.X/ui/componentControl/src/main/templates/htmlComponentControl.jspx
branches/community/3.3.X/ui/componentControl/src/test/java/org/richfaces/component/ComponentControlTest.java
Log:
https://jira.jboss.org/jira/browse/RF-7474
patch modified and applied
Modified:
branches/community/3.3.X/ui/componentControl/src/main/java/org/richfaces/component/UIComponentControl.java
===================================================================
---
branches/community/3.3.X/ui/componentControl/src/main/java/org/richfaces/component/UIComponentControl.java 2009-07-14
08:29:06 UTC (rev 14914)
+++
branches/community/3.3.X/ui/componentControl/src/main/java/org/richfaces/component/UIComponentControl.java 2009-07-14
09:21:44 UTC (rev 14915)
@@ -34,6 +34,8 @@
import org.ajax4jsf.component.EventValueExpression;
import org.ajax4jsf.component.JavaScriptParameter;
import org.ajax4jsf.javascript.JSFunction;
+import org.ajax4jsf.javascript.JSFunctionDefinition;
+import org.ajax4jsf.javascript.JSLiteral;
import org.ajax4jsf.javascript.JSReference;
import org.ajax4jsf.javascript.ScriptUtils;
import org.apache.commons.logging.Log;
@@ -68,26 +70,38 @@
JSFunction invocation = new
JSFunction("Richfaces.componentControl.performOperation");
invocation.addParameter(new JSReference("event"));
- invocation.addParameter(getEvent());
- invocation.addParameter(targetId);
- invocation.addParameter(getOperation());
- addOptions(invocation);
+ addOptions(invocation, getEvent(), targetId, getOperation());
return invocation.toScript();
}
- public void addOptions(JSFunction function) {
+ private static boolean isContextMenuEvent(String event) {
+ return ("contextmenu".equalsIgnoreCase(event) ||
"oncontextmenu".equalsIgnoreCase(event));
+ }
+
+ public void addOptions(JSFunction function, String event, String targetId, String
operation) {
+ function.addParameter(event);
+ function.addParameter(targetId);
+ function.addParameter(operation);
+
+ boolean parametersEncoded = false;
+
String params = getEncodedParametersMap();
-
- if (params.length()!=0) {
- function.addParameter(new
JSReference("function(){return{"+params+"}}"));
+ if (params.length() != 0) {
+ parametersEncoded = true;
+ //parameters should be evaluated in time of componentControl execution, not at page
rendering
+ //e.g. event.clientX, that's why they're rendered in function
+ JSFunctionDefinition parametersFunction = new JSFunctionDefinition().
+ addToBody("return{").addToBody(params).addToBody("}");
+
+ function.addParameter(parametersFunction);
}
- String event = (String) getEvent();
+
boolean disableDefault = isDisableDefault();
- boolean isOnContextMenu = ("contextmenu".equalsIgnoreCase(event) ||
"oncontextmenu".equalsIgnoreCase(event));
- if ( isOnContextMenu ^ disableDefault ) {
- if (params.length()==0) {
- function.addParameter(new JSReference("{}"));
+ boolean isOnContextMenu = isContextMenuEvent(event);
+ if (isOnContextMenu ^ disableDefault) {
+ if (!parametersEncoded) {
+ function.addParameter(JSLiteral.EMPTY_HASH);
}
function.addParameter(disableDefault);
}
@@ -179,8 +193,7 @@
}
}
- String event = getEvent();
- return ("contextmenu".equalsIgnoreCase(event) ||
"oncontextmenu".equalsIgnoreCase(event));
+ return isContextMenuEvent(getEvent());
}
public void setDisableDefault(boolean disableDefault) {
Modified:
branches/community/3.3.X/ui/componentControl/src/main/java/org/richfaces/renderkit/ComponentControlRendererBase.java
===================================================================
---
branches/community/3.3.X/ui/componentControl/src/main/java/org/richfaces/renderkit/ComponentControlRendererBase.java 2009-07-14
08:29:06 UTC (rev 14914)
+++
branches/community/3.3.X/ui/componentControl/src/main/java/org/richfaces/renderkit/ComponentControlRendererBase.java 2009-07-14
09:21:44 UTC (rev 14915)
@@ -21,9 +21,6 @@
package org.richfaces.renderkit;
import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
import java.util.Map;
import javax.faces.FacesException;
@@ -35,7 +32,7 @@
import org.ajax4jsf.javascript.JSFunctionDefinition;
import org.ajax4jsf.javascript.JSReference;
import org.ajax4jsf.renderkit.HeaderResourcesRendererBase;
-import org.ajax4jsf.renderkit.RendererUtils;
+import org.ajax4jsf.renderkit.RendererUtils.HTML;
import org.ajax4jsf.resource.InternetResource;
import org.richfaces.component.UIComponentControl;
import org.richfaces.component.util.HtmlUtil;
@@ -43,186 +40,137 @@
public class ComponentControlRendererBase extends HeaderResourcesRendererBase {
- /**
- * Constant for "immediate" attach timing option
- */
- private static final String IMMEDIATE = "immediate";
+ /**
+ * Constant for "immediate" attach timing option
+ */
+ private static final String IMMEDIATE = "immediate";
- /**
- * Constant for "onAvailable" attach timing option
- */
- private static final String ON_AVAILABLE = "onavailable";
+ /**
+ * Constant for "onAvailable" attach timing option
+ */
+ private static final String ON_AVAILABLE = "onavailable";
- /**
- * Constant for "onload" attach timing option
- */
- private static final String ON_LOAD = "onload";
+ /**
+ * Constant for "onload" attach timing option
+ */
+ private static final String ON_LOAD = "onload";
- protected Class<UIComponentControl> getComponentClass() {
- return UIComponentControl.class;
- }
+ protected Class<UIComponentControl> getComponentClass() {
+ return UIComponentControl.class;
+ }
- /**
- * Additional scripts.
- */
- private final InternetResource[] additionalScripts = { new
org.ajax4jsf.javascript.PrototypeScript(),
- new org.ajax4jsf.javascript.AjaxScript(),
getResource("/org/richfaces/renderkit/html/scripts/available.js") };
+ /**
+ * Additional scripts.
+ */
+ private final InternetResource[] additionalScripts = { new
org.ajax4jsf.javascript.PrototypeScript(),
+ new org.ajax4jsf.javascript.AjaxScript(),
getResource("/org/richfaces/renderkit/html/scripts/available.js") };
- /**
- * Perform validation of the component control configuration. Throws FacesException
in case validation fails.
- * @param clientId - id of the component
- * @param name - component name
- * @param attachTiming - timing options
- * @param forAttr - client ids of target components
- * @param operation - operation performed on target components
- */
- protected void checkValidity(String clientId, String name, String attachTiming,
String forAttr, String operation) {
- if (!ON_LOAD.equals(attachTiming) && !IMMEDIATE.equals(attachTiming)
&& !ON_AVAILABLE.equals(attachTiming)) {
- throw new FacesException("The attachTiming attribute of the
controlComponent (id='" + clientId
- + "') has an invalid value:'" + attachTiming + "'.
It may have only the following values: '"
- + IMMEDIATE + "', '" + ON_LOAD + "', '" +
ON_AVAILABLE + "'");
- }
-
- if (operation == null || operation.trim().length() == 0) {
- throw new FacesException("The operation attribute of the controlComponent
(id='" + clientId
- + "') must be specified");
- }
- }
+ /**
+ * Perform validation of the component control configuration. Throws FacesException in
case validation fails.
+ * @param clientId - id of the component
+ * @param name - component name
+ * @param attachTiming - timing options
+ * @param forAttr - client ids of target components
+ * @param operation - operation performed on target components
+ */
+ protected void checkValidity(String clientId, String name, String attachTiming, String
forAttr, String operation) {
+ if (!ON_LOAD.equals(attachTiming) && !IMMEDIATE.equals(attachTiming) &&
!ON_AVAILABLE.equals(attachTiming)) {
+ throw new FacesException("The attachTiming attribute of the controlComponent
(id='" + clientId
+ + "') has an invalid value:'" + attachTiming + "'. It may
have only the following values: '"
+ + IMMEDIATE + "', '" + ON_LOAD + "', '" +
ON_AVAILABLE + "'");
+ }
- protected String replaceClientIds(FacesContext context, UIComponent component, String
selector) {
- return HtmlUtil.expandIdSelector(HtmlUtil.idsToIdSelector(selector), component,
context);
- }
+ if (operation == null || operation.trim().length() == 0) {
+ throw new FacesException("The operation attribute of the controlComponent
(id='" + clientId
+ + "') must be specified");
+ }
+ }
- /**
- * Gets additional scripts.
- *
- * @return array of resources
- */
- protected InternetResource[] getScripts() {
- return additionalScripts;
- }
+ protected String replaceClientIds(FacesContext context, UIComponent component, String
selector) {
+ return HtmlUtil.expandIdSelector(HtmlUtil.idsToIdSelector(selector), component,
context);
+ }
- /**
- * Returns String representation of object. If object is null,
- * returns empty String.
- * @param obj - object
- * @return String representation of object.
- */
- private static String convertToString(Object obj ) {
- return ( obj == null ? "" : obj.toString() );
- }
-
- private static String convertToString(List array, String separator ) {
- StringBuilder sb = new StringBuilder();
- boolean close = false;
- Iterator<Object> i = array.iterator();
- while (i.hasNext())
- {
- Object item = i.next();
- if (close) {
- sb.append(separator);
- } else {
- close = true;
- }
- sb.append(item);
- }
- return sb.toString();
- }
-
- public void getScript(FacesContext context, UIComponent component) throws IOException
{
-
- UIComponentControl componentControl = (UIComponentControl) component;
- ResponseWriter writer = context.getResponseWriter();
-
- Map<String, Object> attributes = component.getAttributes();
-
- JSFunctionDefinition function = null;
- List<JSFunction> functionArray = new ArrayList<JSFunction>();
-
- String name = convertToString(attributes.get("name"));
- String attachTo = convertToString(attributes.get("attachTo"));
- String forAttr = convertToString(attributes.get("for"));
- forAttr = replaceClientIds(context, component, forAttr);
- String operation = convertToString(attributes.get("operation"));
- String attachTiming = componentControl.getAttachTiming();
- checkValidity(componentControl.getClientId(context), name, attachTiming, forAttr,
operation);
- String event = convertToString(attributes.get("event"));
-
- String performScript = null;
-
- if (!"".equals(name.trim())) {
- JSFunction subFunction = new
JSFunction("Richfaces.componentControl.performOperation");
- subFunction.addParameter(new JSReference("cevent"));
- subFunction.addParameter(event);
- subFunction.addParameter(forAttr);
- subFunction.addParameter(operation);
- componentControl.addOptions(subFunction);
-
- function = new JSFunctionDefinition("cevent");
- function.setName(name);
- function.addToBody(subFunction);
- performScript = function.toString();
- }
-
- if (attachTo != null && attachTo.trim().length() != 0 &&
!"#".equals(attachTo)) {
-
- boolean isImmediate = attachTiming.equals(IMMEDIATE);
- boolean isOnLoad = attachTiming.equals(ON_LOAD);
- boolean isOnAvailable = attachTiming.equals(ON_AVAILABLE);
-
- if (!(isImmediate || isOnLoad || isOnAvailable)) {
- // unknown value of property "attachTiming"
- return;
- }
-
- String pattern = "\\s*,\\s*";
- // "attachTo" attribute may contain several ids splitted by
","
- String[] result = attachTo.split(pattern);
- for (int i = 0; i < result.length; i++) {
- JSFunction mainFunction = null;
- if (isOnLoad) {
- mainFunction = new JSFunction("jQuery(document).ready");
- } else if (isOnAvailable) {
- UIComponent target =
RendererUtils.getInstance().findComponentFor(context, component, result[i]);
- String clientId = (target != null) ? target.getClientId(context) :
result[i];
- mainFunction = new
JSFunction("Richfaces.onAvailable",clientId);
- } else if (isImmediate) {
- }
-
- if (mainFunction!=null)
- {
- JSFunction subFunction = new
JSFunction("Richfaces.componentControl.attachEvent");
- subFunction.addParameter(replaceClientIds(context, component,
result[i]));
- subFunction.addParameter(event);
- subFunction.addParameter(forAttr);
- subFunction.addParameter(operation);
- componentControl.addOptions(subFunction);
-
- function = new JSFunctionDefinition("");
- function.addToBody(subFunction);
-
- mainFunction.addParameter(function);
- functionArray.add(mainFunction);
- }
- }
- }
-
- if (!functionArray.isEmpty() || performScript!=null) {
- writer.startElement("script", componentControl);
- getUtils().writeAttribute(writer, "type",
"text/javascript");
- writer.writeText("//", null);
- writer.write("<![CDATA[\n");
- if (performScript!= null) {
- writer.write(performScript);
- writer.write(";");
- }
- if (!functionArray.isEmpty()) {
- writer.write(convertToString(functionArray, ";"));
- writer.write(";");
- }
- writer.writeText("\n//", null);
- writer.write("]]>");
- writer.endElement("script");
- }
- }
+ /**
+ * Gets additional scripts.
+ *
+ * @return array of resources
+ */
+ protected InternetResource[] getScripts() {
+ return additionalScripts;
+ }
+
+ /**
+ * Returns String representation of object. If object is null,
+ * returns empty String.
+ * @param obj - object
+ * @return String representation of object.
+ */
+ private static String convertToString(Object obj ) {
+ return ( obj == null ? "" : obj.toString() );
+ }
+
+ public void writeScript(FacesContext context, UIComponent component) throws IOException
{
+
+ UIComponentControl componentControl = (UIComponentControl) component;
+ ResponseWriter writer = context.getResponseWriter();
+
+ Map<String, Object> attributes = component.getAttributes();
+
+ String name = convertToString(attributes.get("name"));
+ String attachTo = convertToString(attributes.get("attachTo"));
+ String forAttr = convertToString(attributes.get("for"));
+ forAttr = replaceClientIds(context, component, forAttr);
+ String operation = convertToString(attributes.get("operation"));
+ String attachTiming = componentControl.getAttachTiming();
+ checkValidity(componentControl.getClientId(context), name, attachTiming, forAttr,
operation);
+ String event = convertToString(attributes.get("event"));
+
+ JSFunctionDefinition namedFunction = null;
+ JSFunction eventFunction = null;
+
+ if (name.trim().length() != 0) {
+ JSFunction subFunction = new
JSFunction("Richfaces.componentControl.performOperation");
+ subFunction.addParameter(new JSReference("event"));
+ componentControl.addOptions(subFunction, event, forAttr, operation);
+
+ namedFunction = new JSFunctionDefinition("event");
+ namedFunction.setName(name);
+ namedFunction.addToBody(subFunction);
+ }
+
+ if (attachTo != null && attachTo.trim().length() != 0 &&
!"#".equals(attachTo)) {
+ boolean isImmediate = attachTiming.equals(IMMEDIATE);
+ boolean isOnLoad = attachTiming.equals(ON_LOAD);
+ boolean isOnAvailable = attachTiming.equals(ON_AVAILABLE);
+
+ if (isOnLoad) {
+ eventFunction = new JSFunction("Richfaces.componentControl.attachReady");
+ } else if (isOnAvailable) {
+ eventFunction = new
JSFunction("Richfaces.componentControl.attachAvailable");
+ } else if (isImmediate) {
+ eventFunction = new JSFunction("Richfaces.componentControl.attachEvent");
+ } else {
+ // unknown value of property "attachTiming"
+ return;
+ }
+
+ // "attachTo" attribute may contain several ids splitted by ","
+ String selector = replaceClientIds(context, component, attachTo);
+ eventFunction.addParameter(selector);
+ componentControl.addOptions(eventFunction, event, forAttr, operation);
+ }
+
+ if (eventFunction != null || namedFunction != null) {
+ writer.startElement(HTML.SCRIPT_ELEM, componentControl);
+ getUtils().writeAttribute(writer, HTML.TYPE_ATTR, "text/javascript");
+ if (namedFunction != null) {
+ writer.writeText(namedFunction.toScript(), component, null);
+ writer.writeText(";", component, null);
+ }
+ if (eventFunction != null) {
+ writer.writeText(eventFunction.toScript(), component, null);
+ }
+ writer.endElement(HTML.SCRIPT_ELEM);
+ }
+ }
}
\ No newline at end of file
Modified:
branches/community/3.3.X/ui/componentControl/src/main/resources/org/richfaces/renderkit/html/script/controlUtils.js
===================================================================
---
branches/community/3.3.X/ui/componentControl/src/main/resources/org/richfaces/renderkit/html/script/controlUtils.js 2009-07-14
08:29:06 UTC (rev 14914)
+++
branches/community/3.3.X/ui/componentControl/src/main/resources/org/richfaces/renderkit/html/script/controlUtils.js 2009-07-14
09:21:44 UTC (rev 14915)
@@ -30,14 +30,30 @@
};
Richfaces.componentControl.attachEvent = function(attachTo, aevent, forAttr, operation,
params, disableDefault) {
- jQuery(attachTo).bind(Richfaces.effectEventOnOut(aevent),function(cevent) {
- Richfaces.componentControl.performOperation(cevent, aevent, forAttr, operation, params,
disableDefault);
+ jQuery(attachTo).bind(Richfaces.effectEventOnOut(aevent),function(event) {
+ Richfaces.componentControl.performOperation(event, aevent, forAttr, operation, params,
disableDefault);
}).each(function() {
Richfaces.componentControl.applyDecorations(this, forAttr, function(element) {
//TODO: handle component decoration
});
});
};
+
+Richfaces.componentControl.attachAvailable = function(attachTo, aevent, forAttr,
operation, params, disableDefault) {
+ var ids = attachTo.split(',');
+ for (var i = 0; i < ids.length; i++) {
+ var id = ids[i];
+ Richfaces.onAvailable(id.replace(/^#|\\(:)/g, "$1"), function() {
+ Richfaces.componentControl.attachEvent(id, aevent, forAttr, operation, params,
disableDefault);
+ });
+ }
+};
+
+Richfaces.componentControl.attachReady = function(attachTo, aevent, forAttr, operation,
params, disableDefault) {
+ jQuery(document).ready(function() {
+ Richfaces.componentControl.attachEvent(attachTo, aevent, forAttr, operation, params,
disableDefault);
+ });
+};
Richfaces.componentControl.checkDisableDefault = function (ename, disableDefault) {
if (disableDefault==undefined) {
@@ -46,15 +62,15 @@
} else {
return disableDefault;
}
-}
+};
-Richfaces.componentControl.performOperation = function( cevent, aevent, forAttr,
operation, params, disableDefault) {
+Richfaces.componentControl.performOperation = function(event, aevent, forAttr, operation,
params, disableDefault) {
// stop event before event isn't extended by prototype
if (Richfaces.componentControl.checkDisableDefault(aevent, disableDefault)) {
- var event = jQuery.event.fix(cevent);
- event.stopPropagation();
- event.preventDefault();
+ var fixedEvent = jQuery.event.fix(event);
+ fixedEvent.stopPropagation();
+ fixedEvent.preventDefault();
}
Richfaces.componentControl.eachComponent(forAttr, function(component) {
@@ -63,7 +79,7 @@
paramsValue = params();
}
- component[operation](cevent, paramsValue);
+ component[operation](event, paramsValue);
});
};
Modified:
branches/community/3.3.X/ui/componentControl/src/main/templates/htmlComponentControl.jspx
===================================================================
---
branches/community/3.3.X/ui/componentControl/src/main/templates/htmlComponentControl.jspx 2009-07-14
08:29:06 UTC (rev 14914)
+++
branches/community/3.3.X/ui/componentControl/src/main/templates/htmlComponentControl.jspx 2009-07-14
09:21:44 UTC (rev 14915)
@@ -1,22 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
-<f:root
-
xmlns:f="http://ajax4jsf.org/cdk/template"
- xmlns:c="
http://java.sun.com/jsf/core"
+<f:root
xmlns:f="http://ajax4jsf.org/cdk/template"
+ xmlns:c="
http://java.sun.com/jsf/core"
xmlns:ui="
http://ajax4jsf.org/cdk/ui"
xmlns:u="
http://ajax4jsf.org/cdk/u"
xmlns:x="
http://ajax4jsf.org/cdk/x"
class="org.richfaces.renderkit.html.ComponentControlRenderer"
baseclass="org.richfaces.renderkit.ComponentControlRendererBase"
- component="org.richfaces.component.UIComponentControl"
- >
+ component="org.richfaces.component.UIComponentControl">
<h:scripts>/org/richfaces/renderkit/html/scripts/jquery/jquery.js,/org/richfaces/renderkit/html/script/controlUtils.js</h:scripts>
-<f:clientid var="clientId"/>
+ <f:call name="writeScript" />
-<jsp:scriptlet>
-<![CDATA[
- getScript(context, component);
-]]>
-</jsp:scriptlet>
-
</f:root>
Modified:
branches/community/3.3.X/ui/componentControl/src/test/java/org/richfaces/component/ComponentControlTest.java
===================================================================
---
branches/community/3.3.X/ui/componentControl/src/test/java/org/richfaces/component/ComponentControlTest.java 2009-07-14
08:29:06 UTC (rev 14914)
+++
branches/community/3.3.X/ui/componentControl/src/test/java/org/richfaces/component/ComponentControlTest.java 2009-07-14
09:21:44 UTC (rev 14915)
@@ -144,7 +144,7 @@
String eventString = null;
for (Object obj : scripts) {
HtmlScript element = (HtmlScript) obj;
- if
(element.asXml().contains("Richfaces.componentControl.attachEvent")) {
+ if
(element.asXml().contains("Richfaces.componentControl.attachAvailable")) {
eventString = element.asXml();
break;
}