Author: konstantin.mishin
Date: 2010-07-06 11:49:47 -0400 (Tue, 06 Jul 2010)
New Revision: 17742
Modified:
root/ui/iteration/trunk/tables/ui/src/main/java/org/richfaces/component/UIDataTableBase.java
root/ui/iteration/trunk/tables/ui/src/main/java/org/richfaces/component/UIExtendedDataTable.java
root/ui/iteration/trunk/tables/ui/src/main/java/org/richfaces/renderkit/ExtendedDataTableRenderer.java
root/ui/iteration/trunk/tables/ui/src/main/java/org/richfaces/renderkit/SelectionRenderer.java
root/ui/iteration/trunk/tables/ui/src/main/resources/META-INF/resources/extendedDataTable.js
Log:
RF-8101
Modified:
root/ui/iteration/trunk/tables/ui/src/main/java/org/richfaces/component/UIDataTableBase.java
===================================================================
---
root/ui/iteration/trunk/tables/ui/src/main/java/org/richfaces/component/UIDataTableBase.java 2010-07-06
14:28:25 UTC (rev 17741)
+++
root/ui/iteration/trunk/tables/ui/src/main/java/org/richfaces/component/UIDataTableBase.java 2010-07-06
15:49:47 UTC (rev 17742)
@@ -41,7 +41,9 @@
import javax.faces.event.PhaseId;
import javax.faces.event.PreRenderComponentEvent;
+import org.ajax4jsf.model.DataVisitor;
import org.ajax4jsf.model.ExtendedDataModel;
+import org.ajax4jsf.model.Range;
import org.richfaces.context.ExtendedVisitContext;
import org.richfaces.context.ExtendedVisitContextMode;
import org.richfaces.event.FilteringEvent;
@@ -186,6 +188,24 @@
return state;
}
+ /**
+ * 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);
+
+ getExtendedDataModel().walk(faces, visitor, range, argument);
+
+ setRowKey(faces, key);
+ restoreOrigValue(faces);
+ }
+
public String getFilterVar() {
return (String) getStateHelper().eval(PropertyKeys.filterVar);
}
Modified:
root/ui/iteration/trunk/tables/ui/src/main/java/org/richfaces/component/UIExtendedDataTable.java
===================================================================
---
root/ui/iteration/trunk/tables/ui/src/main/java/org/richfaces/component/UIExtendedDataTable.java 2010-07-06
14:28:25 UTC (rev 17741)
+++
root/ui/iteration/trunk/tables/ui/src/main/java/org/richfaces/component/UIExtendedDataTable.java 2010-07-06
15:49:47 UTC (rev 17742)
@@ -32,8 +32,6 @@
import javax.faces.component.visit.VisitResult;
import javax.faces.context.FacesContext;
-import org.ajax4jsf.model.DataVisitor;
-import org.ajax4jsf.model.Range;
import org.richfaces.context.ExtendedVisitContext;
import org.richfaces.context.ExtendedVisitContextMode;
import org.richfaces.log.RichfacesLogger;
@@ -113,24 +111,6 @@
return super.visitDataChildren(visitContext, callback, visitRows);
}
- /**
- * 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);
-
- getExtendedDataModel().walk(faces, visitor, range, argument);
-
- setRowKey(faces, key);
- restoreOrigValue(faces);
- }
-
protected int getActualFirst() {
return getFirst() + getClientFirst();
}
Modified:
root/ui/iteration/trunk/tables/ui/src/main/java/org/richfaces/renderkit/ExtendedDataTableRenderer.java
===================================================================
---
root/ui/iteration/trunk/tables/ui/src/main/java/org/richfaces/renderkit/ExtendedDataTableRenderer.java 2010-07-06
14:28:25 UTC (rev 17741)
+++
root/ui/iteration/trunk/tables/ui/src/main/java/org/richfaces/renderkit/ExtendedDataTableRenderer.java 2010-07-06
15:49:47 UTC (rev 17742)
@@ -206,8 +206,8 @@
}
- private static final Map<java.lang.String,
org.richfaces.renderkit.ComponentAttribute> EVENT_ATTRIBUTES = Collections
- .unmodifiableMap(ComponentAttribute.createMap(new
ComponentAttribute("onselectionchange")
+ private static final Map<java.lang.String,
org.richfaces.renderkit.ComponentAttribute> EVENT_ATTRIBUTES
+ = Collections.unmodifiableMap(ComponentAttribute.createMap(new
ComponentAttribute("onselectionchange")
.setEventNames(new String[] {"selectionchange"}), new
ComponentAttribute("onbeforeselectionchange")
.setEventNames(new String[] {"beforeselectionchange"})));
@@ -262,8 +262,8 @@
boolean columnFacetPresent = table.isColumnFacetPresent(name);
if (columnFacetPresent || "footer".equals(name)) {
writer.startElement(HTML.DIV_ELEM, table);
- writer.writeAttribute(HTML.CLASS_ATTRIBUTE,
HtmlUtil.concatClasses("rf-edt-" + name.charAt(0), (String) table
- .getAttributes().get(name + "Class")), null);
+ writer.writeAttribute(HTML.CLASS_ATTRIBUTE,
HtmlUtil.concatClasses("rf-edt-" + name.charAt(0),
+ (String) table.getAttributes().get(name + "Class")), null);
writer.startElement(HTML.TABLE_ELEMENT, table);
writer.writeAttribute(HTML.CELLPADDING_ATTRIBUTE, "0", null);
writer.writeAttribute(HTML.CELLSPACING_ATTRIBUTE, "0", null);
@@ -352,7 +352,6 @@
FacesContext context = state.getContext();
ResponseWriter writer = context.getResponseWriter();
UIDataTableBase table = state.getRow();
-
String tableBodyId = table.getClientId(context) + ":b";
EncoderVariance encoderVariance = state.getEncoderVariance();
encoderVariance.encodeStartUpdate(context, tableBodyId);
@@ -360,7 +359,6 @@
writer.writeAttribute(HTML.ID_ATTRIBUTE, tableBodyId, null);
writer.writeAttribute(HTML.CLASS_ATTRIBUTE, "rf-edt-b", null);
if (table.getRowCount() == 0) {
-
UIComponent facet = table.getFacet("noData");
if (facet != null && facet.isRendered()) {
facet.encodeAll(context);
@@ -370,8 +368,6 @@
writer.writeText(noDataLabel, "noDataLabel");
}
}
-
-
} else {
table.getAttributes().put("clientFirst", 0);
writer.startElement(HTML.DIV_ELEM, table);
@@ -391,9 +387,7 @@
writer.writeAttribute(HTML.ID_ATTRIBUTE, table.getClientId(context) +
":body", null);
writer.writeAttribute(HTML.CLASS_ATTRIBUTE, "rf-edt-p
rf-edt-pw", null);
}
-
String targetId = table.getClientId(context) + ":tbt" +
partName.name().charAt(0);
-
writer.startElement(HTML.TABLE_ELEMENT, table);
writer.writeAttribute(HTML.ID_ATTRIBUTE, targetId, null);
writer.writeAttribute(HTML.CELLPADDING_ATTRIBUTE, "0", null);
@@ -456,7 +450,7 @@
if (oldClientFirst == null) {
oldClientFirst = clientFirst;
}
- int clientRows =
((SequenceRange)table.getComponentState().getRange()).getRows();
+ int clientRows = ((SequenceRange)
table.getComponentState().getRange()).getRows();
int difference = clientFirst - oldClientFirst;
SequenceRange addRange = null;
SequenceRange removeRange = null;
@@ -579,7 +573,8 @@
Map<String, Object> attributes = component.getAttributes();
writer.startElement(HTML.DIV_ELEM, component);
writer.writeAttribute(HTML.ID_ATTRIBUTE, component.getClientId(context), null);
- writer.writeAttribute(HTML.CLASS_ATTRIBUTE,
HtmlUtil.concatClasses("rf-edt", (String)
attributes.get("styleClass")), null);
+ writer.writeAttribute(HTML.CLASS_ATTRIBUTE,
HtmlUtil.concatClasses("rf-edt",
+ (String) attributes.get("styleClass")), null);
getUtils().writeAttribute(writer, HTML.STYLE_ATTRIBUTE,
attributes.get("style"));
}
@@ -603,7 +598,8 @@
table.restoreOrigValue(context);
}
- protected void doEncodeEnd(ResponseWriter writer, FacesContext context, UIComponent
component) throws IOException {
+ protected void doEncodeEnd(ResponseWriter writer, FacesContext context, UIComponent
component)
+ throws IOException {
writer.startElement(HTML.DIV_ELEM, component);
writer.writeAttribute(HTML.ID_ATTRIBUTE, component.getClientId(context) +
":d", null);
writer.writeAttribute(HTML.CLASS_ATTRIBUTE, "rf-edt-d", null);
@@ -636,8 +632,6 @@
writer.writeAttribute(HTML.TYPE_ATTR, HTML.INPUT_TYPE_HIDDEN, null);
writer.endElement(HTML.INPUT_ELEM);
encodeSelectionInput(writer, context, component);
- 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);
Map<String, Object> parameters = eventOptions.getParameters();
@@ -660,8 +654,7 @@
builder.append(",").append(ScriptUtils.toScript(options));
}
builder.append(");");
- writer.write(builder.toString());
- writer.endElement(HTML.SCRIPT_ELEM);
+ utils.writeScript(context, component, builder.toString());
writer.endElement(HTML.DIV_ELEM);
}
@@ -703,7 +696,8 @@
writer.endElement("style");
}
- public void encodeRow(ResponseWriter writer, FacesContext facesContext, RowHolderBase
rowHolder) throws IOException {
+ public void encodeRow(ResponseWriter writer, FacesContext facesContext, RowHolderBase
rowHolder)
+ throws IOException {
RendererState state = (RendererState) rowHolder;
UIDataTableBase table = state.getRow();
writer.startElement(HTML.TR_ELEMENT, table);
@@ -818,7 +812,7 @@
if (columnsOrderString != null && columnsOrderString.length() > 0) {
String[] columnsOrder = columnsOrderString.split(",");
updateAttribute(context, component, "columnsOrder", columnsOrder);
-
context.getPartialViewContext().getRenderIds().add(component.getClientId(context)); // Use
partial re-rendering here.
+
context.getPartialViewContext().getRenderIds().add(component.getClientId(context)); //TODO
Use partial re-rendering here.
}
}
Modified:
root/ui/iteration/trunk/tables/ui/src/main/java/org/richfaces/renderkit/SelectionRenderer.java
===================================================================
---
root/ui/iteration/trunk/tables/ui/src/main/java/org/richfaces/renderkit/SelectionRenderer.java 2010-07-06
14:28:25 UTC (rev 17741)
+++
root/ui/iteration/trunk/tables/ui/src/main/java/org/richfaces/renderkit/SelectionRenderer.java 2010-07-06
15:49:47 UTC (rev 17742)
@@ -35,7 +35,6 @@
import org.ajax4jsf.model.SequenceRange;
import org.ajax4jsf.renderkit.RendererUtils.HTML;
import org.richfaces.component.UIDataTableBase;
-import org.richfaces.component.UIExtendedDataTable;
/**
* @author Konstantin Mishin
@@ -180,40 +179,11 @@
updateAttribute(context, component, "selectedRowKeys",
selectedRowKeys);
}
final Collection<Object> rowKeys = selectedRowKeys;
- if (clientSelection.getSelectionFlag() != null) {
+ String selectionFlag = clientSelection.getSelectionFlag();
+ if (selectionFlag != null) {
selectedRowKeys.clear();
- if
(!ClientSelection.FLAG_RESET.equals(clientSelection.getSelectionFlag())) {
- Object key = table.getRowKey();
- table.captureOrigValue(context);
- SequenceRange range = (SequenceRange)
table.getComponentState().getRange();
- SequenceRange newRange = null;
- Object rowKey = attributes.get("shiftRowKey");
- if (rowKey == null) {
- rowKey = attributes.get("activeRowKey");
- attributes.put("shiftRowKey", rowKey);
- }
- table.setRowKey(rowKey);
- int shiftIndex = table.getRowIndex();
- if
(ClientSelection.FLAG_ALL.equals(clientSelection.getSelectionFlag())) {
- newRange = new SequenceRange(0, 0);
- } else if (shiftIndex > 0) {
- if
(ClientSelection.FLAG_BEFORE_RANGE.equals(clientSelection.getSelectionFlag())) {
- newRange = new SequenceRange(shiftIndex, range.getFirstRow()
- shiftIndex);
- } else {
- int last = range.getFirstRow() + range.getRows();
- newRange = new SequenceRange(last, shiftIndex - last + 1);
- }
- }
- table.setRowKey(context, key);
- table.restoreOrigValue(context);
- if (newRange != null) {
- ((UIExtendedDataTable) table).walk(context, new DataVisitor() {
//TODO Don't use cast here.
- public DataVisitResult process(FacesContext context, Object
rowKey, Object argument) {
- rowKeys.add(rowKey);
- return DataVisitResult.CONTINUE;
- }
- }, newRange, null);
- }
+ if (!ClientSelection.FLAG_RESET.equals(selectionFlag)) {
+ encodeSelectionOutsideCurrentRange(context, table, selectionFlag);
}
}
if (clientSelection.isCleanShiftIndex()) {
@@ -238,4 +208,41 @@
}, null);
}
}
+
+
+ private void encodeSelectionOutsideCurrentRange(FacesContext context, UIDataTableBase
table, String selectionFlag) { //TODO Rename method
+ Object key = table.getRowKey();
+ table.captureOrigValue(context);
+ SequenceRange range = (SequenceRange) table.getComponentState().getRange();
+ SequenceRange newRange = null;
+ Map<String, Object> attributes = table.getAttributes();
+ Object rowKey = attributes.get("shiftRowKey");
+ if (rowKey == null) {
+ rowKey = attributes.get("activeRowKey");
+ attributes.put("shiftRowKey", rowKey);
+ }
+ table.setRowKey(rowKey);
+ int shiftIndex = table.getRowIndex();
+ if (ClientSelection.FLAG_ALL.equals(selectionFlag)) {
+ newRange = new SequenceRange(0, 0);
+ } else if (shiftIndex > 0) {
+ if (ClientSelection.FLAG_BEFORE_RANGE.equals(selectionFlag)) {
+ newRange = new SequenceRange(shiftIndex, range.getFirstRow() -
shiftIndex);
+ } else {
+ int last = range.getFirstRow() + range.getRows();
+ newRange = new SequenceRange(last, shiftIndex - last + 1);
+ }
+ }
+ table.setRowKey(context, key);
+ table.restoreOrigValue(context);
+ if (newRange != null) {
+ final Collection<Object> rowKeys = table.getSelectedRowKeys();
+ table.walk(context, new DataVisitor() {
+ public DataVisitResult process(FacesContext context, Object rowKey,
Object argument) {
+ rowKeys.add(rowKey);
+ return DataVisitResult.CONTINUE;
+ }
+ }, newRange, null);
+ }
+ }
}
Modified:
root/ui/iteration/trunk/tables/ui/src/main/resources/META-INF/resources/extendedDataTable.js
===================================================================
---
root/ui/iteration/trunk/tables/ui/src/main/resources/META-INF/resources/extendedDataTable.js 2010-07-06
14:28:25 UTC (rev 17741)
+++
root/ui/iteration/trunk/tables/ui/src/main/resources/META-INF/resources/extendedDataTable.js 2010-07-06
15:49:47 UTC (rev 17742)
@@ -258,7 +258,7 @@
bodyJQuery.bind("scroll", bodyScrollListener);
if (options.selectionMode != "none") {
tbodies.bind("click", selectionClickListener);
- bodyJQuery.bind("keydown", selectionKeyDownListener);
+ bodyJQuery.bind(window.opera ? "keypress" : "keydown",
selectionKeyDownListener);
initializeSelection();
}
} else {
@@ -377,12 +377,22 @@
window.clearTimeout(timeoutId);
timeoutId = null;
}
- if (this.scrollTop < spacerElement.offsetHeight || this.scrollTop +
this.clientHeight > spacerElement.offsetHeight + dataTableElement.offsetHeight) {
+ if (Math.max(this.scrollTop - rowHeight, 0) < spacerElement.offsetHeight
+ || Math.min(this.scrollTop + rowHeight + this.clientHeight, this.scrollHeight) >
spacerElement.offsetHeight + dataTableElement.offsetHeight) {
timeoutId = window.setTimeout(function (event) {loadData(event)}, 1000);
}
};
- var selectRow = function (index) {
+ var showActiveRow = function() {
+ if (bodyElement.scrollTop > activeIndex * rowHeight + spacerElement.offsetHeight) {
//UP
+ bodyElement.scrollTop = Math.max(bodyElement.scrollTop - rowHeight, 0);
+ } else if (bodyElement.scrollTop + bodyElement.clientHeight
+ < (activeIndex + 1) * rowHeight + spacerElement.offsetHeight) { //DOWN
+ bodyElement.scrollTop = Math.min(bodyElement.scrollTop + rowHeight,
bodyElement.scrollHeight - bodyElement.clientHeight);
+ }
+ }
+
+ var selectRow = function(index) {
ranges.add(index);
for ( var i = 0; i < tbodies.length; i++) {
jQuery(tbodies[i].rows[index]).addClass("rf-edt-r-s");
@@ -456,6 +466,9 @@
}
var selectRows = function(range) {
+ if (typeof range == "number") {
+ range = [range, range];
+ }
var changed;
var i = 0;
for (; i < range[0]; i++) {
@@ -507,6 +520,7 @@
}
if (activeIndex != index) {
setActiveRow(index);
+ showActiveRow();
}
if (changed) {
writeSelection();
@@ -535,7 +549,7 @@
var index = tr.rowIndex;
if (options.selectionMode == "single" || (options.selectionMode !=
"multipleKeyboardFree"
&& !event.shiftKey && !event.ctrlKey)) {
- changed = selectRows([index, index]);
+ changed = selectRows(index);
} else if (options.selectionMode == "multipleKeyboardFree" ||
(!event.shiftKey && event.ctrlKey)) {
if (ranges.contains(index)) {
deselectRow(index);
@@ -556,24 +570,26 @@
selectionFlag = "a";
onselectionchange(event, activeIndex, true); //TODO Is there a way to know that
selection haven't changed?
event.preventDefault();
- }
- if (typeof activeIndex == "number") {
+ } else {
var index;
- if (event.keyCode == 38 && activeIndex) { //UP
- index = activeIndex - 1;
- } else if (event.keyCode == 40 && activeIndex < rows - 1) { //DOWN
- index = activeIndex + 1;
+ if (event.keyCode == 38) { //UP
+ index = -1;
+ } else if (event.keyCode == 40) { //DOWN
+ index = 1;
}
if (index != null && onbeforeselectionchange(event)) {
- var changed;
- if (options.selectionMode == "single" || (!event.shiftKey &&
!event.ctrlKey)) {
- changed = selectRows([index, index]);
- } else if (event.shiftKey) {
- changed = processSlectionWithShiftKey(index);
+ if (typeof activeIndex == "number") {
+ index += activeIndex;
+ if (index >= 0 && index < rows ) {
+ var changed;
+ if (options.selectionMode == "single" || (!event.shiftKey &&
!event.ctrlKey)) {
+ changed = selectRows(index);
+ } else if (event.shiftKey) {
+ changed = processSlectionWithShiftKey(index);
+ }
+ onselectionchange(event, index, changed);
+ }
}
- setActiveRow(index);
- //showRow
- onselectionchange(event, index, changed);
event.preventDefault();
}
}