Author: konstantin.mishin
Date: 2010-04-02 09:39:39 -0400 (Fri, 02 Apr 2010)
New Revision: 16708
Modified:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/UIExtendedDataTable.java
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/ExtendedDataTableRenderer.java
root/ui-sandbox/trunk/components/tables/ui/src/main/resources/META-INF/resources/extendedDataTable.js
Log:
RF-7869
Modified:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/UIExtendedDataTable.java
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/UIExtendedDataTable.java 2010-04-02
13:36:47 UTC (rev 16707)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/component/UIExtendedDataTable.java 2010-04-02
13:39:39 UTC (rev 16708)
@@ -68,7 +68,15 @@
((PartialEncodingRenderer) renderer).encodePartially(this, context, callback,
subComponentIdentifiers);
}
- public void partiallyWalk(FacesContext faces, DataVisitor visitor, Range range,
Object argument) {
+ /**
+ * Walk ( visit ) this component on all data-aware children for each row from range.
+ *
+ * @param faces
+ * @param visitor
+ * @param range
+ * @param argument
+ */
+ public void walk(FacesContext faces, DataVisitor visitor, Range range, Object
argument) {
Object key = getRowKey();
captureOrigValue(faces);
@@ -88,7 +96,13 @@
@Override
public int getRows() {
- return UIExtendedDataTable.this.getRealClientRows();
+ int rows = getClientRows();
+ if (rows > 0) {
+ rows = Math.min(rows, UIExtendedDataTable.this.getRows());
+ } else {
+ rows = UIExtendedDataTable.this.getRows();
+ }
+ return rows;
}
};
}
@@ -107,16 +121,6 @@
setClientFirst(0);
}
- public int getRealClientRows() {
- int rows = getClientRows();
- if (rows > 0) {
- rows = Math.min(rows, getRows());
- } else {
- rows = getRows();
- }
- return rows;
- }
-
public int getClientRows() {
return (Integer) getStateHelper().eval(PropertyKeys.clientRows, 0);
}
Modified:
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/ExtendedDataTableRenderer.java
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/ExtendedDataTableRenderer.java 2010-04-02
13:36:47 UTC (rev 16707)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/java/org/richfaces/renderkit/ExtendedDataTableRenderer.java 2010-04-02
13:39:39 UTC (rev 16708)
@@ -35,6 +35,10 @@
import java.util.List;
import java.util.Map;
+import javax.el.ELContext;
+import javax.el.ELException;
+import javax.el.ValueExpression;
+import javax.faces.FacesException;
import javax.faces.application.ResourceDependencies;
import javax.faces.application.ResourceDependency;
import javax.faces.component.UIComponent;
@@ -46,6 +50,7 @@
import org.ajax4jsf.javascript.JSFunction;
import org.ajax4jsf.javascript.JSReference;
+import org.ajax4jsf.javascript.ScriptUtils;
import org.ajax4jsf.model.DataVisitResult;
import org.ajax4jsf.model.DataVisitor;
import org.ajax4jsf.model.SequenceRange;
@@ -169,7 +174,7 @@
if (oldClientFirst == null) {
oldClientFirst = clientFirst;
}
- int clientRows = table.getRealClientRows();
+ int clientRows =
((SequenceRange)table.getComponentState().getRange()).getRows();
int difference = clientFirst - oldClientFirst;
SequenceRange addRange = null;
SequenceRange removeRange = null;
@@ -196,7 +201,7 @@
for (state.startIterate(); state.hasNextPart();) {
char partNameFirstChar =
state.nextPart().getName().toString().charAt(0);
final List<String> ids = new LinkedList<String>();
- table.partiallyWalk(context, new DataVisitor() {
+ table.walk(context, new DataVisitor() {
@Override
public DataVisitResult process(FacesContext context, Object
rowKey, Object argument) {
UIExtendedDataTable dataTable = state.getRow();
@@ -206,7 +211,7 @@
return DataVisitResult.CONTINUE;
}
}, removeRange, null);
- table.partiallyWalk(context, new DataVisitor() {
+ table.walk(context, new DataVisitor() {
@Override
public DataVisitResult process(FacesContext context, Object
rowKey, Object argument) {
UIExtendedDataTable dataTable = state.getRow();
@@ -221,8 +226,7 @@
encodeRow(state);
writer.endUpdate();
} catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
+ throw new FacesException(e);
}
return DataVisitResult.CONTINUE;
}
@@ -333,20 +337,14 @@
writer.endElement(HTML.INPUT_ELEM);
writer.startElement(HTML.SCRIPT_ELEM, component);
writer.writeAttribute(HTML.TYPE_ATTR, "text/javascript", null);
-
JSFunction ajaxFunction = buildAjaxFunction(context, component,
AJAX_FUNCTION_NAME);
AjaxEventOptions eventOptions = buildEventOptions(context, component);
- eventOptions.getParameters().put("rich:columnsOrder", new
JSReference("columnsOrder"));
+ Map<String, Object> parameters = eventOptions.getParameters();
+ eventOptions.set(AjaxEventOptions.PARAMETERS, new
JSReference("parameters"));
ajaxFunction.addParameter(eventOptions);
-
- JSFunction scrollFunction = buildAjaxFunction(context, component,
AJAX_FUNCTION_NAME);
- AjaxEventOptions scrollOptions = buildEventOptions(context, component);
- scrollOptions.getParameters().put("rich:clientFirst", new
JSReference("clientFirst"));
- scrollFunction.addParameter(scrollOptions);
-
writer.write("new RichFaces.ExtendedDataTable('" +
component.getClientId(context) + "', "
- + getRowCount(component) + ", function(event, columnsOrder) {" +
ajaxFunction.toScript() + ";}"
- + ", function(event, clientFirst) {" + scrollFunction.toScript() +
";});");
+ + getRowCount(component) + ", function(event, parameters) {" +
ajaxFunction.toScript() + ";},"
+ + ScriptUtils.toScript(parameters) + ");");
writer.endElement(HTML.SCRIPT_ELEM);
writer.endElement(HTML.DIV_ELEM);
}
@@ -566,7 +564,7 @@
protected void doDecode(FacesContext context, UIComponent component) {
super.doDecode(context, component);
Map<String, String> map =
context.getExternalContext().getRequestParameterMap();
- updateWidthOfColumns(component, map.get(component.getClientId(context) +
":wi"));
+ updateWidthOfColumns(context, component, map.get(component.getClientId(context) +
":wi"));
if (map.get(component.getClientId(context)) != null) {
updateColumnsOrder(context, component,
map.get("rich:columnsOrder"));
}
@@ -575,18 +573,30 @@
}
}
- /**
- * @deprecated
- * TODO Other approaches of updating width of columns should be discussed.
- */
- private void updateWidthOfColumns(UIComponent component, String widthString) {
+ private void updateAttribute(FacesContext context, UIComponent component, String
attribute, Object value) {
+ ELContext elContext = context.getELContext();
+ ValueExpression ve = component.getValueExpression(attribute);
+ if (ve != null && !ve.isReadOnly(elContext)) {
+ component.getAttributes().put(attribute, null);
+ try {
+ ve.setValue(elContext, value);
+ } catch (ELException e) {
+ throw new FacesException(e);
+ }
+ } else {
+ component.getAttributes().put(attribute, value);
+ }
+
+ }
+
+ private void updateWidthOfColumns(FacesContext context, UIComponent component, String
widthString) {
if (widthString != null && widthString.length() > 0) {
String[] widthArray = widthString.split(",");
for (int i = 0; i < widthArray.length; i++) {
String[] widthEntry = widthArray[i].split(":");
UIComponent column = component.findComponent(widthEntry[0]);
if (!widthEntry[1].equals(column.getAttributes().get("width")))
{
- column.getAttributes().put("width", widthEntry[1]);
+ updateAttribute(context, column, "width", widthEntry[1]);
}
}
@@ -596,20 +606,30 @@
private void updateColumnsOrder(FacesContext context, UIComponent component, String
columnsOrderString) {
if (columnsOrderString != null && columnsOrderString.length() > 0) {
String[] columnsOrder = columnsOrderString.split(",");
- component.getAttributes().put("columnsOrder", columnsOrder);
-
context.getPartialViewContext().getRenderIds().add(component.getClientId(context));
+ if
(!columnsOrder.equals(component.getAttributes().get("columnsOrder"))) {
+ updateAttribute(context, component, "columnsOrder",
columnsOrder);
+
context.getPartialViewContext().getRenderIds().add(component.getClientId(context));
+ }
}
}
private void updateClientFirst(FacesContext context, UIComponent component, String
clientFirst) {
if (clientFirst != null && clientFirst.length() > 0) {
- int value = Integer.parseInt(clientFirst);
- component.getAttributes().put(UIExtendedDataTable.SUBMITTED_CLIENT_FIRST,
value);
- context.getPartialViewContext().getRenderIds().add(
- component.getClientId(context) + "@" +
UIExtendedDataTable.SCROLL);
+ Integer value = Integer.valueOf(clientFirst);
+ if (!value.equals(component.getAttributes().get("clientFirst"))) {
+ component.getAttributes().put(UIExtendedDataTable.SUBMITTED_CLIENT_FIRST,
value);
+ context.getPartialViewContext().getRenderIds().add(
+ component.getClientId(context) + "@" +
UIExtendedDataTable.SCROLL);
+ }
}
}
+ /**
+ * @deprecated
+ * TODO Remove this method when width in relative units in columns will be
implimented.
+ * @param column
+ * @return width
+ */
private String getColumnWidth(UIComponent column) {
String width = (String) column.getAttributes().get("width");
if (width == null || width.length() == 0 || width.indexOf("%") != -1)
{
Modified:
root/ui-sandbox/trunk/components/tables/ui/src/main/resources/META-INF/resources/extendedDataTable.js
===================================================================
---
root/ui-sandbox/trunk/components/tables/ui/src/main/resources/META-INF/resources/extendedDataTable.js 2010-04-02
13:36:47 UTC (rev 16707)
+++
root/ui-sandbox/trunk/components/tables/ui/src/main/resources/META-INF/resources/extendedDataTable.js 2010-04-02
13:39:39 UTC (rev 16708)
@@ -34,7 +34,7 @@
return rule;
};
- richfaces.ExtendedDataTable = function(id, rowCount, ajaxFunction, scrollFunction) {
+ richfaces.ExtendedDataTable = function(id, rowCount, ajaxFunction, ajaxParameters) {
var WIDTH_CLASS_NAME_BASE = "rich-extable-cell-width-";
var MIN_WIDTH = 20;
var idSuffixs = [":header", ":footer"]; //TODO Not use idSuffixs
@@ -67,6 +67,15 @@
var timeoutId = null;
+ var sendAjax = function(event, map) {
+ for (key in ajaxParameters) {
+ if(!map[key]) {
+ map[key] = ajaxParameters[key];
+ }
+ }
+ ajaxFunction(event, map);
+ };
+
var updateLayout = function() {
var offsetWidth = frozenHeaderPartElement ? frozenHeaderPartElement.offsetWidth : 0;
var width = Math.max(0, element.clientWidth - offsetWidth);
@@ -173,7 +182,7 @@
widthInput.value = widthsArray.toString();
updateLayout();
adjustResizers();
- ajaxFunction(null, ""); // TODO Maybe, event model should be used here.
+ sendAjax(); // TODO Maybe, event model should be used here.
};
var endResize = function(event) {
@@ -224,7 +233,7 @@
colunmsOrder += i + ",";
}
});
- ajaxFunction(event, colunmsOrder); // TODO Maybe, event model should be used here.
+ sendAjax(event, {"rich:columnsOrder" : colunmsOrder}); // TODO Maybe, event
model should be used here.
};
var cancelReorder = function(event) {
@@ -240,7 +249,7 @@
} else {
clientFirst = Math.min(rowCount - rows, clientFirst);
}
- scrollFunction(event, clientFirst);
+ sendAjax(event, {"rich:clientFirst" : clientFirst});// TODO Maybe, event
model should be used here.
}
var bodyScrollListener = function(event) {
@@ -303,7 +312,7 @@
}
}
}
- ajaxFunction(null, colunmsOrder); // TODO Maybe, event model should be used here.
+ sendAjax(null, {"rich:columnsOrder" : colunmsOrder}); // TODO Maybe, event
model should be used here.
}
this.setColumnWidth = function(id, width) {