Author: abelevich
Date: 2009-12-02 12:49:17 -0500 (Wed, 02 Dec 2009)
New Revision: 16039
Added:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/state/DataTableState.java
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/ColumnVisualModel.java
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/DataTableVisualModel.java
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/SubTableVisualModel.java
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/impl/
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/impl/ColumnVisualModelImpl.java
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/impl/DataTableVisualModelImpl.java
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/impl/SubTableVisualModelImpl.java
Modified:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/UIDataTable.java
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/html/HtmlSubTable.java
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/state/SubTableState.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
Log:
add visual model processing prototype impl
Modified:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/UIDataTable.java
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/UIDataTable.java 2009-12-02
17:47:55 UTC (rev 16038)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/UIDataTable.java 2009-12-02
17:49:17 UTC (rev 16039)
@@ -2,6 +2,11 @@
import javax.faces.component.UIComponent;
+import org.ajax4jsf.model.DataComponentState;
+import org.richfaces.component.state.DataTableState;
+import org.richfaces.model.visual.DataTableVisualModel;
+import org.richfaces.model.visual.impl.DataTableVisualModelImpl;
+
/**
* @author Anton Belevich
*
@@ -9,6 +14,32 @@
public abstract class UIDataTable extends UIDataTableBase {
+ enum PropertyKeys {
+ visualModel
+ }
+
+
+ public DataTableVisualModel getVisualModel(){
+ return (DataTableVisualModel) getStateHelper().eval(PropertyKeys.visualModel);
+ }
+
+ public void setVisualModel(DataTableVisualModel dataTableVisualModel) {
+ getStateHelper().put(PropertyKeys.visualModel, dataTableVisualModel);
+ }
+
+ @Override
+ protected DataComponentState createComponentState() {
+ DataTableState state = new DataTableState(getFirst(), getRows());
+ DataTableVisualModel model = getVisualModel();
+
+ if(model == null) {
+ model = new DataTableVisualModelImpl();
+ }
+ state.setVisualModel(model);
+
+ return state;
+ }
+
public String getCellSkinClass() {
return "rich-table-cell";
}
@@ -66,8 +97,6 @@
return "rich-table-subfooter-cell";
}
-
-
public UIComponent getCaption() {
return getFacet("caption");
}
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-12-02
17:47:55 UTC (rev 16038)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/UISubTable.java 2009-12-02
17:49:17 UTC (rev 16039)
@@ -21,28 +21,32 @@
package org.richfaces.component;
-import java.util.Iterator;
-
+import javax.el.ELContext;
import javax.el.MethodExpression;
-import javax.faces.component.StateHelper;
+import javax.el.ValueExpression;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.event.AbortProcessingException;
+import javax.faces.event.ComponentSystemEventListener;
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.DataTableState;
import org.richfaces.component.state.SubTableState;
import org.richfaces.event.ToggleEvent;
import org.richfaces.event.ToggleListener;
+import org.richfaces.model.visual.SubTableVisualModel;
+import org.richfaces.model.visual.impl.SubTableVisualModelImpl;
/**
* JSF component class
*
*/
-public abstract class UISubTable extends UIDataTableBase implements Row, Column,
Expandable {
+
+public abstract class UISubTable extends UIDataTableBase implements Row, Column,
Expandable, ComponentSystemEventListener {
public static final String COMPONENT_TYPE = "org.richfaces.SubTable";
@@ -54,59 +58,61 @@
public static final String SWITCH_TYPE_AJAX = "ajax";
- private boolean expanded = Boolean.TRUE;
-
-
+ private boolean expanded;
+
+ private SubTableVisualModel visualModel;
+
+ private DataComponentState componentState;
+
enum PropertyKeys {
- switchType, expanded, toggleExpression, childState
+ switchType, expanded, toggleExpression, childState, visualModel
}
- @Override
- protected DataComponentState createComponentState() {
- return new SubTableState() {
-
- @Override
- public int getFirst() {
- return UISubTable.this.getFirst();
+ public SubTableVisualModel getVisualModel() {
+ //TODO refactor
+ SubTableVisualModel model = getCurrentComponentState().getCurrentRowModel();
+
+ if(model == null) {
+
+ if(visualModel == null) {
+
+ ELContext elContext = getFacesContext().getELContext();
+ ValueExpression modelExpression = getValueExpression("visualModel");
+ if(modelExpression != null) {
+ model = (SubTableVisualModel)modelExpression.getValue(elContext);
+ }
+
+ if(model == null) {
+ model = new SubTableVisualModelImpl();
+ model.setExpanded(expanded);
+
+ if((modelExpression != null) && (!modelExpression.isReadOnly(elContext))) {
+ modelExpression.setValue(elContext, model);
+ }
+ }
+ } else {
+ model = visualModel;
}
-
- @Override
- public int getRows() {
- return UISubTable.this.getRows();
- }
- };
- }
+
+ getCurrentComponentState().setCurrentRowModel(model);
+ }
-/*
- @Override
- public Object getIterationState() {
- StateHelper stateHelper = getStateHelper();
- return new Object[] {stateHelper.get(PropertyKeys.childState), this.expanded};
+ return model;
}
- @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);
+ public void setVisualModel(SubTableVisualModel visualModel) {
+ this.visualModel = visualModel;
}
public boolean isBreakBefore() {
return true;
}
+ @Override
+ protected DataComponentState createComponentState() {
+ return new SubTableState(getClientId(), getFirst(), getRows());
+ }
+
public void setBreakBefore(boolean newBreakBefore) {
throw new IllegalStateException("Property 'breakBefore' for subtable is
read-only");
}
@@ -134,14 +140,87 @@
getStateHelper().put(PropertyKeys.switchType, switchType);
}
+ public SubTableState getCurrentComponentState() {
+ DataComponentState dataComponentState = getComponentState();
+ if(dataComponentState instanceof SubTableState) {
+ return (SubTableState)dataComponentState;
+ }
+ return null;
+ }
+
+ public DataTableState getParentState() {
+
+ DataTableState dataTableState = null;
+
+ UIComponent component = getParent();
+ if(component instanceof UIDataTable) {
+
+ UIDataTable dataTable = (UIDataTable)component;
+ DataComponentState state = dataTable.getComponentState();
+
+ if(state instanceof DataTableState) {
+ dataTableState = (DataTableState)state;
+ }
+ }
+ return dataTableState;
+ }
+
+ @Override
+ public DataComponentState getComponentState() {
+
+ DataTableState dataTableState = getParentState();
+
+ if(componentState == null) {
+ ELContext elContext = getFacesContext().getELContext();
+
+ ValueExpression expression = getValueExpression("componentState");
+ if(expression != null) {
+ componentState = (DataComponentState)expression.getValue(elContext);
+ }
+
+ if(componentState == null) {
+ componentState = dataTableState.getSubTableState(getClientId());
+ }
+
+ if(componentState == null) {
+ componentState = createComponentState();
+ }
+
+ if(expression != null && !expression.isReadOnly(elContext)) {
+ expression.setValue(elContext, componentState);
+ }
+ }
+
+ if(componentState instanceof SubTableState) {
+ dataTableState.addSubTableState((SubTableState)componentState);
+ }
+
+ return componentState;
+ }
+
+ @Override
+ public Object getIterationState() {
+ return new Object [] { super.getIterationState(), this.componentState};
+ }
+
+ @Override
+ public void setIterationState(Object stateObject) {
+ Object [] state = (Object [])stateObject;
+ if(state != null) {
+ super.setIterationState(state[0]);
+ this.componentState = (DataComponentState)state[1];
+ } else {
+ super.setIterationState(state);
+ this.componentState = null;
+ }
+ }
+
public void setExpanded(boolean expanded) {
-// ((SubTableState)getComponentState()).setExpanded(expanded);
- getStateHelper().put(PropertyKeys.expanded, expanded);
+ this.expanded = expanded;
}
-
+
public boolean isExpanded() {
-// return ((SubTableState)getComponentState()).isExpanded();
- return (Boolean) getStateHelper().eval(PropertyKeys.expanded, Boolean.TRUE);
+ return getVisualModel().isExpanded();
}
public void setToggleListener(MethodExpression toggleExpression) {
@@ -159,7 +238,7 @@
}
super.queueEvent(event);
}
-
+
@Override
public void broadcast(FacesEvent event) throws AbortProcessingException {
super.broadcast(event);
@@ -171,10 +250,13 @@
if(expression != null) {
expression.invoke(getFacesContext().getELContext(), new Object[]{toggleEvent});
}
- //???
-// ((SubTableState)getComponentState()).setExpanded(toggleEvent.isExpanded());
-// getStateHelper().put(PropertyKeys.expanded, toggleEvent.isExpanded());
- }
+
+ //not sure that this is right ... need to discuss
+ SubTableState state = getCurrentComponentState();
+ if(event.isAppropriateListener(state)) {
+ toggleEvent.processListener(state);
+ }
+ }
}
public void addToggleListener(ToggleListener listener) {
@@ -251,5 +333,5 @@
public String getColumnFooterSkinClass() {
return "rich-subtable-subfooter-cell";
}
-
+
}
Modified:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/html/HtmlSubTable.java
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/html/HtmlSubTable.java 2009-12-02
17:47:55 UTC (rev 16038)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/html/HtmlSubTable.java 2009-12-02
17:49:17 UTC (rev 16039)
@@ -3,7 +3,6 @@
import javax.el.MethodExpression;
import org.richfaces.component.UISubTable;
-import org.richfaces.event.ToggleListener;
import org.richfaces.model.Ordering;
public class HtmlSubTable extends UISubTable{
Added:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/state/DataTableState.java
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/state/DataTableState.java
(rev 0)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/state/DataTableState.java 2009-12-02
17:49:17 UTC (rev 16039)
@@ -0,0 +1,75 @@
+package org.richfaces.component.state;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.faces.component.StateHolder;
+import javax.faces.context.FacesContext;
+
+import org.ajax4jsf.model.RepeatState;
+import org.richfaces.model.visual.DataTableVisualModel;
+
+/**
+ * @author Anton Belevich
+ *
+ */
+public class DataTableState extends RepeatState implements StateHolder {
+
+ private DataTableVisualModel visualModel;
+
+ private Map<String, SubTableState> subTableStates = new HashMap<String,
SubTableState>();
+
+ private int first;
+
+ private int rows;
+
+ public DataTableState(int first, int rows) {
+ this.first = first;
+ this.rows = rows;
+ }
+
+ public void setVisualModel(DataTableVisualModel visualModel) {
+ this.visualModel = visualModel;
+ }
+
+ public DataTableVisualModel getVisualModel() {
+ return this.visualModel;
+ }
+
+ @Override
+ public int getFirst() {
+ return this.first;
+ }
+
+ @Override
+ public int getRows() {
+ return this.rows;
+ }
+
+ public void restoreState(FacesContext context, Object state) {
+ Object [] newState = (Object[])state;
+ if(newState != null) {
+ subTableStates = (Map<String, SubTableState>)newState[0];
+ }
+ }
+
+ public Object saveState(FacesContext context) {
+ return new Object [] {subTableStates};
+ }
+
+ public boolean isTransient() {
+ return false;
+ }
+
+ public void setTransient(boolean newTransientValue) {
+ }
+
+ public void addSubTableState(SubTableState state) {
+ this.subTableStates.put(state.getId(), state);
+ }
+
+ public SubTableState getSubTableState(String id) {
+ return this.subTableStates.get(id);
+ }
+
+}
Modified:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/state/SubTableState.java
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/state/SubTableState.java 2009-12-02
17:47:55 UTC (rev 16038)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/state/SubTableState.java 2009-12-02
17:49:17 UTC (rev 16039)
@@ -1,17 +1,79 @@
package org.richfaces.component.state;
+import javax.faces.component.StateHolder;
+import javax.faces.context.FacesContext;
+
import org.ajax4jsf.model.RepeatState;
+import org.richfaces.event.ToggleEvent;
+import org.richfaces.event.ToggleListener;
+import org.richfaces.model.visual.SubTableVisualModel;
-public abstract class SubTableState extends RepeatState {
+/**
+ * @author Anton Belevich
+ *
+ */
+public class SubTableState extends RepeatState implements StateHolder, ToggleListener {
+
- private boolean expanded;
+ private SubTableVisualModel model;
- public boolean isExpanded() {
- return this.expanded;
+ private String id;
+
+ private int first;
+
+ private int rows;
+
+
+ public SubTableState(String id, int first, int rows) {
+ this.id = id;
+ this.first = first;
+ this.rows = rows;
}
+
+ public String getId(){
+ return this.id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ @Override
+ public int getFirst() {
+ return this.first;
+ }
+
+ @Override
+ public int getRows() {
+ return this.rows;
+ }
+
+ public SubTableVisualModel getCurrentRowModel() {
+ return this.model;
+ }
+
+ public void setCurrentRowModel(SubTableVisualModel model) {
+ this.model = model;
+ }
- public void setExpanded(boolean expanded) {
- this.expanded = expanded;
+ public void restoreState(FacesContext context, Object state) {
+ Object [] currentState = (Object[]) state;
+ this.model = (SubTableVisualModel)currentState[0];
}
+ public Object saveState(FacesContext context) {
+ return new Object [] {this.model};
+ }
+
+ public boolean isTransient() {
+ return false;
+ }
+
+ public void setTransient(boolean newTransientValue) {
+ }
+
+ public void processToggle(ToggleEvent event) {
+ boolean newValue = event.isExpanded();
+ this.model.setExpanded(newValue);
+ }
}
Added:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/ColumnVisualModel.java
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/ColumnVisualModel.java
(rev 0)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/ColumnVisualModel.java 2009-12-02
17:49:17 UTC (rev 16039)
@@ -0,0 +1,8 @@
+package org.richfaces.model.visual;
+
+/**
+ * @author Anton Belevich
+ *
+ */
+public interface ColumnVisualModel {
+}
Added:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/DataTableVisualModel.java
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/DataTableVisualModel.java
(rev 0)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/DataTableVisualModel.java 2009-12-02
17:49:17 UTC (rev 16039)
@@ -0,0 +1,8 @@
+package org.richfaces.model.visual;
+
+/**
+ * @author Anton Belevich
+ *
+ */
+public interface DataTableVisualModel {
+}
Added:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/SubTableVisualModel.java
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/SubTableVisualModel.java
(rev 0)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/SubTableVisualModel.java 2009-12-02
17:49:17 UTC (rev 16039)
@@ -0,0 +1,13 @@
+package org.richfaces.model.visual;
+
+/**
+ * @author Anton Belevich
+ *
+ */
+public interface SubTableVisualModel {
+
+ public boolean isExpanded();
+
+ public void setExpanded(boolean expand);
+
+}
Added:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/impl/ColumnVisualModelImpl.java
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/impl/ColumnVisualModelImpl.java
(rev 0)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/impl/ColumnVisualModelImpl.java 2009-12-02
17:49:17 UTC (rev 16039)
@@ -0,0 +1,10 @@
+package org.richfaces.model.visual.impl;
+
+import org.richfaces.model.visual.ColumnVisualModel;
+
+/**
+ * @author Anton Belevich
+ *
+ */
+public class ColumnVisualModelImpl implements ColumnVisualModel {
+}
Added:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/impl/DataTableVisualModelImpl.java
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/impl/DataTableVisualModelImpl.java
(rev 0)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/impl/DataTableVisualModelImpl.java 2009-12-02
17:49:17 UTC (rev 16039)
@@ -0,0 +1,13 @@
+package org.richfaces.model.visual.impl;
+
+import org.richfaces.model.visual.DataTableVisualModel;
+
+/**
+ * @author Anton Belevich
+ *
+ */
+public class DataTableVisualModelImpl implements DataTableVisualModel {
+
+ public DataTableVisualModelImpl() {
+ }
+}
Added:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/impl/SubTableVisualModelImpl.java
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/impl/SubTableVisualModelImpl.java
(rev 0)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/model/visual/impl/SubTableVisualModelImpl.java 2009-12-02
17:49:17 UTC (rev 16039)
@@ -0,0 +1,23 @@
+package org.richfaces.model.visual.impl;
+
+import org.richfaces.model.visual.SubTableVisualModel;
+
+/**
+ * @author Anton Belevich
+ *
+ */
+public class SubTableVisualModelImpl implements SubTableVisualModel{
+
+ private boolean expanded;
+
+ public SubTableVisualModelImpl() {
+ }
+
+ public boolean isExpanded() {
+ return this.expanded;
+ }
+
+ public void setExpanded(boolean expanded) {
+ this.expanded = expanded;
+ }
+}
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-12-02
17:47:55 UTC (rev 16038)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/DataTableRenderer.java 2009-12-02
17:49:17 UTC (rev 16039)
@@ -124,19 +124,28 @@
if(child instanceof UISubTable) {
//ecode subTable header facet
UISubTable subTable = (UISubTable)child;
+
if(bodyStart) {
encodeTableBodyEnd(writer, context, (UIDataTableBase)row);
bodyStart = false;
}
// subTable.setRowKey(childRowHolder.getCurrentRow());
+
+/* Object key = subTable.getRowKey();
+ subTable.captureOrigValue(context);
+ subTable.setRowKey(context, null); */
+
+
encodeTableBodyStart(writer, context, subTable);
encodeHeader(writer, context, subTable);
- }
- encodeRows(childRowHolder);
- if(child instanceof UISubTable) {
- UISubTable subTable = (UISubTable)child;
+ encodeRows(childRowHolder);
+
encodeFooter(writer, context, subTable);
+
+/* subTable.setRowKey(context, key);
+ subTable.restoreOrigValue(context); */
+
// encodeHiddenInput(context, writer, subTable);
encodeTableBodyEnd(writer, context, subTable);
@@ -146,6 +155,9 @@
encodeTableBodyStart(writer, context, (UIDataTableBase)row);
bodyStart=true;
}
+
+ } else {
+ encodeRows(childRowHolder);
}
} else if(child instanceof UIColumn) {
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-12-02
17:47:55 UTC (rev 16038)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/ToggleControlRendererBase.java 2009-12-02
17:49:17 UTC (rev 16039)
@@ -77,6 +77,7 @@
UIToggleControl toggleControl = (UIToggleControl)component;
UISubTable subTable = findComponent(context, toggleControl);
+ subTable.getAttributes().get("expanded");
if(subTable != null) {
ResponseWriter writer = context.getResponseWriter();