ソースを参照

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
tags/6.7.0.beta1
Matti Tahvonen 15年前
コミット
25c279f2c1
1個のファイルの変更55行の追加23行の削除
  1. 55
    23
      src/com/itmill/toolkit/terminal/gwt/client/ui/IScrollTable.java

+ 55
- 23
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) {

読み込み中…
キャンセル
保存