diff options
author | Matti Tahvonen <matti.tahvonen@itmill.com> | 2009-04-23 13:54:48 +0000 |
---|---|---|
committer | Matti Tahvonen <matti.tahvonen@itmill.com> | 2009-04-23 13:54:48 +0000 |
commit | dc250f61b6b13db5ed67e08fceb720fe43ce44bd (patch) | |
tree | d05c62d9ddcd15fe6217c4f525e6bf1a509980a9 /src/com/itmill | |
parent | bc493e0ae6e67af9b28d5ef459bea8fcae756079 (diff) | |
download | vaadin-framework-dc250f61b6b13db5ed67e08fceb720fe43ce44bd.tar.gz vaadin-framework-dc250f61b6b13db5ed67e08fceb720fe43ce44bd.zip |
major refactoring and cleaning related to column width handling in scrolltable. Hardcoded margins now removed and most things ought to be possible to define with CSS. fixes #2417
svn changeset:7512/svn branch:6.0
Diffstat (limited to 'src/com/itmill')
-rw-r--r-- | src/com/itmill/toolkit/terminal/gwt/client/ui/IScrollTable.java | 335 |
1 files changed, 182 insertions, 153 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 892c330b68..f686f137ae 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/IScrollTable.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/IScrollTable.java @@ -13,6 +13,11 @@ import java.util.List; import java.util.Set; import java.util.Vector; +import com.google.gwt.dom.client.Document; +import com.google.gwt.dom.client.NodeList; +import com.google.gwt.dom.client.TableCellElement; +import com.google.gwt.dom.client.TableRowElement; +import com.google.gwt.dom.client.TableSectionElement; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.DeferredCommand; @@ -137,10 +142,6 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener { */ boolean recalcWidths = false; - int scrollbarWidthReservedInColumn = -1; - int scrollbarWidthReserved = -1; - boolean relativeWidth = false; - private final ArrayList<Panel> lazyUnregistryBag = new ArrayList<Panel>(); private String height; private String width = ""; @@ -166,10 +167,6 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener { return; } - if (uidl.hasAttribute("width")) { - relativeWidth = uidl.getStringAttribute("width").endsWith("%"); - } - // we may have pending cache row fetch, cancel it. See #2136 rowRequestHandler.cancel(); @@ -559,21 +556,18 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener { while (headCells.hasNext()) { final HeaderCell hCell = (HeaderCell) headCells.next(); int w = hCell.getWidth(); - if (w > 0) { + if (hCell.isDefinedWidth()) { // server has defined column width explicitly totalExplicitColumnsWidths += w; } else { if (hCell.getExpandRatio() > 0) { expandRatioDivider += hCell.getExpandRatio(); - w = IScrollTableBody.CELL_EXTRA_WIDTH - + IScrollTableBody.CELL_CONTENT_PADDING; + w = 0; } else { // get and store greater of header width and column width, // and // store it as a minimumn natural col width - final int hw = hCell.getOffsetWidth(); - final int cw = tBody.getColWidth(i); - w = (hw > cw ? hw : cw) + IScrollTableBody.CELL_EXTRA_WIDTH; + w = hCell.getNaturalColumnWidth(i); } hCell.setNaturalMinimumColumnWidth(w); } @@ -587,6 +581,7 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener { // fix "natural" width if width not set if (width == null || "".equals(width)) { int w = total; + w += tBody.getCellExtraWidth() * visibleColOrder.length; w += getScrollbarWidth(); setContentWidth(w); } @@ -594,47 +589,23 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener { int availW = tBody.getAvailableWidth(); // Hey IE, are you really sure about this? availW = tBody.getAvailableWidth(); + availW -= tBody.getCellExtraWidth() * visibleColOrder.length; - // FIXME this may fail if pagelenth does not correlate well with actual - // height (via setHeight()) - boolean verticalScrollbarVisible = (pageLength < totalRows); - - if (verticalScrollbarVisible) { - // There will be a vertical scrollbar and its width is not included - // in availW - availW -= Util.getNativeScrollbarSize(); + if (!(height != null && !height.equals(""))) { + if (pageLength < totalRows) { + availW -= Util.getNativeScrollbarSize(); + } } boolean needsReLayout = false; if (availW > total) { // natural size is smaller than available space - int extraSpace = availW - total; - int totalWidthR = total - totalExplicitColumnsWidths; + final int extraSpace = availW - total; + final int totalWidthR = total - totalExplicitColumnsWidths; if (totalWidthR > 0) { needsReLayout = true; - /* - * If the table has a relative width and there is enough space - * for a scrollbar we reserve this in the last column - */ - int scrollbarWidth = getScrollbarWidth(); - scrollbarWidth = Util.getNativeScrollbarSize(); - if (!verticalScrollbarVisible && relativeWidth - && totalWidthR >= scrollbarWidth) { - - scrollbarWidthReserved = scrollbarWidth + 1; // - int columnindex = tHead.getVisibleCellCount() - 1; - widths[columnindex] += scrollbarWidthReserved; - HeaderCell headerCell = tHead.getHeaderCell(columnindex); - if (headerCell.getWidth() == -1) { - totalWidthR += scrollbarWidthReserved; - headerCell.setNaturalMinimumColumnWidth(headerCell - .getNaturalColumnWidth() - + scrollbarWidthReserved); - } - extraSpace -= scrollbarWidthReserved; - scrollbarWidthReservedInColumn = columnindex; - } + if (expandRatioDivider > 0) { // visible columns have some active expand ratios, excess // space is divided according to them @@ -658,7 +629,7 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener { i = 0; while (headCells.hasNext()) { HeaderCell hCell = (HeaderCell) headCells.next(); - if (hCell.getWidth() == -1) { + if (!hCell.isDefinedWidth()) { int w = widths[i]; final int newSpace = extraSpace * w / totalWidthR; w += newSpace; @@ -997,10 +968,6 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener { public class HeaderCell extends Widget { - private static final int DRAG_WIDGET_WIDTH = 4; - - private static final int MINIMUM_COL_WIDTH = 20; - Element td = DOM.createTD(); Element captionContainer = DOM.createDiv(); @@ -1027,7 +994,7 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener { private int width = -1; - private int naturalWidth = 0; + private int naturalWidth = -1; private char align = ALIGN_LEFT; @@ -1048,8 +1015,6 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener { DOM.setElementProperty(colResizeWidget, "className", CLASSNAME + "-resizer"); - DOM.setStyleAttribute(colResizeWidget, "width", DRAG_WIDGET_WIDTH - + "px"); DOM.sinkEvents(colResizeWidget, Event.MOUSEEVENTS); setText(headerText); @@ -1089,10 +1054,24 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener { DOM.setStyleAttribute(captionContainer, "width", ""); setWidth(""); } else { - DOM.setStyleAttribute(captionContainer, "width", (w - - DRAG_WIDGET_WIDTH - 4) - + "px"); - setWidth(w + "px"); + captionContainer.getStyle().setPropertyPx("width", w); + + /* + * if we already have tBody, set the header width properly, if + * not defer it. IE will fail with complex float in table header + * unless TD width is not explicitly set. + */ + if (tBody != null) { + int tdWidth = width + tBody.getCellExtraWidth(); + setWidth(tdWidth + "px"); + } else { + DeferredCommand.addCommand(new Command() { + public void execute() { + int tdWidth = width + tBody.getCellExtraWidth(); + setWidth(tdWidth + "px"); + } + }); + } } } @@ -1307,8 +1286,8 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener { } int newWidth = originalWidth + deltaX; - if (newWidth < MINIMUM_COL_WIDTH) { - newWidth = MINIMUM_COL_WIDTH; + if (newWidth < tBody.getCellExtraWidth()) { + newWidth = tBody.getCellExtraWidth(); } setColWidth(colIndex, newWidth, true); } @@ -1354,27 +1333,34 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener { * If column is resized by user or the width is defined by server the * actual width is returned. Else the natural min width is returned. * + * @param columnIndex + * column index hint, if -1 (unknown) it will be detected + * * @return */ - public int getNaturalColumnWidth() { + public int getNaturalColumnWidth(int columnIndex) { if (isDefinedWidth()) { return width; } else { - if (naturalWidth == 0) { + if (naturalWidth < 0) { // This is recently revealed column. Try to detect a proper // value (greater of header and data // cols) - final int hw = getOffsetWidth(); - int i = 0; - for (Iterator<Widget> it = tHead.iterator(); it.hasNext(); i++) { - if (it.next() == this) { - break; + + final int hw = ((Element) getElement().getLastChild()) + .getOffsetWidth() + + tBody.getCellExtraWidth(); + if (columnIndex < 0) { + columnIndex = 0; + for (Iterator<Widget> it = tHead.iterator(); it + .hasNext(); columnIndex++) { + if (it.next() == this) { + break; + } } } - final int cw = tBody.getColWidth(i); - naturalWidth = (hw > cw ? hw : cw) - + IScrollTableBody.CELL_EXTRA_WIDTH; - + final int cw = tBody.getColWidth(columnIndex); + naturalWidth = (hw > cw ? hw : cw); } return naturalWidth; } @@ -1428,6 +1414,10 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener { private int focusedSlot = -1; public TableHead() { + if (BrowserInfo.get().isIE()) { + table.setPropertyInt("cellSpacing", 0); + } + DOM.setStyleAttribute(hTableWrapper, "overflow", "hidden"); DOM.setElementProperty(hTableWrapper, "className", CLASSNAME + "-header"); @@ -1770,7 +1760,7 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener { * Returns column alignments for visible columns */ public char[] getColumnAlignments() { - final Iterator it = visibleCells.iterator(); + final Iterator<Widget> it = visibleCells.iterator(); final char[] aligns = new char[visibleCells.size()]; int colIndex = 0; while (it.hasNext()) { @@ -1789,29 +1779,25 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener { */ public class IScrollTableBody extends Panel { - public static final int CELL_EXTRA_WIDTH = 20; - public static final int DEFAULT_ROW_HEIGHT = 24; - /** - * Amount of padding inside one table cell (this is reduced from the - * "cellContent" element's width). You may override this in your own - * widgetset. - */ - public static final int CELL_CONTENT_PADDING = 8; - private int rowHeight = -1; private final List<Widget> renderedRows = new Vector<Widget>(); - private boolean initDone = false; + /** + * Due some optimizations row height measuring is deferred and initial + * set of rows is rendered detached. Flag set on when table body has + * been attached in dom and rowheight has been measured. + */ + private boolean tBodyMeasurementsDone = false; Element preSpacer = DOM.createDiv(); Element postSpacer = DOM.createDiv(); Element container = DOM.createDiv(); - Element tBody = DOM.createTBody(); + TableSectionElement tBodyElement = Document.get().createTBodyElement(); Element table = DOM.createTable(); private int firstRendered; @@ -1822,17 +1808,21 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener { IScrollTableBody() { constructDOM(); + setElement(container); } private void constructDOM() { DOM.setElementProperty(table, "className", CLASSNAME + "-table"); + if (BrowserInfo.get().isIE()) { + table.setPropertyInt("cellSpacing", 0); + } DOM.setElementProperty(preSpacer, "className", CLASSNAME + "-row-spacer"); DOM.setElementProperty(postSpacer, "className", CLASSNAME + "-row-spacer"); - DOM.appendChild(table, tBody); + table.appendChild(tBodyElement); DOM.appendChild(container, preSpacer); DOM.appendChild(container, table); DOM.appendChild(container, postSpacer); @@ -1840,13 +1830,13 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener { } public int getAvailableWidth() { - return DOM.getElementPropertyInt(preSpacer, "offsetWidth"); + return preSpacer.getOffsetWidth(); } public void renderInitialRows(UIDL rowData, int firstIndex, int rows) { firstRendered = firstIndex; lastRendered = firstIndex + rows - 1; - final Iterator it = rowData.getChildIterator(); + final Iterator<?> it = rowData.getChildIterator(); aligns = tHead.getColumnAlignments(); while (it.hasNext()) { final IScrollTableRow row = new IScrollTableRow((UIDL) it @@ -1861,7 +1851,7 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener { public void renderRows(UIDL rowData, int firstIndex, int rows) { // FIXME REVIEW aligns = tHead.getColumnAlignments(); - final Iterator it = rowData.getChildIterator(); + final Iterator<?> it = rowData.getChildIterator(); if (firstIndex == lastRendered + 1) { while (it.hasNext()) { final IScrollTableRow row = createRow((UIDL) it.next()); @@ -1915,7 +1905,7 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener { rowRequestHandler.setReqFirstRow(lastRendered + 1); rowRequestHandler.setReqRows(reactLastRow - lastRendered - 1); rowRequestHandler.deferRowFetch(1); - } else if (IScrollTable.this.tBody.getFirstRendered() > reactFirstRow) { + } else if (tBody.getFirstRendered() > reactFirstRow) { /* * Branch for fetching cache above visible area. * @@ -1946,9 +1936,9 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener { final Element cell = DOM.getChild(row.getElement(), i); final int w = IScrollTable.this .getColWidth(getColKeyByIndex(i)); - DOM.setStyleAttribute(DOM.getFirstChild(cell), "width", - (w - CELL_CONTENT_PADDING) + "px"); - DOM.setStyleAttribute(cell, "width", w + "px"); + cell.getFirstChildElement().getStyle() + .setPropertyPx("width", w); + cell.getStyle().setPropertyPx("width", w); } return row; } @@ -1966,7 +1956,8 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener { if (row.isSelected()) { row.addStyleName("i-selected"); } - DOM.insertChild(tBody, row.getElement(), 0); + tBodyElement.insertBefore(row.getElement(), tBodyElement + .getFirstChild()); adopt(row); renderedRows.add(0, row); } @@ -1985,7 +1976,7 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener { if (row.isSelected()) { row.addStyleName("i-selected"); } - DOM.appendChild(tBody, row.getElement()); + tBodyElement.appendChild(row.getElement()); adopt(row); renderedRows.add(row); } @@ -2012,7 +2003,7 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener { final IScrollTableRow toBeRemoved = (IScrollTableRow) renderedRows .get(index); lazyUnregistryBag.add(toBeRemoved); - DOM.removeChild(tBody, toBeRemoved.getElement()); + tBodyElement.removeChild(toBeRemoved.getElement()); orphan(toBeRemoved); renderedRows.remove(index); fixSpacers(); @@ -2058,15 +2049,17 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener { } public int getRowHeight(boolean forceUpdate) { - if (initDone && !forceUpdate) { + if (tBodyMeasurementsDone && !forceUpdate) { return rowHeight; } else { - if (DOM.getChildCount(tBody) > 0) { - rowHeight = getTableHeight() / DOM.getChildCount(tBody); + + if (tBodyElement.getRows().getLength() > 0) { + rowHeight = getTableHeight() + / tBodyElement.getRows().getLength(); } else { return DEFAULT_ROW_HEIGHT; } - initDone = true; + tBodyMeasurementsDone = true; return rowHeight; } } @@ -2075,26 +2068,71 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener { return table.getOffsetHeight(); } + /** + * Returns the width available for column content. + * + * @param i + * @return + */ public int getColWidth(int i) { - if (initDone) { - final Element e = DOM.getChild(DOM.getChild(tBody, 0), i); - return DOM.getElementPropertyInt(e, "offsetWidth"); + if (tBodyMeasurementsDone) { + final Element wrapper = (Element) tBodyElement + .getFirstChildElement().getChildNodes().getItem(i) + .getFirstChild(); + return wrapper.getOffsetWidth(); } else { return 0; } } + /** + * Sets the content width of a column. + * + * Due IE limitation, we must set the width to a wrapper elements inside + * table cells (with overflow hidden, which does not work on td + * elements). + * + * To get this work properly crossplatform, we will also set the width + * of td. + * + * @param colIndex + * @param w + */ public void setColWidth(int colIndex, int w) { - final int rows = DOM.getChildCount(tBody); + NodeList<TableRowElement> rows2 = tBodyElement.getRows(); + final int rows = rows2.getLength(); for (int i = 0; i < rows; i++) { - final Element cell = DOM.getChild(DOM.getChild(tBody, i), - colIndex); - DOM.setStyleAttribute(DOM.getFirstChild(cell), "width", - (w - CELL_CONTENT_PADDING) + "px"); - DOM.setStyleAttribute(cell, "width", w + "px"); + TableRowElement row = rows2.getItem(i); + TableCellElement cell = row.getCells().getItem(colIndex); + cell.getFirstChildElement().getStyle() + .setPropertyPx("width", w); + cell.getStyle().setPropertyPx("width", w); } } + private int cellExtraWidth = -1; + private int cellMarginLeft = -1; + + /** + * Method to return the space used for cell paddings + border. + */ + private int getCellExtraWidth() { + if (cellExtraWidth < 0) { + detectExtrawidth(); + } + return cellExtraWidth; + } + + private void detectExtrawidth() { + com.google.gwt.dom.client.Element firstTD = tBodyElement + .getFirstChildElement().getFirstChildElement(); + com.google.gwt.dom.client.Element wrapper = firstTD + .getFirstChildElement(); + cellExtraWidth = firstTD.getOffsetWidth() + - wrapper.getOffsetWidth(); + cellMarginLeft = wrapper.getOffsetLeft(); + } + private void reLayoutComponents() { for (Widget w : this) { IScrollTableRow r = (IScrollTableRow) w; @@ -2115,7 +2153,7 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener { public void moveCol(int oldIndex, int newIndex) { // loop all rows and move given index to its new place - final Iterator rows = iterator(); + final Iterator<?> rows = iterator(); while (rows.hasNext()) { final IScrollTableRow row = (IScrollTableRow) rows.next(); @@ -2131,7 +2169,7 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener { public class IScrollTableRow extends Panel implements ActionOwner, Container { - Vector childWidgets = new Vector(); + Vector<Widget> childWidgets = new Vector<Widget>(); private boolean selected = false; private final int rowKey; private List<UIDL> pendingComponentPaints; @@ -2193,7 +2231,7 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener { actionKeys = uidl.getStringArrayAttribute("al"); } - final Iterator cells = uidl.getChildIterator(); + final Iterator<?> cells = uidl.getChildIterator(); while (cells.hasNext()) { final Object cell = cells.next(); visibleColumnIndex++; @@ -2229,26 +2267,26 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener { if (style != null && !style.equals("")) { className += " " + CLASSNAME + "-cell-content-" + style; } - - DOM.setElementProperty(container, "className", className); + td.setClassName(className); + container.setClassName(CLASSNAME + "-cell-wrapper"); if (textIsHTML) { - DOM.setInnerHTML(container, text); + container.setInnerHTML(text); } else { - DOM.setInnerText(container, text); + container.setInnerText(text); } if (align != ALIGN_LEFT) { switch (align) { case ALIGN_CENTER: - DOM.setStyleAttribute(container, "textAlign", "center"); + container.getStyle().setProperty("textAlign", "center"); break; case ALIGN_RIGHT: default: - DOM.setStyleAttribute(container, "textAlign", "right"); + container.getStyle().setProperty("textAlign", "right"); break; } } - DOM.appendChild(td, container); - DOM.appendChild(getElement(), td); + td.appendChild(container); + getElement().appendChild(td); } public void addCell(Widget w, char align, String style) { @@ -2258,7 +2296,8 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener { if (style != null && !style.equals("")) { className += " " + CLASSNAME + "-cell-content-" + style; } - DOM.setElementProperty(container, "className", className); + td.setClassName(className); + container.setClassName(CLASSNAME + "-cell-wrapper"); // TODO most components work with this, but not all (e.g. // Select) // Old comment: make widget cells respect align. @@ -2266,25 +2305,25 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener { if (align != ALIGN_LEFT) { switch (align) { case ALIGN_CENTER: - DOM.setStyleAttribute(container, "textAlign", "center"); + container.getStyle().setProperty("textAlign", "center"); break; case ALIGN_RIGHT: default: - DOM.setStyleAttribute(container, "textAlign", "right"); + container.getStyle().setProperty("textAlign", "right"); break; } } - DOM.appendChild(td, container); - DOM.appendChild(getElement(), td); + td.appendChild(container); + getElement().appendChild(td); // ensure widget not attached to another element (possible tBody // change) w.removeFromParent(); - DOM.appendChild(container, w.getElement()); + container.appendChild(w.getElement()); adopt(w); childWidgets.add(w); } - public Iterator iterator() { + public Iterator<Widget> iterator() { return childWidgets.iterator(); } @@ -2491,14 +2530,13 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener { HeaderCell headerCell = tHead.getHeaderCell(i); if (headerCell != null) { if (initializedAndAttached) { - w = headerCell.getWidth() - CELL_CONTENT_PADDING; + w = headerCell.getWidth(); } else { // header offset width is not absolutely correct value, - // but - // a best guess (expecting similar content in all + // but a best guess (expecting similar content in all // columns -> // if one component is relative width so are others) - w = headerCell.getOffsetWidth() - CELL_CONTENT_PADDING; + w = headerCell.getOffsetWidth() - getCellExtraWidth(); } } return new RenderSpace(w, getRowHeight()); @@ -2573,19 +2611,7 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener { this.width = width; if (width != null && !"".equals(width)) { - int oldWidth = getOffsetWidth(); super.setWidth(width); - int newWidth = getOffsetWidth(); - - if (scrollbarWidthReservedInColumn != -1 && oldWidth > newWidth - && (oldWidth - newWidth) < scrollbarWidthReserved) { - int col = scrollbarWidthReservedInColumn; - String colKey = getColKeyByIndex(col); - setColWidth(scrollbarWidthReservedInColumn, getColWidth(colKey) - - (oldWidth - newWidth), false); - scrollbarWidthReservedInColumn = -1; - } - int innerPixels = getOffsetWidth() - getBorderWidth(); if (innerPixels < 0) { innerPixels = 0; @@ -2619,54 +2645,57 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener { int usedMinimumWidth = 0; int totalExplicitColumnsWidths = 0; float expandRatioDivider = 0; + int colIndex = 0; while (headCells.hasNext()) { final HeaderCell hCell = (HeaderCell) headCells.next(); - usedMinimumWidth += hCell.getNaturalColumnWidth(); if (hCell.isDefinedWidth()) { totalExplicitColumnsWidths += hCell.getWidth(); + usedMinimumWidth += hCell.getWidth(); } else { - totalExplicitColumnsWidths += hCell.getNaturalColumnWidth(); + usedMinimumWidth += hCell.getNaturalColumnWidth(colIndex); expandRatioDivider += hCell.getExpandRatio(); } + colIndex++; } int availW = tBody.getAvailableWidth(); // Hey IE, are you really sure about this? availW = tBody.getAvailableWidth(); + availW -= tBody.getCellExtraWidth() * visibleColOrder.length; int extraSpace = availW - usedMinimumWidth; if (extraSpace < 0) { extraSpace = 0; } - int totalWidthR = usedMinimumWidth - totalExplicitColumnsWidths; - if (totalWidthR < 0) { - totalWidthR = 0; - } + + int totalUndefinedNaturaWidths = usedMinimumWidth + - totalExplicitColumnsWidths; // we have some space that can be divided optimally HeaderCell hCell; - int i = 0; + colIndex = 0; headCells = tHead.iterator(); while (headCells.hasNext()) { hCell = (HeaderCell) headCells.next(); if (!hCell.isDefinedWidth()) { - int w = hCell.getNaturalColumnWidth(); + int w = hCell.getNaturalColumnWidth(colIndex); int newSpace; if (expandRatioDivider > 0) { // divide excess space by expand ratios newSpace = (int) (w + extraSpace * hCell.getExpandRatio() / expandRatioDivider); } else { - if (totalWidthR != 0) { + if (totalUndefinedNaturaWidths != 0) { // divide relatively to natural column widths - newSpace = w + extraSpace * w / totalWidthR; + newSpace = w + extraSpace * w + / totalUndefinedNaturaWidths; } else { newSpace = w; } } - setColWidth(i, newSpace, false); + setColWidth(colIndex, newSpace, false); } - i++; + colIndex++; } Util.runWebkitOverflowAutoFix(bodyContainer.getElement()); tBody.reLayoutComponents(); |