SWF-965 - We should be able to change the css style of the code generated by SF: tags.

SWF-1020 - Add an <sf:elementDecoration> component to make it easy to build new Dojo-based composition components
This commit is contained in:
Jeremy Grelle
2009-01-16 21:22:55 +00:00
parent 13b05e984b
commit 09f2c6f24f
17 changed files with 227 additions and 105 deletions

View File

@@ -33,7 +33,7 @@ import org.springframework.util.StringUtils;
* @author Jeremy Grelle
*
*/
public class AjaxEventInterceptorRenderer extends DojoDecorationRenderer {
public class AjaxEventInterceptorRenderer extends DojoElementDecorationRenderer {
public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
String event = (String) component.getAttributes().get("event");
@@ -52,13 +52,14 @@ public class AjaxEventInterceptorRenderer extends DojoDecorationRenderer {
}
String childId = getElementId(context, component);
StringBuffer script = new StringBuffer();
script.append("dojo.addOnLoad(function(){");
script.append("Spring.addDecoration(new Spring.AjaxEventDecoration({");
script.append("event:'" + event + "'");
script.append(", elementId: '" + childId + "'");
script.append(", sourceId: '" + component.getClientId(context) + "'");
script.append(", formId : '" + RendererUtils.getFormId(context, component) + "'");
script.append(", params: {processIds : '" + processIds + "'");
script.append(", ajaxSource : '" + component.getClientId(context) + "'} }));");
script.append(", ajaxSource : '" + component.getClientId(context) + "'} }));});");
writer.writeText(script.toString(), null);
@@ -68,7 +69,7 @@ public class AjaxEventInterceptorRenderer extends DojoDecorationRenderer {
private String getElementId(FacesContext context, UIComponent component) {
if (component.getChildCount() > 0) {
UIComponent child = (UIComponent) component.getChildren().get(0);
if (!(child instanceof DojoDecoration)) {
if (!(child instanceof SpringJavascriptElementDecoration)) {
return child.getClientId(context);
} else {
return getElementId(context, child);

View File

@@ -33,23 +33,20 @@ import org.springframework.faces.webflow.JsfUtils;
*/
public abstract class BaseDojoComponentRenderer extends BaseSpringJavascriptComponentRenderer {
private String dojoJsResourceUri = "/dojo/dojo.js";
private String dijitThemePath = "/dijit/themes/";
private String dijitTheme = "tundra";
private String springDojoJsResourceUri = "/spring/Spring-Dojo.js";
public void encodeBegin(FacesContext context, UIComponent component) throws IOException {
super.encodeBegin(context, component);
if (!JsfUtils.isAsynchronousFlowRequest()) {
ResourceHelper.renderStyleLink(context, dijitThemePath + dijitTheme + "/" + dijitTheme + ".css");
ResourceHelper.renderScriptLink(context, dojoJsResourceUri);
if (!context.getViewRoot().getAttributes().containsKey(DojoConstants.CUSTOM_THEME_PATH_SET)
&& !context.getViewRoot().getAttributes().containsKey(DojoConstants.CUSTOM_THEME_SET)) {
ResourceHelper.renderStyleLink(context, DojoConstants.DIJIT_THEME_PATH
+ DojoConstants.DEFAULT_DIJIT_THEME + "/" + DojoConstants.DEFAULT_DIJIT_THEME + ".css");
}
ResourceHelper.renderScriptLink(context, springDojoJsResourceUri);
ResourceHelper.renderScriptLink(context, DojoConstants.DOJO_JS_RESOURCE_URI);
ResourceHelper.renderScriptLink(context, DojoConstants.SPRING_DOJO_JS_RESOURCE_URI);
}
}

View File

@@ -25,7 +25,7 @@ import javax.faces.el.ValueBinding;
* @author Jeremy Grelle
*
*/
public class DojoClientCurrencyValidator extends DojoDecoration {
public class DojoClientCurrencyValidator extends DojoWidget {
private static final String DOJO_COMPONENT_TYPE = "dijit.form.CurrencyTextBox";
@@ -34,9 +34,9 @@ public class DojoClientCurrencyValidator extends DojoDecoration {
private static final String[] DOJO_ATTRS;
static {
DOJO_ATTRS = new String[DojoDecoration.DOJO_ATTRS.length + DOJO_ATTRS_INTERNAL.length];
System.arraycopy(DojoDecoration.DOJO_ATTRS, 0, DOJO_ATTRS, 0, DojoDecoration.DOJO_ATTRS.length);
System.arraycopy(DOJO_ATTRS_INTERNAL, 0, DOJO_ATTRS, DojoDecoration.DOJO_ATTRS.length, DOJO_ATTRS_INTERNAL.length);
DOJO_ATTRS = new String[DojoWidget.DOJO_ATTRS.length + DOJO_ATTRS_INTERNAL.length];
System.arraycopy(DojoWidget.DOJO_ATTRS, 0, DOJO_ATTRS, 0, DojoWidget.DOJO_ATTRS.length);
System.arraycopy(DOJO_ATTRS_INTERNAL, 0, DOJO_ATTRS, DojoWidget.DOJO_ATTRS.length, DOJO_ATTRS_INTERNAL.length);
}
private String currency;
@@ -57,7 +57,7 @@ public class DojoClientCurrencyValidator extends DojoDecoration {
return DOJO_ATTRS;
}
public String getDojoComponentType() {
public String getWidgetType() {
return DOJO_COMPONENT_TYPE;
}

View File

@@ -28,7 +28,7 @@ import org.springframework.util.Assert;
* @author Jeremy Grelle
*
*/
public class DojoClientDateValidator extends DojoDecoration {
public class DojoClientDateValidator extends DojoWidget {
private static final String DOJO_COMPONENT_TYPE = "dijit.form.DateTextBox";
@@ -39,9 +39,9 @@ public class DojoClientDateValidator extends DojoDecoration {
private String datePattern = null;
static {
DOJO_ATTRS = new String[DojoDecoration.DOJO_ATTRS.length + DOJO_ATTRS_INTERNAL.length];
System.arraycopy(DojoDecoration.DOJO_ATTRS, 0, DOJO_ATTRS, 0, DojoDecoration.DOJO_ATTRS.length);
System.arraycopy(DOJO_ATTRS_INTERNAL, 0, DOJO_ATTRS, DojoDecoration.DOJO_ATTRS.length,
DOJO_ATTRS = new String[DojoWidget.DOJO_ATTRS.length + DOJO_ATTRS_INTERNAL.length];
System.arraycopy(DojoWidget.DOJO_ATTRS, 0, DOJO_ATTRS, 0, DojoWidget.DOJO_ATTRS.length);
System.arraycopy(DOJO_ATTRS_INTERNAL, 0, DOJO_ATTRS, DojoWidget.DOJO_ATTRS.length,
DOJO_ATTRS_INTERNAL.length);
}
@@ -63,7 +63,7 @@ public class DojoClientDateValidator extends DojoDecoration {
return DOJO_ATTRS;
}
public String getDojoComponentType() {
public String getWidgetType() {
return DOJO_COMPONENT_TYPE;
}

View File

@@ -22,15 +22,15 @@ package org.springframework.faces.ui;
* @author Jeremy Grelle
*
*/
public class DojoClientNumberValidator extends DojoDecoration {
public class DojoClientNumberValidator extends DojoWidget {
private static final String DOJO_COMPONENT_TYPE = "dijit.form.NumberTextBox";
protected String[] getDojoAttributes() {
return DojoDecoration.DOJO_ATTRS;
return DojoWidget.DOJO_ATTRS;
}
public String getDojoComponentType() {
public String getWidgetType() {
return DOJO_COMPONENT_TYPE;
}

View File

@@ -22,15 +22,15 @@ package org.springframework.faces.ui;
* @author Jeremy Grelle
*
*/
public class DojoClientTextValidator extends DojoDecoration {
public class DojoClientTextValidator extends DojoWidget {
private static final String DOJO_COMPONENT_TYPE = "dijit.form.ValidationTextBox";
protected String[] getDojoAttributes() {
return DojoDecoration.DOJO_ATTRS;
return DojoWidget.DOJO_ATTRS;
}
public String getDojoComponentType() {
public String getWidgetType() {
return DOJO_COMPONENT_TYPE;
}

View File

@@ -0,0 +1,12 @@
package org.springframework.faces.ui;
class DojoConstants {
static final String DIJIT_THEME_PATH = "/dijit/themes/";
static final String DEFAULT_DIJIT_THEME = "tundra";
static final String DOJO_JS_RESOURCE_URI = "/dojo/dojo.js";
static final String SPRING_DOJO_JS_RESOURCE_URI = "/spring/Spring-Dojo.js";
static final String CUSTOM_THEME_PATH_SET = "dojoCustomThemePathSet";
static final String CUSTOM_THEME_SET = "dojoCustomThemeSet";
}

View File

@@ -32,26 +32,23 @@ import org.springframework.faces.webflow.JsfUtils;
* @author Jeremy Grelle
*
*/
public class DojoDecorationRenderer extends BaseSpringJavascriptDecorationRenderer {
private String dojoJsResourceUri = "/dojo/dojo.js";
private String dijitThemePath = "/dijit/themes/";
private String dijitTheme = "tundra";
private String springDojoJsResourceUri = "/spring/Spring-Dojo.js";
public class DojoElementDecorationRenderer extends BaseSpringJavascriptDecorationRenderer {
public void encodeBegin(FacesContext context, UIComponent component) throws IOException {
super.encodeBegin(context, component);
if (!JsfUtils.isAsynchronousFlowRequest()) {
ResourceHelper.renderStyleLink(context, dijitThemePath + dijitTheme + "/" + dijitTheme + ".css");
ResourceHelper.renderScriptLink(context, dojoJsResourceUri);
if (!context.getViewRoot().getAttributes().containsKey(DojoConstants.CUSTOM_THEME_PATH_SET)
&& !context.getViewRoot().getAttributes().containsKey(DojoConstants.CUSTOM_THEME_SET)) {
ResourceHelper.renderStyleLink(context, DojoConstants.DIJIT_THEME_PATH
+ DojoConstants.DEFAULT_DIJIT_THEME + "/" + DojoConstants.DEFAULT_DIJIT_THEME + ".css");
}
ResourceHelper.renderScriptLink(context, springDojoJsResourceUri);
ResourceHelper.renderScriptLink(context, DojoConstants.DOJO_JS_RESOURCE_URI);
ResourceHelper.renderScriptLink(context, DojoConstants.SPRING_DOJO_JS_RESOURCE_URI);
}
}
@@ -59,26 +56,33 @@ public class DojoDecorationRenderer extends BaseSpringJavascriptDecorationRender
ResponseWriter writer = context.getResponseWriter();
if (component.getChildCount() == 0)
throw new FacesException("A Spring Faces advisor expects to have at least one child component.");
UIComponent advisedChild = (UIComponent) component.getChildren().get(0);
ResourceHelper.renderDojoInclude(context, ((DojoDecoration) component).getDojoComponentType());
String selector;
if (component.getAttributes().containsKey("selector")) {
selector = "\"" + (String) component.getAttributes().get("selector") + "\"";
} else {
if (component.getChildCount() == 0)
throw new FacesException(
"A Spring Faces elementDecoration expects either have a specified selector or at least one child component.");
selector = "dojo.byId('" + ((UIComponent) component.getChildren().get(0)).getClientId(context) + "')";
}
ResourceHelper.beginScriptBlock(context);
StringBuffer script = new StringBuffer();
script.append(" dojo.addOnLoad(function(){dojo.query(" + selector + ").forEach(function(element){");
script.append(" Spring.addDecoration(new Spring.ElementDecoration({ ");
script.append(" elementId : '" + advisedChild.getClientId(context) + "', ");
script.append(" widgetType : '" + ((DojoDecoration) component).getDojoComponentType() + "', ");
script.append(" elementId : element, ");
script.append(" widgetType : '" + component.getAttributes().get("widgetType") + "', ");
if (component.getAttributes().containsKey("widgetModule")) {
script.append(" widgetModule : '" + component.getAttributes().get("widgetModule") + "', ");
}
script.append(" widgetAttrs : { ");
String dojoAttrs = getDojoAttributesAsString(context, component);
script.append(dojoAttrs);
script.append(" }}));");
script.append(" }}));})});");
writer.writeText(script, null);
@@ -87,29 +91,10 @@ public class DojoDecorationRenderer extends BaseSpringJavascriptDecorationRender
protected String getDojoAttributesAsString(FacesContext context, UIComponent component) {
DojoDecoration advisor = (DojoDecoration) component;
StringBuffer attrs = new StringBuffer();
for (int i = 0; i < advisor.getDojoAttributes().length; i++) {
String key = advisor.getDojoAttributes()[i];
Object value = advisor.getAttributes().get(key);
if (value != null) {
if (attrs.length() > 0)
attrs.append(", ");
attrs.append(key + " : ");
if (value instanceof String) {
attrs.append("'" + value + "'");
} else {
attrs.append(value.toString());
}
}
if (component.getAttributes().containsKey("widgetAttrs")) {
return (String) component.getAttributes().get("widgetAttrs");
} else {
return "";
}
return attrs.toString();
}
}

View File

@@ -0,0 +1,30 @@
package org.springframework.faces.ui;
import java.io.IOException;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.render.Renderer;
import org.springframework.faces.ui.resource.ResourceHelper;
/**
* {@link Renderer} implementation that renders the JavaScript resources required by the Dojo versions of the Spring
* Faces components.
*
* @author Jeremy Grelle
*
*/
public class DojoScriptRenderer extends Renderer {
private static final String SPRING_JS_RESOURCE_URI = "/spring/Spring.js";
public void encodeBegin(FacesContext context, UIComponent component) throws IOException {
ResourceHelper.renderScriptLink(context, SPRING_JS_RESOURCE_URI);
ResourceHelper.renderScriptLink(context, DojoConstants.DOJO_JS_RESOURCE_URI);
ResourceHelper.renderScriptLink(context, DojoConstants.SPRING_DOJO_JS_RESOURCE_URI);
}
}

View File

@@ -31,12 +31,25 @@ import org.springframework.faces.ui.resource.ResourceHelper;
*/
public class DojoStyleRenderer extends Renderer {
private static final String dijitThemePath = "/dijit/themes/";
private static final String THEME_PATH_ATTR = "themePath";
private static final String dijitTheme = "tundra";
private static final String THEME_ATTR = "theme";
public void encodeBegin(FacesContext context, UIComponent component) throws IOException {
ResourceHelper.renderStyleLink(context, dijitThemePath + dijitTheme + "/" + dijitTheme + ".css");
String themePath = DojoConstants.DIJIT_THEME_PATH;
String theme = DojoConstants.DEFAULT_DIJIT_THEME;
if (component.getAttributes().containsKey(THEME_PATH_ATTR)) {
themePath = (String) component.getAttributes().get(THEME_PATH_ATTR);
context.getViewRoot().getAttributes().put(DojoConstants.CUSTOM_THEME_PATH_SET, Boolean.TRUE);
}
if (component.getAttributes().containsKey(THEME_ATTR)) {
theme = (String) component.getAttributes().get(THEME_ATTR);
context.getViewRoot().getAttributes().put(DojoConstants.CUSTOM_THEME_SET, Boolean.TRUE);
}
ResourceHelper.renderStyleLink(context, themePath + theme + "/" + theme + ".css");
}
}

View File

@@ -16,7 +16,6 @@
package org.springframework.faces.ui;
import javax.faces.component.UIComponent;
import javax.faces.component.UIComponentBase;
import javax.faces.context.FacesContext;
import javax.faces.el.ValueBinding;
@@ -27,7 +26,7 @@ import javax.faces.el.ValueBinding;
* @author Jeremy Grelle
*
*/
public abstract class DojoDecoration extends UIComponentBase {
public abstract class DojoWidget extends SpringJavascriptElementDecoration {
protected static final String[] DOJO_ATTRS = new String[] { "disabled", "intermediateChanges", "tabIndex",
"required", "promptMessage", "invalidMessage", "constraints", "regExp", "regExpGen", "propercase",
@@ -167,7 +166,7 @@ public abstract class DojoDecoration extends UIComponentBase {
protected abstract String[] getDojoAttributes();
public abstract String getDojoComponentType();
public abstract String getWidgetType();
public Object saveState(FacesContext context) {
Object[] values = new Object[11];
@@ -200,9 +199,4 @@ public abstract class DojoDecoration extends UIComponentBase {
this.propercase = (Boolean) values[10];
}
public String getFamily() {
return "spring.faces.Decoration";
}
}

View File

@@ -0,0 +1,35 @@
package org.springframework.faces.ui;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
public class DojoWidgetRenderer extends DojoElementDecorationRenderer {
protected String getDojoAttributesAsString(FacesContext context, UIComponent component) {
DojoWidget advisor = (DojoWidget) component;
StringBuffer attrs = new StringBuffer();
for (int i = 0; i < advisor.getDojoAttributes().length; i++) {
String key = advisor.getDojoAttributes()[i];
Object value = advisor.getAttributes().get(key);
if (value != null) {
if (attrs.length() > 0)
attrs.append(", ");
attrs.append(key + " : ");
if (value instanceof String) {
attrs.append("'" + value + "'");
} else {
attrs.append(value.toString());
}
}
}
return attrs.toString();
}
}

View File

@@ -0,0 +1,12 @@
package org.springframework.faces.ui;
import javax.faces.component.UIComponentBase;
public class SpringJavascriptElementDecoration extends UIComponentBase {
public String getFamily() {
return "spring.faces.Decoration";
}
}

View File

@@ -41,6 +41,11 @@
<component-type>spring.faces.DojoIncludeStyles</component-type>
<component-class>org.springframework.faces.ui.DynamicComponent</component-class>
</component>
<component>
<component-type>spring.faces.DojoIncludeScripts</component-type>
<component-class>org.springframework.faces.ui.DynamicComponent</component-class>
</component>
<component>
<component-type>spring.faces.ResourceGroup</component-type>
@@ -52,6 +57,11 @@
<component-class>org.springframework.faces.ui.DynamicComponent</component-class>
</component>
<component>
<component-type>spring.faces.DojoElementDecoration</component-type>
<component-class>org.springframework.faces.ui.SpringJavascriptElementDecoration</component-class>
</component>
<component>
<component-type>spring.faces.DojoClientTextValidator</component-type>
<component-class>org.springframework.faces.ui.DojoClientTextValidator</component-class>
@@ -105,8 +115,14 @@
<renderer>
<component-family>spring.faces.Decoration</component-family>
<renderer-type>spring.faces.DojoDecorationRenderer</renderer-type>
<renderer-class>org.springframework.faces.ui.DojoDecorationRenderer</renderer-class>
<renderer-type>spring.faces.DojoWidgetRenderer</renderer-type>
<renderer-class>org.springframework.faces.ui.DojoWidgetRenderer</renderer-class>
</renderer>
<renderer>
<component-family>spring.faces.Decoration</component-family>
<renderer-type>spring.faces.DojoElementDecorationRenderer</renderer-type>
<renderer-class>org.springframework.faces.ui.DojoElementDecorationRenderer</renderer-class>
</renderer>
<renderer>
@@ -121,6 +137,12 @@
<renderer-class>org.springframework.faces.ui.DojoStyleRenderer</renderer-class>
</renderer>
<renderer>
<component-family>spring.faces.DynamicComponent</component-family>
<renderer-type>spring.faces.DojoScriptRenderer</renderer-type>
<renderer-class>org.springframework.faces.ui.DojoScriptRenderer</renderer-class>
</renderer>
<renderer>
<component-family>spring.faces.DynamicComponent</component-family>
<renderer-type>spring.faces.ResourceGroupRenderer</renderer-type>

View File

@@ -11,6 +11,13 @@
<renderer-type>spring.faces.DojoStyleRenderer</renderer-type>
</component>
</tag>
<tag>
<tag-name>includeScripts</tag-name>
<component>
<component-type>spring.faces.DojoIncludeScripts</component-type>
<renderer-type>spring.faces.DojoScriptRenderer</renderer-type>
</component>
</tag>
<tag>
<tag-name>resourceGroup</tag-name>
<component>
@@ -46,11 +53,20 @@
<renderer-type>spring.faces.AjaxEventInterceptorRenderer</renderer-type>
</component>
</tag>
<tag>
<tag-name>elementDecoration</tag-name>
<component>
<component-type>spring.faces.DojoElementDecoration</component-type>
<renderer-type>spring.faces.DojoElementDecorationRenderer</renderer-type>
</component>
</tag>
<tag>
<tag-name>clientTextValidator</tag-name>
<component>
<component-type>spring.faces.DojoClientTextValidator</component-type>
<renderer-type>spring.faces.DojoDecorationRenderer</renderer-type>
<renderer-type>spring.faces.DojoWidgetRenderer</renderer-type>
</component>
</tag>
@@ -58,7 +74,7 @@
<tag-name>clientNumberValidator</tag-name>
<component>
<component-type>spring.faces.DojoClientNumberValidator</component-type>
<renderer-type>spring.faces.DojoDecorationRenderer</renderer-type>
<renderer-type>spring.faces.DojoWidgetRenderer</renderer-type>
</component>
</tag>
@@ -66,7 +82,7 @@
<tag-name>clientCurrencyValidator</tag-name>
<component>
<component-type>spring.faces.DojoClientCurrencyValidator</component-type>
<renderer-type>spring.faces.DojoDecorationRenderer</renderer-type>
<renderer-type>spring.faces.DojoWidgetRenderer</renderer-type>
</component>
</tag>
@@ -74,7 +90,7 @@
<tag-name>clientDateValidator</tag-name>
<component>
<component-type>spring.faces.DojoClientDateValidator</component-type>
<renderer-type>spring.faces.DojoDecorationRenderer</renderer-type>
<renderer-type>spring.faces.DojoWidgetRenderer</renderer-type>
</component>
</tag>