Author: andrei_exadel
Date: 2008-01-29 07:11:07 -0500 (Tue, 29 Jan 2008)
New Revision: 5694
Modified:
trunk/sandbox/ui/progressBAR/src/main/java/org/richfaces/component/UIProgressBar.java
trunk/sandbox/ui/progressBAR/src/main/java/org/richfaces/renderkit/AbstractProgressBarRenderer.java
trunk/sandbox/ui/progressBAR/src/main/resources/org/richfaces/renderkit/html/js/progressBar.js
Log:
refactoring
Modified:
trunk/sandbox/ui/progressBAR/src/main/java/org/richfaces/component/UIProgressBar.java
===================================================================
---
trunk/sandbox/ui/progressBAR/src/main/java/org/richfaces/component/UIProgressBar.java 2008-01-29
12:08:51 UTC (rev 5693)
+++
trunk/sandbox/ui/progressBAR/src/main/java/org/richfaces/component/UIProgressBar.java 2008-01-29
12:11:07 UTC (rev 5694)
@@ -6,7 +6,24 @@
package org.richfaces.component;
+import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import javax.faces.context.FacesContext;
+import javax.faces.event.AbortProcessingException;
+import javax.faces.event.FacesEvent;
+import javax.servlet.http.HttpServletRequest;
+
import org.ajax4jsf.component.UIPoll;
+import org.ajax4jsf.context.AjaxContext;
+import org.ajax4jsf.context.AjaxContextImpl;
+import org.ajax4jsf.event.AjaxEvent;
+import org.ajax4jsf.javascript.JSLiteral;
+import org.ajax4jsf.renderkit.AjaxRendererUtils;
+import org.richfaces.renderkit.AbstractProgressBarRenderer;
/**
* TODO Class description goes here.
@@ -15,12 +32,161 @@
*
*/
-//TODO add @since declaration
+// TODO add @since declaration
public abstract class UIProgressBar extends UIPoll {
public static final String COMPONENT_TYPE = "org.richfaces.ProgressBar";
public static final String COMPONENT_FAMILY = "org.richfaces.ProgressBar";
-
- //TODO value can be any number, e.g. big decimal
+
+ /** Request parameter name containing component state to render */
+ private static final String FORCE_STATE_PARAM = "forceState";
+
+ public void broadcast(FacesEvent event) throws AbortProcessingException {
+ // TODO Auto-generated method stub
+ if (event instanceof AjaxEvent) {
+ FacesContext facesContext = FacesContext.getCurrentInstance();
+ AjaxContext ajaxContext = AjaxContextImpl
+ .getCurrentInstance(facesContext);
+
+ HttpServletRequest request = (HttpServletRequest) facesContext
+ .getExternalContext().getRequest();
+
+ Number percent = getNumber(this.getAttributes().get("value"));
+ Number maxValue = getNumber(this.getAttributes().get("maxValue"));
+ Map params = request.getParameterMap();
+ if (params.containsKey(FORCE_STATE_PARAM)) {
+ ajaxContext.addComponentToAjaxRender(this);
+ String[] str = (String[]) params.get(FORCE_STATE_PARAM);
+ for (String s : str) {
+ this.getAttributes().put(FORCE_STATE_PARAM, s);
+ }
+ } else if (percent.doubleValue() < maxValue.doubleValue()
+ && params.containsKey("percent")) {
+ ajaxContext.removeRenderedArea(this.getClientId(facesContext));
+ ajaxContext.setResponseData(getResponseData(percent,
+ facesContext));
+ Object rerenderAfterComplete = this.getAttributes().get(
+ "reRender");
+ Set ajaxRegions = AjaxRendererUtils
+ .asSet(rerenderAfterComplete);
+
+ if (ajaxRegions != null) {
+ for (Iterator iter = ajaxRegions.iterator(); iter.hasNext();) {
+ String id = iter.next().toString();
+ ajaxContext.addComponentToAjaxRender(this, id);
+ }
+ }
+ } else {
+ ajaxContext.addComponentToAjaxRender(this);
+ }
+
+ }
+ }
+
+ /**
+ * Returns ajax response data
+ *
+ * @param uiComponent
+ * @param percent
+ * @return
+ */
+ private Map<Object, Object> getResponseData(Number percent,
+ FacesContext facesContext) {
+
+ AbstractProgressBarRenderer renderer = (AbstractProgressBarRenderer) this
+ .getRenderer(facesContext);
+
+ Map<Object, Object> map = new HashMap<Object, Object>();
+ map.put("percent", percent);
+ map.put("interval", this.getInterval());
+
+ if (this.getAttributes().get("style") != null) {
+ map.put("style", this.getAttributes().get("style"));
+ }
+
+ boolean enabled = (Boolean) this.getAttributes().get("enabled");
+ map.put("enabled", Boolean.toString(enabled));
+
+ map.put("markup", getMarkup(facesContext, renderer));
+
+ map.put("context", getContext(renderer, percent));
+
+ addStyles2Responce(map, "completeClass", this.getAttributes().get(
+ "completeClass"));
+ addStyles2Responce(map, "remainClass", this.getAttributes().get(
+ "remainClass"));
+ addStyles2Responce(map, "styleClass", this.getAttributes().get(
+ "styleClass"));
+ return map;
+
+ }
+
+ private Map<String, Object> getContext(
+ AbstractProgressBarRenderer renderer, Number percent) {
+ Map<String, Object> context = renderer.getParametersMap(this);
+ if (context == null) {
+ context = new HashMap<String, Object>();
+ }
+ context.put("value", percent.toString());
+ context.put("maxValue", this.getAttributes().get("maxValue"));
+ context.put("minValue", this.getAttributes().get("minValue"));
+ return context;
+ }
+
+ private JSLiteral getMarkup(FacesContext context,
+ AbstractProgressBarRenderer renderer) {
+ JSLiteral literal = null;
+ try {
+ literal = new JSLiteral(renderer.getMarkup(context, this)
+ .toString());
+ } catch (Exception e) {
+
+ }
+ return literal;
+ }
+
+ /**
+ * Add component classes to ajax response
+ *
+ * @param buffer
+ * @param attr
+ * @param newValue
+ */
+ private void addStyles2Responce(Map<Object, Object> map, String key,
+ Object className) {
+ if (className != null) {
+ map.put(key, className);
+ }
+ }
+
+ /**
+ * Converts value attr to number value
+ *
+ * @param v -
+ * value attr
+ * @return result
+ */
+ public Number getNumber(Object v) {
+ Number result = new Integer(0);
+ if (v != null) {
+ try {
+ if (v instanceof String) {
+ result = Double.parseDouble((String) v);
+ } else {
+ Number n = (Number) v;
+ if (n instanceof BigDecimal || n instanceof Double
+ || n instanceof Float) {
+ result = n.floatValue();
+ } else if (n instanceof Integer) {
+ result = n.intValue();
+ }
+ }
+ } catch (Exception e) {
+ // TODO: handle exception
+ }
+ }
+ return result;
+ }
+
}
Modified:
trunk/sandbox/ui/progressBAR/src/main/java/org/richfaces/renderkit/AbstractProgressBarRenderer.java
===================================================================
---
trunk/sandbox/ui/progressBAR/src/main/java/org/richfaces/renderkit/AbstractProgressBarRenderer.java 2008-01-29
12:08:51 UTC (rev 5693)
+++
trunk/sandbox/ui/progressBAR/src/main/java/org/richfaces/renderkit/AbstractProgressBarRenderer.java 2008-01-29
12:11:07 UTC (rev 5694)
@@ -15,13 +15,15 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import javax.faces.FactoryFinder;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
-import javax.servlet.http.HttpServletRequest;
+import javax.faces.render.RenderKit;
+import javax.faces.render.RenderKitFactory;
import org.ajax4jsf.context.AjaxContext;
-import org.ajax4jsf.context.AjaxContextImpl;
+import org.ajax4jsf.event.AjaxEvent;
import org.ajax4jsf.javascript.JSFunction;
import org.ajax4jsf.javascript.JSFunctionDefinition;
import org.ajax4jsf.javascript.JSReference;
@@ -30,6 +32,7 @@
import org.ajax4jsf.renderkit.ComponentVariables;
import org.ajax4jsf.renderkit.ComponentsVariableResolver;
import org.ajax4jsf.renderkit.RendererUtils.HTML;
+import org.ajax4jsf.resource.CountingOutputWriter;
import org.richfaces.component.UIProgressBar;
/**
@@ -61,47 +64,12 @@
*/
@Override
protected void doDecode(FacesContext facesContext, UIComponent uiComponent) {
- AjaxContext ajaxContext = AjaxContextImpl
- .getCurrentInstance(facesContext);
-
- if (!ajaxContext.isAjaxRequest()) {
- return;
- }
-
- HttpServletRequest request = (HttpServletRequest) facesContext
- .getExternalContext().getRequest();
-
- Number percent = getNumber(uiComponent.getAttributes().get("value"));
- Number maxValue = getNumber(uiComponent.getAttributes().get("maxValue"));
- Map params = request.getParameterMap();
- if (params.containsKey(FORCE_STATE_PARAM)) {
- ajaxContext.addComponentToAjaxRender(uiComponent);
- String[] str = (String[]) params.get(FORCE_STATE_PARAM);
- for (String s : str) {
- uiComponent.getAttributes().put(FORCE_STATE_PARAM, s);
- }
- } else if (percent.doubleValue() < maxValue.doubleValue()
- && params.containsKey("percent")) {
- ajaxContext.removeRenderedArea(uiComponent
- .getClientId(facesContext));
- ajaxContext.setResponseData(getResponseData(uiComponent, percent));
- Object rerenderAfterComplete = uiComponent.getAttributes().get(
- "reRender");
- Set ajaxRegions = AjaxRendererUtils.asSet(rerenderAfterComplete);
-
- if (ajaxRegions != null) {
- for (Iterator iter = ajaxRegions.iterator(); iter.hasNext();) {
- String id = iter.next().toString();
- ajaxContext.addComponentToAjaxRender(uiComponent, id);
- }
- }
- } else {
- ajaxContext.addComponentToAjaxRender(uiComponent);
- }
+ new AjaxEvent(uiComponent).queue();
}
/**
* Render progress state forced from javascript
+ *
* @param state
* @param context
* @param component
@@ -121,6 +89,7 @@
/**
* Gets state forced from javascript
+ *
* @param component
* @return
*/
@@ -131,72 +100,46 @@
return null;
}
+
/**
- * Returns ajax response data
- * @param uiComponent
- * @param percent
+ * Renderes label markup
+ * @param context
+ * @param component
* @return
*/
- private String getResponseData(UIComponent uiComponent, Number percent) {
- UIProgressBar progressBar = (UIProgressBar) uiComponent;
- StringBuffer buffer = new StringBuffer();
- buffer.append("percent:");
- buffer.append(percent);
- buffer.append(",");
+ public StringBuffer getMarkup(FacesContext context, UIComponent component) {
+ StringBuffer result = null;
+ CountingOutputWriter customWriter = new CountingOutputWriter();
+ ResponseWriter writer = context.getResponseWriter();
+ try {
- buffer.append("interval:");
- buffer.append(progressBar.getInterval());
- buffer.append(",");
-
- if (progressBar.getAttributes().get("style") != null) {
- buffer.append("style:");
- buffer.append(progressBar.getAttributes().get("style"));
- buffer.append(",");
+ String defaultRenderKitId = context.getApplication()
+ .getDefaultRenderKitId();
+ if (null == defaultRenderKitId) {
+ defaultRenderKitId = RenderKitFactory.HTML_BASIC_RENDER_KIT;
+ }
+ RenderKitFactory renderKitFactory = (RenderKitFactory) FactoryFinder
+ .getFactory(FactoryFinder.RENDER_KIT_FACTORY);
+ RenderKit renderKit = renderKitFactory.getRenderKit(context,
+ defaultRenderKitId);
+
+ ResponseWriter responseWriter = renderKit.createResponseWriter(
+ customWriter, null, "UTF-8");
+ context.setResponseWriter(responseWriter);
+ writeScriptBody(context, component, true);
+ result = customWriter.getContent();
+ if (writer != null) {
+ context.setResponseWriter(writer);
+ }
+ } catch (Exception e) {
+ e.getMessage();
}
- boolean enabled = (Boolean) uiComponent.getAttributes().get("enabled");
- buffer.append("enabled:");
- buffer.append(Boolean.toString(enabled));
- buffer.append(",");
+ return result;
- addStyles2Responce(buffer, "completeClass", (String) uiComponent
- .getAttributes().get("completeClass"));
- addStyles2Responce(buffer, "remainClass", (String) uiComponent
- .getAttributes().get("remainClass"));
- addStyles2Responce(buffer, "styleClass", (String) uiComponent
- .getAttributes().get("styleClass"));
- return buffer.toString();
-
}
/**
- * Add component classes to ajax response
- *
- * @param buffer
- * @param attr
- * @param newValue
- */
- private void addStyles2Responce(StringBuffer buffer, String attr,
- String newValue) {
- if (newValue != null) {
- buffer.append(attr);
- buffer.append(":");
- buffer.append(newValue);
- buffer.append(",");
- }
- }
-
- /**
- * Return poll function name
- *
- * @param component
- * @return
- */
- public String getVarName(UIComponent component) {
- return String.valueOf(Math.abs(component.hashCode()));
- }
-
- /**
* Methods encodes AJAX script for polling
*
* @param context -
@@ -249,8 +192,10 @@
StringBuffer script = new StringBuffer();
writer.startElement(HTML.SPAN_ELEM, component);
writer.startElement(HTML.SCRIPT_ELEM, component);
- script.append("new ProgressBar('" + component.getClientId(context)
- + "').renderLabel();\n");
+ script.append(
+ "new ProgressBar('" + component.getClientId(context)
+ + "').renderLabel(").append(
+ getMarkup(context, component)).append(",null);\n");
writer.append(script.toString());
writer.endElement(HTML.SCRIPT_ELEM);
writer.endElement(HTML.SPAN_ELEM);
@@ -268,7 +213,7 @@
throws IOException {
ResponseWriter writer = context.getResponseWriter();
UIProgressBar progressBar = (UIProgressBar) component;
- AjaxContext ajaxContext = AjaxContextImpl.getCurrentInstance(context);
+
writer.startElement(HTML.SPAN_ELEM, component);
writer.startElement(HTML.SCRIPT_ELEM, component);
@@ -286,23 +231,20 @@
.append("','").append(containerId).append("','").append(formId)
.append("','").append(mode).append("',").append(minValue)
.append(",").append(maxValue).append(",");
- writer.write(script.toString());
- writeScriptBody(context, component, true);
- script = new StringBuffer();
- script.append(",");
script.append(ScriptUtils.toScript(getParametersMap(component)));
script.append(",");
script.append(ScriptUtils.toScript(buildAjaxOptions(clientId,
progressBar, context)));
- String progressVar = (String)component.getAttributes().get("progressVar");
+ String progressVar = (String) component.getAttributes().get(
+ "progressVar");
if (progressVar != null) {
script.append(",'");
script.append(progressVar);
script.append("'");
- }else {
+ } else {
script.append(",null");
}
-
+
script.append(");\n");
writer.write(script.toString());
@@ -360,13 +302,6 @@
functionDefinition.addParameter("event");
functionDefinition.addParameter("data");
StringBuffer body = new StringBuffer();
- ComponentVariables variables = ComponentsVariableResolver.getVariables(
- this, component);
- UIComponent nestingContainer = (UIComponent) AjaxRendererUtils
- .findAjaxContainer(context, component);
- UIComponent form = (UIComponent) AjaxRendererUtils
- .getNestingForm(component);
- String content = (String) variables.getVariable("content");
body.append("new ProgressBar('" + clientId +
"').onComplete(data);");
functionDefinition.addToBody(body.toString());
@@ -496,11 +431,11 @@
* @param component
* @return
*/
- private Map<String, String> getParametersMap(UIComponent component) {
+ public Map<String, Object> getParametersMap(UIComponent component) {
String parameters = (String) component.getAttributes()
.get("parameters");
if (parameters != null) {
- Map<String, String> map = new HashMap<String, String>();
+ Map<String, Object> map = new HashMap<String, Object>();
String[] strs = parameters.split(SPLIT_EXPRS);
if (strs != null) {
for (String str : strs) {
Modified:
trunk/sandbox/ui/progressBAR/src/main/resources/org/richfaces/renderkit/html/js/progressBar.js
===================================================================
---
trunk/sandbox/ui/progressBAR/src/main/resources/org/richfaces/renderkit/html/js/progressBar.js 2008-01-29
12:08:51 UTC (rev 5693)
+++
trunk/sandbox/ui/progressBAR/src/main/resources/org/richfaces/renderkit/html/js/progressBar.js 2008-01-29
12:11:07 UTC (rev 5694)
@@ -8,14 +8,13 @@
this.id = id;
}
},
- init: function (id, containerId, formId, mode, minValue, maxValue, label , context,
options, progressVar) {
+ init: function (id, containerId, formId, mode, minValue, maxValue, context, options,
progressVar) {
ProgressBar.Pollers[id] = {};
ProgressBar.Pollers[id]['containerId'] = containerId;
ProgressBar.Pollers[id]['formId'] = formId;
ProgressBar.Pollers[id]['mode'] = mode;
ProgressBar.Pollers[id]['minValue'] = minValue;
ProgressBar.Pollers[id]['maxValue'] = maxValue;
- ProgressBar.Pollers[id]['label'] = label;
ProgressBar.Pollers[id]['context'] = context;
ProgressBar.Pollers[id]['options'] = options;
ProgressBar.Pollers[id]['progressVar'] = progressVar;
@@ -32,9 +31,8 @@
},
onComplete: function (data) {
if (data) {
- this.parseResponse(data);
- this.setValue(this.value);
- this.renderLabel();
+ this.updateComponent(data);
+ this.renderLabel(data['markup'], data['context']);
this.poll();
}
@@ -50,42 +48,30 @@
}
return placeholders;
},
- parseResponse: function (data) {
- var params = data.split(",");
- for (var i = 0; i < params.length; i++) {
- var param = params[i];
- if (param) {
- var t = param.split(":");
- if (t)
- if (t.length == 2) {
- var k = t[0];
- var v = t[1];
- this.updateComponent(k,v);
- }
- }
- }
- },
- updateComponent: function (k,v) {
- switch (k) {
- case "style" : this.updateStyle(v); break;
- case "percent" : this.value = v; break;
- case "enabled" : if (v == "false") { this.disable(); }; break;
- case "completeClass" : this.updateClassName($(this.id +
":complete"), v, "rich-progress-bar-base"); break;
- case "remainClass" : this.updateClassName($(this.id + ":remain"),
v, "rich-progress-bar-base"); break;
- case "styleClass" : this.updateClassName($(this.id), v,
"rich-progress-bar"); break;
- case "interval" : if
(ProgressBar.Pollers[this.id]['options']['pollinterval'] != v)
ProgressBar.Pollers[this.id]['options']['pollinterval'] = v; break;
+ updateComponent: function (data) {
+ this.updateStyle(data['style']);
+ this.setValue(data['percent']);
+ if (!data['enabled']) { this.disable(); }
+ this.updateClassName($(this.id + ":complete"), data['completeClass'],
"rich-progress-bar-base");
+ this.updateClassName($(this.id + ":remain"), data['remainClass'],
"rich-progress-bar-base");
+ this.updateClassName($(this.id), data['styleClass'],
"rich-progress-bar-base");
+
+ if (ProgressBar.Pollers[this.id]['options']['pollinterval'] !=
data['interval']) {
+ ProgressBar.Pollers[this.id]['options']['pollinterval'] =
data['interval'];
}
},
updateStyle: function (style) {
+ if (!style) { return; }
var d = $(this.id);
- if (d.style != style) {
- d.style = style;
+ if (d.style)
+ if (d.style.cssText != style) {
+ d.style.cssText = style;
d = $(this.id + ":remain");
- if (d) d.style = style;
+ if (d) d.style.cssText = style;
d = $(this.id + ":complete");
- if (d) d.style = style;
+ if (d) d.style.cssText = style;
d = $(this.id + ":upload");
- if (d) d.style = style;
+ if (d) d.style.cssText = style;
}
},
updateClassName: function (o, newName, defaultClass) {
@@ -106,9 +92,10 @@
}
return context;
},
- renderLabel: function () {
- var context = this.getContext();
- var markup = ProgressBar.Pollers[this.id]['label'];
+ renderLabel: function (markup, context) {
+ if (!context) {
+ context = this.getContext();
+ }
var html = markup.invoke('getContent', context).join('');
$(this.id + ":remain").innerHTML = $(this.id +
":complete").innerHTML = html;
},
@@ -138,12 +125,12 @@
return (this.getMode() == "ajax");
},
setValue: function (val) {
+ val = "" + val;
var p = val;
if (val != null) {
if (val.indexOf("%") < 0)
val = val + "%";
}
-
if ( parseFloat(p) < parseFloat(this.getMinValue())) {
if (!this.isAjaxMode()) {
this.forceState("initial",null);