Browse Source

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 years ago
parent
commit
25c279f2c1
1 changed files with 55 additions and 23 deletions
  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 View File

rowHeight = getTableHeight() rowHeight = getTableHeight()
/ tBodyElement.getRows().getLength(); / tBodyElement.getRows().getLength();
} else { } 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; tBodyMeasurementsDone = true;
return rowHeight; return rowHeight;
/** /**
* Returns the width available for column content. * Returns the width available for column content.
* *
* @param i
* @param columnIndex
* @return * @return
*/ */
public int getColWidth(int i) {
public int getColWidth(int columnIndex) {
if (tBodyMeasurementsDone) { 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 { } else {
return 0; return 0;
} }
} }


private int cellExtraWidth = -1; private int cellExtraWidth = -1;
private int cellMarginLeft = -1;


/** /**
* Method to return the space used for cell paddings + border. * Method to return the space used for cell paddings + border.
} }


private void detectExtrawidth() { 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() { private void reLayoutComponents() {
private List<UIDL> pendingComponentPaints; private List<UIDL> pendingComponentPaints;


private String[] actionKeys = null; private String[] actionKeys = null;
private TableRowElement rowElement;


private IScrollTableRow(int rowKey) { private IScrollTableRow(int rowKey) {
this.rowKey = rowKey; this.rowKey = rowKey;
setElement(DOM.createElement("tr"));
rowElement = Document.get().createTRElement();
setElement(rowElement);
DOM.sinkEvents(getElement(), Event.ONCLICK | Event.ONDBLCLICK DOM.sinkEvents(getElement(), Event.ONCLICK | Event.ONDBLCLICK
| Event.ONCONTEXTMENU); | Event.ONCONTEXTMENU);
} }
} }
} }


/**
* 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, public void addCell(String text, char align, String style,
boolean textIsHTML) { boolean textIsHTML) {
// String only content is optimized by not using Label widget // String only content is optimized by not using Label widget
private int getColIndexOf(Widget child) { private int getColIndexOf(Widget child) {
com.google.gwt.dom.client.Element widgetCell = child com.google.gwt.dom.client.Element widgetCell = child
.getElement().getParentElement().getParentElement(); .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) { public boolean hasChildComponent(Widget component) {

Loading…
Cancel
Save