From 3d5174437d8b18db34587c64139ad6d08c32cdec Mon Sep 17 00:00:00 2001 From: Matti Tahvonen Date: Thu, 24 Jan 2008 14:24:57 +0000 Subject: [PATCH] fixes #1331 svn changeset:3653/svn branch:trunk --- .../terminal/gwt/client/ui/IScrollTable.java | 110 +++++++++++------- 1 file 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); } } -- 2.39.5