Browse Source

fixes #2859

svn changeset:7473/svn branch:6.0
tags/6.7.0.beta1
Matti Tahvonen 15 years ago
parent
commit
ffeb0373d9
1 changed files with 52 additions and 27 deletions
  1. 52
    27
      src/com/itmill/toolkit/terminal/gwt/client/ui/IScrollTable.java

+ 52
- 27
src/com/itmill/toolkit/terminal/gwt/client/ui/IScrollTable.java View File

@@ -21,7 +21,6 @@ import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.ScrollListener;
@@ -91,10 +90,15 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener {

private int selectMode = Table.SELECT_MODE_NONE;

private final HashSet selectedRowKeys = new HashSet();
private final HashSet<String> selectedRowKeys = new HashSet<String>();

private boolean initializedAndAttached = false;

/**
* Flag to indicate if a column width recalculation is needed due update.
*/
private boolean headerChangedDuringUpdate = false;

private final TableHead tHead = new TableHead();

private final ScrollPanel bodyContainer = new ScrollPanel();
@@ -114,7 +118,7 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener {
* This map contains captions and icon urls for actions like: * "33_c" ->
* "Edit" * "33_i" -> "http://dom.com/edit.png"
*/
private final HashMap actionMap = new HashMap();
private final HashMap<Object, String> actionMap = new HashMap<Object, String>();
private String[] visibleColOrder;
private boolean initialContentReceived = false;
private Element scrollPositionElement;
@@ -137,7 +141,7 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener {
int scrollbarWidthReserved = -1;
boolean relativeWidth = false;

private final ArrayList lazyUnregistryBag = new ArrayList();
private final ArrayList<Panel> lazyUnregistryBag = new ArrayList<Panel>();
private String height;
private String width = "";
private boolean rendering = false;
@@ -154,6 +158,7 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener {

}

@SuppressWarnings("unchecked")
public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
rendering = true;
if (client.updateComponent(this, uidl, true)) {
@@ -211,11 +216,11 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener {
}

if (uidl.hasVariable("selected")) {
final Set selectedKeys = uidl
final Set<String> selectedKeys = uidl
.getStringArrayVariableAsSet("selected");
selectedRowKeys.clear();
for (final Iterator it = selectedKeys.iterator(); it.hasNext();) {
selectedRowKeys.add(it.next());
for (String string : selectedKeys) {
selectedRowKeys.add(string);
}
}

@@ -260,6 +265,9 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener {
if (!recalcWidths && initializedAndAttached) {
updateBody(rowData, uidl.getIntAttribute("firstrow"), uidl
.getIntAttribute("rows"));
if (headerChangedDuringUpdate) {
lazyAdjustColumnWidths.schedule(1);
}
} else {
if (tBody != null) {
tBody.removeFromParent();
@@ -278,6 +286,7 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener {
hideScrollPositionAnnotation();
purgeUnregistryBag();
rendering = false;
headerChangedDuringUpdate = false;
}

/**
@@ -286,15 +295,15 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener {
* "subtreecaching" logic.
*/
private void purgeUnregistryBag() {
for (Iterator iterator = lazyUnregistryBag.iterator(); iterator
for (Iterator<Panel> iterator = lazyUnregistryBag.iterator(); iterator
.hasNext();) {
client.unregisterChildPaintables((HasWidgets) iterator.next());
client.unregisterChildPaintables(iterator.next());
}
lazyUnregistryBag.clear();
}

private void updateActionMap(UIDL c) {
final Iterator it = c.getChildIterator();
final Iterator<?> it = c.getChildIterator();
while (it.hasNext()) {
final UIDL action = (UIDL) it.next();
final String key = action.getStringAttribute("key");
@@ -310,11 +319,11 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener {
}

public String getActionCaption(String actionKey) {
return (String) actionMap.get(actionKey + "_c");
return actionMap.get(actionKey + "_c");
}

public String getActionIcon(String actionKey) {
return (String) actionMap.get(actionKey + "_i");
return actionMap.get(actionKey + "_i");
}

private void updateHeader(String[] strings) {
@@ -432,7 +441,7 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener {
}

private IScrollTableRow getRenderedRowByKey(String key) {
final Iterator it = tBody.iterator();
final Iterator<Widget> it = tBody.iterator();
IScrollTableRow r = null;
while (it.hasNext()) {
r = (IScrollTableRow) it.next();
@@ -1351,6 +1360,22 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener {
if (isDefinedWidth()) {
return width;
} else {
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 cw = tBody.getColWidth(i);
naturalWidth = (hw > cw ? hw : cw)
+ IScrollTableBody.CELL_EXTRA_WIDTH;

}
return naturalWidth;
}
}
@@ -1437,7 +1462,7 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener {
}

public void updateCellsFromUIDL(UIDL uidl) {
Iterator it = uidl.getChildIterator();
Iterator<?> it = uidl.getChildIterator();
HashSet<String> updated = new HashSet<String>();
updated.add("0");
while (it.hasNext()) {
@@ -1495,14 +1520,8 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener {
final HeaderCell c = getHeaderCell(cid);
if (!c.isEnabled() || getHeaderCell(index) != c) {
setHeaderCell(index, c);
if (c.getWidth() == -1) {
if (initializedAndAttached) {
// column is not drawn before,
// we will need a column width recalculation
initializedAndAttached = false;
initialContentReceived = false;
isNewBody = true;
}
if (initializedAndAttached) {
headerChangedDuringUpdate = true;
}
}
}
@@ -1668,6 +1687,7 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener {
} else {
tHead.removeCell(colKey);
collapsedColumns.add(colKey);
lazyAdjustColumnWidths.schedule(1);
}

// update variable to server
@@ -1717,7 +1737,7 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener {
for (i = 0; i < visibleColOrder.length; i++) {
cols[i] = visibleColOrder[i];
}
for (final Iterator it = collapsedColumns.iterator(); it
for (final Iterator<String> it = collapsedColumns.iterator(); it
.hasNext();) {
cols[i++] = it.next();
}
@@ -1782,7 +1802,7 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener {

private int rowHeight = -1;

private final List renderedRows = new Vector();
private final List<Widget> renderedRows = new Vector<Widget>();

private boolean initDone = false;

@@ -1970,7 +1990,7 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener {
renderedRows.add(row);
}

public Iterator iterator() {
public Iterator<Widget> iterator() {
return renderedRows.iterator();
}

@@ -2605,6 +2625,7 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener {
if (hCell.isDefinedWidth()) {
totalExplicitColumnsWidths += hCell.getWidth();
} else {
totalExplicitColumnsWidths += hCell.getNaturalColumnWidth();
expandRatioDivider += hCell.getExpandRatio();
}
}
@@ -2636,8 +2657,12 @@ public class IScrollTable extends FlowPanel implements Table, ScrollListener {
newSpace = (int) (w + extraSpace
* hCell.getExpandRatio() / expandRatioDivider);
} else {
// divide relatively to natural column widths
newSpace = w + extraSpace * w / totalWidthR;
if (totalWidthR != 0) {
// divide relatively to natural column widths
newSpace = w + extraSpace * w / totalWidthR;
} else {
newSpace = w;
}
}
setColWidth(i, newSpace, false);
}

Loading…
Cancel
Save