aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/com/itmill/toolkit/terminal/gwt/client/ui/IScrollTable.java110
1 files changed, 65 insertions, 45 deletions
diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/IScrollTable.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/IScrollTable.java
index 7ab151d6bd..e54df00594 100644
--- a/src/com/itmill/toolkit/terminal/gwt/client/ui/IScrollTable.java
+++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/IScrollTable.java
@@ -33,7 +33,7 @@ import com.itmill.toolkit.terminal.gwt.client.Util;
import com.itmill.toolkit.terminal.gwt.client.ui.IScrollTable.IScrollTableBody.IScrollTableRow;
/**
- * Constructor for IScrollTable
+ * IScrollTable
*
* IScrollTable is a FlowPanel having two widgets in it: * TableHead component *
* ScrollPanel
@@ -119,6 +119,9 @@ public class IScrollTable extends Composite implements Table, ScrollListener,
private boolean enabled;
private boolean showColHeaders;
+ /** flag to indicate that table body has changed */
+ private boolean isNewBody = false;
+
public IScrollTable() {
bodyContainer.addScrollListener(this);
@@ -147,8 +150,10 @@ public class IScrollTable extends Composite implements Table, ScrollListener,
final int newTotalRows = uidl.getIntAttribute("totalrows");
if (newTotalRows != totalRows) {
totalRows = newTotalRows;
- if (initializedAndAttached) {
- tBody.setContainerHeight();
+ if (tBody != null) {
+ initializedAndAttached = false;
+ initialContentReceived = false;
+ isNewBody = true;
}
}
@@ -212,7 +217,7 @@ public class IScrollTable extends Composite implements Table, ScrollListener,
} else if (c.getTag().equals("actions")) {
updateActionMap(c);
} else if (c.getTag().equals("visiblecolumns")) {
- updateVisibleColumns(c);
+ tHead.updateCellsFromUIDL(c);
}
}
updateHeader(uidl.getStringArrayAttribute("vcolorder"));
@@ -221,6 +226,10 @@ public class IScrollTable extends Composite implements Table, ScrollListener,
updateBody(rowData, uidl.getIntAttribute("firstrow"), uidl
.getIntAttribute("rows"));
} else {
+ if (tBody != null) {
+ tBody.removeFromParent();
+ client.unregisterChildPaintables(tBody);
+ }
tBody = new IScrollTableBody();
tBody.renderInitialRows(rowData, uidl.getIntAttribute("firstrow"),
@@ -234,14 +243,6 @@ public class IScrollTable extends Composite implements Table, ScrollListener,
hideScrollPositionAnnotation();
}
- private void updateVisibleColumns(UIDL uidl) {
- final Iterator it = uidl.getChildIterator();
- while (it.hasNext()) {
- final UIDL col = (UIDL) it.next();
- tHead.updateCellFromUIDL(col);
- }
- }
-
private void updateActionMap(UIDL c) {
final Iterator it = c.getChildIterator();
while (it.hasNext()) {
@@ -284,7 +285,8 @@ public class IScrollTable extends Composite implements Table, ScrollListener,
tHead.removeCell("0");
}
- for (int i = 0; i < strings.length; i++) {
+ int i;
+ for (i = 0; i < strings.length; i++) {
final String cid = strings[i];
visibleColOrder[colIndex] = cid;
tHead.enableColumn(cid, colIndex);
@@ -488,6 +490,7 @@ public class IScrollTable extends Composite implements Table, ScrollListener,
final int[] widths = new int[tHead.visibleCells.size()];
+ tHead.enableBrowserIntelligence();
// first loop: collect natural widths
while (headCells.hasNext()) {
final HeaderCell hCell = (HeaderCell) headCells.next();
@@ -506,7 +509,6 @@ public class IScrollTable extends Composite implements Table, ScrollListener,
total += w;
i++;
}
-
tHead.disableBrowserIntelligence();
if (height == null) {
@@ -567,18 +569,20 @@ public class IScrollTable extends Composite implements Table, ScrollListener,
// bodys size will be more than available and scrollbar will appear
}
- // last loop: set possibly modified values
+ // last loop: set possibly modified values or reset if new tBody
i = 0;
headCells = tHead.iterator();
while (headCells.hasNext()) {
final HeaderCell hCell = (HeaderCell) headCells.next();
- if (hCell.getWidth() == -1) {
+ if (isNewBody || hCell.getWidth() == -1) {
final int w = widths[i];
setColWidth(i, w);
}
i++;
}
+ isNewBody = false;
+
if (firstvisible > 0) {
// Deferred due some Firefox oddities. IE & Safari could survive
// without
@@ -1187,32 +1191,49 @@ public class IScrollTable extends Composite implements Table, ScrollListener,
availableCells.put("0", new RowHeadersHeaderCell());
}
- public void updateCellFromUIDL(UIDL col) {
- final String cid = col.getStringAttribute("cid");
- HeaderCell c = getHeaderCell(cid);
- if (c == null) {
- c = new HeaderCell(cid, col.getStringAttribute("caption"));
- availableCells.put(cid, c);
- } else {
- c.setText(col.getStringAttribute("caption"));
- }
-
- if (col.hasAttribute("sortable")) {
- c.setSortable(true);
- if (cid.equals(sortColumn)) {
- c.setSorted(true);
+ public void updateCellsFromUIDL(UIDL uidl) {
+ Iterator it = uidl.getChildIterator();
+ HashSet updated = new HashSet();
+ updated.add("0");
+ while (it.hasNext()) {
+ final UIDL col = (UIDL) it.next();
+ final String cid = col.getStringAttribute("cid");
+ updated.add(cid);
+ HeaderCell c = getHeaderCell(cid);
+ if (c == null) {
+ c = new HeaderCell(cid, col.getStringAttribute("caption"));
+ availableCells.put(cid, c);
} else {
- c.setSorted(false);
+ c.setText(col.getStringAttribute("caption"));
}
+
+ if (col.hasAttribute("sortable")) {
+ c.setSortable(true);
+ if (cid.equals(sortColumn)) {
+ c.setSorted(true);
+ } else {
+ c.setSorted(false);
+ }
+ }
+ if (col.hasAttribute("align")) {
+ c.setAlign(col.getStringAttribute("align").charAt(0));
+ }
+ if (col.hasAttribute("width")) {
+ final String width = col.getStringAttribute("width");
+ c.setWidth(Integer.parseInt(width));
+ }
+ // TODO icon
}
- if (col.hasAttribute("align")) {
- c.setAlign(col.getStringAttribute("align").charAt(0));
- }
- if (col.hasAttribute("width")) {
- final String width = col.getStringAttribute("width");
- c.setWidth(Integer.parseInt(width));
+ // check for orphaned header cells
+ it = availableCells.keySet().iterator();
+ while (it.hasNext()) {
+ String cid = (String) it.next();
+ if (!updated.contains(cid)) {
+ removeCell(cid);
+ it.remove();
+ }
}
- // TODO icon
+
}
public void enableColumn(String cid, int index) {
@@ -1243,6 +1264,10 @@ public class IScrollTable extends Composite implements Table, ScrollListener,
+ "px");
}
+ public void enableBrowserIntelligence() {
+ DOM.setStyleAttribute(hTableContainer, "width", "");
+ }
+
public void setHeaderCell(int index, HeaderCell cell) {
if (index < visibleCells.size()) {
// insert to right slot
@@ -1535,6 +1560,7 @@ public class IScrollTable extends Composite implements Table, ScrollListener,
}
public void renderRows(UIDL rowData, int firstIndex, int rows) {
+ // FIXME REVIEW
aligns = tHead.getColumnAlignments();
final Iterator it = rowData.getChildIterator();
if (firstIndex == lastRendered + 1) {
@@ -1555,9 +1581,7 @@ public class IScrollTable extends Composite implements Table, ScrollListener,
addRowBeforeFirstRendered(rowArray[i]);
firstRendered--;
}
- // } else if (firstIndex > lastRendered || firstIndex + rows <
- // firstRendered) {
- } else if (true) {
+ } else {
// completely new set of rows
while (lastRendered + 1 > firstRendered) {
unlinkRow(false);
@@ -1574,10 +1598,6 @@ public class IScrollTable extends Composite implements Table, ScrollListener,
lastRendered++;
}
fixSpacers();
- } else {
- // sorted or column reordering changed
- ApplicationConnection.getConsole().log(
- "Bad update" + firstIndex + "/" + rows);
}
}