Author: abelevich
Date: 2009-11-24 11:36:33 -0500 (Tue, 24 Nov 2009)
New Revision: 15987
Modified:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/UISubTable.java
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/event/ToggleEvent.java
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/event/ToggleListener.java
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/DataTableRenderer.java
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/ToggleControlRendererBase.java
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/taglib/SubTableHandler.java
root/ui-sandbox/trunk/components/tables/ui/src/main/resources/META-INF/resources/toggler.js
root/ui-sandbox/trunk/components/tables/ui/src/main/resources/META-INF/tables.taglib.xml
root/ui-sandbox/trunk/components/tables/ui/src/main/templates/org/richfaces/renderkit/html/toggle-control.template.xml
Log:
expand subTables functionality
Modified:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/UISubTable.java
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/UISubTable.java 2009-11-24
15:31:22 UTC (rev 15986)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/UISubTable.java 2009-11-24
16:36:33 UTC (rev 15987)
@@ -24,13 +24,16 @@
import java.util.Iterator;
import javax.el.MethodExpression;
+import javax.faces.component.StateHelper;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.FacesEvent;
import javax.faces.event.PhaseId;
+import org.ajax4jsf.model.DataComponentState;
import org.ajax4jsf.model.DataVisitor;
+import org.richfaces.component.state.SubTableState;
import org.richfaces.event.ToggleEvent;
import org.richfaces.event.ToggleListener;
@@ -39,7 +42,7 @@
* JSF component class
*
*/
-public abstract class UISubTable extends UIDataTableBase implements Row, Column,
Expandable{
+public abstract class UISubTable extends UIDataTableBase implements Row, Column,
Expandable {
public static final String COMPONENT_TYPE = "org.richfaces.SubTable";
@@ -50,13 +53,52 @@
public static final String SWITCH_TYPE_CLIENT = "client";
public static final String SWITCH_TYPE_AJAX = "ajax";
+
+ private boolean expanded = Boolean.TRUE;
enum PropertyKeys {
- switchType, expanded, toggleExpression
+ switchType, expanded, toggleExpression, childState
}
-
+
@Override
+ protected DataComponentState createComponentState() {
+ return new SubTableState() {
+
+ @Override
+ public int getFirst() {
+ return UISubTable.this.getFirst();
+ }
+
+ @Override
+ public int getRows() {
+ return UISubTable.this.getRows();
+ }
+ };
+ }
+
+/*
+ @Override
+ public Object getIterationState() {
+ StateHelper stateHelper = getStateHelper();
+ return new Object[] {stateHelper.get(PropertyKeys.childState), this.expanded};
+ }
+
+ @Override
+ public void setIterationState(Object stateObject) {
+ StateHelper stateHelper = getStateHelper();
+
+ if (stateObject != null) {
+ Object[] state = (Object[]) stateObject;
+ stateHelper.put(PropertyKeys.childState, state[0]);
+ this.expanded = (Boolean) state[1];
+ } else {
+ stateHelper.remove(PropertyKeys.childState);
+ this.expanded = Boolean.TRUE;
+ }
+ } */
+
+ @Override
public Iterator<UIComponent> fixedChildren() {
return new SubtableFixedChildrenIterator(this);
}
@@ -93,10 +135,12 @@
}
public void setExpanded(boolean expanded) {
+// ((SubTableState)getComponentState()).setExpanded(expanded);
getStateHelper().put(PropertyKeys.expanded, expanded);
}
public boolean isExpanded() {
+// return ((SubTableState)getComponentState()).isExpanded();
return (Boolean) getStateHelper().eval(PropertyKeys.expanded, Boolean.TRUE);
}
@@ -126,7 +170,10 @@
MethodExpression expression = getToggleListener();
if(expression != null) {
expression.invoke(getFacesContext().getELContext(), new Object[]{toggleEvent});
- }
+ }
+ //???
+// ((SubTableState)getComponentState()).setExpanded(toggleEvent.isExpanded());
+// getStateHelper().put(PropertyKeys.expanded, toggleEvent.isExpanded());
}
}
Modified:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/event/ToggleEvent.java
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/event/ToggleEvent.java 2009-11-24
15:31:22 UTC (rev 15986)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/event/ToggleEvent.java 2009-11-24
16:36:33 UTC (rev 15987)
@@ -4,20 +4,24 @@
import javax.faces.event.FacesEvent;
import javax.faces.event.FacesListener;
+/**
+ * @author Anton Belevich
+ *
+ */
public class ToggleEvent extends FacesEvent {
private static final long serialVersionUID = 2916560585918250885L;
- private String state;
+ private boolean expanded;
- public ToggleEvent(UIComponent target, String state) {
+ public ToggleEvent(UIComponent target, boolean expanded) {
super(target);
- this.state = state;
+ this.expanded = expanded;
}
- public String getState() {
- return this.state;
+ public boolean isExpanded() {
+ return this.expanded;
}
@Override
Modified:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/event/ToggleListener.java
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/event/ToggleListener.java 2009-11-24
15:31:22 UTC (rev 15986)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/event/ToggleListener.java 2009-11-24
16:36:33 UTC (rev 15987)
@@ -2,6 +2,10 @@
import javax.faces.event.FacesListener;
+/**
+ * @author Anton Belevich
+ *
+ */
public interface ToggleListener extends FacesListener {
public void processToggle(ToggleEvent event);
Modified:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/DataTableRenderer.java
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/DataTableRenderer.java 2009-11-24
15:31:22 UTC (rev 15986)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/DataTableRenderer.java 2009-11-24
16:36:33 UTC (rev 15987)
@@ -298,6 +298,16 @@
public void encodeTableBodyStart(ResponseWriter writer, FacesContext context,
UIDataTableBase component) throws IOException {
writer.startElement(HTML.TBOBY_ELEMENT, component);
getUtils().encodeId(context, component);
+
+ String predefinedStyles = null;
+ if(component instanceof UISubTable) {
+ UISubTable subTable = (UISubTable)component;
+ if(!subTable.isExpanded()) {
+ predefinedStyles = "display: none;";
+ }
+ }
+
+ encodeStyle(writer, context, component, predefinedStyles);
}
public void encodeTableEnd(ResponseWriter writer, FacesContext context, UIDataTableBase
component) throws IOException {
@@ -536,7 +546,7 @@
protected void encodeStyleClass(ResponseWriter writer, FacesContext context,
UIComponent component , String styleClassAttribute, String styleClass) throws IOException
{
- boolean isEmpty = isEmpty(component, styleClassAttribute);
+ boolean isEmpty = isEmptyAttr(component, styleClassAttribute);
if( isEmpty && !(styleClass != null && styleClass.trim().length() !=
0)) {
return;
}
@@ -545,7 +555,7 @@
writer.writeAttribute(HTML.CLASS_ATTRIBUTE, componentStyleClass, null);
}
- protected boolean isEmpty(UIComponent component, String attribute) {
+ protected boolean isEmptyAttr(UIComponent component, String attribute) {
if(attribute == null) {
return true;
}
@@ -553,14 +563,26 @@
return !(value != null && value.trim().length()!=0);
}
- protected void encodeStyle(ResponseWriter writer, FacesContext context, UIComponent
component) throws IOException {
- String style = (String)component.getAttributes().get(HTML.STYLE_ATTRIBUTE);
- if(!isEmptyStyle(style)) {
- writer.writeAttribute(HTML.STYLE_ATTRIBUTE, style, null);
+ protected void encodeStyle(ResponseWriter writer, FacesContext context, UIComponent
component, String predefinedStyles) throws IOException {
+ StringBuffer toEncode = new StringBuffer();
+
+ if(!isEmptyAttr(component, HTML.STYLE_ATTRIBUTE)) {
+ String style = ((String)component.getAttributes().get(HTML.STYLE_ATTRIBUTE)).trim();
+ style = style.endsWith(";") ? style : style + ";";
+ toEncode.append(style);
}
+
+ if(!isEmpty(predefinedStyles)) {
+ String style = predefinedStyles.endsWith(";") ? predefinedStyles :
predefinedStyles + ";";
+ toEncode.append(style);
+ }
+
+ if(toEncode.length() > 0) {
+ writer.writeAttribute(HTML.STYLE_ATTRIBUTE, toEncode.toString(), null);
+ }
}
- protected boolean isEmptyStyle(String style) {
+ protected boolean isEmpty(String style) {
return !((style != null) && (style.trim().length()!=0));
}
Modified:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/ToggleControlRendererBase.java
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/ToggleControlRendererBase.java 2009-11-24
15:31:22 UTC (rev 15986)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/ToggleControlRendererBase.java 2009-11-24
16:36:33 UTC (rev 15987)
@@ -2,14 +2,17 @@
import java.io.IOException;
import java.text.MessageFormat;
+import java.util.HashMap;
import java.util.Map;
import javax.faces.application.ResourceDependencies;
import javax.faces.application.ResourceDependency;
import javax.faces.component.UIComponent;
+import javax.faces.component.UIForm;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
+import org.ajax4jsf.javascript.ScriptUtils;
import org.ajax4jsf.renderkit.RendererBase;
import org.ajax4jsf.renderkit.RendererUtils.HTML;
import org.richfaces.component.Expandable;
@@ -17,12 +20,16 @@
import org.richfaces.component.UIToggleControl;
import org.richfaces.event.ToggleEvent;
+/**
+ * @author Anton Belevich
+ *
+ */
@ResourceDependencies({
@ResourceDependency(name = "toggler.js")
})
public abstract class ToggleControlRendererBase extends RendererBase {
- private static final String MANAGER_SCRIPT = "<script
type=\"text/javascript\">ToggleManager.add(new Toggle(\"{0}\",
\"{1}\", \"{2}\"));</script>";
+ private static final String MANAGER_SCRIPT = "<script
type=\"text/javascript\">ToggleManager.add(new Toggle(\"{0}\",
{1}));</script>";
private static final String CLIENT_TOGGLE_SCRIPT =
"ToggleManager.clientToggle(''{0}'',
''{1}'');";
@@ -48,7 +55,7 @@
Map<String, String> params =
context.getExternalContext().getRequestParameterMap();
- String hiddenId = toggle.getClientId() + HIDDEN;
+ String hiddenId = toggle.getClientId();
String state = params.get(hiddenId);
if(state != null && state.trim().length()> 0) {
@@ -58,11 +65,9 @@
String prevState = getState(((Expandable)processed).isExpanded());
if(!state.equals(prevState)) {
- new ToggleEvent(processed, state).queue();
+ new ToggleEvent(processed, isExpanded(state)).queue();
}
-
}
-
}
}
@@ -76,17 +81,17 @@
ResponseWriter writer = context.getResponseWriter();
String toggleId = toggleControl.getClientId(context);
- String subTableId = subTable.getClientId(context);
- boolean expanded = subTable.isExpanded();
- String initialState = getState(expanded);
+ String options = encodeOptions(context, toggleControl, subTable);
- String registerScript = MessageFormat.format(MANAGER_SCRIPT, toggleId, subTableId,
initialState);
+ String registerScript = MessageFormat.format(MANAGER_SCRIPT, toggleId, options);
writer.write(registerScript);
String switchType = subTable.getSwichType();
+ boolean expanded = subTable.isExpanded();
+
encodeControl(context, writer, toggleControl, switchType, expanded, false);
encodeControl(context, writer, toggleControl, switchType, !expanded, true);
- encodeHiddenInput(context, writer, toggleControl);
+ // encodeHiddenInput(context, writer, toggleControl);
}
}
@@ -127,6 +132,22 @@
writer.endElement(HTML.SPAN_ELEM);
}
+ public String encodeOptions(FacesContext context, UIToggleControl toggleControl,
UISubTable subTable) {
+
+ UIForm nestingForm = getUtils().getNestingForm(context, toggleControl);
+
+ String formId = nestingForm.getClientId(context);
+ String forId = subTable.getClientId(context);
+ String state = getState(subTable.isExpanded());
+
+ HashMap<String, String> options = new HashMap<String, String>();
+ options.put("formId", formId);
+ options.put("forId", forId);
+ options.put("initialState", state);
+
+ return ScriptUtils.toScript(options);
+ }
+
public void encodeHiddenInput(FacesContext context, ResponseWriter writer, UIComponent
component) throws IOException {
String hiddenId = component.getClientId(context) +HIDDEN;
@@ -136,7 +157,7 @@
writer.writeAttribute(HTML.NAME_ATTRIBUTE, hiddenId, null);
writer.writeAttribute(HTML.TYPE_ATTR,"hidden", null);
writer.endElement(HTML.INPUT_ELEM);
-
+
}
public String getStyleClass(FacesContext context, UIToggleControl control) {
@@ -182,4 +203,8 @@
return expand ? EXPAND_STATE: COLLAPSE_STATE;
}
+ protected boolean isExpanded(String state) {
+ return state.equals(EXPAND_STATE);
+ }
+
}
Modified:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/taglib/SubTableHandler.java
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/taglib/SubTableHandler.java 2009-11-24
15:31:22 UTC (rev 15986)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/taglib/SubTableHandler.java 2009-11-24
16:36:33 UTC (rev 15987)
@@ -12,6 +12,10 @@
import org.richfaces.component.UISubTable;
+/**
+ * @author Anton Belevich
+ *
+ */
public class SubTableHandler extends ComponentHandler{
private static final SubTableHandlerMetaRule metaRule = new SubTableHandlerMetaRule();
Modified:
root/ui-sandbox/trunk/components/tables/ui/src/main/resources/META-INF/resources/toggler.js
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/resources/META-INF/resources/toggler.js 2009-11-24
15:31:22 UTC (rev 15986)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/resources/META-INF/resources/toggler.js 2009-11-24
16:36:33 UTC (rev 15987)
@@ -1,7 +1,8 @@
-function Toggle(id, forId, initialState){
+function Toggle(id, options){
this.id = id;
- this.forId = forId;
- this.state = initialState;
+ this.forId = options.forId;
+ this.state = options.initialState;
+ this.formId = options.formId;
this.hidden = id + ":hidden";
}
@@ -9,61 +10,66 @@
return id.replace(/:/g, "\\:");
}
-Toggle.prototype.clientToggle= function(toState){
- var elements = this.getElement(this.forId);
-
- if(this.state != toState) {
+Toggle.prototype.toggle = function(toState) {
+ var elements = this.getElement(this.forId);
+
+ if(this.state != toState) {
- var hideId = this.id + ":" + toState;
- var showId = this.id + ":" + this.state;
+ var hideId = this.id + ":" + toState;
+ var showId = this.id + ":" + this.state;
- var hideControl = this.getElement(hideId);
- var showControl = this.getElement(showId);
-
- this.command("show", showControl);
- this.command("hide", hideControl);
-
- if(toState == 'collapse') {
- this.command("hide", elements);
- } else {
- this.command("show", elements);
- }
- this.state = toState;
- this.saveState(this.state);
- }
+ var hideControl = this.getElement(hideId);
+ var showControl = this.getElement(showId);
+
+ this.command("show", showControl);
+ this.command("hide", hideControl);
+
+ if(toState == 'collapse') {
+ this.command("hide", elements);
+ } else {
+ this.command("show", elements);
+ }
+ this.state = toState;
+ // this.saveState(this.state);
+ }
}
Toggle.prototype.saveState= function(state) {
- var id = this.hidden;
+ /*var id = this.hidden;
var element = this.getElement(id);
if(element) {
- element[0].attr('value', state);
- }
+ element.attr('value', state);
+ }*/
}
+Toggle.prototype.clientToggle= function(toState){
+ this.toggle(toState);
+}
+
Toggle.prototype.serverToggle = function(toState) {
+ if(mojarra && mojarra.jsfcljs) {
+ var form = this.getElement(this.formId);
+ var prv = {};
+ if(this.id) {
+ prv[this.id] = toState;
+ mojarra.jsfcljs(form[0],prv,'');
+ }
+ }
}
Toggle.prototype.ajaxToggle = function(toState) {
}
-Toggle.prototype.command = function(name, elements){
+Toggle.prototype.command = function(name, element){
if(name) {
- for(var i in elements) {
- var element = elements[i];
- if(element && typeof element[name] == 'function') {
+ if(element && typeof element[name] == 'function') {
element[name]();
- }
- }
- }
+ }
+ }
}
-Toggle.prototype.getElement = function() {
- var elements = new Array();
- for(var i = 0; i < arguments.length; i++) {
- elements[i] = $("#" + this.convertId(arguments[i]));
- }
- return elements;
+Toggle.prototype.getElement = function(id) {
+ return $("#" + this.convertId(id));
}
ToggleManager = new Object();
Modified:
root/ui-sandbox/trunk/components/tables/ui/src/main/resources/META-INF/tables.taglib.xml
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/resources/META-INF/tables.taglib.xml 2009-11-24
15:31:22 UTC (rev 15986)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/resources/META-INF/tables.taglib.xml 2009-11-24
16:36:33 UTC (rev 15987)
@@ -36,7 +36,7 @@
<component>
<component-type>org.richfaces.SubTable</component-type>
<!--
renderer-type>org.richfaces.renderkit.SubTableRenderer</renderer-type-->
- <!-- handler-class>org.richfaces.taglib.SubTableHandler</handler-class
-->
+ <handler-class>org.richfaces.taglib.SubTableHandler</handler-class>
</component>
</tag>
<tag>
Modified:
root/ui-sandbox/trunk/components/tables/ui/src/main/templates/org/richfaces/renderkit/html/toggle-control.template.xml
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/templates/org/richfaces/renderkit/html/toggle-control.template.xml 2009-11-24
15:31:22 UTC (rev 15986)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/templates/org/richfaces/renderkit/html/toggle-control.template.xml 2009-11-24
16:36:33 UTC (rev 15987)
@@ -13,9 +13,11 @@
</cc:interface>
<cc:implementation>
+ <cdk:call expression="getUtils().encodeBeginFormIfNessesary(facesContext,
cc);"/>
<span id="#{clientId}"
class="#{cc.attributes['styleClass']}">
<cdk:call expression="encodeControl(facesContext, cc);" />
</span>
+ <cdk:call expression="getUtils().encodeEndFormIfNessesary(facesContext,
cc);"/>
</cc:implementation>
</cdk:root>
\ No newline at end of file