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.