Fix for Bug 188663 [Viewers] Virtual TreeViewer with columns: First and last row have wrong labels
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/AbstractTableViewer.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/AbstractTableViewer.java
index 54ac749..02d2339 100644
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/AbstractTableViewer.java
+++ b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/AbstractTableViewer.java
@@ -363,12 +363,27 @@
columnCount = 1;// If there are no columns do the first one
ViewerRow viewerRowFromItem = getViewerRowFromItem(item);
+
+ boolean isVirtual = (getControl().getStyle() & SWT.VIRTUAL) != 0;
+
+ // If the control is virtual, we cannot use the cached viewer row object. See bug 188663.
+ if (isVirtual) {
+ viewerRowFromItem = (ViewerRow) viewerRowFromItem.clone();
+ }
+
// Also enter loop if no columns added. See 1G9WWGZ: JFUIF:WINNT -
// TableViewer with 0 columns does not work
for (int column = 0; column < columnCount || column == 0; column++) {
ViewerColumn columnViewer = getViewerColumn(column);
- columnViewer.refresh(updateCell(viewerRowFromItem,
- column, element));
+ ViewerCell cellToUpdate = updateCell(viewerRowFromItem,
+ column, element);
+
+ // If the control is virtual, we cannot use the cached cell object. See bug 188663.
+ if (isVirtual) {
+ cellToUpdate = new ViewerCell(cellToUpdate.getViewerRow(), cellToUpdate.getColumnIndex(), element);
+ }
+
+ columnViewer.refresh(cellToUpdate);
// As it is possible for user code to run the event
// loop check here.
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/AbstractTreeViewer.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/AbstractTreeViewer.java
index 6de0f56..d0eafc0 100644
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/AbstractTreeViewer.java
+++ b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/AbstractTreeViewer.java
@@ -890,10 +890,25 @@
columnCount = 1;
ViewerRow viewerRowFromItem = getViewerRowFromItem(item);
+
+ boolean isVirtual = (getControl().getStyle() & SWT.VIRTUAL) != 0;
+
+ // If the control is virtual, we cannot use the cached viewer row object. See bug 188663.
+ if (isVirtual) {
+ viewerRowFromItem = (ViewerRow) viewerRowFromItem.clone();
+ }
+
for (int column = 0; column < columnCount; column++) {
ViewerColumn columnViewer = getViewerColumn(column);
- columnViewer.refresh(updateCell(viewerRowFromItem,
- column, element));
+ ViewerCell cellToUpdate = updateCell(viewerRowFromItem, column,
+ element);
+
+ // If the control is virtual, we cannot use the cached cell object. See bug 188663.
+ if (isVirtual) {
+ cellToUpdate = new ViewerCell(cellToUpdate.getViewerRow(), cellToUpdate.getColumnIndex(), element);
+ }
+
+ columnViewer.refresh(cellToUpdate);
// As it is possible for user code to run the event
// loop check here.