aboutsummaryrefslogtreecommitdiffstats
path: root/src/com/itmill
diff options
context:
space:
mode:
authorMatti Tahvonen <matti.tahvonen@itmill.com>2009-04-23 19:58:08 +0000
committerMatti Tahvonen <matti.tahvonen@itmill.com>2009-04-23 19:58:08 +0000
commit25c279f2c112a2aa010e6c04d57373c700af634d (patch)
tree4f987b54c3c8ac7f91808ae35463ecd99439a6f9 /src/com/itmill
parentdc250f61b6b13db5ed67e08fceb720fe43ce44bd (diff)
downloadvaadin-framework-25c279f2c112a2aa010e6c04d57373c700af634d.tar.gz
vaadin-framework-25c279f2c112a2aa010e6c04d57373c700af634d.zip
more cleaning for scroll table. Fixed npe on empty table (regression). Now detects better default values for row height and column extra space with initially empty table.
svn changeset:7516/svn branch:6.0
Diffstat (limited to 'src/com/itmill')
-rw-r--r--src/com/itmill/toolkit/terminal/gwt/client/ui/IScrollTable.java78
1 files changed, 55 insertions, 23 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 f686f137ae..9b8766c68c 100644
--- a/src/com/itmill/toolkit/terminal/gwt/client/ui/IScrollTable.java
+++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/IScrollTable.java
@@ -2057,7 +2057,16 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener {
rowHeight = getTableHeight()
/ tBodyElement.getRows().getLength();
} else {
- return DEFAULT_ROW_HEIGHT;
+ if (isAttached()) {
+ // measure row height by adding a dummy row
+ IScrollTableRow scrollTableRow = new IScrollTableRow();
+ tBodyElement.appendChild(scrollTableRow.getElement());
+ getRowHeight(forceUpdate);
+ tBodyElement.removeChild(scrollTableRow.getElement());
+ } else {
+ // TODO investigate if this can never happen anymore
+ return DEFAULT_ROW_HEIGHT;
+ }
}
tBodyMeasurementsDone = true;
return rowHeight;
@@ -2071,15 +2080,21 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener {
/**
* Returns the width available for column content.
*
- * @param i
+ * @param columnIndex
* @return
*/
- public int getColWidth(int i) {
+ public int getColWidth(int columnIndex) {
if (tBodyMeasurementsDone) {
- final Element wrapper = (Element) tBodyElement
- .getFirstChildElement().getChildNodes().getItem(i)
- .getFirstChild();
- return wrapper.getOffsetWidth();
+ NodeList<TableRowElement> rows = tBodyElement.getRows();
+ if (rows.getLength() == 0) {
+ // no rows yet rendered
+ return 0;
+ } else {
+ com.google.gwt.dom.client.Element wrapperdiv = rows
+ .getItem(0).getCells().getItem(columnIndex)
+ .getFirstChildElement();
+ return wrapperdiv.getOffsetWidth();
+ }
} else {
return 0;
}
@@ -2111,7 +2126,6 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener {
}
private int cellExtraWidth = -1;
- private int cellMarginLeft = -1;
/**
* Method to return the space used for cell paddings + border.
@@ -2124,13 +2138,21 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener {
}
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();
+ NodeList<TableRowElement> rows = tBodyElement.getRows();
+ if (rows.getLength() == 0) {
+ /* need to temporary add empty row and detect */
+ IScrollTableRow scrollTableRow = new IScrollTableRow();
+ tBodyElement.appendChild(scrollTableRow.getElement());
+ detectExtrawidth();
+ tBodyElement.removeChild(scrollTableRow.getElement());
+ } else {
+ TableRowElement item = rows.getItem(0);
+ TableCellElement firstTD = item.getCells().getItem(0);
+ com.google.gwt.dom.client.Element wrapper = firstTD
+ .getFirstChildElement();
+ cellExtraWidth = firstTD.getOffsetWidth()
+ - wrapper.getOffsetWidth();
+ }
}
private void reLayoutComponents() {
@@ -2175,10 +2197,12 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener {
private List<UIDL> pendingComponentPaints;
private String[] actionKeys = null;
+ private TableRowElement rowElement;
private IScrollTableRow(int rowKey) {
this.rowKey = rowKey;
- setElement(DOM.createElement("tr"));
+ rowElement = Document.get().createTRElement();
+ setElement(rowElement);
DOM.sinkEvents(getElement(), Event.ONCLICK | Event.ONDBLCLICK
| Event.ONCONTEXTMENU);
}
@@ -2258,6 +2282,15 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener {
}
}
+ /**
+ * Add a dummy row, used for measurements if Table is empty.
+ */
+ public IScrollTableRow() {
+ this(0);
+ addStyleName(CLASSNAME + "-row");
+ addCell("_", 'b', "", true);
+ }
+
public void addCell(String text, char align, String style,
boolean textIsHTML) {
// String only content is optimized by not using Label widget
@@ -2545,14 +2578,13 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener {
private int getColIndexOf(Widget child) {
com.google.gwt.dom.client.Element widgetCell = child
.getElement().getParentElement().getParentElement();
- com.google.gwt.dom.client.Element td = getElement()
- .getFirstChildElement();
- int index = 0;
- while (td != widgetCell && td.getNextSiblingElement() != null) {
- index++;
- td = td.getNextSiblingElement();
+ NodeList<TableCellElement> cells = rowElement.getCells();
+ for (int i = 0; i < cells.getLength(); i++) {
+ if (cells.getItem(i) == widgetCell) {
+ return i;
+ }
}
- return index;
+ return -1;
}
public boolean hasChildComponent(Widget component) {