diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Table.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Table.java
index dfc03fb..eb17c58 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Table.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Table.java
@@ -6,7 +6,7 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/cpl-v10.html
  */
-
+ 
 import org.eclipse.swt.*;
 import org.eclipse.swt.internal.*;
 import org.eclipse.swt.internal.gtk.*;
@@ -38,15 +38,12 @@
  * </p>
  */
 public class Table extends Composite {
-	int modelHandle, fakeColumn, fakePixbufRenderer;
 	boolean selected;
 	int itemCount, columnCount, imageHeight;
 	TableItem [] items;
 	TableColumn [] columns;
+	int check, uncheck;
 	public static int MAX_COLUMNS = 32;
-	static int INTERNAL_COLUMNS = 2*MAX_COLUMNS + 1  // check
-	                                     + 2; // fg, bg
-	int selSize; int[] selIndices;
 
 /**
  * Constructs a new instance of this class given its parent
@@ -131,11 +128,85 @@
 
 public Point computeSize (int wHint, int hHint, boolean changed) {
 	checkWidget ();
-	Point size = computeNativeSize(handle, wHint, hHint, changed);
-	Rectangle trim = computeTrim (0, 0, size.x, size.y);
-	size.x = trim.width;
-	size.y = trim.height;
-	return size;
+	
+	/* Compute the height based on the items */
+	int height;
+	GtkStyle st = new GtkStyle ();
+	OS.memmove (st, OS.gtk_widget_get_style (handle));
+	if (hHint != SWT.DEFAULT) {
+		height = hHint;
+	} else {
+		height = getHeaderHeight();
+		height += OS.GTK_CLIST_ROW_HEIGHT (handle) * getItemCount();
+		height += 2 * st.ythickness;
+		int hBarHandle = OS.GTK_SCROLLED_WINDOW_HSCROLLBAR(scrolledHandle);
+		GtkRequisition requisition = new GtkRequisition();
+		OS.gtk_widget_size_request(hBarHandle, requisition);
+		height += requisition.height + OS.GTK_SCROLLED_WINDOW_SCROLLBAR_SPACING(scrolledHandle);
+	}
+	
+	/* Compute the width based on the items */
+	int width;
+	if (wHint != SWT.DEFAULT) {
+		width = wHint;
+	} else {
+		width = 2 * st.xthickness;
+		int count = getColumnCount();
+		for (int i = 0; i<count; i++) {
+			width += OS.gtk_clist_optimal_column_width(handle, i);
+		}
+		width += vScrollBarWidth();
+	}
+	
+	/* In no event will we request ourselves smaller than the minimum OS size */
+	Point minimum = computeNativeSize (scrolledHandle, wHint, hHint, changed);
+	width = Math.max(width, minimum.x);
+	height = Math.max(height, minimum.y);
+	
+	return new Point(width, height);
+}
+
+int createCheckPixmap(boolean checked) {
+	/*
+	 * The box will occupy the whole item width.
+	 */
+	int check_height = OS.GTK_CLIST_ROW_HEIGHT (handle) - 2;
+	int check_width = check_height;
+
+	GdkVisual visual = new GdkVisual();
+	OS.memmove(visual, OS.gdk_visual_get_system());
+	int pixmap = OS.gdk_pixmap_new(0, check_width, check_height, visual.depth);
+	
+	int gc = OS.gdk_gc_new(pixmap);
+	
+	GdkColor fgcolor = new GdkColor();
+	fgcolor.pixel = 0xFFFFFFFF;
+	fgcolor.red = (short) 0xFFFF;
+	fgcolor.green = (short) 0xFFFF;
+	fgcolor.blue = (short) 0xFFFF;
+	OS.gdk_gc_set_foreground(gc, fgcolor);
+	OS.gdk_draw_rectangle(pixmap, gc, 1, 0,0, check_width,check_height);
+
+	fgcolor = new GdkColor();
+	fgcolor.pixel = 0;
+	fgcolor.red = (short) 0;
+	fgcolor.green = (short) 0;
+	fgcolor.blue = (short) 0;
+	OS.gdk_gc_set_foreground(gc, fgcolor);
+	
+	OS.gdk_draw_line(pixmap, gc, 0,0, 0,check_height-1);
+	OS.gdk_draw_line(pixmap, gc, 0,check_height-1, check_width-1,check_height-1);
+	OS.gdk_draw_line(pixmap, gc, check_width-1,check_height-1, check_width-1,0);
+	OS.gdk_draw_line(pixmap, gc, check_width-1,0, 0,0);
+
+	/* now the cross check */
+	if (checked) {
+		OS.gdk_draw_line(pixmap, gc, 0,0, check_width-1,check_height-1);
+		OS.gdk_draw_line(pixmap, gc, 0,check_height-1, check_width-1,0);
+	}
+	
+	OS.g_object_unref(gc);
+	return pixmap;
 }
 
 void createHandle (int index) {
@@ -145,70 +216,42 @@
 	OS.gtk_fixed_set_has_window (fixedHandle, true);
 	scrolledHandle = OS.gtk_scrolled_window_new (0, 0);
 	if (scrolledHandle == 0) error (SWT.ERROR_NO_HANDLES);
-
-	int[] types = new int[INTERNAL_COLUMNS];
-	for (int j=0; j<MAX_COLUMNS; j++) {
-		types[j] = OS.G_TYPE_STRING();
-		types[j+MAX_COLUMNS] = OS.gdk_pixbuf_get_type();
-	}
-	types[2*MAX_COLUMNS] = OS.G_TYPE_BOOLEAN();
-	types[2*MAX_COLUMNS+1] = OS.GDK_TYPE_COLOR();
-	types[2*MAX_COLUMNS+2] = OS.GDK_TYPE_COLOR();
-	modelHandle = OS.gtk_list_store_newv(INTERNAL_COLUMNS, types);
-	if (modelHandle == 0) error (SWT.ERROR_NO_HANDLES);
-	handle = OS.gtk_tree_view_new_with_model(modelHandle);
+	handle = OS.gtk_clist_new (MAX_COLUMNS);
 	if (handle == 0) error (SWT.ERROR_NO_HANDLES);
-
 	int parentHandle = parent.parentingHandle ();
 	OS.gtk_container_add (parentHandle, fixedHandle);
 	OS.gtk_container_add (fixedHandle, scrolledHandle);
 	OS.gtk_container_add (scrolledHandle, handle);
-	int mode = (style & SWT.MULTI) != 0 ? OS.GTK_SELECTION_EXTENDED : OS.GTK_SELECTION_BROWSE;
-	int selectionObject = OS.gtk_tree_view_get_selection(handle);
-	OS.gtk_tree_selection_set_mode(selectionObject, mode);
-	OS.gtk_tree_view_set_headers_visible(handle, false);	
-	int hsp = (style & SWT.H_SCROLL) != 0 ? OS.GTK_POLICY_AUTOMATIC : OS.GTK_POLICY_NEVER;
-	int vsp = (style & SWT.V_SCROLL) != 0 ? OS.GTK_POLICY_AUTOMATIC : OS.GTK_POLICY_NEVER;
-	OS.gtk_scrolled_window_set_policy (scrolledHandle, hsp, vsp);
-	if ((style & SWT.BORDER) != 0) OS.gtk_scrolled_window_set_shadow_type (scrolledHandle, OS.GTK_SHADOW_ETCHED_IN);
 	OS.gtk_widget_show (fixedHandle);
 	OS.gtk_widget_show (scrolledHandle);
 	OS.gtk_widget_show (handle);
 
-	fakeColumn = _createColumnHandle(index, null);
-	OS.gtk_tree_view_insert_column(handle, fakeColumn, 0);
-}
+	/* Force row_height to be computed */
+	OS.gtk_clist_set_row_height (handle, 0);
+	
+	/* Single or Multiple Selection */
+	int mode = (style & SWT.MULTI) != 0 ? OS.GTK_SELECTION_EXTENDED : OS.GTK_SELECTION_BROWSE;
+	OS.gtk_clist_set_selection_mode (handle, mode);
 
-int _createColumnHandle(int index, TableColumn column) {
-	int columnHandle = OS.gtk_tree_view_column_new();
-	if (columnHandle == 0) error(SWT.ERROR_NO_HANDLES);
-	int textRenderer = OS.gtk_cell_renderer_text_new();
-	if (textRenderer == 0) error(SWT.ERROR_NO_HANDLES);
-	OS.gtk_tree_view_column_pack_end(columnHandle, textRenderer, true);
-	OS.gtk_tree_view_column_add_attribute(columnHandle, textRenderer, "text", index);
-	OS.gtk_tree_view_column_add_attribute(columnHandle, textRenderer, "foreground-gdk", 2*MAX_COLUMNS+1);
-	OS.gtk_tree_view_column_add_attribute(columnHandle, textRenderer, "background-gdk", 2*MAX_COLUMNS+2);
-	int pixbufRenderer = OS.gtk_cell_renderer_pixbuf_new();
-	if (pixbufRenderer == 0) error(SWT.ERROR_NO_HANDLES);
-	OS.gtk_tree_view_column_pack_end(columnHandle, pixbufRenderer, false);
-	OS.gtk_tree_view_column_add_attribute(columnHandle, pixbufRenderer, "pixbuf", index+MAX_COLUMNS);
-	if ((style & SWT.CHECK) != 0 && (index==0)) {
-		int checkRenderer = OS.gtk_cell_renderer_toggle_new();
-		if (checkRenderer == 0) error(SWT.ERROR_NO_HANDLES);
-		OS.gtk_tree_view_column_pack_end(columnHandle, checkRenderer, false);
-		OS.gtk_tree_view_column_add_attribute(columnHandle, checkRenderer, "active", 2*MAX_COLUMNS);
-		OS.g_signal_connect(checkRenderer, OS.toggled, getDisplay().toggleProc, columnHandle);
+	/* We fake the number of columns, because we have to know beforehand.
+	 * Initially all those fake columns are invisible
+	 */
+	byte [] buffer = new byte [1];
+	for (int i=1; i<MAX_COLUMNS; i++) {
+		OS.gtk_clist_set_column_title (handle, i, buffer);
+		OS.gtk_clist_set_column_visibility (handle, i, false);
 	}
-	OS.gtk_tree_view_column_set_resizable(columnHandle, true);
-	WidgetTable.put (columnHandle, this);
-	OS.gtk_tree_view_column_set_clickable(columnHandle, true);
-	OS.g_signal_connect(columnHandle, OS.clicked, getDisplay().windowProc2, SWT.Activate);	
-	if (column!=null) {
-		column.pixbufRendererHandle = pixbufRenderer;
-	} else {
-		fakePixbufRenderer = pixbufRenderer;
+
+	/* Scrolling policy */
+	int hsp = (style & SWT.H_SCROLL) != 0 ? OS.GTK_POLICY_AUTOMATIC : OS.GTK_POLICY_NEVER;
+	int vsp = (style & SWT.V_SCROLL) != 0 ? OS.GTK_POLICY_AUTOMATIC : OS.GTK_POLICY_NEVER;
+	OS.gtk_scrolled_window_set_policy (scrolledHandle, hsp, vsp);
+
+	if ((style & SWT.CHECK) != 0) {
+		OS.gtk_widget_realize (handle);
+		uncheck = createCheckPixmap (false);
+		check = createCheckPixmap (true);
 	}
-	return columnHandle;
 }
 
 void createItem (TableColumn column, int index) {
@@ -218,13 +261,7 @@
 		System.arraycopy (columns, 0, newColumns, 0, columns.length);
 		columns = newColumns;
 	}
-	if (fakeColumn != 0) {
-		column.handle = fakeColumn;
-		fakeColumn = 0;
-	} else {
-		column.handle = _createColumnHandle(index, column);
-		OS.gtk_tree_view_insert_column(handle, column.handle, index);
-	}
+	OS.gtk_clist_set_column_visibility (handle, index, true);
 	System.arraycopy (columns, index, columns, index + 1, columnCount++ - index);
 	columns [index] = column;
 }
@@ -236,9 +273,17 @@
 		System.arraycopy (items, 0, newItems, 0, items.length);
 		items = newItems;
 	}
-	item.handle = OS.g_malloc(OS.GtkTreeIter_sizeof());
-	if (item.handle==0) error(SWT.ERROR_NO_HANDLES);
-	OS.gtk_list_store_insert (modelHandle, item.handle, index);
+	int [] strings = new int [MAX_COLUMNS];
+	for (int i=0; i<strings.length; i++) strings [i] = 0;
+	blockSignal (handle, SWT.Selection);
+	int result = OS.gtk_clist_insert (handle, index, strings);
+	if ((style & SWT.SINGLE) != 0) {
+		if (itemCount == 0) OS.gtk_clist_unselect_row (handle, 0, 0);
+	}
+	unblockSignal (handle, SWT.Selection);
+	if ((style & SWT.CHECK) != 0) {
+		OS.gtk_clist_set_pixtext (handle, index, 0, new byte [1], (byte) 2, uncheck, 0);
+	}
 	System.arraycopy (items, index, items, index + 1, itemCount++ - index);
 	items [index] = item;
 }
@@ -260,11 +305,6 @@
 	return display.COLOR_LIST_FOREGROUND;
 }
 
-void deregister() {
-	super.deregister ();
-	WidgetTable.remove(OS.gtk_tree_view_get_selection(handle));
-}
-
 /**
  * Deselects the item at the given zero-relative index in the receiver.
  * If the item at the index was already deselected, it remains
@@ -279,10 +319,8 @@
  */
 public void deselect (int index) {
 	checkWidget();
-	if ((index<0) || (index>=items.length)) return;
 	blockSignal (handle, SWT.Selection);
-	int selection = OS.gtk_tree_view_get_selection(handle);
-	OS.gtk_tree_selection_unselect_iter(selection, items[index].handle);
+	OS.gtk_clist_unselect_row (handle, index, 0);
 	unblockSignal (handle, SWT.Selection);
 }
 
@@ -303,14 +341,11 @@
  */
 public void deselect (int start, int end) {
 	checkWidget();
-	// FIXME: use the native facility
-	int selection = OS.gtk_tree_view_get_selection(handle);
-	blockSignal(handle, SWT.Selection);
+	blockSignal (handle, SWT.Selection);
 	for (int i=start; i<=end; i++) {
-		if ((i<0) || (i>=items.length)) continue;
-		OS.gtk_tree_selection_unselect_iter(selection, items[i].handle);
+		OS.gtk_clist_unselect_row (handle, i, 0);
 	}
-	unblockSignal(handle, SWT.Selection);
+	unblockSignal (handle, SWT.Selection);
 }
 
 /**
@@ -333,13 +368,11 @@
 public void deselect (int [] indices) {
 	checkWidget();
 	if (indices == null) error (SWT.ERROR_NULL_ARGUMENT);
-	int selection = OS.gtk_tree_view_get_selection(handle);
-	blockSignal(handle, SWT.Selection);
+	blockSignal (handle, SWT.Selection);
 	for (int i=0; i<indices.length; i++) {
-		if ((i<0) || (i>=items.length)) continue;
-		OS.gtk_tree_selection_unselect_iter(selection, items[i].handle);
+		OS.gtk_clist_unselect_row (handle, indices [i], 0);
 	}
-	unblockSignal(handle, SWT.Selection);
+	unblockSignal (handle, SWT.Selection);
 }
 
 /**
@@ -352,31 +385,32 @@
  */
 public void deselectAll () {
 	checkWidget();
-	blockSignal(handle, SWT.Selection);
-	int selection = OS.gtk_tree_view_get_selection(handle);
-	OS.gtk_tree_selection_unselect_all(selection);
-	unblockSignal(handle, SWT.Selection);
+	blockSignal (handle, SWT.Selection);
+	if ((style & SWT.SINGLE) != 0) {
+		int selection = OS.GTK_CLIST_SELECTION (handle);
+		if (selection != 0 && OS.g_list_length (selection) > 0) {
+			int index = OS.GTK_CLIST_FOCUS_ROW (handle);
+			if (index == -1) index = 0;
+			OS.gtk_clist_select_row (handle, index, 0);
+			OS.gtk_clist_unselect_row (handle, index, 0);
+		}
+	} else {
+		OS.gtk_clist_unselect_all (handle);
+	}
+	unblockSignal (handle, SWT.Selection);
 }
 
 void destroyItem (TableColumn column) {
-/*	int index = 0;
+	int index = 0;
 	while (index < columnCount) {
 		if (columns [index] == column) break;
 		index++;
 	}
 	if (index == columnCount) return;
-	WidgetTable.remove(column.handle);
+	OS.gtk_clist_set_column_visibility (handle, index, false);
+	OS.gtk_clist_set_column_title (handle, index, new byte [1]);
 	System.arraycopy (columns, index + 1, columns, index, --columnCount - index);
 	columns [columnCount] = null;
-	if (columnCount==0) {
-		fakeColumn = column.handle;
-	} else {
-		for (int j=index+1; j<=columnCount; j++) {
-			
-		}
-		OS.gtk_tree_view_remove_column(handle, column.handle);
-		OS.g_object_unref(column.handle);
-	}*/
 }
 
 void destroyItem (TableItem item) {
@@ -386,20 +420,27 @@
 		index++;
 	}
 	if (index == itemCount) return;
-	blockSignal(handle, SWT.Selection);
-	OS.gtk_list_store_remove(modelHandle, item.handle);
-	OS.g_free(item.handle);
-	unblockSignal(handle, SWT.Selection);
+	blockSignal (handle, SWT.Selection);
+	if ((style & SWT.SINGLE) != 0) {
+		int selectionIndex = -1;
+		int selection = OS.GTK_CLIST_SELECTION (handle);
+		if (selection != 0 && OS.g_list_length (selection) != 0) {
+			selectionIndex = OS.g_list_nth_data (selection, 0);
+		}
+		OS.gtk_clist_remove (handle, index);
+		if (selectionIndex == -1 || selectionIndex == index) {
+			int focusIndex = OS.GTK_CLIST_FOCUS_ROW (handle);
+			if (focusIndex == -1) focusIndex = 0;
+			OS.gtk_clist_unselect_row (handle, focusIndex, 0);
+		}
+	} else {
+		OS.gtk_clist_remove (handle, index);
+	}
+	unblockSignal (handle, SWT.Selection);
 	System.arraycopy (items, index + 1, items, index, --itemCount - index);
 	items [itemCount] = null;
 }
 
-void destroyWidget() {
-	int model = modelHandle;
-	super.destroyWidget();
-	OS.g_object_unref(model);
-}
-
 GdkColor getBackgroundColor () {
 	return getBaseColor ();
 }
@@ -506,15 +547,9 @@
  */
 public int getHeaderHeight () {
 	checkWidget ();
-	if ( !OS.gtk_tree_view_get_headers_visible(handle) ) return 0;
-	OS.gtk_widget_realize(handle);
-	int fixedWindow = OS.GTK_WIDGET_WINDOW (fixedHandle);
-	int binWindow = OS.gtk_tree_view_get_bin_window(handle);
-	int[] binY = new int[1];
-	OS.gdk_window_get_origin(binWindow, null, binY);
-	int[] fixedY = new int[1];
-	OS.gdk_window_get_origin(fixedWindow, null, fixedY);
-	return binY[0]-fixedY[0];
+	if ( !OS.GTK_CLIST_SHOW_TITLES (handle) ) return 0;
+	OS.gtk_widget_size_request(handle, new GtkRequisition());
+	return OS.GTK_CLIST_COLUMN_TITLE_AREA_HEIGHT(handle);
 }
 
 /**
@@ -556,17 +591,14 @@
  */
 public TableItem getItem (Point pt) {
 	checkWidget();
-	int[] path = new int[1];
-	int[] column = new int[1];
-	int clientY = pt.y - getHeaderHeight();
-	if (!OS.gtk_tree_view_get_path_at_pos(handle, pt.x, clientY, path, column, null, null)) return null;
-	if (path[0]==0) return null;
-	int indexPtr = OS.gtk_tree_path_get_indices(path[0]);
-	OS.gtk_tree_path_free(path[0]);
-	if (indexPtr==0) return null;
-	int[] indices = new int[1];
-	OS.memmove(indices, indexPtr, 4);
-	return items [indices[0]];
+	int clientX = pt.x;
+	int clientY = pt.y - OS.GTK_CLIST_COLUMN_TITLE_AREA_HEIGHT (handle);
+	int [] row = new int [1], column = new int [1];
+	if (OS.gtk_clist_get_selection_info (handle, clientX, clientY, row, column) == 0) {
+		return null;
+	}
+	if (row [0] < 0 || row [0] >= itemCount) return null;
+	return items [row [0]];
 }
 
 /**
@@ -597,22 +629,7 @@
  */
 public int getItemHeight () {
 	checkWidget();
-	// FIXME
-	// I (bgs) am not sure what to do with this.
-	// In GTK2, rows may have different heights, so asking
-	// this question will only make sense given the item.
-	if (itemCount == 0) return 15;
-	OS.gtk_widget_realize(handle);
-	GdkRectangle rect = new GdkRectangle();
-	int path = OS.gtk_tree_path_new_from_string(Converter.wcsToMbcs(null, "0", true));
-	int columnPtr;
-	if (fakeColumn != 0) {
-		columnPtr = fakeColumn;
-	} else {
-		columnPtr = columns[0].handle;
-	}
-	OS.gtk_tree_view_get_cell_area(handle, path, columnPtr, rect);
-	return rect.height;
+	return OS.GTK_CLIST_ROW_HEIGHT (handle);
 }
 
 /**
@@ -656,13 +673,16 @@
  */
 public TableItem [] getSelection () {
 	checkWidget();
-	selSize = 0;
-	selIndices = new int[itemCount];
-	int selection = OS.gtk_tree_view_get_selection(handle);
-	OS.gtk_tree_selection_selected_foreach(selection, getDisplay().selectionIterProc, handle);
-	TableItem[] answer = new TableItem[selSize];
-	for (int i=0; i<selSize; i++) answer[i] = items[selIndices[i]];
-	return answer;
+	int list = OS.GTK_CLIST_SELECTION (handle);
+	if (list == 0) return new TableItem [0];
+	int length = OS.g_list_length (list);
+	TableItem [] result = new TableItem [length];
+	int [] buffer = new int [1];
+	for (int i=0; i<length; i++) {
+		int index = OS.g_list_nth_data (list, i);
+		result [i] = items [index];
+	}
+	return result;
 }
 
 /**
@@ -677,11 +697,9 @@
  */
 public int getSelectionCount () {
 	checkWidget();
-	selSize = 0;
-	selIndices = new int[itemCount];
-	int selection = OS.gtk_tree_view_get_selection(handle);
-	OS.gtk_tree_selection_selected_foreach(selection, getDisplay().selectionIterProc, handle);
-	return selSize;
+	int selection = OS.GTK_CLIST_SELECTION (handle);
+	if (selection == 0) return 0;
+	return OS.g_list_length (selection);
 }
 
 /**
@@ -697,12 +715,9 @@
  */
 public int getSelectionIndex () {
 	checkWidget();
-	selSize = 0;
-	selIndices = new int[itemCount];
-	int selection = OS.gtk_tree_view_get_selection(handle);
-	OS.gtk_tree_selection_selected_foreach(selection, getDisplay().selectionIterProc, handle);
-	if (selSize==0) return -1;
-	return selIndices[0];
+	int list = OS.GTK_CLIST_SELECTION (handle);
+	if (OS.g_list_length (list) == 0) return -1;
+	return OS.g_list_nth_data (list, 0);
 }
 
 /**
@@ -722,13 +737,13 @@
  */
 public int [] getSelectionIndices () {
 	checkWidget();
-	selSize = 0;
-	selIndices = new int[itemCount];
-	int selection = OS.gtk_tree_view_get_selection(handle);
-	OS.gtk_tree_selection_selected_foreach(selection, getDisplay().selectionIterProc, handle);
-	int[] answer = new int[selSize];
-	for (int i=0; i<selSize; i++) answer[i] = selIndices[i];
-	return answer;
+	int list = OS.GTK_CLIST_SELECTION (handle);
+	int length = OS.g_list_length (list);
+	int [] indices = new int [length];
+	for (int i=0; i<length; i++) {
+		indices [i] = OS.g_list_nth_data (list, i);
+	}
+	return indices;
 }
 
 /**
@@ -746,21 +761,26 @@
  */
 public boolean isSelected (int index) {
 	checkWidget();
-	int selection = OS.gtk_tree_view_get_selection(handle);
-	String pathString = Integer.toString(index);
-	int path = OS.gtk_tree_path_new_from_string(Converter.wcsToMbcs(null, pathString, true));
-	boolean answer = OS.gtk_tree_selection_path_is_selected(selection, path);
-	OS.gtk_tree_path_free(path);
-	return answer;
+	int list = OS.GTK_CLIST_SELECTION (handle);
+	int length = OS.g_list_length (list);
+	for (int i=0; i<length; i++) {
+		if (index == OS.g_list_nth_data (list, i)) return true;
+	}
+	return false;
 }
 
 int processSelection (int int0, int int1, int int2) {
-/*
 	int focus_row = OS.GTK_CLIST_FOCUS_ROW (handle);
 	if (int0 != focus_row) return 0;
 	if ((style & SWT.MULTI) != 0) selected = false;
-*/
 	int eventType = SWT.Selection;
+	if (int2 != 0) {
+		GdkEvent gdkEvent = new GdkEvent ();
+		OS.memmove (gdkEvent, int2, GdkEvent.sizeof);
+		if (gdkEvent.type == OS.GDK_2BUTTON_PRESS) {
+			eventType = SWT.DefaultSelection;
+		}
+	}
 	Event event = new Event ();
 	event.item = items [int0];
 	postEvent (eventType, event);
@@ -769,62 +789,184 @@
 
 int paintWindow () {
 	OS.gtk_widget_realize (handle);
-	return OS.gtk_tree_view_get_bin_window (handle);
+	return OS.GTK_CLIST_CLIST_WINDOW (handle);
 }
 
 int processActivate (int columnIndex, int arg1, int int2) {
-	if (fakeColumn != 0) return 0;
 	TableColumn column = columns [columnIndex];
 	if (column != null) column.postEvent (SWT.Selection);
 	return 0;
 }
 
-int processMouseDown (int int0, int int1, int int2) {
-	GdkEventButton e = new GdkEventButton ();
-	int indexPtr;
-	int[] path = new int[1];
-	int[] column = new int[1];
-	OS.memmove (e, int0, GdkEventButton.sizeof);
-	if ((e.type == OS.GDK_2BUTTON_PRESS) &&
-	     OS.gtk_tree_view_get_path_at_pos(handle, (int)e.x, (int)e.y, path, column, null, null) &&
-	     ((indexPtr = OS.gtk_tree_path_get_indices(path[0])) != 0)) {
-		int[] indices = new int[1];
-		OS.memmove(indices, indexPtr, 4);
-		Event event = new Event ();
-		event.item = items [indices[0]];
-		postEvent (SWT.DefaultSelection, event);
-		OS.gtk_tree_path_free(path[0]);
+int processEvent (int eventNumber, int int0, int int1, int int2) {
+	if (eventNumber == 0) {
+		GdkEvent gdkEvent = new GdkEvent ();
+		OS.memmove (gdkEvent, int0, GdkEvent.sizeof);
+		switch (gdkEvent.type) {
+			case OS.GDK_BUTTON_PRESS:
+			case OS.GDK_2BUTTON_PRESS: {
+				OS.GTK_CLIST_RESYNC_SELECTION (handle);
+				break;
+			}
+			case OS.GDK_BUTTON_RELEASE: {
+				/*
+				* Feature in GTK.  When an item is reselected, GTK
+				* does not issue notification.  The fix is to detect
+				* that the mouse was released over a selected item when
+				* no selection signal was set and issue a fake selection
+				* event.
+				*/
+				if ((style & SWT.MULTI) != 0) {
+					if (selected) {
+						double[] px = new double [1], py = new double [1];
+						OS.gdk_event_get_coords (int0, px, py);
+						int x = (int) (px[0]), y = (int) (py[0]);
+						int [] row = new int [1], column = new int [1];
+						if (OS.gtk_clist_get_selection_info (handle, x, y, row, column) != 0) {
+							int list = OS.GTK_CLIST_SELECTION (handle);
+							if (list != 0) {
+								int length = OS.g_list_length (list);
+								for (int i=0; i<length; i++) {
+									if (row [0] == OS.g_list_nth_data (list, i)) {
+										Event event = new Event ();
+										event.item = items [row [0]];
+										postEvent (SWT.Selection, event);
+									}
+								}
+							}
+						}
+					}
+					selected = false;
+				}
+				break;
+			}
+			case OS.GDK_FOCUS_CHANGE: {
+				/*
+				* Bug in GTK.  When an application opens a new modal top level
+				* shell from inside the "select_row" signal, the GtkCList does not get the
+				* mouse up and does not release grabs.  The fix is to release the grabs
+				* when focus is lost.
+				*/
+				GdkEventFocus focusEvent = new GdkEventFocus ();
+				OS.memmove (focusEvent, int0, GdkEventFocus.sizeof);
+				if (focusEvent.in == 0) {
+					if (OS.gtk_grab_get_current () == handle) {
+						OS.gtk_grab_remove (handle);
+						OS.gdk_pointer_ungrab (OS.GDK_CURRENT_TIME);
+					}
+				}
+				break;
+			}
+		}
+		return 1;
 	}
-	int headerHeight = getHeaderHeight();
-	e.y += headerHeight;
-	OS.memmove(int0, e, GdkEventButton.sizeof);
-	int result = super.processMouseDown(int0, int1, int2);
-	e.y -= headerHeight;
-	OS.memmove(int0, e, GdkEventButton.sizeof);
+	return super.processEvent (eventNumber, int0, int1, int2);
+}
+
+int processKeyDown (int callData, int arg1, int int2) {
+	int result = super.processKeyDown (callData, arg1, int2);
+	if (result != 0) return result;
+
+	/*
+	* Feature in GTK.  When an item is reselected using
+	* the space bar or default selected using the return key,
+	* GTK does not issue notification. The fix is to ignore the
+	* notification that is sent by GTK and look for the space key.
+	*/
+	GdkEventKey keyEvent = new GdkEventKey ();
+	OS.memmove (keyEvent, callData, GdkEventKey.sizeof);
+	int key = keyEvent.keyval;
+	switch (key) {
+		case OS.GDK_Return:
+		case OS.GDK_KP_Enter:
+		case OS.GDK_space: {
+			int focus_row = OS.GTK_CLIST_FOCUS_ROW (handle);
+			if (focus_row != -1) {
+				TableItem item =  items [focus_row];
+				if (key == OS.GDK_space && (style & SWT.CHECK) != 0) {
+					if (item != null) item.setChecked (!item.getChecked ());
+				}
+				Event event = new Event ();
+				event.item = item;
+				int type = key == OS.GDK_space ? SWT.Selection : SWT.DefaultSelection;
+				postEvent (type, event);
+				if (key == OS.GDK_space && (style & SWT.CHECK) != 0) {
+					event = new Event ();
+					event.item = item;
+					event.detail = SWT.CHECK;
+					postEvent (SWT.Selection, event);
+				}
+			}
+			break;
+		}
+	}
+	return result;
+}
+
+int processMouseDown (int int0, int int1, int int2) {
+	int result = 0;
+	int headerHeight = OS.GTK_CLIST_COLUMN_TITLE_AREA_HEIGHT (handle);
+	if (headerHeight <= 0) {
+		result = super.processMouseDown (int0, int1, int2);
+	} else {
+		GdkEventButton e = new GdkEventButton ();
+		OS.memmove (e, int0, GdkEventButton.sizeof);
+		double y_back = e.y;  
+		e.y += headerHeight;
+		OS.memmove (int0, e, GdkEventButton.sizeof);
+		result = super.processMouseDown (int0, int1, int2);
+		e.y = y_back;
+		OS.memmove (int0, e, GdkEventButton.sizeof);
+	}
+	if ((style & SWT.MULTI) != 0) selected = true;
+	if ((style & SWT.CHECK) != 0) {
+		double [] px = new double [1], py = new double [1];
+		OS.gdk_event_get_coords (int0, px, py);
+		int x = (int) (px [0]);
+		int y = (int) (py [0]);
+		if (y > 0) {
+			int [] row = new int [1], column = new int [1];
+			if (OS.gtk_clist_get_selection_info (handle, x, y, row, column) != 0) {	
+				int nX = OS.GTK_CLIST_HOFFSET (handle) + 4;
+				int nY = OS.GTK_CLIST_VOFFSET (handle) + (OS.GTK_CLIST_ROW_HEIGHT (handle) + 1) * row [0] + 2;
+				int [] check_width = new int [1], check_height = new int [1];
+				OS.gdk_drawable_get_size (check, check_width, check_height);
+				if (nX <= x && x <= nX + check_width [0]) {
+					if (nY <= y && y <= nY + check_height [0]) {
+						TableItem item = items [row [0]];
+						byte [] spacing = new byte [1];
+						int [] pixmap = new int [1], mask = new int [1];
+						OS.gtk_clist_get_pixtext (handle, row [0], 0, null, spacing, pixmap, mask);
+						byte [] text = Converter.wcsToMbcs (null, item.getText (), true);
+						pixmap [0] = pixmap [0] == check ? uncheck : check;
+						OS.gtk_clist_set_pixtext (handle, row [0], 0, text, spacing [0], pixmap [0], mask [0]);
+						Event event = new Event ();
+						event.detail = SWT.CHECK;
+						event.item = item;
+						postEvent (SWT.Selection, event);
+					}
+				}
+			}
+		}
+	}
 	return result;
 }
 
 int processMouseUp (int int0, int int1, int int2) {
-	GdkEventButton e = new GdkEventButton ();
-	OS.memmove (e, int0, GdkEventButton.sizeof);
-	int headerHeight = getHeaderHeight();
-	e.y += headerHeight;
-	OS.memmove(int0, e, GdkEventButton.sizeof);
-	int result = super.processMouseUp(int0, int1, int2);
-	e.y -= headerHeight;
-	OS.memmove(int0, e, GdkEventButton.sizeof);
-	return result;
-}
-
-int processMouseMove (int int0, int int1, int int2) {
-	GdkEventButton e = new GdkEventButton ();
-	OS.memmove (e, int0, GdkEventButton.sizeof);
-	int headerHeight = getHeaderHeight();
-	e.y += headerHeight;
-	OS.memmove(int0, e, GdkEventButton.sizeof);
-	int result = super.processMouseMove(int0, int1, int2);
-	e.y -= headerHeight;
-	OS.memmove(int0, e, GdkEventButton.sizeof);
+	int result = 0;
+	int headerHeight = OS.GTK_CLIST_COLUMN_TITLE_AREA_HEIGHT (handle);
+	if (headerHeight <= 0) {
+		result = super.processMouseUp (int0, int1, int2);
+	} else { 
+		GdkEventButton e = new GdkEventButton ();
+		OS.memmove (e, int0, GdkEventButton.sizeof);
+		double y_back = e.y;  
+		e.y += headerHeight;
+		OS.memmove (int0, e, GdkEventButton.sizeof);
+		result = super.processMouseUp (int0, int1, int2);
+		e.y = y_back;
+		OS.memmove (int0, e, GdkEventButton.sizeof);
+	}
 	return result;
 }
 
@@ -842,25 +984,21 @@
  */
 public int getTopIndex () {
 	checkWidget();
-	int[] path = new int[1];
-	int[] column = new int[1];
-	if (!OS.gtk_tree_view_get_path_at_pos(handle, 1, 1, path, column, null, null)) return 0;
-	if (path[0]==0) return -1;
-	int indexPtr = OS.gtk_tree_path_get_indices(path[0]);
-	OS.gtk_tree_path_free(path[0]);
-	if (indexPtr==0) return -1;
-	int[] indices = new int[1];
-	OS.memmove(indices, indexPtr, 4);
-	return indices[0];
+	int voffset = OS.GTK_CLIST_VOFFSET (handle);
+	int row_height = OS.GTK_CLIST_ROW_HEIGHT (handle);
+	return -voffset / (row_height + 1);
 }
 
 void hookEvents () {
 	//TO DO - get rid of enter/exit for mouse crossing border
 	super.hookEvents ();
 	Display display = getDisplay ();
-	int selection = OS.gtk_tree_view_get_selection(handle);
-	OS.g_signal_connect(selection, OS.changed, display.windowProc2, SWT.Selection);
-	OS.g_signal_connect (handle, OS.event_after, display.windowProc3, 0);
+	int windowProc3 = display.windowProc3;
+	int windowProc5 = display.windowProc5;
+	OS.g_signal_connect (handle, OS.select_row, windowProc5, SWT.Selection);
+	OS.g_signal_connect (handle, OS.unselect_row, windowProc5, SWT.Selection);
+	OS.g_signal_connect (handle, OS.click_column, windowProc3, SWT.Activate);
+	OS.g_signal_connect (handle, OS.event_after, windowProc3, 0);
 }
 
 /**
@@ -915,11 +1053,6 @@
 	return -1;
 }
 
-void register () {
-	super.register ();
-	WidgetTable.put (OS.gtk_tree_view_get_selection(handle), this);
-}
-
 void releaseWidget () {
 	for (int i=0; i<columnCount; i++) {
 		TableColumn column = columns [i];
@@ -931,6 +1064,9 @@
 		if (!item.isDisposed ()) item.releaseResources ();
 	}
 	items = null;
+	if (check != 0) OS.g_object_unref (check);
+	if (uncheck != 0) OS.g_object_unref (uncheck);
+	check = uncheck = 0;
 	super.releaseWidget ();
 }
 
@@ -954,9 +1090,8 @@
 public void remove (int index) {
 	checkWidget();
 	if (!(0 <= index && index <= itemCount)) error (SWT.ERROR_ITEM_NOT_REMOVED);
-	TableItem item = items[index];
-	OS.gtk_list_store_remove(modelHandle, item.handle);
-	OS.g_free(item.handle);
+	OS.gtk_clist_remove (handle, index);
+	TableItem item = items [index];
 	System.arraycopy (items, index + 1, items, index, --itemCount - index);
 	items [itemCount] = null;
 	item.releaseResources ();
@@ -985,7 +1120,7 @@
 	checkWidget();
 	int index = end;
 	while (index >= start) {
-		OS.gtk_list_store_remove(modelHandle, items[index].handle);
+		OS.gtk_clist_remove (handle, index);
 		items [index].releaseResources ();
 		--index;
 	}
@@ -1023,7 +1158,7 @@
 	for (int i=0; i<newIndices.length; i++) {
 		int index = newIndices [i];
 		if (index != last || i == 0) {
-			OS.gtk_list_store_remove(modelHandle, items[index].handle);
+			OS.gtk_clist_remove (handle, index);
 			// BUG - disposed callback could remove an item
 			items [index].releaseResources ();
 			System.arraycopy (items, index + 1, items, index, --itemCount - index);
@@ -1043,7 +1178,7 @@
  */
 public void removeAll () {
 	checkWidget();
-	OS.gtk_list_store_clear (modelHandle);
+	OS.gtk_clist_clear (handle);
 	int index = itemCount - 1;
 	while (index >= 0) {
 		items [index].releaseResources ();
@@ -1092,11 +1227,9 @@
  */
 public void select (int index) {
 	checkWidget();
-	if ((index<0) || (index>=items.length)) return;
-	blockSignal(handle, SWT.Selection);
-	int selection = OS.gtk_tree_view_get_selection(handle);
-	OS.gtk_tree_selection_select_iter(selection, items[index].handle);
-	unblockSignal(handle, SWT.Selection);
+	blockSignal (handle, SWT.Selection);
+	OS.gtk_clist_select_row (handle, index, 0);
+	unblockSignal (handle, SWT.Selection);
 }
 
 /**
@@ -1115,14 +1248,11 @@
  */
 public void select (int start, int end) {
 	checkWidget();
-	// FIXME, use the native mechanism
-	blockSignal(handle, SWT.Selection);
-	int selection = OS.gtk_tree_view_get_selection(handle);
+	blockSignal (handle, SWT.Selection);
 	for (int i=start; i<=end; i++) {
-		if ((i<0) || (i>=items.length)) continue;
-		OS.gtk_tree_selection_select_iter(selection, items[i].handle);
+		OS.gtk_clist_select_row (handle, i, 0);
 	}
-	unblockSignal(handle, SWT.Selection);
+	unblockSignal (handle, SWT.Selection);
 }
 
 /**
@@ -1145,13 +1275,11 @@
 public void select (int [] indices) {
 	checkWidget();
 	if (indices == null) error (SWT.ERROR_NULL_ARGUMENT);
-	blockSignal(handle, SWT.Selection);
-	int selection = OS.gtk_tree_view_get_selection(handle);
+	blockSignal (handle, SWT.Selection);
 	for (int i=0; i<indices.length; i++) {
-		if ((i<0) || (i>=items.length)) continue;
-		OS.gtk_tree_selection_select_iter(selection, items[i].handle);
+		OS.gtk_clist_select_row (handle, indices [i], 0);
 	}
-	unblockSignal(handle, SWT.Selection);
+	unblockSignal (handle, SWT.Selection);
 }
 
 /**
@@ -1164,36 +1292,9 @@
  */
 public void selectAll () {
 	checkWidget();
-	blockSignal(handle, SWT.Selection);
-	int selection = OS.gtk_tree_view_get_selection(handle);
-	OS.gtk_tree_selection_select_all(selection);
-	unblockSignal(handle, SWT.Selection);
-}
-
-int processSelectionIter(int path, int iter, int data) {
-	int indexPtr = OS.gtk_tree_path_get_indices(path);
-	if (indexPtr!=0) {
-		int[] indices = new int[1];
-		OS.memmove(indices, indexPtr, 4);
-		selIndices[selSize++] = indices[0];
-	}
-	return 0;
-}
-
-int processToggle(int path, int handle) {
-	int length = OS.strlen(path);
-	byte[] pathBytes = new byte[length+1];
-	OS.memmove(pathBytes, path, length);
-	char[] pathChars = Converter.mbcsToWcs(null, pathBytes);
-	int itemIndex = Integer.parseInt(new String(pathChars));
-	boolean checked = items[itemIndex].getChecked();
-	checked = !checked;
-	items[itemIndex].setChecked(checked);
-	Event event = new Event();
-	event.detail = SWT.CHECK;
-	event.item = items[itemIndex];
-	postEvent(SWT.Selection, event);
-	return 0;
+	blockSignal (handle, SWT.Selection);
+	OS.gtk_clist_select_all (handle);
+	unblockSignal (handle, SWT.Selection);
 }
 
 void setBackgroundColor (GdkColor color) {
@@ -1221,12 +1322,18 @@
  */
 public boolean getHeaderVisible () {
 	checkWidget();
-	return OS.gtk_tree_view_get_headers_visible(handle);
+	return OS.GTK_CLIST_SHOW_TITLES (handle);
 }
 
-void setForegroundColor (GdkColor color) {
-	super.setForegroundColor (color);
-	OS.gtk_widget_modify_text (handle, 0, color);
+void setFontDescription (int font) {
+	super.setFontDescription (font);
+	if (imageHeight != 0) {
+		OS.gtk_widget_realize (handle);
+		OS.gtk_clist_set_row_height (handle, 0);
+		if (imageHeight > OS.GTK_CLIST_ROW_HEIGHT (handle)) {
+			OS.gtk_clist_set_row_height (handle, imageHeight);
+		}
+	}
 }
 
 /**
@@ -1247,7 +1354,11 @@
  */
 public void setHeaderVisible (boolean show) {
 	checkWidget ();
-	OS.gtk_tree_view_set_headers_visible(handle, show);
+	if (show) {
+		OS.gtk_clist_column_titles_show (handle);
+	} else {
+		OS.gtk_clist_column_titles_hide (handle);
+	}
 }
 
 /**
@@ -1307,19 +1418,19 @@
  * @see Table#select(int)
  */
 public void setSelection (int index) {
+	checkWidget ();
 	deselectAll ();
 	select (index);
+	showSelection ();
 }
 
 public void setRedraw (boolean redraw) {
 	checkWidget ();
-	// FIXME
-/*	if (redraw) {
+	if (redraw) {
 		OS.gtk_clist_thaw (handle);
 	} else {
 		OS.gtk_clist_freeze (handle);
 	}
-*/
 }
 
 /**
@@ -1338,8 +1449,10 @@
  * @see Table#select(int,int)
  */
 public void setSelection (int start, int end) {
+	checkWidget();
 	deselectAll ();
 	select (start, end);
+	showSelection ();
 }
 
 /**
@@ -1360,8 +1473,11 @@
  * @see Table#select(int[])
  */
 public void setSelection (int [] indices) {
+	checkWidget();
+	if (indices == null) error (SWT.ERROR_NULL_ARGUMENT);
 	deselectAll ();
 	select (indices);
+	showSelection ();
 }
 
 /**
@@ -1394,6 +1510,7 @@
 		int index = indexOf (items [i]);
 		if (index != -1) select (index);
 	}
+	showSelection ();
 }
 
 /**
@@ -1409,16 +1526,10 @@
  * </ul>
  */
 public void setTopIndex (int index) {
-	// FIXME - For some reason, sometimes the tree scrolls to the wrong place
 	checkWidget();
-	if (!(0 <= index && index < itemCount)) return;
-	int path = OS.gtk_tree_model_get_path(modelHandle, items[index].handle);
-	OS.gtk_tree_view_scroll_to_cell(handle,
-	                                path,
-	                                0,    // no h-scroll, please
-	                                true, // align at the top
-	                                0, 0);
-	OS.gtk_tree_path_free(path);
+	blockSignal (handle, SWT.Selection);
+	OS.gtk_clist_moveto (handle, index, 0, 0.0f, 0.0f);
+	unblockSignal (handle, SWT.Selection);
 }
 
 /**
@@ -1440,9 +1551,7 @@
  * @see Table#showSelection()
  */
 public void showItem (TableItem item) {
-	int path = OS.gtk_tree_model_get_path(modelHandle, item.handle);
-	OS.gtk_tree_view_scroll_to_cell(handle, path, 0, false, 0, 0);
-	OS.gtk_tree_path_free(path);
+//	error(SWT.ERROR_NOT_IMPLEMENTED);
 }
 
 /**
@@ -1462,10 +1571,7 @@
  */
 public void showSelection () {
 	checkWidget();
-	if (getSelectionCount()==0) return;
-	TableItem item = getSelection()[0];
-	int path = OS.gtk_tree_model_get_path(modelHandle, item.handle);
-	OS.gtk_tree_view_scroll_to_cell(handle, path, 0, false, 0, 0);
-	OS.gtk_tree_path_free(path);
+	setTopIndex (getSelectionIndex ());
 }
+
 }
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TableColumn.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TableColumn.java
index 4e42799..9605434 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TableColumn.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TableColumn.java
@@ -1,18 +1,18 @@
-package org.eclipse.swt.widgets;
-
-/*
+package org.eclipse.swt.widgets;
+
+/*
  * Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
  * This file is made available under the terms of the Common Public License v1.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.internal.*;
-import org.eclipse.swt.internal.gtk.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.events.*;
-
+ * http://www.eclipse.org/legal/cpl-v10.html
+ */
+
+import org.eclipse.swt.*;
+import org.eclipse.swt.internal.*;
+import org.eclipse.swt.internal.gtk.*;
+import org.eclipse.swt.graphics.*;
+import org.eclipse.swt.events.*;
+
 /**
  * Instances of this class represent a column in a table widget.
  *  <dl>
@@ -27,10 +27,8 @@
  * IMPORTANT: This class is <em>not</em> intended to be subclassed.
  * </p>
  */
-public class TableColumn extends Item {
-	Table parent;
-	int pixbufRendererHandle;
-
+public class TableColumn extends Item {
+	Table parent;
 /**
  * Constructs a new instance of this class given its parent
  * (which must be a <code>Table</code>) and a style value
@@ -63,11 +61,11 @@
  * @see Widget#checkSubclass
  * @see Widget#getStyle
  */
-public TableColumn (Table parent, int style) {
-	super (parent, checkStyle (style));
-	this.parent = parent;
-	createWidget (parent.getColumnCount ());
-}
+public TableColumn (Table parent, int style) {
+	super (parent, checkStyle (style));
+	this.parent = parent;
+	createWidget (parent.getColumnCount ());
+}
 /**
  * Constructs a new instance of this class given its parent
  * (which must be a <code>Table</code>), a style value
@@ -101,11 +99,11 @@
  * @see Widget#checkSubclass
  * @see Widget#getStyle
  */
-public TableColumn (Table parent, int style, int index) {
-	super (parent, checkStyle (style));
-	this.parent = parent;
-	createWidget (index);
-}
+public TableColumn (Table parent, int style, int index) {
+	super (parent, checkStyle (style));
+	this.parent = parent;
+	createWidget (index);
+}
 /**
  * Adds the listener to the collection of listeners who will
  * be notified when the control is moved or resized, by sending
@@ -125,51 +123,51 @@
  * @see ControlListener
  * @see #removeControlListener
  */
-public void addControlListener(ControlListener listener) {
-	checkWidget();
-	if (listener == null) error (SWT.ERROR_NULL_ARGUMENT);
-	TypedListener typedListener = new TypedListener (listener);
-	addListener (SWT.Resize,typedListener);
-	addListener (SWT.Move,typedListener);
-}
-/**
- * Adds the listener to the collection of listeners who will
- * be notified when the control is selected, by sending
- * it one of the messages defined in the <code>SelectionListener</code>
- * interface.
- * <p>
- * <code>widgetSelected</code> is called when the column header is selected.
- * <code>widgetDefaultSelected</code> is not called.
- * </p>
- *
- * @param listener the listener which should be notified
- *
- * @exception IllegalArgumentException <ul>
- *    <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
- * </ul>
- * @exception SWTException <ul>
- *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- * </ul>
- *
- * @see SelectionListener
- * @see #removeSelectionListener
- * @see SelectionEvent
+public void addControlListener(ControlListener listener) {
+	checkWidget();
+	if (listener == null) error (SWT.ERROR_NULL_ARGUMENT);
+	TypedListener typedListener = new TypedListener (listener);
+	addListener (SWT.Resize,typedListener);
+	addListener (SWT.Move,typedListener);
+}
+/**
+ * Adds the listener to the collection of listeners who will
+ * be notified when the control is selected, by sending
+ * it one of the messages defined in the <code>SelectionListener</code>
+ * interface.
+ * <p>
+ * <code>widgetSelected</code> is called when the column header is selected.
+ * <code>widgetDefaultSelected</code> is not called.
+ * </p>
+ *
+ * @param listener the listener which should be notified
+ *
+ * @exception IllegalArgumentException <ul>
+ *    <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
+ * </ul>
+ * @exception SWTException <ul>
+ *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ *
+ * @see SelectionListener
+ * @see #removeSelectionListener
+ * @see SelectionEvent
  */
-public void addSelectionListener (SelectionListener listener) {
-	checkWidget();
-	if (listener == null) error (SWT.ERROR_NULL_ARGUMENT);
-	TypedListener typedListener = new TypedListener (listener);
-	addListener (SWT.Selection,typedListener);
-	addListener (SWT.DefaultSelection,typedListener);
-}
-static int checkStyle (int style) {
-	return checkBits (style, SWT.LEFT, SWT.CENTER, SWT.RIGHT, 0, 0, 0);
-}
-void createWidget (int index) {
-	parent.createItem (this, index);
-	text = "";
-}
+public void addSelectionListener (SelectionListener listener) {
+	checkWidget();
+	if (listener == null) error (SWT.ERROR_NULL_ARGUMENT);
+	TypedListener typedListener = new TypedListener (listener);
+	addListener (SWT.Selection,typedListener);
+	addListener (SWT.DefaultSelection,typedListener);
+}
+static int checkStyle (int style) {
+	return checkBits (style, SWT.LEFT, SWT.CENTER, SWT.RIGHT, 0, 0, 0);
+}
+void createWidget (int index) {
+	parent.createItem (this, index);
+	text = "";
+}
 /**
  * Returns a value which describes the position of the
  * text or image in the receiver. The value will be one of
@@ -182,18 +180,18 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public int getAlignment () {
-	checkWidget();
-	if ((style & SWT.LEFT) != 0) return SWT.LEFT;
-	if ((style & SWT.CENTER) != 0) return SWT.CENTER;
-	if ((style & SWT.RIGHT) != 0) return SWT.RIGHT;
-	return SWT.LEFT;
-}
-public Display getDisplay () {
-	Table parent = this.parent;
-	if (parent == null) error (SWT.ERROR_WIDGET_DISPOSED);
-	return parent.getDisplay ();
-}
+public int getAlignment () {
+	checkWidget();
+	if ((style & SWT.LEFT) != 0) return SWT.LEFT;
+	if ((style & SWT.CENTER) != 0) return SWT.CENTER;
+	if ((style & SWT.RIGHT) != 0) return SWT.RIGHT;
+	return SWT.LEFT;
+}
+public Display getDisplay () {
+	Table parent = this.parent;
+	if (parent == null) error (SWT.ERROR_WIDGET_DISPOSED);
+	return parent.getDisplay ();
+}
 /**
  * Returns the receiver's parent, which must be a <code>Table</code>.
  *
@@ -204,10 +202,10 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public Table getParent () {
-	checkWidget();
-	return parent;
-}
+public Table getParent () {
+	checkWidget();
+	return parent;
+}
 /**
  * Gets the resizable attribute. A column that is
  * not resizable cannot be dragged by the user but
@@ -220,11 +218,15 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public boolean getResizable () {
-	checkWidget();
-	return OS.gtk_tree_view_column_get_resizable(handle);
-}
-
+public boolean getResizable () {
+	checkWidget();
+	int index = parent.indexOf (this);
+	if (index == -1) return false;
+	int chandle=OS.GTK_CLIST_COLUMN (parent.handle);
+	GtkCListColumn gtkcolumn = new GtkCListColumn ();
+	OS.memmove(gtkcolumn, chandle+index*GtkCListColumn.sizeof, GtkCListColumn.sizeof);
+	return (gtkcolumn.resizeable == 1) ? true : false;
+}
 /**
  * Gets the width of the receiver.
  *
@@ -235,11 +237,15 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public int getWidth () {
-	checkWidget();
-	return OS.gtk_tree_view_column_get_width(handle);
-}
-
+public int getWidth () {
+	checkWidget();
+	int index = parent.indexOf (this);
+	if (index == -1) return 0;
+	int chandle=OS.GTK_CLIST_COLUMN (parent.handle);
+	GtkCListColumn gtkcolumn = new GtkCListColumn();
+	OS.memmove(gtkcolumn, chandle+index*GtkCListColumn.sizeof, GtkCListColumn.sizeof);
+	return gtkcolumn.width;
+}
 /**
  * Causes the receiver to be resized to its preferred size.
  * For a composite, this involves computing the preferred size
@@ -251,24 +257,23 @@
  * </ul>
  *
  */
-public void pack () {
-	checkWidget();
-	if (getResizable()) {
-		// Feature in GTK: AUTOSIZE and RESIZABLE are mutually exclusive
-		OS.gtk_tree_view_column_set_sizing(handle, OS.GTK_TREE_VIEW_COLUMN_GROW_ONLY);
-	} else {
-		OS.gtk_tree_view_column_set_sizing(handle, OS.GTK_TREE_VIEW_COLUMN_AUTOSIZE);
-	}
-}
-void releaseChild () {
-	super.releaseChild ();
-	parent.destroyItem (this);
-}
-void releaseWidget () {
-	super.releaseWidget ();
-	text = null;
-	parent = null;
-}
+public void pack () {
+	checkWidget();
+	int index = parent.indexOf (this);
+	if (index == -1) return;
+	int clist = parent.handle;
+	int width = OS.gtk_clist_optimal_column_width (clist, index);
+	OS.gtk_clist_set_column_width (clist, index, width);	
+}
+void releaseChild () {
+	super.releaseChild ();
+	parent.destroyItem (this);
+}
+void releaseWidget () {
+	super.releaseWidget ();
+	text = null;
+	parent = null;
+}
 /**
  * Removes the listener from the collection of listeners who will
  * be notified when the control is moved or resized.
@@ -286,13 +291,13 @@
  * @see ControlListener
  * @see #addControlListener
  */
-public void removeControlListener (ControlListener listener) {
-	checkWidget();
-	if (listener == null) error (SWT.ERROR_NULL_ARGUMENT);
-	if (eventTable == null) return;
-	eventTable.unhook (SWT.Move, listener);
-	eventTable.unhook (SWT.Resize, listener);
-}
+public void removeControlListener (ControlListener listener) {
+	checkWidget();
+	if (listener == null) error (SWT.ERROR_NULL_ARGUMENT);
+	if (eventTable == null) return;
+	eventTable.unhook (SWT.Move, listener);
+	eventTable.unhook (SWT.Resize, listener);
+}
 /**
  * Removes the listener from the collection of listeners who will
  * be notified when the control is selected.
@@ -310,13 +315,13 @@
  * @see SelectionListener
  * @see #addSelectionListener
  */
-public void removeSelectionListener(SelectionListener listener) {
-	checkWidget();
-	if (listener == null) error (SWT.ERROR_NULL_ARGUMENT);
-	if (eventTable == null) return;
-	eventTable.unhook (SWT.Selection, listener);
-	eventTable.unhook (SWT.DefaultSelection,listener);	
-}
+public void removeSelectionListener(SelectionListener listener) {
+	checkWidget();
+	if (listener == null) error (SWT.ERROR_NULL_ARGUMENT);
+	if (eventTable == null) return;
+	eventTable.unhook (SWT.Selection, listener);
+	eventTable.unhook (SWT.DefaultSelection,listener);	
+}
 /**
  * Controls how text and images will be displayed in the receiver.
  * The argument should be one of <code>LEFT</code>, <code>RIGHT</code>
@@ -329,12 +334,20 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public void setAlignment (int alignment) {
-	checkWidget();
-	if ((alignment & (SWT.LEFT | SWT.RIGHT | SWT.CENTER)) == 0) return;
-	// FIXME
-	// NOT IMPLEMENTED
-}
+public void setAlignment (int alignment) {
+	checkWidget();
+	if ((alignment & (SWT.LEFT | SWT.RIGHT | SWT.CENTER)) == 0) return;
+	int index = parent.indexOf (this);
+	if (index == -1 || index == 0) return;
+	int table = parent.handle;
+	style &= ~(SWT.LEFT | SWT.RIGHT | SWT.CENTER);
+	style |= alignment & (SWT.LEFT | SWT.RIGHT | SWT.CENTER);
+	int justification = 0;
+	if ((style & SWT.LEFT) == SWT.LEFT) justification |= OS.GTK_JUSTIFY_LEFT;
+	if ((style & SWT.CENTER) == SWT.CENTER) justification |= OS.GTK_JUSTIFY_CENTER;
+	if ((style & SWT.RIGHT) == SWT.RIGHT) justification |= OS.GTK_JUSTIFY_RIGHT;
+	OS.gtk_clist_set_column_justification (table, index, justification);
+}
 /**
  * Sets the resizable attribute.  A column that is
  * not resizable cannot be dragged by the user but
@@ -347,27 +360,35 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public void setResizable (boolean resizable) {
-	checkWidget();
-	OS.gtk_tree_view_column_set_resizable(handle, resizable);
-}
-
-public void setText (String string) {
-	checkWidget();
-	if (string == null) error (SWT.ERROR_NULL_ARGUMENT);
-	super.setText (string);
-	byte[] bytes = Converter.wcsToMbcs(null, string, true);
-	OS.gtk_tree_view_column_set_title(handle, bytes);
-	/*
-	* Bug in GTK.  When a table column is hidden and then shown,
-	* and new text is set into the column, the widget that shows the
-	* text is not resized to show the new text.  The fix is to force the
-	* table header to resize the widget.
-	* 
-	* FIXME - Must investigate what is the story with the new Table.
-	*/
-}
-
+public void setResizable (boolean resizable) {
+	checkWidget();
+	int index = parent.indexOf (this);
+	if (index == -1) return;
+	int table = parent.handle;
+	OS.gtk_clist_set_column_resizeable (table, index, resizable);
+}
+public void setText (String string) {
+	if (!isValidThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS);
+	if (!isValidWidget ()) error (SWT.ERROR_WIDGET_DISPOSED);
+	if (string == null) error (SWT.ERROR_NULL_ARGUMENT);
+	super.setText (string);
+	int index = parent.indexOf (this);
+	if (index == -1) return;
+	int table = parent.handle;
+	byte [] buffer = Converter.wcsToMbcs (null, string, true);
+	OS.gtk_clist_set_column_title (table, index, buffer);
+	/*
+	* Bug in GTK.  When a table column is hidden and then shown,
+	* and new text is set into the column, the widget that shows the
+	* text is not resized to show the new text.  The fix is to force the
+	* table header to resize the widget.
+	*/
+	int headerHandle = OS.gtk_clist_get_column_widget (table, index);
+	if (headerHandle != 0) {
+		GtkRequisition requisition = new GtkRequisition ();
+		OS.gtk_widget_size_request (headerHandle, requisition);
+	}
+}
 /**
  * Sets the width of the receiver.
  *
@@ -378,9 +399,12 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public void setWidth (int width) {
-	checkWidget();
-	OS.gtk_tree_view_column_set_sizing(handle, OS.GTK_TREE_VIEW_COLUMN_FIXED);
-	OS.gtk_tree_view_column_set_fixed_width(handle, width);
-}
-}
+public void setWidth (int width) {
+	checkWidget();
+	int index = parent.indexOf (this);
+	if (index == -1) return;
+	int table = parent.handle;
+	OS.gtk_clist_set_column_width (table, index, width);
+}
+
+}
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TableItem.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TableItem.java
index 4dd438d..0b634d4 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TableItem.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TableItem.java
@@ -1,17 +1,18 @@
-package org.eclipse.swt.widgets;
-
-/*
+package org.eclipse.swt.widgets;
+
+/*
  * Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
  * This file is made available under the terms of the Common Public License v1.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.internal.*;
-import org.eclipse.swt.internal.gtk.*;
-import org.eclipse.swt.graphics.*;
-
+ * http://www.eclipse.org/legal/cpl-v10.html
+ */
+
+import org.eclipse.swt.*;
+import org.eclipse.swt.internal.*;
+import org.eclipse.swt.internal.gtk.*;
+import org.eclipse.swt.graphics.*;
+import org.eclipse.swt.graphics.*;
+
 /**
  * Instances of this class represent a selectable user interface object
  * that represents an item in a table.
@@ -25,9 +26,9 @@
  * IMPORTANT: This class is <em>not</em> intended to be subclassed.
  * </p>
  */
-public class TableItem extends Item {
-	Table parent;
-	
+public class TableItem extends Item {
+	Table parent;
+	
 /**
  * Constructs a new instance of this class given its parent
  * (which must be a <code>Table</code>), a style value
@@ -59,12 +60,12 @@
  * @see Widget#checkSubclass
  * @see Widget#getStyle
  */
-public TableItem (Table parent, int style, int index) {
-	super (parent, style);
-	this.parent = parent;
-	parent.createItem (this, index);
-}
-
+public TableItem (Table parent, int style, int index) {
+	super (parent, style);
+	this.parent = parent;
+	parent.createItem (this, index);
+}
+
 /**
  * Constructs a new instance of this class given its parent
  * (which must be a <code>Table</code>) and a style value
@@ -95,126 +96,127 @@
  * @see Widget#checkSubclass
  * @see Widget#getStyle
  */
-public TableItem (Table parent, int style) {
-	super (parent, style);
-	this.parent = parent;
-	parent.createItem (this, parent.getItemCount ());
-}
-
-/**
- * Returns the receiver's background color.
- *
- * @return the background color
- *
- * @exception SWTException <ul>
- *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- * </ul>
- * 
- * @since 2.0
- * 
+public TableItem (Table parent, int style) {
+	super (parent, style);
+	this.parent = parent;
+	parent.createItem (this, parent.getItemCount ());
+}
+
+/**
+ * Returns the receiver's background color.
+ *
+ * @return the background color
+ *
+ * @exception SWTException <ul>
+ *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ * 
+ * @since 2.0
+ * 
  */
-public Color getBackground () {
-	checkWidget ();
-	int[] ptr = new int[1];
-	OS.gtk_tree_model_get(parent.modelHandle, handle, 2*parent.MAX_COLUMNS+2, ptr, -1);
-	if (ptr[0]==0) return parent.getBackground();
-	GdkColor gdkColor = new GdkColor();
-	OS.memmove(gdkColor, ptr[0], GdkColor.sizeof);
-	return Color.gtk_new(getDisplay(), gdkColor);
-}
-
-/**
- * Returns a rectangle describing the receiver's size and location
- * relative to its parent at a column in the table.
- *
- * @param index the index that specifies the column
- * @return the receiver's bounding column rectangle
- *
- * @exception SWTException <ul>
- *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- * </ul>
+public Color getBackground () {
+	checkWidget ();
+	Table parent = getParent();
+	return parent.getBackground();
+}
+
+/**
+ * Returns a rectangle describing the receiver's size and location
+ * relative to its parent at a column in the table.
+ *
+ * @param index the index that specifies the column
+ * @return the receiver's bounding column rectangle
+ *
+ * @exception SWTException <ul>
+ *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
  */
-public Rectangle getBounds (int index) {
-	checkWidget();
-	GdkRectangle rect = new GdkRectangle();
-	String pathString = Integer.toString(parent.indexOf(this));
-	int path = OS.gtk_tree_path_new_from_string(Converter.wcsToMbcs(null, pathString, true));
-	int columnPtr = parent.columns[index].handle;
-	OS.gtk_tree_view_get_cell_area(parent.handle, path, columnPtr, rect);
-	int headerHeight = parent.getHeaderHeight();
-	return new Rectangle (rect.x, rect.y+headerHeight, rect.width, rect.height);
-}
-
-/**
- * Returns <code>true</code> if the receiver is checked,
- * and false otherwise.  When the parent does not have
- * the <code>CHECK style, return false.
- *
- * @return the checked state of the checkbox
- *
- * @exception SWTException <ul>
- *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- * </ul>
+public Rectangle getBounds (int index) {
+	checkWidget();
+	int CELL_SPACING = 1;
+	int clist = parent.handle;
+	int columnHandle = OS.GTK_CLIST_COLUMN (clist);
+	columnHandle= columnHandle + index * GtkCListColumn.sizeof;
+	GtkCListColumn column = new GtkCListColumn ();
+	OS.memmove (column, columnHandle, GtkCListColumn.sizeof);
+	int x = column.area_x + OS.GTK_CLIST_HOFFSET (clist);
+	int width = column.area_width;
+	int height = OS.GTK_CLIST_ROW_HEIGHT (clist);
+	int row = parent.indexOf (this);
+	int headerHeight = OS.GTK_CLIST_COLUMN_TITLE_AREA_HEIGHT (clist);
+	int y = headerHeight + OS.GTK_CLIST_VOFFSET (clist) + (height + CELL_SPACING) * row + 3;
+	return new Rectangle (x, y, width, height);
+}
+
+/**
+ * Returns <code>true</code> if the receiver is checked,
+ * and false otherwise.  When the parent does not have
+ * the <code>CHECK style, return false.
+ *
+ * @return the checked state of the checkbox
+ *
+ * @exception SWTException <ul>
+ *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
  */
-public boolean getChecked () {
-	checkWidget();
-	if ((parent.style & SWT.CHECK) == 0) return false;
-	int[] ptr = new int[1];
-	OS.gtk_tree_model_get(parent.modelHandle, handle, 2*parent.MAX_COLUMNS, ptr, -1);
-	return ptr[0] != 0;
-}
-
-public Display getDisplay () {
-	Table parent = this.parent;
-	if (parent == null) error (SWT.ERROR_WIDGET_DISPOSED);
-	return parent.getDisplay ();
-}
-
-/**
- * Returns the foreground color that the receiver will use to draw.
- *
- * @return the receiver's foreground color
- *
- * @exception SWTException <ul>
- *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- * </ul>
- * 
- * @since 2.0
- * 
+public boolean getChecked () {
+	checkWidget();
+	if ((parent.style & SWT.CHECK) == 0) return false;
+	int row = parent.indexOf (this);
+	if (row == -1) return false;
+	int clist = parent.handle;
+	int [] pixmap = new int [1];
+	OS.gtk_clist_get_pixtext (clist, row, 0, null, null, pixmap, null);
+	return pixmap [0] == parent.check;
+}
+
+public Display getDisplay () {
+	Table parent = this.parent;
+	if (parent == null) error (SWT.ERROR_WIDGET_DISPOSED);
+	return parent.getDisplay ();
+}
+
+/**
+ * Returns the foreground color that the receiver will use to draw.
+ *
+ * @return the receiver's foreground color
+ *
+ * @exception SWTException <ul>
+ *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ * 
+ * @since 2.0
+ * 
  */
-public Color getForeground () {
-	checkWidget ();
-	int[] ptr = new int[1];
-	OS.gtk_tree_model_get(parent.modelHandle, handle, 2*parent.MAX_COLUMNS+1, ptr, -1);
-	if (ptr[0]==0) return parent.getForeground();
-	GdkColor gdkColor = new GdkColor();
-	OS.memmove(gdkColor, ptr[0], GdkColor.sizeof);
-	return Color.gtk_new(getDisplay(), gdkColor);
-}
-
-/**
- * Returns <code>true</code> if the receiver is grayed,
- * and false otherwise. When the parent does not have
- * the <code>CHECK</code> style, return false.
- *
- * @return the grayed state of the checkbox
- *
- * @exception SWTException <ul>
- *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- * </ul>
+public Color getForeground () {
+	checkWidget ();
+	Table parent = getParent();
+	return parent.getForeground();
+}
+
+/**
+ * Returns <code>true</code> if the receiver is grayed,
+ * and false otherwise. When the parent does not have
+ * the <code>CHECK</code> style, return false.
+ *
+ * @return the grayed state of the checkbox
+ *
+ * @exception SWTException <ul>
+ *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
  */
-public boolean getGrayed () {
-	checkWidget ();
-	//NOT DONE
-	if ((parent.style & SWT.CHECK) == 0) return false;
-	return false;
-}
-
+public boolean getGrayed () {
+	checkWidget ();
+	//NOT DONE
+	if ((parent.style & SWT.CHECK) == 0) return false;
+	return false;
+}
+
 /**
  * Returns the image stored at the given column index in the receiver,
  * or null if the image has not been set or if the column does not exist.
@@ -227,23 +229,19 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public Image getImage (int index) {
-	checkWidget ();
-	// FIXME - not implemented
-	return null;
-
-/*	if (index == 0) return getImage ();
-	int row = parent.indexOf (this);
-	if (row == -1) return null;
-	int clist = parent.handle;
-	int [] pixmap = new int [1], mask = new int [1];
-	OS.gtk_clist_get_pixtext (clist, row, index, null, null, pixmap, null);
-	if (pixmap [0] == 0) return null;
-	Display display = getDisplay ();
-	return Image.gtk_new (display, mask [0] == 0 ? SWT.BITMAP : SWT.ICON, pixmap [0], mask [0]);
-	*/
-}
-
+public Image getImage (int index) {
+	checkWidget ();
+	if (index == 0) return getImage ();
+	int row = parent.indexOf (this);
+	if (row == -1) return null;
+	int clist = parent.handle;
+	int [] pixmap = new int [1], mask = new int [1];
+	OS.gtk_clist_get_pixtext (clist, row, index, null, null, pixmap, null);
+	if (pixmap [0] == 0) return null;
+	Display display = getDisplay ();
+	return Image.gtk_new (display, mask [0] == 0 ? SWT.BITMAP : SWT.ICON, pixmap [0], mask [0]);
+}
+
 /**
  * Returns a rectangle describing the size and location
  * relative to its parent of an image at a column in the
@@ -257,25 +255,32 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public Rectangle getImageBounds (int index) {
-	checkWidget ();
-	int renderer;
-	if (parent.getColumnCount()==0) {
-		if (index!=0) return new Rectangle(0,0,0,0);
-		renderer = parent.fakePixbufRenderer;
-	} else {
-		if (index<0 || index>parent.getColumnCount()) return new Rectangle(0,0,0,0);
-		renderer = parent.columns[index].pixbufRendererHandle;
-	}
-	int[] x = new int[1];
-	int[] y = new int[1];
-	int[] w = new int[1];
-	int[] h = new int[1];
-	GdkRectangle rect = new GdkRectangle();
-	OS.gtk_cell_renderer_get_size(renderer, parent.handle, rect, x, y, w, h);
-	return new Rectangle(x[0],y[0],w[0],h[0]);
-}
-
+public Rectangle getImageBounds (int index) {
+	checkWidget ();
+	int CELL_SPACING = 1;
+	int clist = parent.handle;
+	int columnHandle = OS.GTK_CLIST_COLUMN (clist);
+	columnHandle= columnHandle + index * GtkCListColumn.sizeof;
+	GtkCListColumn column = new GtkCListColumn ();
+	OS.memmove (column, columnHandle, GtkCListColumn.sizeof);
+	int x = column.area_x + OS.GTK_CLIST_HOFFSET (clist) + 1;
+	int height = OS.GTK_CLIST_ROW_HEIGHT (clist);
+	int row = parent.indexOf (this);
+	int headerHeight = OS.GTK_CLIST_COLUMN_TITLE_AREA_HEIGHT (clist);
+	int y = headerHeight + OS.GTK_CLIST_VOFFSET (clist) + (height + CELL_SPACING) * row + 3;
+	int width = 0;
+	if (!(index == 0 && (parent.style & SWT.CHECK) != 0)) {
+		int [] pixmap = new int [1];
+		OS.gtk_clist_get_pixtext (clist, row, index, null, null, pixmap, null);
+		if (pixmap [0] != 0) {
+			int [] w = new int [1], h = new int [1];
+			OS.gdk_drawable_get_size (pixmap [0], w, h);
+			width = w [0];
+		}
+	}
+	return new Rectangle (x, y, width, height);
+}
+
 /**
  * Gets the image indent.
  *
@@ -286,12 +291,12 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public int getImageIndent () {
-	checkWidget ();
-	/* Image indent is not supported on GTK */
-	return 0;
-}
-
+public int getImageIndent () {
+	checkWidget ();
+	/* Image indent is not supported on GTK */
+	return 0;
+}
+
 /**
  * Returns the receiver's parent, which must be a <code>Table</code>.
  *
@@ -302,11 +307,11 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public Table getParent () {
-	checkWidget ();
-	return parent;
-}
-
+public Table getParent () {
+	checkWidget ();
+	return parent;
+}
+
 /**
  * Returns the text stored at the given column index in the receiver,
  * or empty string if the text has not been set.
@@ -322,121 +327,131 @@
  *    <li>ERROR_CANNOT_GET_TEXT - if the column at index does not exist</li>
  * </ul>
  */
-public String getText (int index) {
-	checkWidget ();
-	if (index<0) error(SWT.ERROR_CANNOT_GET_TEXT);
-	if ((index>0)&&(index>=parent.columnCount)) error(SWT.ERROR_CANNOT_GET_TEXT);
-	int[] ptr = new int[1];
-	OS.gtk_tree_model_get(parent.modelHandle, handle, index, ptr, -1);
-	if (ptr[0]==0) return null;
-	int length = OS.strlen(ptr[0]);
-	byte[] bytes = new byte[length+1];
-	OS.memmove(bytes, ptr[0], length);
-	char[] chars = Converter.mbcsToWcs(null, bytes);
-	OS.g_free(ptr[0]);
-	return new String(chars);
-}
-
-public String getText () {
-	return getText(0);
-}
-
-void releaseChild () {
-	super.releaseChild ();
-	parent.destroyItem (this);
-}
-
-void releaseWidget () {
-	super.releaseWidget ();
-	parent = null;
-}
-
-/**
- * Sets the receiver's background color to the color specified
- * by the argument, or to the default system color for the item
- * if the argument is null.
- *
- * @param color the new color (or null)
- *
- * @exception IllegalArgumentException <ul>
- *    <li>ERROR_INVALID_ARGUMENT - if the argument has been disposed</li> 
- * </ul>
- * @exception SWTException <ul>
- *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- * </ul>
- * 
- * @since 2.0
- * 
+public String getText (int index) {
+	checkWidget ();
+	if (index == 0) return getText ();
+	int row = parent.indexOf (this);
+	if (row == -1) error (SWT.ERROR_CANNOT_GET_TEXT);
+	int clist = parent.handle;
+	int [] address = new int [1];
+	int [] pixmap = new int [1];
+	OS.gtk_clist_get_pixtext (clist, row, index, address, null, pixmap, null);
+	if (pixmap [0] == 0) {
+		OS.gtk_clist_get_text (clist, row, index, address);
+	}
+	if (address [0] == 0) return "";
+	byte [] buffer = new byte [OS.strlen (address [0])];
+	OS.memmove (buffer, address [0], buffer.length);
+	return new String (Converter.mbcsToWcs (null, buffer));
+}
+
+void releaseChild () {
+	super.releaseChild ();
+	parent.destroyItem (this);
+}
+
+void releaseWidget () {
+	super.releaseWidget ();
+	parent = null;
+}
+
+/**
+ * Sets the receiver's background color to the color specified
+ * by the argument, or to the default system color for the item
+ * if the argument is null.
+ *
+ * @param color the new color (or null)
+ *
+ * @exception IllegalArgumentException <ul>
+ *    <li>ERROR_INVALID_ARGUMENT - if the argument has been disposed</li> 
+ * </ul>
+ * @exception SWTException <ul>
+ *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ * 
+ * @since 2.0
+ * 
  */
-public void setBackground (Color color) {
-	checkWidget ();
-	if (color != null && color.isDisposed ()) SWT.error (SWT.ERROR_INVALID_ARGUMENT);
-	int row = parent.indexOf (this);
-	if (row == -1) return;
-	GdkColor ptr = (color != null)? color.handle : null;
-	OS.gtk_list_store_set(parent.modelHandle, handle, 2*parent.MAX_COLUMNS+2, ptr, -1);
-}
-
-/**
- * Sets the checked state of the checkbox for this item.  This state change 
- * only applies if the Table was created with the SWT.CHECK style.
- *
- * @param checked the new checked state of the checkbox
- *
- * @exception SWTException <ul>
- *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- * </ul>
+public void setBackground (Color color) {
+	checkWidget ();
+	if (color != null && color.isDisposed ()) {
+		SWT.error (SWT.ERROR_INVALID_ARGUMENT);
+	}
+	int row = parent.indexOf (this);
+	if (row == -1) return;
+	int clist = parent.handle;
+	OS.gtk_clist_set_background (clist, row, color != null ? color.handle : null);
+}
+
+/**
+ * Sets the checked state of the checkbox for this item.  This state change 
+ * only applies if the Table was created with the SWT.CHECK style.
+ *
+ * @param checked the new checked state of the checkbox
+ *
+ * @exception SWTException <ul>
+ *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
  */
-public void setChecked (boolean checked) {
-	checkWidget();
-	OS.gtk_list_store_set(parent.modelHandle, handle, 2*parent.MAX_COLUMNS, checked, -1);
-}
-
-/**
- * Sets the receiver's foreground color to the color specified
- * by the argument, or to the default system color for the item
- * if the argument is null.
- *
- * @param color the new color (or null)
- *
- * @exception IllegalArgumentException <ul>
- *    <li>ERROR_INVALID_ARGUMENT - if the argument has been disposed</li> 
- * </ul>
- * @exception SWTException <ul>
- *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- * </ul>
- * 
- * @since 2.0
- * 
+public void setChecked (boolean checked) {
+	checkWidget();
+	int row = parent.indexOf (this);
+	if (row == -1) return;
+	int ctable = parent.handle;
+	byte [] buffer = Converter.wcsToMbcs (null, text, true);
+	int pixmap = checked ? parent.check : parent.uncheck;
+	byte [] spacing = new byte [1];
+	OS.gtk_clist_get_pixtext(ctable, row, 0, null, spacing, null, null);
+	OS.gtk_clist_set_pixtext (ctable, row, 0, buffer, spacing [0], pixmap, 0);
+}
+
+/**
+ * Sets the receiver's foreground color to the color specified
+ * by the argument, or to the default system color for the item
+ * if the argument is null.
+ *
+ * @param color the new color (or null)
+ *
+ * @exception IllegalArgumentException <ul>
+ *    <li>ERROR_INVALID_ARGUMENT - if the argument has been disposed</li> 
+ * </ul>
+ * @exception SWTException <ul>
+ *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ * 
+ * @since 2.0
+ * 
  */
-public void setForeground (Color color){
-	checkWidget ();
-	if (color != null && color.isDisposed ()) SWT.error (SWT.ERROR_INVALID_ARGUMENT);
-	int row = parent.indexOf (this);
-	if (row == -1) return;
-	GdkColor ptr = (color != null)? color.handle : null;
-	OS.gtk_list_store_set(parent.modelHandle, handle, 2*parent.MAX_COLUMNS+1, ptr, -1);
-}
-
-/**
- * Sets the grayed state of the checkbox for this item.  This state change 
- * only applies if the Table was created with the SWT.CHECK style.
- *
- * @param grayed the new grayed state of the checkbox
- *
- * @exception SWTException <ul>
- *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- * </ul>
+public void setForeground (Color color){
+	checkWidget ();
+	if (color != null && color.isDisposed ()) {
+		SWT.error (SWT.ERROR_INVALID_ARGUMENT);
+	}
+	int row = parent.indexOf (this);
+	if (row == -1) return;
+	int clist = parent.handle;
+	OS.gtk_clist_set_foreground (clist, row, color != null ? color.handle : null);
+}
+
+/**
+ * Sets the grayed state of the checkbox for this item.  This state change 
+ * only applies if the Table was created with the SWT.CHECK style.
+ *
+ * @param grayed the new grayed state of the checkbox
+ *
+ * @exception SWTException <ul>
+ *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
  */
-public void setGrayed (boolean grayed) {
-	checkWidget();
-	//NOT IMPLEMENTED
-}
-
+public void setGrayed (boolean grayed) {
+	checkWidget();
+	//NOT IMPLEMENTED
+}
+
 /**
  * Sets the receiver's image at a column.
  *
@@ -451,51 +466,44 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public void setImage (int index, Image image) {
-	checkWidget ();
-	if (image != null && image.isDisposed()) {
-		error(SWT.ERROR_INVALID_ARGUMENT);
-	}
-	if (index<0) return;
-	if ((index>0)&&(index>=parent.columnCount)) return;
-	int pixbuf = 0;
-	if (image != null) {
-		int[] w = new int[1], h = new int[1];
-		boolean hasMask = (image.mask != 0);
-	 	OS.gdk_drawable_get_size(image.pixmap, w, h);
- 		int width = w[0], height = h[0]; 	
-		pixbuf = OS.gdk_pixbuf_new(OS.GDK_COLORSPACE_RGB, hasMask, 8, width, height);
-		if (pixbuf == 0) SWT.error(SWT.ERROR_NO_HANDLES);
-		int colormap = OS.gdk_colormap_get_system();
-		OS.gdk_pixbuf_get_from_drawable(pixbuf, image.pixmap, colormap, 0, 0, 0, 0, width, height);
-		if (hasMask) {
-			int gdkMaskImagePtr = OS.gdk_drawable_get_image(image.mask, 0, 0, width, height);
-			if (gdkMaskImagePtr == 0) SWT.error(SWT.ERROR_NO_HANDLES);
-			int stride = OS.gdk_pixbuf_get_rowstride(pixbuf);
-			int pixels = OS.gdk_pixbuf_get_pixels(pixbuf);
-			byte[] line = new byte[stride];
-			for (int y=0; y<height; y++) {
-				OS.memmove(line, pixels + (y * stride), stride);
-				for (int x=0; x<width; x++) {
-					if (OS.gdk_image_get_pixel(gdkMaskImagePtr, x, y) != 0) {
-						line[x*4+3] = (byte)0xFF;
-					} else {
-						line[x*4+3] = 0;
-					}
-				}
-				OS.memmove(pixels + (y * stride), line, stride);
-			}
-			OS.g_object_unref(gdkMaskImagePtr);
-		}
-	}	
-	OS.gtk_list_store_set(parent.modelHandle, handle, index+parent.MAX_COLUMNS, pixbuf, -1);
-}
-
-public void setImage (Image image) {
-	checkWidget ();
-	setImage (0, image);
-}
-
+public void setImage (int index, Image image) {
+	checkWidget ();
+	if (image != null && image.isDisposed()) {
+		error(SWT.ERROR_INVALID_ARGUMENT);
+	}
+	if (index == 0) {
+		if ((parent.style & SWT.CHECK) != 0) return;
+		super.setImage (image);
+	}
+	int row = parent.indexOf (this);
+	if (row == -1) return;
+	int clist = parent.handle;
+	String string = getText (index);
+	byte [] buffer = Converter.wcsToMbcs (null, string, true);
+	if (image == null) {
+		OS.gtk_clist_set_text (clist, row, index, buffer);
+	} else {
+		int pixmap = image.pixmap, mask = image.mask;
+		byte [] spacing = new byte [] {2};
+//		OS.gtk_clist_get_pixtext (clist, row, index, null, spacing, null, null);
+		OS.gtk_clist_set_pixtext (clist, row, index, buffer, spacing [0], pixmap, mask);
+		if (parent.imageHeight == 0) {	
+			int [] width = new int [1], height = new int [1];
+			OS.gdk_drawable_get_size (pixmap, width, height);
+			if (height [0] > OS.GTK_CLIST_ROW_HEIGHT (parent.handle)) {
+				parent.imageHeight = height [0];
+				OS.gtk_widget_realize (clist);
+				OS.gtk_clist_set_row_height (clist, height [0]);
+			}
+		}
+	}
+}
+
+public void setImage (Image image) {
+	checkWidget ();
+	setImage (0, image);
+}
+
 /**
  * Sets the image for multiple columns in the Table. 
  * 
@@ -510,14 +518,14 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public void setImage (Image [] images) {
-	checkWidget ();
-	if (images == null) error (SWT.ERROR_NULL_ARGUMENT);
-	for (int i=0; i<images.length; i++) {
-		setImage (i, images [i]);
-	}
-}
-
+public void setImage (Image [] images) {
+	checkWidget ();
+	if (images == null) error (SWT.ERROR_NULL_ARGUMENT);
+	for (int i=0; i<images.length; i++) {
+		setImage (i, images [i]);
+	}
+}
+
 /**
  * Sets the image indent.
  *
@@ -529,11 +537,11 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public void setImageIndent (int indent) {
-	checkWidget ();
-	/* Image indent is not supported on GTK */
-}
-
+public void setImageIndent (int indent) {
+	checkWidget ();
+	/* Image indent is not supported on GTK */
+}
+
 /**
  * Sets the receiver's text at a column
  *
@@ -548,20 +556,31 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public void setText (int index, String string) {
-	checkWidget ();
-	if (string == null) error (SWT.ERROR_NULL_ARGUMENT);
-	if (index<0) return;
-	if ((index>0)&&(index>=parent.columnCount)) return;
-	byte[] bytes = Converter.wcsToMbcs(null, string, true);
-	OS.gtk_list_store_set(parent.modelHandle, handle, index, bytes, -1);
-}
-
-public void setText (String string) {
-	checkWidget ();
-	setText (0, string);
-}
-
+public void setText (int index, String string) {
+	checkWidget ();
+	if (string == null) error (SWT.ERROR_NULL_ARGUMENT);
+	if (index == 0) {
+		super.setText (string);
+	}
+	int row = parent.indexOf (this);
+	if (row == -1) return;
+	int clist = parent.handle;
+	byte [] buffer = Converter.wcsToMbcs (null, string, true);
+	byte [] spacing = new byte [1];
+	int [] pixmap = new int [1], mask = new int [1];
+	OS.gtk_clist_get_pixtext (clist, row, index, null, spacing, pixmap, mask);
+	if (pixmap [0] == 0) {
+		OS.gtk_clist_set_text (clist, row, index, buffer);
+	} else {
+		OS.gtk_clist_set_pixtext (clist, row, index, buffer, spacing [0], pixmap [0], mask [0]);
+	}
+}
+
+public void setText (String string) {
+	checkWidget ();
+	setText (0, string);
+}
+
 /**
  * Sets the text for multiple columns in the table. 
  * 
@@ -575,12 +594,13 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public void setText (String [] strings) {
-	checkWidget ();
-	if (strings == null) error (SWT.ERROR_NULL_ARGUMENT);
-	for (int i=0; i<strings.length; i++) {
-		String string = strings [i];
-		if (string != null) setText (i, string);
-	}
-}
-}
+public void setText (String [] strings) {
+	checkWidget ();
+	if (strings == null) error (SWT.ERROR_NULL_ARGUMENT);
+	for (int i=0; i<strings.length; i++) {
+		String string = strings [i];
+		if (string != null) setText (i, string);
+	}
+}
+
+}
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tree.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tree.java
index 31af9f6..4c12c77 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tree.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tree.java
@@ -38,10 +38,19 @@
  * </p>
  */
 public class Tree extends Composite {
-	int selSize; int[] selIndices;
-	TreeItem[] items;
-	int modelHandle, columnHandle;	
-	
+	TreeItem [] items;
+	boolean selected, doubleSelected;
+	int check, uncheck, imageHeight, timerID;
+	static int CELL_SPACING = 1;
+
+	/*
+	* NOT DONE - These need to be moved to display,
+	* they are not thread safe.  Consider moving the
+	* methods that access them to Display.
+	*/
+	static TreeItem [] Items;
+	static int Index, Count, Sibling;
+
 /**
  * Constructs a new instance of this class given its parent
  * and a style value describing its behavior and appearance.
@@ -77,6 +86,11 @@
 }
 
 static int checkStyle (int style) {
+	/*
+	* To be compatible with Windows, force the H_SCROLL
+	* and V_SCROLL style bits.  On Windows, it is not
+	* possible to create a tree without scroll bars.
+	*/
 	style |= SWT.H_SCROLL | SWT.V_SCROLL;
 	return checkBits (style, SWT.SINGLE, SWT.MULTI, 0, 0, 0, 0);
 }
@@ -156,85 +170,92 @@
 	OS.gtk_fixed_set_has_window (fixedHandle, true);
 	scrolledHandle = OS.gtk_scrolled_window_new (0, 0);
 	if (scrolledHandle == 0) error (SWT.ERROR_NO_HANDLES);
-
-	/* Columns:
-	 * 0 - text
-	 * 1 - pixmap
-	 * 2 - foreground
-	 * 3 - background
-	 * 4 - id
-	 * 5 - checked (if needed)
-	 */
-	int COLUMN_NUM = (style&SWT.CHECK)!=0? 6:5;
-	int[] types = new int[COLUMN_NUM];
-	types[0] = OS.G_TYPE_STRING();
-	types[1] = OS.gdk_pixbuf_get_type();
-	types[2] = OS.GDK_TYPE_COLOR();
-	types[3] = OS.GDK_TYPE_COLOR();
-	types[4] = OS.G_TYPE_INT();
-	if ((style&SWT.CHECK) != 0) types[5] = OS.G_TYPE_BOOLEAN();
-	modelHandle = OS.gtk_tree_store_newv(COLUMN_NUM, types);
-	if (modelHandle == 0) error (SWT.ERROR_NO_HANDLES);
-	handle = OS.gtk_tree_view_new_with_model(modelHandle);
-	if (handle == 0) error (SWT.ERROR_NO_HANDLES);
-	
+	handle = OS.gtk_ctree_new (1, 0);
+	if (handle == 0) SWT.error (SWT.ERROR_NO_HANDLES);
 	int parentHandle = parent.parentingHandle ();
 	OS.gtk_container_add (parentHandle, fixedHandle);
 	OS.gtk_container_add (fixedHandle, scrolledHandle);
 	OS.gtk_container_add (scrolledHandle, handle);
-	int mode = (style & SWT.MULTI) != 0 ? OS.GTK_SELECTION_EXTENDED : OS.GTK_SELECTION_BROWSE;
-	int selectionObject = OS.gtk_tree_view_get_selection(handle);
-	OS.gtk_tree_selection_set_mode(selectionObject, mode);
-	OS.gtk_tree_view_set_headers_visible(handle, false);	
-	int hsp = (style & SWT.H_SCROLL) != 0 ? OS.GTK_POLICY_AUTOMATIC : OS.GTK_POLICY_NEVER;
-	int vsp = (style & SWT.V_SCROLL) != 0 ? OS.GTK_POLICY_AUTOMATIC : OS.GTK_POLICY_NEVER;
-	OS.gtk_scrolled_window_set_policy (scrolledHandle, hsp, vsp);
-	if ((style & SWT.BORDER) != 0) OS.gtk_scrolled_window_set_shadow_type (scrolledHandle, OS.GTK_SHADOW_ETCHED_IN);
 	OS.gtk_widget_show (fixedHandle);
 	OS.gtk_widget_show (scrolledHandle);
 	OS.gtk_widget_show (handle);
-	columnHandle = OS.gtk_tree_view_column_new();
-	int renderer;
-	renderer = OS.gtk_cell_renderer_text_new();
-	if (renderer == 0) error(SWT.ERROR_NO_HANDLES);
-	OS.gtk_tree_view_column_pack_end (columnHandle, renderer, true);
-	OS.gtk_tree_view_column_add_attribute (columnHandle, renderer, "text", 0);
-	OS.gtk_tree_view_column_add_attribute(columnHandle, renderer, "foreground-gdk", 2);
-	OS.gtk_tree_view_column_add_attribute(columnHandle, renderer, "background-gdk", 3);
-	renderer = OS.gtk_cell_renderer_pixbuf_new();
-	if (renderer == 0) error(SWT.ERROR_NO_HANDLES);
-	OS.gtk_tree_view_column_pack_end (columnHandle, renderer, false);
-	OS.gtk_tree_view_column_add_attribute (columnHandle, renderer, "pixbuf", 1);
+	
+	/* Force row_height to be computed */
+	OS.gtk_clist_set_row_height (handle, 0);
+		
+	/* Single or Multiple Selection */
+	int mode = (style & SWT.MULTI) != 0 ? OS.GTK_SELECTION_EXTENDED : OS.GTK_SELECTION_BROWSE;
+	OS.gtk_clist_set_selection_mode (handle, mode);
+	
+	/* Scrolling policy */
+	int hsp = (style & SWT.H_SCROLL) != 0 ? OS.GTK_POLICY_AUTOMATIC : OS.GTK_POLICY_NEVER;
+	int vsp = (style & SWT.V_SCROLL) != 0 ? OS.GTK_POLICY_AUTOMATIC : OS.GTK_POLICY_NEVER;
+	OS.gtk_scrolled_window_set_policy (scrolledHandle, hsp, vsp);
+	
 	if ((style & SWT.CHECK) != 0) {
-		renderer = OS.gtk_cell_renderer_toggle_new();
-		if (renderer == 0) error(SWT.ERROR_NO_HANDLES);
-		OS.gtk_tree_view_column_pack_end (columnHandle, renderer, false);
-		OS.gtk_tree_view_column_add_attribute (columnHandle, renderer, "active", 5);
-		OS.g_signal_connect(renderer, OS.toggled, getDisplay().toggleProc, columnHandle);
+		OS.gtk_widget_realize (handle);
+		uncheck = createCheckPixmap (false);
+		check = createCheckPixmap (true);
 	}
-	OS.gtk_tree_view_insert_column (handle, columnHandle, 0);
-	OS.gtk_tree_view_set_headers_visible(handle, false);
 }
 
 void hookEvents () {
 	//TO DO - get rid of enter/exit for mouse crossing border
 	super.hookEvents ();
 	Display display = getDisplay ();
-	int selection = OS.gtk_tree_view_get_selection(handle);
-	OS.g_signal_connect_after (selection, OS.changed, display.windowProc2, SWT.Selection);
-	OS.g_signal_connect (handle, OS.row_activated, display.windowProc4, SWT.DefaultSelection);
-	OS.g_signal_connect (handle, OS.row_expanded, display.windowProc4, SWT.Expand);
-	OS.g_signal_connect (handle, OS.row_collapsed, display.windowProc4, SWT.Collapse);
-	OS.g_signal_connect (handle, OS.event_after, display.windowProc3, 0);
-	// FIXME - we want to get MouseUp *AFTER*
+	int windowProc3 = display.windowProc3;
+	int windowProc4 = display.windowProc4;
+	OS.g_signal_connect (handle, OS.tree_select_row, windowProc4, SWT.Selection);
+	OS.g_signal_connect (handle, OS.tree_unselect_row, windowProc4, SWT.Selection);
+	OS.g_signal_connect (handle, OS.tree_expand, windowProc3, SWT.Expand);
+	OS.g_signal_connect (handle, OS.tree_collapse, windowProc3, SWT.Collapse);
+	OS.g_signal_connect (handle, OS.event_after, windowProc3, 0);
 }
 
-void createWidget(int index) {
-	super.createWidget(index);
-	items = new TreeItem[4];
+int createCheckPixmap(boolean checked) {
+	/*
+	 * The box will occupy the whole item width.
+	 */
+	int check_height = OS.GTK_CLIST_ROW_HEIGHT (handle) - 2;
+	int check_width = check_height;
+
+	GdkVisual visual = new GdkVisual();
+	OS.memmove(visual, OS.gdk_visual_get_system());
+	int pixmap = OS.gdk_pixmap_new(0, check_width, check_height, visual.depth);
+	
+	int gc = OS.gdk_gc_new(pixmap);
+	
+	GdkColor fgcolor = new GdkColor();
+	fgcolor.pixel = 0xFFFFFFFF;
+	fgcolor.red = (short) 0xFFFF;
+	fgcolor.green = (short) 0xFFFF;
+	fgcolor.blue = (short) 0xFFFF;
+	OS.gdk_gc_set_foreground(gc, fgcolor);
+	OS.gdk_draw_rectangle(pixmap, gc, 1, 0,0, check_width,check_height);
+
+	fgcolor = new GdkColor();
+	fgcolor.pixel = 0;
+	fgcolor.red = (short) 0;
+	fgcolor.green = (short) 0;
+	fgcolor.blue = (short) 0;
+	OS.gdk_gc_set_foreground(gc, fgcolor);
+	
+	OS.gdk_draw_line(pixmap, gc, 0,0, 0,check_height-1);
+	OS.gdk_draw_line(pixmap, gc, 0,check_height-1, check_width-1,check_height-1);
+	OS.gdk_draw_line(pixmap, gc, check_width-1,check_height-1, check_width-1,0);
+	OS.gdk_draw_line(pixmap, gc, check_width-1,0, 0,0);
+
+	/* now the cross check */
+	if (checked) {
+		OS.gdk_draw_line(pixmap, gc, 0,0, check_width-1,check_height-1);
+		OS.gdk_draw_line(pixmap, gc, 0,check_height-1, check_width-1,0);
+	}
+	
+	OS.g_object_unref(gc);
+	return pixmap;
 }
 
-void createItem (TreeItem item, int iter, int index) {
+void createItem (TreeItem item, int node, int index) {
 	int id = 0;
 	while (id < items.length && items [id] != null) id++;
 	if (id == items.length) {
@@ -242,15 +263,36 @@
 		System.arraycopy (items, 0, newItems, 0, items.length);
 		items = newItems;
 	}
-	item.handle = OS.g_malloc(OS.GtkTreeIter_sizeof());
-	if (item.handle == 0) error(SWT.ERROR_NO_HANDLES);
-	if (index==-1) {
-		OS.gtk_tree_store_append(modelHandle, item.handle, iter);
-	} else {
-		OS.gtk_tree_store_insert(modelHandle, item.handle, iter, index);
+	int sibling = index == -1 ? 0 : findSibling (node, index);
+	if (OS.GTK_WIDGET_MAPPED (handle) && timerID == 0) {
+		OS.gtk_clist_freeze (handle);
+		Display display = getDisplay ();
+		timerID = OS.gtk_timeout_add (0, display.windowTimerProc, handle);
 	}
-	OS.gtk_tree_store_set(modelHandle, item.handle, 4, id, -1);
-	items[id] = item;
+	blockSignal (handle, SWT.Selection);
+	item.handle = OS.gtk_ctree_insert_node (handle, node, sibling, null, (byte) 2, uncheck, 0, uncheck, 0, false, false);
+	if ((style & SWT.SINGLE) != 0 && OS.GTK_CLIST_ROWS (handle) == 1) {
+		OS.gtk_clist_unselect_row (handle, 0, 0);
+	}
+	unblockSignal (handle, SWT.Selection);
+	if (item.handle == 0) error (SWT.ERROR_ITEM_NOT_ADDED);
+	OS.gtk_ctree_node_set_row_data (handle, item.handle, id + 1);
+	items [id] = item;
+}
+
+void createWidget (int index) {
+	super.createWidget (index);
+	items = new TreeItem [4];
+}
+
+GdkColor defaultBackground () {
+	Display display = getDisplay ();
+	return display.COLOR_LIST_BACKGROUND;
+}
+
+GdkColor defaultForeground () {
+	Display display = getDisplay ();
+	return display.COLOR_LIST_FOREGROUND;
 }
 
 /**
@@ -263,15 +305,62 @@
  */
 public void deselectAll() {
 	checkWidget();
-	blockSignal(handle, SWT.Selection);
-	int selection = OS.gtk_tree_view_get_selection(handle);
-	OS.gtk_tree_selection_unselect_all(selection);
-	unblockSignal(handle, SWT.Selection);
+	blockSignal (handle, SWT.Selection);
+	if ((style & SWT.SINGLE) != 0) {
+		int selection = OS.GTK_CLIST_SELECTION (handle);
+		if (selection != 0 && OS.g_list_length (selection) > 0) {
+			int index = OS.GTK_CLIST_FOCUS_ROW (handle);
+			if (index == -1) index = 0;
+			OS.gtk_clist_select_row (handle, index, 0);
+			OS.gtk_clist_unselect_row (handle, index, 0);
+		}
+	} else {
+		OS.gtk_ctree_unselect_recursive (handle, 0);
+	}
+	unblockSignal (handle, SWT.Selection);
 }
 
 void destroyItem (TreeItem item) {
-	// FIXME - do I need to block Collapse?
-	OS.gtk_tree_store_remove (modelHandle, item.handle);
+	int node = item.handle;
+	Callback GtkCTreeFunc = new Callback (this, "GtkCTreeDispose", 3);
+	int address = GtkCTreeFunc.getAddress ();
+	OS.gtk_ctree_post_recursive (handle, node, address, 0);
+	GtkCTreeFunc.dispose ();
+	blockSignal (handle, SWT.Collapse);
+	boolean fixSelection = false;
+	if ((style & SWT.SINGLE) != 0) {
+		int selection = OS.GTK_CLIST_SELECTION (handle);
+		fixSelection = selection == 0 || OS.g_list_length (selection) == 0;
+	}
+	if (fixSelection) blockSignal (handle, SWT.Selection);
+	OS.gtk_ctree_remove_node (handle, node);
+	if (fixSelection) {
+		OS.gtk_clist_unselect_row (handle, 0, 0);
+		unblockSignal (handle, SWT.Selection);
+	}
+	unblockSignal (handle, SWT.Collapse);
+}
+
+int findSibling (int node, int index) {
+	int depth = 1;
+	if (node != 0) {
+		int data = OS.g_list_nth_data (node, 0);
+		GtkCTreeRow row = new GtkCTreeRow ();
+		OS.memmove (row, data, GtkCTreeRow.sizeof);
+		depth = row.level + 1;
+	}
+	Index = 0;
+	Sibling = 0;
+	Callback GtkCTreeCountItems = new Callback (this, "GtkCTreeFindSibling", 3);
+	int address0 = GtkCTreeCountItems.getAddress ();
+	OS.gtk_ctree_post_recursive_to_depth (handle, node, depth, address0, index);
+	GtkCTreeCountItems.dispose ();
+	if (Sibling == node) Sibling = 0; 
+	return Sibling;
+}
+
+GdkColor getBackgroundColor () {
+	return getBaseColor ();
 }
 
 /**
@@ -292,15 +381,15 @@
  */
 public TreeItem getItem (Point point) {
 	checkWidget ();
-	int [] path = new int [1];	
-	if (!OS.gtk_tree_view_get_path_at_pos(handle, point.x, point.y, path, null, null, null)) return null;
-	if (path[0]==0) return null;
-	int iter = OS.g_malloc(OS.GtkTreeIter_sizeof());
-	OS.gtk_tree_model_get_iter(modelHandle, iter, path[0]);
-	int[] index = new int[1];
-	OS.gtk_tree_model_get(modelHandle, iter, 4, index, -1);
-	OS.g_free(iter);
-	return items[index[0]];
+	int [] row = new int [1], column = new int [1];
+	if (OS.gtk_clist_get_selection_info (handle, point.x, point.y, row, column) == 0) {
+		return null;
+	}
+	int node = OS.gtk_ctree_node_nth (handle, row [0]);
+	if (node == 0) return null;
+	int index = OS.gtk_ctree_node_get_row_data (handle, node) - 1;
+	if (index == -1) return null;
+	return items [index];
 }
 
 /**
@@ -321,8 +410,20 @@
 	return getItemCount (0);
 }
 
-int getItemCount (int iter) {
-	return OS.gtk_tree_model_iter_n_children(modelHandle, iter);
+int getItemCount (int node) {
+	int depth = 1;
+	if (node != 0) {
+		int data = OS.g_list_nth_data (node, 0);
+		GtkCTreeRow row = new GtkCTreeRow ();
+		OS.memmove (row, data, GtkCTreeRow.sizeof);
+		depth = row.level + 1;
+	}
+	Count = 0;
+	Callback GtkCTreeCountItems = new Callback (this, "GtkCTreeCountItems", 3);
+	int address0 = GtkCTreeCountItems.getAddress ();
+	OS.gtk_ctree_post_recursive_to_depth (handle, node, depth, address0, node);
+	GtkCTreeCountItems.dispose ();
+	return Count;
 }
 
 /**
@@ -338,15 +439,7 @@
  */
 public int getItemHeight () {
 	checkWidget ();
-	// FIXME
-	// I (bgs) am not sure what to do with this.
-	// In GTK2, rows may have different heights, so asking
-	// this question will only make sense given the item.
-	if (getItemCount() == 0) return 18;
-	GdkRectangle rect = new GdkRectangle();
-	int path = OS.gtk_tree_path_new_from_string(Converter.wcsToMbcs(null, "0", true));
-	OS.gtk_tree_view_get_cell_area(parent.handle, path, columnHandle, rect);
-	return rect.height;
+	return OS.GTK_CLIST_ROW_HEIGHT (handle) + CELL_SPACING;
 }
 
 /**
@@ -367,25 +460,32 @@
  * </ul>
  */
 public TreeItem [] getItems () {
-	TreeItem[] items;
 	checkWidget();
 	return getItems (0);
 }
 
-TreeItem [] getItems (int parent) {
-	int len = getItemCount(parent);
-	TreeItem[] answer = new TreeItem [len];
-	if (len==0) return answer;
-	int currentIter = OS.g_malloc(OS.GtkTreeIter_sizeof());
-	if (!OS.gtk_tree_model_iter_children(modelHandle, currentIter, parent)) return answer;
-	for (int i=0; i<len; i++) {
-		int[] index = new int[1];
-		OS.gtk_tree_model_get(modelHandle, currentIter, 4, index, -1);
-		answer[i] = items[index[0]];
-		OS.gtk_tree_model_iter_next(modelHandle, currentIter);
+TreeItem [] getItems (int node) {
+	int depth = 1;
+	if (node != 0) {
+		int data = OS.g_list_nth_data (node, 0);
+		GtkCTreeRow row = new GtkCTreeRow ();
+		OS.memmove (row, data, GtkCTreeRow.sizeof);
+		depth = row.level + 1;
 	}
-	OS.g_free(currentIter);
-	return answer;
+	Count = 0;
+	Callback GtkCTreeCountItems = new Callback (this, "GtkCTreeCountItems", 3);
+	int address0 = GtkCTreeCountItems.getAddress ();
+	OS.gtk_ctree_post_recursive_to_depth (handle, node, depth, address0, node);
+	GtkCTreeCountItems.dispose ();
+	Items = new TreeItem [Count];
+	Count = 0;
+	Callback GtkCTreeGetItems = new Callback (this, "GtkCTreeGetItems", 3);
+	int address1 = GtkCTreeGetItems.getAddress ();
+	OS.gtk_ctree_post_recursive_to_depth (handle, node, depth, address1, node);
+	GtkCTreeGetItems.dispose ();
+	TreeItem [] result = Items;
+	Items = null;
+	return result;
 }
 
 /**
@@ -423,35 +523,16 @@
  */
 public TreeItem[] getSelection () {
 	checkWidget();
-	TreeItem[] answer;
-	if ((style & SWT.MULTI) != 0) {
-		/*
-		 * Multi-selection case
-		 */
-		selSize = 0;
-		selIndices = new int[items.length];
-		int selection = OS.gtk_tree_view_get_selection(handle);
-		OS.gtk_tree_selection_selected_foreach(selection, getDisplay().selectionIterProc, handle);
-		answer = new TreeItem[selSize];
-		for (int i=0; i<selSize; i++) answer[i] = items[selIndices[i]];
-	} else {
-		/*
-		 * Single-selection case
-		 */
-		int iter = OS.g_malloc(OS.GtkTreeIter_sizeof());
-		int selection = OS.gtk_tree_view_get_selection(handle);
-		boolean hasSelection = OS.gtk_tree_selection_get_selected(selection, null, iter);
-		if (hasSelection) {
-			int[] index = new int[1];
-			OS.gtk_tree_model_get(modelHandle, iter, 4, index, -1);
-			answer = new TreeItem[1];
-			answer[0] = items[index[0]];
-		} else {
-			answer = new TreeItem[0];
-		}
-		OS.g_free(iter);
+	int selection = OS.GTK_CLIST_SELECTION (handle);
+	if (selection == 0) return new TreeItem [0];
+	int length = OS.g_list_length (selection);
+	TreeItem [] result = new TreeItem [length];
+	for (int i=0; i<length; i++) {
+		int node = OS.g_list_nth_data (selection, i);
+		int index = OS.gtk_ctree_node_get_row_data (handle, node) - 1;
+		result [i] = items [index];
 	}
-	return answer;
+	return result;
 }
 	
 /**
@@ -466,98 +547,310 @@
  */
 public int getSelectionCount () {
 	checkWidget();
-	selSize = 0;
-	selIndices = new int[items.length];
-	int selection = OS.gtk_tree_view_get_selection(handle);
-	OS.gtk_tree_selection_selected_foreach(selection, getDisplay().selectionIterProc, handle);
-	return selSize;
+	int selection = OS.GTK_CLIST_SELECTION (handle);
+	if (selection == 0) return 0;
+	return OS.g_list_length (selection);
 }
 
-int processCollapse (int iter, int path, int data) {
-	Event event = new Event ();
-	int[] index = new int[1];
-	OS.gtk_tree_model_get(modelHandle, iter, 4, index, -1);
-	event.item = items[index[0]];
-	sendEvent (SWT.Collapse, event);	
+int GtkCTreeCountItems (int ctree, int node, int data) {
+	if (data != node) Count++;
 	return 0;
 }
 
-int processExpand (int iter, int path, int data) {
+int GtkCTreeFindSibling (int ctree, int node, int data) {
+	if (Index == -1) return 0;
+	if (Index == data) {
+		Sibling = node;
+		Index = -1;
+	} else {
+		Index++;
+	}
+	return 0;
+}
+
+int GtkCTreeGetItems (int ctree, int node, int data) {
+	if (data != node) {
+		int index = OS.gtk_ctree_node_get_row_data (ctree, node) - 1;
+		Items [Count++] = items [index];
+	}
+	return 0;
+}
+
+int GtkCTreeDispose (int ctree, int node, int data) {
+	int index = OS.gtk_ctree_node_get_row_data (ctree, node) - 1;
+	OS.gtk_ctree_node_set_row_data (ctree, node, 0);
+	TreeItem item = items [index];
+	if (item != null && !item.isDisposed ()) item.releaseResources ();
+	items [index] = null;
+	return 0;
+}
+
+int paintWindow () {
+	OS.gtk_widget_realize (handle);
+	return OS.GTK_CLIST_CLIST_WINDOW (handle);
+}
+
+int processCollapse (int int0, int int1, int int2) {
+	int index = OS.gtk_ctree_node_get_row_data (handle, int0) - 1;
 	Event event = new Event ();
-	int[] index = new int[1];
-	OS.gtk_tree_model_get(modelHandle, iter, 4, index, -1);
-	event.item = items[index[0]];
+	event.item = items [index];
+	/*
+	* This code is intentionally commented.
+	* Not yet sure if freezing improves the
+	* look when a tree is collapsed.
+	*/
+//	OS.gtk_clist_freeze (handle);
+	sendEvent (SWT.Collapse, event);
+//	OS.gtk_clist_thaw (handle);
+	return 0;
+}
+
+int processKeyDown (int callData, int arg1, int int2) {
+	int result = super.processKeyDown (callData, arg1, int2);
+	if (result != 0) return result;
+
+	/*
+	* Feature in GTK.  When an item is reselected using
+	* the space bar or default selected using the return key,
+	* GTK does not issue notification. The fix is to ignore the
+	* notification that is sent by GTK and look for the space key.
+	*/
+	GdkEventKey keyEvent = new GdkEventKey ();
+	OS.memmove (keyEvent, callData, GdkEventKey.sizeof);
+	int key = keyEvent.keyval;
+	switch (key) {
+		case OS.GDK_Return:
+		case OS.GDK_KP_Enter:
+		case OS.GDK_space: {
+			int focus_row = OS.GTK_CLIST_FOCUS_ROW (handle);
+			if (focus_row != -1) {
+				int focus = OS.gtk_ctree_node_nth (handle, focus_row);
+				TreeItem item = null;
+				if (focus != 0) {
+					int index = OS.gtk_ctree_node_get_row_data (handle, focus) - 1;
+					item = items [index];
+				}
+				if (key == OS.GDK_space && (style & SWT.CHECK) != 0) {
+					if (item != null) item.setChecked (!item.getChecked ());
+				}
+				Event event = new Event ();
+				event.item = item;
+				int type = key == OS.GDK_space ? SWT.Selection : SWT.DefaultSelection;
+				postEvent (type, event);
+				if (key == OS.GDK_space && (style & SWT.CHECK) != 0) {
+					event = new Event ();
+					event.item = item;
+					event.detail = SWT.CHECK;
+					postEvent (SWT.Selection, event);
+				}
+			}
+			break;
+		}
+	}
+	return result;
+}
+
+int processEvent (int eventNumber, int int0, int int1, int int2) {
+	if (eventNumber == 0) {
+		GdkEvent gdkEvent = new GdkEvent ();
+		OS.memmove (gdkEvent, int0, GdkEvent.sizeof);
+		int type = gdkEvent.type;
+		switch (type) {
+			case OS.GDK_BUTTON_PRESS:
+			case OS.GDK_2BUTTON_PRESS: {
+				OS.GTK_CLIST_RESYNC_SELECTION (handle);
+				
+				/*
+				* Feature in GTK.  Double selection can only be implemented
+				* in a mouse down handler for a tree unlike the list, the event
+				* that caused the select signal is not included when the select
+				* signal is issued.
+				*/
+				if (type == OS.GDK_2BUTTON_PRESS) {
+					doubleSelected = true;
+					double[] px = new double [1], py = new double [1];
+					OS.gdk_event_get_coords (int0, px, py);
+					int x = (int)(px[0]), y = (int)(py[0]);	
+					if (!OS.gtk_ctree_is_hot_spot (handle, x, y)) {
+						int [] row = new int [1], column = new int [1];
+						int code = OS.gtk_clist_get_selection_info (handle, x, y, row, column);
+						if (code != 0) {
+							int node = OS.gtk_ctree_node_nth (handle, row [0]);
+							int index = OS.gtk_ctree_node_get_row_data (handle, node) - 1;
+							Event event = new Event ();
+							event.item = items [index];
+							postEvent (SWT.DefaultSelection, event);
+						}
+					}
+				}
+				break;
+			}
+			case OS.GDK_BUTTON_RELEASE: {
+				/*
+				* Feature in GTK.  When an item is reselected in a
+				* multi-select tree, GTK does not issue notification.
+				* The fix is to detect that the mouse was released over
+				* a selected item when no selection signal was set and
+				* issue a fake selection event.
+				*/
+				if ((style & SWT.MULTI) != 0) {
+					if (selected && !doubleSelected) {
+						double[] px = new double [1], py = new double [1];
+						OS.gdk_event_get_coords (int0, px, py);
+						int x = (int)(px[0]), y = (int)(py[0]);	
+						if (!OS.gtk_ctree_is_hot_spot (handle, x, y)) {
+							int [] row = new int [1], column = new int [1];
+							int code = OS.gtk_clist_get_selection_info (handle, x, y, row, column);
+							if (code != 0) {
+								int focus = OS.gtk_ctree_node_nth (handle, row [0]);
+								int selection = OS.GTK_CLIST_SELECTION (handle);
+								if (selection != 0) {
+									int length = OS.g_list_length (selection);
+									for (int i=0; i<length; i++) {
+										int node = OS.g_list_nth_data (selection, i);
+										if (node == focus) {
+											int index = OS.gtk_ctree_node_get_row_data (handle, node) - 1;
+											Event event = new Event ();
+											event.item = items [index];
+											postEvent (SWT.Selection, event);
+										}
+									}
+								}
+							}
+						}
+					}
+					selected = false;
+				}
+				doubleSelected = false;
+				break;
+			}
+			case OS.GDK_FOCUS_CHANGE: {
+				/*
+				* Bug in GTK.  When an application opens a new modal top level
+				* shell from inside the "select_row" signal, the GtkCList does not get the
+				* mouse up and does not release grabs.  The fix is to release the grabs
+				* when focus is lost.
+				*/
+				GdkEventFocus focusEvent = new GdkEventFocus ();
+				OS.memmove (focusEvent, int0, GdkEventFocus.sizeof);
+				if (focusEvent.in == 0) {
+					if (OS.gtk_grab_get_current () == handle) {
+						OS.gtk_grab_remove (handle);
+						OS.gdk_pointer_ungrab (OS.GDK_CURRENT_TIME);
+					}
+				}
+				break;
+			}
+		}
+		return 1;
+	}
+	return super.processEvent (eventNumber, int0, int1, int2);
+}
+
+int processExpand (int int0, int int1, int int2) {
+	int index = OS.gtk_ctree_node_get_row_data (handle, int0) - 1;
+	Event event = new Event ();
+	event.item = items [index];
+	OS.gtk_clist_freeze (handle);
 	sendEvent (SWT.Expand, event);
-	/* FIXME
-	 * The similar code in 1.2 checks if the expand is necesary.
-	 * Should we call gtk_tree_view_row_expanded() for a similar check?
-	 */
-	blockSignal(handle, SWT.Expand);
-	OS.gtk_tree_view_expand_row(handle, path, false);
-	unblockSignal(handle, SWT.Expand);
+	OS.gtk_clist_thaw (handle);
+	boolean [] expanded = new boolean [1];
+	OS.gtk_ctree_get_node_info (handle, int0, null, null, null, null, null, null, null, expanded);
+	if (!expanded [0]) {
+		blockSignal (handle, SWT.Expand);
+		OS.gtk_ctree_expand (handle, int0);
+		unblockSignal (handle, SWT.Expand);
+	}
 	return 0;
 }
 
-int processDefaultSelection (int int0, int int1, int int2) {
-	int iter = OS.g_malloc(OS.GtkTreeIter_sizeof());
-	OS.gtk_tree_model_get_iter(modelHandle, iter, int0);
-	int[] index = new int[1];
-	OS.gtk_tree_model_get(modelHandle, iter, 4, index, -1);
-	OS.g_free(iter);
-	Event event = new Event ();
-	event.item = items[index[0]];
-	postEvent (SWT.DefaultSelection, event);
-	return 0;
+int processMouseDown (int int0, int int1, int int2) {
+	int result = super.processMouseDown (int0, int1, int2);
+	if ((style & SWT.MULTI) != 0) selected = true;
+	double [] px = new double [1], py = new double [1];
+	OS.gdk_event_get_coords (int0, px, py);
+	int x = (int)(px[0]), y = (int)(py[0]);	
+	if ((style & SWT.CHECK) != 0) {
+		if (!OS.gtk_ctree_is_hot_spot (handle, x, y)) {
+			int [] row = new int [1], column = new int [1];
+			if (OS.gtk_clist_get_selection_info (handle, x, y, row, column) != 0) {
+				int node = OS.gtk_ctree_node_nth (handle, row [0]);
+				int crow = OS.g_list_nth_data (node, 0);
+				GtkCTreeRow row_data = new GtkCTreeRow ();
+				OS.memmove (row_data, crow, GtkCTreeRow.sizeof);
+				int nX = OS.GTK_CLIST_HOFFSET (handle) + OS.GTK_CTREE_TREE_INDENT (handle) * row_data.level - 2;
+				int nY = OS.GTK_CLIST_VOFFSET (handle) + (OS.GTK_CLIST_ROW_HEIGHT (handle) + 1) * row [0] + 2;
+				int [] check_width = new int [1], check_height = new int [1];
+				OS.gdk_drawable_get_size (check, check_width, check_height);
+				if (nX <= x && x <= nX + check_width [0]) {
+					if (nY <= y && y <= nY + check_height [0]) {
+						byte [] spacing = new byte [1];
+						boolean [] is_leaf = new boolean [1], expanded = new boolean [1];
+						int [] pixmap = new int [1], mask = new int [1];
+						int index = OS.gtk_ctree_node_get_row_data (handle, node) - 1;
+						byte [] text = Converter.wcsToMbcs (null, items [index].getText (), true);
+						OS.gtk_ctree_get_node_info (handle, node, null, spacing, pixmap, mask, pixmap, mask, is_leaf, expanded);
+						pixmap [0] = pixmap [0] == check ? uncheck : check;
+						OS.gtk_ctree_set_node_info (handle, node, text, spacing [0], pixmap [0], mask [0], pixmap [0], mask [0], is_leaf [0], expanded [0]);
+						Event event = new Event ();
+						event.detail = SWT.CHECK;
+						event.item = items [index];
+						postEvent (SWT.Selection, event);
+					}
+				}
+			}
+		}
+	}
+	GdkEvent gdkEvent = new GdkEvent ();
+	OS.memmove (gdkEvent, int0, GdkEvent.sizeof);
+	if (gdkEvent.type == OS.GDK_2BUTTON_PRESS) {
+		if (hooks (SWT.DefaultSelection)) return 1;
+	}
+	return result;
 }
 
 int processSelection (int int0, int int1, int int2) {
-	Event event = new Event ();
-	if ((style&SWT.SINGLE)!=0) {
-		event.item = getSelectionCount()>0? getSelection()[0] : null;
-	} else {
-		if (getSelectionCount()==1) event.item = getSelection()[0];
+	int focus_row = OS.GTK_CLIST_FOCUS_ROW (handle);
+	int focus = OS.gtk_ctree_node_nth (handle, focus_row);
+	if (focus != int0) return 0;
+	if ((style & SWT.MULTI) != 0) selected = false;
+	int ptr = OS.gtk_get_current_event ();
+	if (ptr != 0) {
+		GdkEvent gdkEvent = new GdkEvent ();
+		OS.memmove (gdkEvent, ptr, GdkEvent.sizeof);
+		OS.gdk_event_free (ptr);
+		/*
+		* Feature in GTK.  When a leaf node is double clicked, the
+		* GtkCTree issues two tree_row_select signals.  Non-leaf
+		* nodes only get one tree_row_select.  Avoid issueing
+		* a selection event for the double clicked leaf node.
+		*/ 
+		if (gdkEvent.type == OS.GDK_2BUTTON_PRESS) return 0;
 	}
+	int index = OS.gtk_ctree_node_get_row_data (handle, int0) - 1;
+	Event event = new Event ();
+	event.item = items [index];
 	postEvent (SWT.Selection, event);
-	return 0;	
-}
-
-int processSelectionIter(int path, int iter, int data) {
-	int[] index = new int[1];
-	OS.gtk_tree_model_get(modelHandle, iter, 4, index, -1);
-	selIndices[selSize++] = index[0];
 	return 0;
 }
 
-int processToggle(int pathString, int handle) {
-	int path = OS.gtk_tree_path_new_from_string(pathString);
-	int iter = OS.g_malloc(OS.GtkTreeIter_sizeof());
-	OS.gtk_tree_model_get_iter(modelHandle, iter, path);
-	int[] index = new int[1];
-	OS.gtk_tree_model_get(modelHandle, iter, 4, index, -1);
-	OS.g_free(iter);
-	OS.gtk_tree_path_free(path);
-	// FIXME - just use OS calls	
-	boolean checked = items[index[0]].getChecked();
-	checked = !checked;
-	items[index[0]].setChecked(checked);
-	Event event = new Event();
-	event.detail = SWT.CHECK;
-	event.item = items[index[0]];
-	postEvent(SWT.Selection, event);
+int processTimer (int id) {
+	if (timerID != 0) OS.gtk_clist_thaw (handle);
+	timerID = 0;
 	return 0;
 }
 
 void releaseWidget () {
 	for (int i=0; i<items.length; i++) {
 		TreeItem item = items [i];
-		if (item != null && !item.isDisposed ()) {
-			item.releaseWidget ();
-			item.releaseHandle ();
-		}
+		if (item != null && !item.isDisposed ()) item.releaseResources ();
 	}
 	items = null;
-	modelHandle = 0;
-	super.releaseWidget();
+	if (check != 0) OS.g_object_unref (check);
+	if (uncheck != 0) OS.g_object_unref (uncheck);
+	check = uncheck = 0;
+	if (timerID != 0) OS.gtk_timeout_remove (timerID);
+	super.releaseWidget ();
 }
 
 /**
@@ -570,15 +863,12 @@
  */
 public void removeAll () {
 	checkWidget ();
-	OS.gtk_tree_store_clear (modelHandle);
+	OS.gtk_ctree_remove_node (handle, 0);
 	for (int i=0; i<items.length; i++) {
-		TreeItem item = items[i];
-		if (item!=null && !item.isDisposed()) {
-			item.releaseWidget();
-			item.releaseHandle();
-		}
+		TreeItem item = items [i];
+		if (item != null && !item.isDisposed ()) item.releaseResources ();
 	}
-	items = new TreeItem[4];
+	items = new TreeItem [4];
 }
 
 /**
@@ -630,8 +920,38 @@
 	eventTable.unhook (SWT.Collapse, listener);
 }
 
-public void setInsertMark(TreeItem item, boolean set) {
-	// FIXME - not yet implemented
+void setFontDescription (int font) {
+	super.setFontDescription (font);
+	if (imageHeight != 0) {
+		OS.gtk_widget_realize (handle);
+		OS.gtk_clist_set_row_height (handle, 0);
+		if (imageHeight > OS.GTK_CLIST_ROW_HEIGHT (handle)) {
+			OS.gtk_clist_set_row_height (handle, imageHeight);
+		}
+	}
+}
+
+/**
+ * Display a mark indicating the point at which an item will be inserted.
+ * The drop insert item has a visual hint to show where a dragged item 
+ * will be inserted when dropped on the tree.
+ * 
+ * @param item the insert item.  Null will clear the insertion mark.
+ * @param after true places the insert mark above 'item'. false places 
+ *	the insert mark below 'item'.
+ *
+ * @exception IllegalArgumentException <ul>
+ *    <li>ERROR_INVALID_ARGUMENT - if the item has been disposed</li>
+ * </ul>
+ * @exception SWTException <ul>
+ *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ */
+public void setInsertMark(TreeItem item, boolean before){
+	checkWidget();
+	if (item != null && item.isDisposed()) error(SWT.ERROR_INVALID_ARGUMENT);
+	// This needs to be implemented
 }
 
 /**
@@ -644,9 +964,9 @@
  */
 public void selectAll () {
 	checkWidget();
-	blockSignal(handle, SWT.Selection);
-	OS.gtk_tree_selection_select_all (OS.gtk_tree_view_get_selection(handle));
-	unblockSignal(handle, SWT.Selection);
+	blockSignal (handle, SWT.Selection);
+	OS.gtk_ctree_select_recursive (handle, 0);
+	unblockSignal (handle, SWT.Selection);	
 }
 
 void setBackgroundColor (GdkColor color) {
@@ -654,9 +974,13 @@
 	OS.gtk_widget_modify_base (handle, 0, color);
 }
 
-void setForegroundColor (GdkColor color) {
-	super.setForegroundColor (color);
-	OS.gtk_widget_modify_text (handle, 0, color);
+public void setRedraw (boolean redraw) {
+	checkWidget ();
+	if (redraw) {
+		OS.gtk_clist_thaw (handle);
+	} else {
+		OS.gtk_clist_freeze (handle);
+	}
 }
 
 /**
@@ -678,17 +1002,29 @@
  * @see Tree#deselectAll()
  */
 public void setSelection (TreeItem [] items) {
-	if (items == null) error (SWT.ERROR_NULL_ARGUMENT);
 	checkWidget();
-	int selection = OS.gtk_tree_view_get_selection(handle);
-	blockSignal(handle, SWT.Selection);
-	OS.gtk_tree_selection_unselect_all(selection);
-	for (int i = 0; i < items.length; i++) {
-		if (items[i].isDisposed ()) break;
-		OS.gtk_tree_selection_select_iter (selection, items[i].handle);
+	if (items == null) error (SWT.ERROR_NULL_ARGUMENT);
+	deselectAll();
+	blockSignal (handle, SWT.Selection);
+	int index = 0, length = items.length;
+	while (index < length) {
+		TreeItem item = items [index];
+		if (item != null) {
+			if (item.isDisposed ()) break;
+			OS.gtk_ctree_select (handle, item.handle);
+		}
+		index++;
 	}
-	if (items.length > 0) showItem(items[0]);
-	unblockSignal(handle, SWT.Selection);
+	unblockSignal (handle, SWT.Selection);
+	index = 0;
+	while (index < length) {
+		TreeItem item = items [index];
+		if (item != null && !item.isDisposed ()) {
+			showItem (item);
+			return;
+		}
+		index++;
+	}
 }
 
 /**
@@ -708,11 +1044,12 @@
  */
 public void showSelection () {
 	checkWidget();
-	if (getSelectionCount()==0) return;
-	TreeItem item = getSelection()[0];
-	int path = OS.gtk_tree_model_get_path(modelHandle, item.handle);
-	OS.gtk_tree_view_scroll_to_cell(handle, path, 0, false, 0, 0);
-	OS.gtk_tree_path_free(path);
+	int selection = OS.GTK_CLIST_SELECTION (handle);
+	if (selection == 0) return;
+	if (OS.g_list_length (selection) == 0) return;
+	int node = OS.g_list_nth_data (selection, 0);
+	int index = OS.gtk_ctree_node_get_row_data (handle, node) - 1;
+	showItem (items [index]);
 }
 
 /**
@@ -735,21 +1072,35 @@
  */
 public void showItem (TreeItem item) {
 	checkWidget ();
-	int path = OS.gtk_tree_model_get_path(modelHandle, item.handle);
-	OS.gtk_tree_view_scroll_to_cell(handle, path, 0, false, 0, 0);
-	OS.gtk_tree_path_free(path);
+	if (item == null) error (SWT.ERROR_NULL_ARGUMENT);
+	if (item.isDisposed ()) error(SWT.ERROR_INVALID_ARGUMENT);
+	int node = item.handle;
+	int visibility = OS.gtk_ctree_node_is_visible (handle, node);
+	if (visibility != OS.GTK_VISIBILITY_NONE) return;
+	if (!OS.gtk_ctree_is_viewable (handle, node)) {
+		int parent = node;
+		GtkCTreeRow row;
+		blockSignal (handle, SWT.Expand);
+		do {
+			int data = OS.g_list_nth_data (parent, 0);
+			row = new GtkCTreeRow ();
+			OS.memmove (row, data, GtkCTreeRow.sizeof);
+			if ((parent = row.parent) == 0) break;
+			OS.gtk_ctree_expand (handle, parent);
+		} while (true);
+		unblockSignal (handle, SWT.Expand);
+	}
+	OS.gtk_ctree_node_moveto (handle, node, 0, 0.0f, 0.0f);
 }
 
-void deregister () {
-	super.deregister ();
-	WidgetTable.remove(OS.gtk_tree_view_get_selection(handle));
-	WidgetTable.remove(columnHandle);
+public void update () {
+	checkWidget ();
+	if (timerID != 0) {
+		OS.gtk_clist_thaw (handle);
+		OS.gtk_timeout_remove (timerID);
+		timerID = 0;
+	}
+	super.update ();
 }
 
-void register () {
-	super.register ();
-	WidgetTable.put (OS.gtk_tree_view_get_selection(handle), this);
-	WidgetTable.put (columnHandle, this);
 }
-}
-
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TreeItem.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TreeItem.java
index ffffdc1..0562bad 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TreeItem.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TreeItem.java
@@ -154,12 +154,8 @@
  */
 public Color getBackground () {
 	checkWidget ();
-	int[] ptr = new int[1];
-	OS.gtk_tree_model_get(parent.modelHandle, handle, 3, ptr, -1);
-	if (ptr[0]==0) return parent.getBackground();
-	GdkColor gdkColor = new GdkColor();
-	OS.memmove(gdkColor, ptr[0], GdkColor.sizeof);
-	return Color.gtk_new(getDisplay(), gdkColor);
+	Tree parent = getParent();
+	return parent.getBackground();
 }
 
 /**
@@ -217,9 +213,36 @@
  * </ul>
  */
 public Rectangle getBounds () {
-	GdkRectangle rect = new GdkRectangle();
-	OS.gtk_tree_view_get_cell_area(parent.handle, handle, parent.columnHandle, rect);
-	return new Rectangle (rect.x, rect.y, rect.width, rect.height);
+	int ctree = parent.handle;
+	/* NB: Different from gtk_ctree_is_visible() */
+	if (!OS.gtk_ctree_is_viewable(ctree, handle)) return new Rectangle(0,0,0,0);
+
+	/* Vertical */
+	int row_index = 0;
+	int work = OS.GTK_CLIST_ROW_LIST(ctree);
+	while ((work!=0) && (work!=handle)) {
+		work = OS.GTK_CTREE_NODE_NEXT(work);
+		row_index++;
+	}
+	
+	int border = OS.gtk_container_get_border_width(ctree);
+	// observe the weird row spacing rule
+	int y = OS.ROW_TOP_YPIXEL(ctree, row_index) + Tree.CELL_SPACING;
+	int height = parent.getItemHeight();
+
+	/* Horizontal */	
+	int row_ptr = OS.GTK_CTREE_ROW(ctree, handle);
+	GtkCTreeRow row = new GtkCTreeRow();
+	OS.memmove(row, OS.g_list_nth_data (handle, 0), GtkCTreeRow.sizeof);
+	int x = OS.GTK_CLIST_HOFFSET(ctree) + OS.GTK_CTREE_TREE_INDENT (ctree) * row.level;
+	if (image != null) {
+		int[] w = new int[1], h = new int[1];
+ 		OS.gdk_drawable_get_size(image.pixmap, w, h);
+ 		x += w[0]; 
+	}	
+	int width = OS.GTK_CLIST_WINDOW_WIDTH(ctree) - x; // No hoffset!
+	
+	return new Rectangle (x, y, width, parent.getItemHeight());
 }	
 
 /**
@@ -238,9 +261,10 @@
 public boolean getChecked () {
 	checkWidget();
 	if ((parent.style & SWT.CHECK) == 0) return false;
-	int[] ptr = new int[1];
-	OS.gtk_tree_model_get(parent.modelHandle, handle, 5, ptr, -1);
-	return ptr[0] != 0;
+	int ctree = parent.handle;
+	int [] pixmap = new int [1];
+	OS.gtk_ctree_get_node_info (ctree, handle, null, null, pixmap, null, null, null, null, null);
+	return pixmap [0] == parent.check;
 }
 
 public Display getDisplay () {
@@ -262,10 +286,10 @@
  */
 public boolean getExpanded () {
 	checkWidget();
-	int path = OS.gtk_tree_model_get_path(parent.modelHandle, handle);
-	boolean answer = OS.gtk_tree_view_row_expanded(parent.handle, path);
-	OS.gtk_tree_path_free(path);
-	return answer;
+	int ctree = parent.handle;
+	boolean [] buffer = new boolean [1];
+	OS.gtk_ctree_get_node_info (ctree, handle, null, null, null, null, null, null, null, buffer);
+	return buffer [0];
 }
 
 /**
@@ -283,12 +307,8 @@
  */
 public Color getForeground () {
 	checkWidget ();
-	int[] ptr = new int[1];
-	OS.gtk_tree_model_get(parent.modelHandle, handle, 2, ptr, -1);
-	if (ptr[0]==0) return parent.getBackground();
-	GdkColor gdkColor = new GdkColor();
-	OS.memmove(gdkColor, ptr[0], GdkColor.sizeof);
-	return Color.gtk_new(getDisplay(), gdkColor);
+	Tree parent = getParent();
+	return parent.getForeground();
 }
 
 /**
@@ -375,19 +395,13 @@
  */
 public TreeItem getParentItem () {
 	checkWidget();
-	int path = OS.gtk_tree_model_get_path(parent.modelHandle, handle);
-	if (OS.gtk_tree_path_get_depth(path)<2) {
-		OS.gtk_tree_path_free(path);
-		return null;
-	}
-	OS.gtk_tree_path_up(path);
-	int iter = OS.g_malloc(OS.GtkTreeIter_sizeof());
-	OS.gtk_tree_model_get_iter(parent.modelHandle, iter, path);
-	int[] index = new int[1];
-	OS.gtk_tree_model_get(parent.modelHandle, iter, 4, index, -1);
-	OS.g_free(iter);
-	OS.gtk_tree_path_free(path);
-	return parent.items[index[0]];
+	int data = OS.g_list_nth_data (handle, 0);
+	GtkCTreeRow row = new GtkCTreeRow ();
+	OS.memmove (row, data, GtkCTreeRow.sizeof);
+	if (row.parent == 0) return null;
+	int ctree = parent.handle;
+	int index = OS.gtk_ctree_node_get_row_data (ctree, row.parent) - 1;
+	return parent.items [index];
 }
 
 void releaseChild () {
@@ -423,8 +437,8 @@
 	if (color != null && color.isDisposed ()) {
 		SWT.error (SWT.ERROR_INVALID_ARGUMENT);
 	}
-	GdkColor ptr = (color != null)? color.handle : null;
-	OS.gtk_tree_store_set(parent.modelHandle, handle, 3, ptr, -1);
+	int ctree = parent.handle;
+	OS.gtk_ctree_node_set_background (ctree, handle, color != null ? color.handle : null);
 }
 
 /**
@@ -441,7 +455,16 @@
 public void setChecked (boolean checked) {
 	checkWidget();
 	if ((parent.style & SWT.CHECK) == 0) return;
-	OS.gtk_tree_store_set(parent.modelHandle, handle, 5, checked, -1);
+	int ctree = parent.handle;
+	byte [] spacing = new byte [1];
+	int [] pixmap = new int [1], mask = new int [1];
+	boolean [] is_leaf = new boolean [1], expanded = new boolean [1];
+	byte [] buffer = Converter.wcsToMbcs (null, text, true);
+	OS.gtk_ctree_get_node_info (ctree, handle, null, spacing, pixmap, mask, pixmap, mask, is_leaf, expanded);
+	if (checked && pixmap [0] == parent.check) return;
+	if (!checked && pixmap [0] == parent.uncheck) return;
+	pixmap [0] = checked ? parent.check : parent.uncheck;
+	OS.gtk_ctree_set_node_info (ctree, handle, buffer, spacing [0], pixmap [0], mask [0], pixmap [0], mask [0], is_leaf [0], expanded [0]);				
 }
 
 /**
@@ -472,17 +495,16 @@
  */
 public void setExpanded (boolean expanded) {
 	checkWidget();
-	int path = OS.gtk_tree_model_get_path(parent.modelHandle, handle);
+	int ctree = parent.handle;
 	if (expanded) {
-		blockSignal(parent.handle, SWT.Expand);
-		OS.gtk_tree_view_expand_row(parent.handle, path, false);
-		unblockSignal(parent.handle, SWT.Expand);
+		blockSignal (ctree, SWT.Expand);
+		OS.gtk_ctree_expand (ctree, handle);
+		unblockSignal (ctree, SWT.Expand);
 	} else {
-		blockSignal(parent.handle, SWT.Collapse);
-		OS.gtk_tree_view_collapse_row(parent.handle, path);
-		unblockSignal(parent.handle, SWT.Collapse);
+		blockSignal (ctree, SWT.Collapse);
+		OS.gtk_ctree_collapse (ctree, handle);
+		unblockSignal (ctree, SWT.Collapse);
 	}
-	OS.gtk_tree_path_free(path);
 }
 
 /**
@@ -510,8 +532,8 @@
 	if (color != null && color.isDisposed ()) {
 		SWT.error (SWT.ERROR_INVALID_ARGUMENT);
 	}
-	GdkColor ptr = (color != null)? color.handle : null;
-	OS.gtk_tree_store_set(parent.modelHandle, handle, 2, ptr, -1);
+	int ctree = parent.handle;
+	OS.gtk_ctree_node_set_foreground (ctree, handle, color != null ? color.handle : null);
 }
 
 public void setImage (Image image) {
@@ -519,38 +541,29 @@
 	if (image != null && image.isDisposed()) {
 		error(SWT.ERROR_INVALID_ARGUMENT);
 	}
+	if ((parent.style & SWT.CHECK) != 0) return;
 	this.image = image;
-	int pixbuf = 0;
+	int pixmap = 0, mask = 0;
 	if (image != null) {
-		int[] w = new int[1], h = new int[1];
-		boolean hasMask = (image.mask != 0);
-	 	OS.gdk_drawable_get_size(image.pixmap, w, h);
- 		int width = w[0], height = h[0]; 	
-		pixbuf = OS.gdk_pixbuf_new(OS.GDK_COLORSPACE_RGB, hasMask, 8, width, height);
-		if (pixbuf == 0) SWT.error(SWT.ERROR_NO_HANDLES);
-		int colormap = OS.gdk_colormap_get_system();
-		OS.gdk_pixbuf_get_from_drawable(pixbuf, image.pixmap, colormap, 0, 0, 0, 0, width, height);
-		if (hasMask) {
-			int gdkMaskImagePtr = OS.gdk_drawable_get_image(image.mask, 0, 0, width, height);
-			if (gdkMaskImagePtr == 0) SWT.error(SWT.ERROR_NO_HANDLES);
-			int stride = OS.gdk_pixbuf_get_rowstride(pixbuf);
-			int pixels = OS.gdk_pixbuf_get_pixels(pixbuf);
-			byte[] line = new byte[stride];
-			for (int y=0; y<height; y++) {
-				OS.memmove(line, pixels + (y * stride), stride);
-				for (int x=0; x<width; x++) {
-					if (OS.gdk_image_get_pixel(gdkMaskImagePtr, x, y) != 0) {
-						line[x*4+3] = (byte)0xFF;
-					} else {
-						line[x*4+3] = 0;
-					}
-				}
-				OS.memmove(pixels + (y * stride), line, stride);
+		pixmap = image.pixmap;
+		mask = image.mask;
+	}
+	int ctree = parent.handle;
+	byte [] spacing = new byte [1];
+	boolean [] is_leaf = new boolean [1], expanded = new boolean [1];
+	byte [] buffer = Converter.wcsToMbcs (null, text, true);
+	OS.gtk_ctree_get_node_info (ctree, handle, null, spacing, null, null, null, null, is_leaf, expanded);
+	OS.gtk_ctree_set_node_info (ctree, handle, buffer, spacing [0], pixmap, mask, pixmap, mask, is_leaf [0], expanded [0]);
+	if (image != null) {
+		if (parent.imageHeight == 0) {		
+			int [] width = new int [1], height = new int [1];
+			OS.gdk_drawable_get_size (pixmap, width, height);
+			if (height [0] > OS.GTK_CLIST_ROW_HEIGHT (parent.handle)) {
+				parent.imageHeight = height [0];
+				OS.gtk_clist_set_row_height (ctree, height [0]);
 			}
-			OS.g_object_unref(gdkMaskImagePtr);
 		}
-	}	
-	OS.gtk_tree_store_set(parent.modelHandle, handle, 1, pixbuf, -1);
+	}
 }
 
 /**
@@ -562,8 +575,13 @@
 	checkWidget();
 	if (string == null) error (SWT.ERROR_NULL_ARGUMENT);
 	super.setText (string);
-	byte[] bytes = Converter.wcsToMbcs(null, string, true);
-	OS.gtk_tree_store_set(parent.modelHandle, handle, 0, bytes, -1);
+	int ctree = parent.handle;
+	byte [] buffer = Converter.wcsToMbcs (null, string, true);
+	byte [] spacing = new byte [1];
+	boolean [] is_leaf = new boolean [1], expanded = new boolean [1];
+	int [] pixmap_closed = new int [1], mask_closed= new int [1], pixmap_opened= new int [1], mask_opened= new int [1];
+	OS.gtk_ctree_get_node_info (ctree, handle, null, spacing, pixmap_closed, mask_closed, pixmap_opened, mask_opened, is_leaf, expanded);
+	OS.gtk_ctree_set_node_info (ctree, handle, buffer, spacing [0], pixmap_closed [0], mask_closed [0], pixmap_opened [0], mask_opened [0], is_leaf [0], expanded [0]);
 }
 
 }
diff --git a/examples/org.eclipse.swt.examples.controls/.classpath b/examples/org.eclipse.swt.examples.controls/.classpath
deleted file mode 100755
index 2b023fa..0000000
--- a/examples/org.eclipse.swt.examples.controls/.classpath
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-    <classpathentry kind="src" path="src"/>
-    <classpathentry kind="var" path="JRE_LIB"/>
-    <classpathentry kind="var"
-        path="ECLIPSE_HOME/plugins/org.eclipse.core.runtime_2.0.0/runtime.jar" sourcepath="ECLIPSE_HOME/plugins/org.eclipse.core.runtime_1.9.0/runtimesrc.zip"/>
-    <classpathentry kind="var"
-        path="ECLIPSE_HOME/plugins/org.eclipse.ui_2.0.0/workbench.jar" sourcepath="ECLIPSE_HOME/plugins/org.eclipse.ui_1.9.0/workbenchsrc.zip"/>
-    <classpathentry kind="src" path="/org.eclipse.swt.examples"/>
-    <classpathentry kind="src" path="/org.eclipse.swt"/>
-    <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/examples/org.eclipse.swt.examples.controls/.cvsignore b/examples/org.eclipse.swt.examples.controls/.cvsignore
deleted file mode 100755
index c5e82d7..0000000
--- a/examples/org.eclipse.swt.examples.controls/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
\ No newline at end of file
diff --git a/examples/org.eclipse.swt.examples.controls/.project b/examples/org.eclipse.swt.examples.controls/.project
deleted file mode 100644
index 8ef8047..0000000
--- a/examples/org.eclipse.swt.examples.controls/.project
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.swt.examples.controls</name>
-	<comment></comment>
-	<projects>
-		<project>org.eclipse.swt</project>
-		<project>org.eclipse.swt.examples</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/examples/org.eclipse.swt.examples.controls/about.html b/examples/org.eclipse.swt.examples.controls/about.html
deleted file mode 100644
index 9db411a..0000000
--- a/examples/org.eclipse.swt.examples.controls/about.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>20th June, 2002</p>	
-<h3>License</h3>
-<p>Eclipse.org makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Common Public License Version 1.0 (&quot;CPL&quot;).  A copy of the CPL is available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>.
-For purposes of the CPL, &quot;Program&quot; will mean the Content.</p>
-
-<h3>Contributions</h3>
-
-<p>If this Content is licensed to you under the terms and conditions of the CPL, any Contributions, as defined in the CPL, uploaded, submitted, or otherwise
-made available to Eclipse.org, members of Eclipse.org and/or the host of Eclipse.org web site, by you that relate to such
-Content are provided under the terms and conditions of the CPL and can be made available to others under the terms of the CPL.</p>
-
-<p>If this Content is licensed to you under license terms and conditions other than the CPL (&quot;Other License&quot;), any modifications, enhancements and/or
-other code and/or documentation (&quot;Modifications&quot;) uploaded, submitted, or otherwise made available to Eclipse.org, members of Eclipse.org and/or the
-host of Eclipse.org, by you that relate to such Content are provided under terms and conditions of the Other License and can be made available
-to others under the terms of the Other License.  In addition, with regard to Modifications for which you are the copyright holder, you are also
-providing the Modifications under the terms and conditions of the CPL and such Modifications can be made available to others under the terms of
-the CPL.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/examples/org.eclipse.swt.examples.controls/build.properties b/examples/org.eclipse.swt.examples.controls/build.properties
deleted file mode 100755
index daf2c0b..0000000
--- a/examples/org.eclipse.swt.examples.controls/build.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-bin.includes = doc-html/,\
-               icons/,\
-               plugin.properties,\
-               plugin.xml,\
-               about.html,\
-	           *.jar
-
-src.includes = about.html
-	       
-source.controls.jar = src/
diff --git a/examples/org.eclipse.swt.examples.controls/doc-html/hglegal2002.htm b/examples/org.eclipse.swt.examples.controls/doc-html/hglegal2002.htm
deleted file mode 100644
index 74393f0..0000000
--- a/examples/org.eclipse.swt.examples.controls/doc-html/hglegal2002.htm
+++ /dev/null
@@ -1,14 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <meta name="GENERATOR" content="Microsoft FrontPage 4.0">
-   <title>Legal Notices</title>
-</head>
-<body>
-
-<h3>
-<a NAME="Notices"></a>Notices</h3>
-(c) Copyright IBM Corp. 2000, 2002. All Rights Reserved.
-</body>
-</html>
diff --git a/examples/org.eclipse.swt.examples.controls/doc-html/ngibmcpy2002.gif b/examples/org.eclipse.swt.examples.controls/doc-html/ngibmcpy2002.gif
deleted file mode 100644
index 61cef48..0000000
--- a/examples/org.eclipse.swt.examples.controls/doc-html/ngibmcpy2002.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.controls/doc-html/swt_controls_ex.html b/examples/org.eclipse.swt.examples.controls/doc-html/swt_controls_ex.html
deleted file mode 100755
index d18d828..0000000
--- a/examples/org.eclipse.swt.examples.controls/doc-html/swt_controls_ex.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <title>SWT - Controls Example</title>
-</head>
-<body>
-
-<h2>SWT Example - Controls Example</h2>
-
-<p>
-The Controls example is a simple demonstration of common SWT controls. 
-It consists of a tab folder where each tab in the folder allows the user 
-to interact with a different control.
-The user can change styles and settings and view how this affects the control.
-</p>
-
-<h3>Running the example</h3>
-<p>From the Window menu select Show View --> Other.  
-In the Show View dialog, expand SWT Examples and select the
-view named SWT Controls.  A view titled SWT Controls will appear in your current perspective.
-</p>
-
-
-<p><a href="hglegal2002.htm"><img SRC="ngibmcpy2002.gif" ALT="Copyright IBM Corporation and others 2000, 2002.  All Rights Reserved." BORDER=0 height=14 width=324></a></p>
-</body>
-</html>
diff --git a/examples/org.eclipse.swt.examples.controls/icons/controls_example.gif b/examples/org.eclipse.swt.examples.controls/icons/controls_example.gif
deleted file mode 100755
index cbdee97..0000000
--- a/examples/org.eclipse.swt.examples.controls/icons/controls_example.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.controls/plugin.properties b/examples/org.eclipse.swt.examples.controls/plugin.properties
deleted file mode 100755
index 418cd71..0000000
--- a/examples/org.eclipse.swt.examples.controls/plugin.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-providerName = Eclipse.org
-plugin.SWTControlsExample.name = SWT Controls Example Plugin
-category.SWTExamples.name = SWT Examples
-view.ControlsExample.name = SWT Controls
-
-launchcategory.SWTViewExamples.name = Workbench Views
-launchcategory.SWTViewExamples.description = \
-	A collection of Standard Widget Toolkit examples that run as Views inside the Workbench.  \
-	These examples will create a new View in the current Perspective.
-
-launchitem.ControlsExample.name = Controls
-launchitem.ControlsExample.description = \
-	This example is a simple demonstration of common SWT controls.\n\n\
-	It consists of a tab folder where each tab allows the user \
-	to interact with a different SWT control. \
-	The user can change styles and settings and view how this affects the control.
\ No newline at end of file
diff --git a/examples/org.eclipse.swt.examples.controls/plugin.xml b/examples/org.eclipse.swt.examples.controls/plugin.xml
deleted file mode 100755
index 9015ad9..0000000
--- a/examples/org.eclipse.swt.examples.controls/plugin.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<plugin
-   id="org.eclipse.swt.examples.controls"
-   name="%plugin.SWTControlsExample.name"
-   version="2.1.0"
-   provider-name="%providerName"
-   class="org.eclipse.swt.examples.controls.ControlPlugin">
-
-<!-- Runtime -->
-<!-- Runtime -->
-   <runtime>
-      <library name="controls.jar"/>
-   </runtime>
-<!-- Required plugins -->
-   <requires>
-      <import plugin="org.eclipse.core.runtime"/>
-      <import plugin="org.eclipse.ui"/>
-      <import plugin="org.eclipse.swt"/>
-      <import plugin="org.eclipse.swt.examples"/>
-   </requires>
-
-
-<!-- Extension points -->
-<!-- Extensions -->
-   <extension
-         point="org.eclipse.ui.views">
-      <view
-            name="%view.ControlsExample.name"
-            icon="icons/controls_example.gif"
-            category="org.eclipse.swt.examples.category"
-            class="org.eclipse.swt.examples.controls.ControlView"
-            id="org.eclipse.swt.examples.controls.view">
-      </view>
-   </extension>
-   <extension
-         point="org.eclipse.swt.examples.launcher.launchItems">
-      <category
-            name="%launchcategory.SWTViewExamples.name"
-            description="%launchcategory.SWTViewExamples.description"
-            id="org.eclipse.swt.examples.launchViewCategory">
-      </category>
-      <item
-            name="%launchitem.ControlsExample.name"
-            icon="icons/controls_example.gif"
-            description="%launchitem.ControlsExample.description"
-            category="org.eclipse.swt.examples.launchViewCategory"
-            id="org.eclipse.swt.examples.controls.viewlauncher">
-         <view
-               viewId="org.eclipse.swt.examples.controls.view">
-         </view>
-      </item>
-   </extension>
-
-</plugin>
diff --git a/examples/org.eclipse.swt.examples.controls/src/import.properties b/examples/org.eclipse.swt.examples.controls/src/import.properties
deleted file mode 100644
index 265131a..0000000
--- a/examples/org.eclipse.swt.examples.controls/src/import.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-# Persist project settings for later import 
-natures = org.eclipse.jdt.core.javanature; org.eclipse.pde.PluginNature
-builders = org.eclipse.jdt.core.javabuilder; org.eclipse.pde.ManifestBuilder; org.eclipse.pde.SchemaBuilder
-var.ECLIPSE_PLUGINS = <<ECLIPSE_PLUGINS>>
diff --git a/examples/org.eclipse.swt.examples.controls/src/org/eclipse/swt/examples/controls/ControlPlugin.java b/examples/org.eclipse.swt.examples.controls/src/org/eclipse/swt/examples/controls/ControlPlugin.java
deleted file mode 100755
index 25bf20e..0000000
--- a/examples/org.eclipse.swt.examples.controls/src/org/eclipse/swt/examples/controls/ControlPlugin.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.eclipse.swt.examples.controls;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.core.runtime.*;
-import org.eclipse.ui.plugin.*;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class ControlPlugin extends AbstractUIPlugin {
-	/**
-	 * The constructor.
-	 */
-	public ControlPlugin(IPluginDescriptor descriptor) {
-		super(descriptor);
-	}
-	
-	/**
-	 * Clean up
-	 */
-	public void shutdown() throws CoreException {
-		super.shutdown();
-	}
-}
diff --git a/examples/org.eclipse.swt.examples.controls/src/org/eclipse/swt/examples/controls/ControlView.java b/examples/org.eclipse.swt.examples.controls/src/org/eclipse/swt/examples/controls/ControlView.java
deleted file mode 100755
index a55b754..0000000
--- a/examples/org.eclipse.swt.examples.controls/src/org/eclipse/swt/examples/controls/ControlView.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.eclipse.swt.examples.controls;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
- 
-import org.eclipse.swt.examples.controlexample.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.ui.part.*;
-
-/**
- * <code>Controls</code> is a simple demonstration
- * of the controls defined by SWT.  It consists of a workbench
- * view and tab folder where each tab in the folder allows the
- * user to interact with a control.
- * 
- * @see ViewPart
- */
-public class ControlView extends ViewPart {
-	ControlExample instance = null;
-	
-	/**
-	 * Create the example
-	 * 
-	 * @see ViewPart#createPartControl
-	 */
-	public void createPartControl(Composite frame) {
-		instance = new ControlExample(frame);
-	}
-
-	/**
-	 * Called when we must grab focus.
-	 * 
-	 * @see org.eclipse.ui.part.ViewPart#setFocus
-	 */
-	public void setFocus() {
-		instance.setFocus();
-	}
-
-	/**
-	 * Called when the View is to be disposed
-	 */	
-	public void dispose() {
-		instance.dispose();
-		instance = null;
-		super.dispose();
-	}
-}
diff --git a/examples/org.eclipse.swt.examples.launcher/.classpath b/examples/org.eclipse.swt.examples.launcher/.classpath
deleted file mode 100755
index 57088c8..0000000
--- a/examples/org.eclipse.swt.examples.launcher/.classpath
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-    <classpathentry kind="src" path="src"/>
-    <classpathentry kind="src" path="/org.eclipse.swt"/>
-    <classpathentry kind="src" path="/org.eclipse.swt.examples"/>
-    <classpathentry kind="var" path="JRE_LIB" rootpath="JRE_SRCROOT" sourcepath="JRE_SRC"/>
-    <classpathentry kind="var" path="ECLIPSE_HOME/plugins/org.eclipse.ui_2.0.0/workbench.jar"/>
-    <classpathentry kind="var" path="ECLIPSE_HOME/plugins/org.eclipse.core.boot_2.0.0/boot.jar"/>
-    <classpathentry kind="var" path="ECLIPSE_HOME/plugins/org.eclipse.core.runtime_2.0.0/runtime.jar"/>
-    <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/examples/org.eclipse.swt.examples.launcher/.cvsignore b/examples/org.eclipse.swt.examples.launcher/.cvsignore
deleted file mode 100755
index c5e82d7..0000000
--- a/examples/org.eclipse.swt.examples.launcher/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
\ No newline at end of file
diff --git a/examples/org.eclipse.swt.examples.launcher/.project b/examples/org.eclipse.swt.examples.launcher/.project
deleted file mode 100644
index 3aa0f07..0000000
--- a/examples/org.eclipse.swt.examples.launcher/.project
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.swt.examples.launcher</name>
-	<comment></comment>
-	<projects>
-		<project>org.eclipse.swt</project>
-		<project>org.eclipse.swt.examples</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/examples/org.eclipse.swt.examples.launcher/about.html b/examples/org.eclipse.swt.examples.launcher/about.html
deleted file mode 100644
index 9db411a..0000000
--- a/examples/org.eclipse.swt.examples.launcher/about.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>20th June, 2002</p>	
-<h3>License</h3>
-<p>Eclipse.org makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Common Public License Version 1.0 (&quot;CPL&quot;).  A copy of the CPL is available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>.
-For purposes of the CPL, &quot;Program&quot; will mean the Content.</p>
-
-<h3>Contributions</h3>
-
-<p>If this Content is licensed to you under the terms and conditions of the CPL, any Contributions, as defined in the CPL, uploaded, submitted, or otherwise
-made available to Eclipse.org, members of Eclipse.org and/or the host of Eclipse.org web site, by you that relate to such
-Content are provided under the terms and conditions of the CPL and can be made available to others under the terms of the CPL.</p>
-
-<p>If this Content is licensed to you under license terms and conditions other than the CPL (&quot;Other License&quot;), any modifications, enhancements and/or
-other code and/or documentation (&quot;Modifications&quot;) uploaded, submitted, or otherwise made available to Eclipse.org, members of Eclipse.org and/or the
-host of Eclipse.org, by you that relate to such Content are provided under terms and conditions of the Other License and can be made available
-to others under the terms of the Other License.  In addition, with regard to Modifications for which you are the copyright holder, you are also
-providing the Modifications under the terms and conditions of the CPL and such Modifications can be made available to others under the terms of
-the CPL.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/examples/org.eclipse.swt.examples.launcher/build.properties b/examples/org.eclipse.swt.examples.launcher/build.properties
deleted file mode 100755
index 8d7ddf7..0000000
--- a/examples/org.eclipse.swt.examples.launcher/build.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-bin.includes = doc/,\
-               doc-html/,\
-               icons/,\
-               schema/,\
-               plugin.properties,\
-               plugin.xml,\
-               about.html,\
-	           *.jar
-	           
-src.includes = about.html
-
-source.launcher.jar = src/
diff --git a/examples/org.eclipse.swt.examples.launcher/doc-html/hglegal2002.htm b/examples/org.eclipse.swt.examples.launcher/doc-html/hglegal2002.htm
deleted file mode 100644
index 74393f0..0000000
--- a/examples/org.eclipse.swt.examples.launcher/doc-html/hglegal2002.htm
+++ /dev/null
@@ -1,14 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <meta name="GENERATOR" content="Microsoft FrontPage 4.0">
-   <title>Legal Notices</title>
-</head>
-<body>
-
-<h3>
-<a NAME="Notices"></a>Notices</h3>
-(c) Copyright IBM Corp. 2000, 2002. All Rights Reserved.
-</body>
-</html>
diff --git a/examples/org.eclipse.swt.examples.launcher/doc-html/ngibmcpy2002.gif b/examples/org.eclipse.swt.examples.launcher/doc-html/ngibmcpy2002.gif
deleted file mode 100644
index 61cef48..0000000
--- a/examples/org.eclipse.swt.examples.launcher/doc-html/ngibmcpy2002.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.launcher/doc-html/swt_launcher_ex.html b/examples/org.eclipse.swt.examples.launcher/doc-html/swt_launcher_ex.html
deleted file mode 100755
index 6ed2891..0000000
--- a/examples/org.eclipse.swt.examples.launcher/doc-html/swt_launcher_ex.html
+++ /dev/null
@@ -1,45 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <title>SWT - Example Launcher</title>
-</head>
-<body>
-
-<h2>SWT Example Launcher</h2>
-
-<p>
-The Example Launcher is used to launch SWT examples which can either be Workbench Views, 
-or Standalone applications.
-</p>
-
-<ul>
-<li>Workbench Views are examples that are integrated into Eclipse.  When the Launcher
-starts a Workbench View, it is opened in the currently active perspective.
-<li>Standalone applications are launched in a separate window.
-</ul>
-
-<h3>Running the Example Launcher</h3>
-
-<p>
-From the Window menu, select Show View --> Other. 
-In the Show View dialog, expand SWT Examples and select the SWT Example Launcher view. 
-A view containing a list of examples will appear in your current perspective.
-Select an example from the list.  A brief description of the example is displayed.
-Click on the Run button to launch the example.
-</p>
-
-
-<h3>Details</h3>
-<p>The example launcher view contains a tree list, a text area, and a button.
-The tree list contains a list of all the SWT examples you can choose
-to run. When an example is selected from the tree, the text area
-displays a short description of the example. The selected example can
-be launched by clicking on the Run button.  Standalone examples are run in the 
-same thread as the workbench's UI but they are not integrated into the perspective. 
-The launcher invokes the <code>open()</code> method of the standalone example.
-</p>
-
-<p><a href="hglegal2002.htm"><img SRC="ngibmcpy2002.gif" ALT="Copyright IBM Corporation and others 2000, 2002.  All Rights Reserved." BORDER=0 height=14 width=324></a></p>
-</body>
-</html>
diff --git a/examples/org.eclipse.swt.examples.launcher/doc/org.eclipse.swt.examples.launcher.launchItems.html b/examples/org.eclipse.swt.examples.launcher/doc/org.eclipse.swt.examples.launcher.launchItems.html
deleted file mode 100755
index abef83e..0000000
--- a/examples/org.eclipse.swt.examples.launcher/doc/org.eclipse.swt.examples.launcher.launchItems.html
+++ /dev/null
@@ -1,60 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<HEAD>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-</HEAD>
-<HTML>
-<BODY>
-<H1><CENTER>Launch Items</CENTER></H1>
-<H2>Identifier</H2>
-org.eclipse.swt.examples.launcher.launchItems<H2>Description</H2>
-This extension point is used to add 'standalone program' and
-'Workbench view'
-launch items to the Launcher, optionally grouping them into
-categories so as to form a multi-tiered hierarchy.
-Standalone programs are executed using the platform's event loop.
-Workbench views are created within the active Workbench Perspective.<H2>Markup</H2>
-<p><samp>&nbsp;&nbsp; &lt;!ELEMENT extension (EMPTY)&gt;</samp>
-<br><samp>&nbsp;&nbsp; &lt;!ATTLIST extension</samp>
-<br><samp>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;point&nbsp;CDATA #REQUIRED</samp>
-<br><samp>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id&nbsp;&nbsp;&nbsp;&nbsp;CDATA #IMPLIED</samp>
-<br><samp>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;&nbsp;CDATA #IMPLIED</samp>
-<br><samp>&nbsp;&nbsp; &gt;</samp>
-<ul>
-<li><b>point</b> - </li><li><b>id</b> - </li><li><b>name</b> - </li></ul>
-<p><samp>&nbsp;&nbsp; &lt;!ELEMENT program (EMPTY)&gt;</samp>
-<br><samp>&nbsp;&nbsp; &lt;!ATTLIST program</samp>
-<br><samp>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mainClass&nbsp;CDATA #REQUIRED</samp>
-<br><samp>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pluginId&nbsp;&nbsp;CDATA #REQUIRED</samp>
-<br><samp>&nbsp;&nbsp; &gt;</samp>
-<ul>
-<li><b>mainClass</b> - The fully-qualified name of the class whose main() method is to be launched.</li><li><b>pluginId</b> - The unique id of the Eclipse Platform plugin containing the program.</li></ul>
-<p><samp>&nbsp;&nbsp; &lt;!ELEMENT view (EMPTY)&gt;</samp>
-<br><samp>&nbsp;&nbsp; &lt;!ATTLIST view</samp>
-<br><samp>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;viewId&nbsp;CDATA #REQUIRED</samp>
-<br><samp>&nbsp;&nbsp; &gt;</samp>
-<ul>
-<li><b>viewId</b> - The unique id of the Workbench View to be activated when the item is launched.</li></ul>
-<p><samp>&nbsp;&nbsp; &lt;!ELEMENT category (EMPTY)&gt;</samp>
-<br><samp>&nbsp;&nbsp; &lt;!ATTLIST category</samp>
-<br><samp>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CDATA #REQUIRED</samp>
-<br><samp>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CDATA #REQUIRED</samp>
-<br><samp>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;category&nbsp;CDATA #IMPLIED</samp>
-<br><samp>&nbsp;&nbsp; &gt;</samp>
-<ul>
-<li><b>name</b> - The localized name of this category.</li><li><b>id</b> - The unique id of this category.  Categories with duplicate id's will be discarded.</li><li><b>category</b> - The unique id of the parent category.</li></ul>
-<p><samp>&nbsp;&nbsp; &lt;!ELEMENT item (EMPTY)&gt;</samp>
-<br><samp>&nbsp;&nbsp; &lt;!ATTLIST item</samp>
-<br><samp>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CDATA #REQUIRED</samp>
-<br><samp>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CDATA #REQUIRED</samp>
-<br><samp>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;category&nbsp;&nbsp;&nbsp;&nbsp;CDATA #IMPLIED</samp>
-<br><samp>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;icon&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CDATA #IMPLIED</samp>
-<br><samp>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enabled&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(true | false) "false""true"</samp>
-<br><samp>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;description&nbsp;CDATA #IMPLIED</samp>
-<br><samp>&nbsp;&nbsp; &gt;</samp>
-<ul>
-<li><b>name</b> - The localized name of this launch item.</li><li><b>id</b> - The unique id of this launch item. Launch items with duplicate id's will be discarded.</li><li><b>category</b> - The unique id of the category this launch item belongs to.</li><li><b>icon</b> - The declaring plugin relative path of an icon to display with this launch item in the Launcher.</li><li><b>enabled</b> - Set to "false" to disable this launch item, or to "true" to enable it (default).</li><li><b>description</b> - The localized plain-text description of this launch item.</li></ul>
-<H2>Example</H2>
-<H2>API Information</H2>
-<H2>Supplied Implementation</H2>
-</BODY>
-</HTML>
diff --git a/examples/org.eclipse.swt.examples.launcher/icons/closedFolder.gif b/examples/org.eclipse.swt.examples.launcher/icons/closedFolder.gif
deleted file mode 100755
index beb6ed1..0000000
--- a/examples/org.eclipse.swt.examples.launcher/icons/closedFolder.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.launcher/icons/generic_example.gif b/examples/org.eclipse.swt.examples.launcher/icons/generic_example.gif
deleted file mode 100755
index f9fb6b0..0000000
--- a/examples/org.eclipse.swt.examples.launcher/icons/generic_example.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.launcher/icons/launcher_example.gif b/examples/org.eclipse.swt.examples.launcher/icons/launcher_example.gif
deleted file mode 100755
index 3ab4d32..0000000
--- a/examples/org.eclipse.swt.examples.launcher/icons/launcher_example.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.launcher/icons/openFolder.gif b/examples/org.eclipse.swt.examples.launcher/icons/openFolder.gif
deleted file mode 100755
index a9c77734..0000000
--- a/examples/org.eclipse.swt.examples.launcher/icons/openFolder.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.launcher/plugin.properties b/examples/org.eclipse.swt.examples.launcher/plugin.properties
deleted file mode 100755
index 05c328a..0000000
--- a/examples/org.eclipse.swt.examples.launcher/plugin.properties
+++ /dev/null
@@ -1,39 +0,0 @@
-providerName = Eclipse.org
-plugin.SWTLauncherExample.name = SWT Launcher Example Plugin
-category.SWTExamples.name = SWT Examples
-view.LauncherExample.name = SWT Example Launcher
-
-extension-point.launchItems.name = Launch Items
-
-launchcategory.SWTViewExamples.name = Workbench Views
-launchcategory.SWTViewExamples.description = \
-	A collection of Standard Widget Toolkit examples that run as Views inside the Workbench.  \
-	These examples will create a new View in the current Perspective.
-
-launchitem.LauncherExample.name = Launcher
-launchitem.LauncherExample.description = \
-	The Example Launcher is used to launch SWT examples which can either be \
-	Workbench Views, or Standalone applications.\n\n\
-	Workbench Views are examples that are integrated into Eclipse.  When the Launcher \
-	starts a Workbench View, it is opened in the currently active perspective.\n\n\
-	Standalone applications are launched in a separate window.
-
-error.CouldNotLoadResources = Unable to load resources
-error.CouldNotFindRegisteredExtensions = Could Not Find Registered Extensions
-error.IncompleteProgramLaunchItem = Incomplete XML ProgramLaunchItem definition, id = {0}
-error.IncompleteViewLaunchItem = Incomplete XML ViewLaunchItem definition, id = {0}
-error.IncompleteLaunchItem = Incomplete or unrecognized XML LaunchItem definition, id = {0}
-
-launchitem.Null.description = <<no item selected>>
-
-launchitem.Missing.name = <<unnamed>>
-launchitem.Missing.description = <<no description available>>
-
-view.launchGroup.text = Examples
-view.launchButton.text = Run
-view.descriptionGroup.text = Description
-
-run.error.Invocation = A fatal error occurred while launching the program.
-run.error.DoesNotImplementMethod = The class does not implement the open() method.
-run.error.CouldNotFindClass = Could not find the class to run.
-run.error.CouldNotInstantiateClass = Could not instantiate the class to run.
diff --git a/examples/org.eclipse.swt.examples.launcher/plugin.xml b/examples/org.eclipse.swt.examples.launcher/plugin.xml
deleted file mode 100755
index f64d009..0000000
--- a/examples/org.eclipse.swt.examples.launcher/plugin.xml
+++ /dev/null
@@ -1,78 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<plugin
-   id="org.eclipse.swt.examples.launcher"
-   name="%plugin.SWTLauncherExample.name"
-   version="2.1.0"
-   provider-name="%providerName"
-   class="org.eclipse.swt.examples.launcher.LauncherPlugin">
-
-<!-- Runtime -->
-<!-- Runtime -->
-<!-- Runtime -->
-<!-- Runtime -->
-   <runtime>
-      <library name="launcher.jar"/>
-   </runtime>
-<!-- Required plugins -->
-   <requires>
-      <import plugin="org.eclipse.core.runtime"/>
-      <import plugin="org.eclipse.core.resources"/>
-      <import plugin="org.eclipse.ui"/>
-      <import plugin="org.eclipse.swt"/>
-      <import plugin="org.eclipse.jdt.launching"/>
-      <import plugin="org.eclipse.debug.core"/>
-      <import plugin="org.eclipse.core.boot"/>
-      <import plugin="org.eclipse.jdt.core"/>
-      <import plugin="org.eclipse.swt.examples"/>
-   </requires>
-
-
-<!-- Extension points -->
-   <extension-point id="launchItems" name="%extension-point.launchItems.name" schema="schema/org.eclipse.swt.examples.launcher.launchItems.exsd"/>
-
-<!-- Extensions -->
-   <extension
-         id="application"
-         point="org.eclipse.core.runtime.applications">
-      <application>
-         <run
-               name="%launchitem.LauncherApplication.name"
-               class="org.eclipse.swt.examples.launcher.LauncherApplication">
-         </run>
-      </application>
-   </extension>
-   <extension
-         point="org.eclipse.ui.views">
-      <category
-            name="%category.SWTExamples.name"
-            id="org.eclipse.swt.examples.category">
-      </category>
-      <view
-            name="%view.LauncherExample.name"
-            icon="icons/launcher_example.gif"
-            category="org.eclipse.swt.examples.category"
-            class="org.eclipse.swt.examples.launcher.LauncherView"
-            id="org.eclipse.swt.examples.launcher.view">
-      </view>
-   </extension>
-   <extension
-         point="org.eclipse.swt.examples.launcher.launchItems">
-      <category
-            name="%launchcategory.SWTViewExamples.name"
-            description="%launchcategory.SWTViewExamples.description"
-            id="org.eclipse.swt.examples.launchViewCategory">
-      </category>
-      <item
-            name="%launchitem.LauncherExample.name"
-            enabled="false"
-            icon="icons/launcher_example.gif"
-            description="%launchitem.LauncherExample.description"
-            category="org.eclipse.swt.examples.launchViewCategory"
-            id="org.eclipse.swt.examples.launcher.viewlauncher">
-         <view
-               viewId="org.eclipse.swt.examples.launcher.view">
-         </view>
-      </item>
-   </extension>
-
-</plugin>
diff --git a/examples/org.eclipse.swt.examples.launcher/schema/org.eclipse.swt.examples.launcher.launchItems.exsd b/examples/org.eclipse.swt.examples.launcher/schema/org.eclipse.swt.examples.launcher.launchItems.exsd
deleted file mode 100644
index c91ddc5..0000000
--- a/examples/org.eclipse.swt.examples.launcher/schema/org.eclipse.swt.examples.launcher.launchItems.exsd
+++ /dev/null
@@ -1,195 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.swt.examples.launcher">
-<annotation>
-   <appInfo>
-      <meta.schema plugin="org.eclipse.swt.examples.launcher" id="launchItems" name="Launch Items"/>
-   </appInfo>
-   <documentation>
-      This extension point is used to add 'standalone program' and
-'Workbench view'
-launch items to the Launcher, optionally grouping them into
-categories so as to form a multi-tiered hierarchy.
-Standalone programs are executed using the platform's event loop.
-Workbench views are created within the active Workbench Perspective.
-   </documentation>
-</annotation>
-
-   <element name="extension">
-      <complexType>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="program">
-      <annotation>
-         <documentation>
-            Specifies a "Standalone Program" for a launch item to run.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="mainClass" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The fully-qualified name of the class whose main() method is to be launched.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="pluginId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The unique id of the Eclipse Platform plugin containing the program.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="view">
-      <annotation>
-         <documentation>
-            Specifies a "Workbench View" for a launch item to activate.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="viewId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The unique id of the Workbench View to be activated when the item is launched.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="category">
-      <annotation>
-         <documentation>
-            Specifies a launch item category heading.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The localized name of this category.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The unique id of this category.  Categories with duplicate id's will be discarded.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="category" type="string">
-            <annotation>
-               <documentation>
-                  The unique id of the parent category.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="item">
-      <annotation>
-         <documentation>
-            Specifies a launch item.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The localized name of this launch item.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The unique id of this launch item. Launch items with duplicate id's will be discarded.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="category" type="string">
-            <annotation>
-               <documentation>
-                  The unique id of the category this launch item belongs to.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="icon" type="string">
-            <annotation>
-               <documentation>
-                  The declaring plugin relative path of an icon to display with this launch item in the Launcher.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="enabled" type="boolean" use="default" value="true">
-            <annotation>
-               <documentation>
-                  Set to "false" to disable this launch item, or to "true" to enable it (default).
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="description" type="string">
-            <annotation>
-               <documentation>
-                  The localized plain-text description of this launch item.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/examples/org.eclipse.swt.examples.launcher/src/import.properties b/examples/org.eclipse.swt.examples.launcher/src/import.properties
deleted file mode 100644
index 265131a..0000000
--- a/examples/org.eclipse.swt.examples.launcher/src/import.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-# Persist project settings for later import 
-natures = org.eclipse.jdt.core.javanature; org.eclipse.pde.PluginNature
-builders = org.eclipse.jdt.core.javabuilder; org.eclipse.pde.ManifestBuilder; org.eclipse.pde.SchemaBuilder
-var.ECLIPSE_PLUGINS = <<ECLIPSE_PLUGINS>>
diff --git a/examples/org.eclipse.swt.examples.launcher/src/org/eclipse/swt/examples/launcher/ItemDescriptor.java b/examples/org.eclipse.swt.examples.launcher/src/org/eclipse/swt/examples/launcher/ItemDescriptor.java
deleted file mode 100755
index da9553d..0000000
--- a/examples/org.eclipse.swt.examples.launcher/src/org/eclipse/swt/examples/launcher/ItemDescriptor.java
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.launcher/src/org/eclipse/swt/examples/launcher/ItemTreeNode.java b/examples/org.eclipse.swt.examples.launcher/src/org/eclipse/swt/examples/launcher/ItemTreeNode.java
deleted file mode 100755
index 9f6717e..0000000
--- a/examples/org.eclipse.swt.examples.launcher/src/org/eclipse/swt/examples/launcher/ItemTreeNode.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package org.eclipse.swt.examples.launcher;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-/**
- * Internal class used to store tree structures of ItemDescriptors
- */
-class ItemTreeNode {
-	private ItemTreeNode nextSibling;
-	private ItemTreeNode firstChild;
-	private ItemDescriptor descriptor;
-
-	/**
-	 * Constructs a leaf ItemTreeNode with a given descriptor.
-	 * 
-	 * @param descriptor the descriptor
-	 */
-	public ItemTreeNode(ItemDescriptor descriptor) {
-		this.descriptor = descriptor;
-	}
-
-	/**
-	 * Adds a node to the Tree in sorted order by name.
-	 * 
-	 * @param node the node to add. Note that node.nextSibling must be null
-	 */
-	public void addSortedNode(ItemTreeNode node) {
-		if (firstChild == null) {
-			firstChild = node;
-		} else if (firstChild.descriptor.getName().compareTo(node.descriptor.getName()) > 0) {
-			node.nextSibling = firstChild;
-			firstChild = node;
-		} else {
-			ItemTreeNode cursor;
-			for (cursor = firstChild; cursor.nextSibling != null; cursor = cursor.nextSibling) {
-				ItemTreeNode sibling = cursor.nextSibling;
-				if (sibling.descriptor.getName().compareTo(node.descriptor.getName()) > 0) break;
-			}
-			node.nextSibling = cursor.nextSibling;
-			cursor.nextSibling = node;
-		}
-	}
-	
-	/**
-	 * Returns the descriptor for this node.
-	 * 
-	 * @return the descriptor
-	 */
-	public ItemDescriptor getDescriptor() {
-		return descriptor;
-	}
-
-	/**
-	 * Returns the next sibling of this node.
-	 * 
-	 * @return the next sibling, or null if none
-	 */
-	public ItemTreeNode getNextSibling() {
-		return nextSibling;
-	}
-
-	/**
-	 * Returns the first child of this node.
-	 * 
-	 * @return the first child, or null if none
-	 */
-	public ItemTreeNode getFirstChild() {
-		return firstChild;
-	}
-}
diff --git a/examples/org.eclipse.swt.examples.launcher/src/org/eclipse/swt/examples/launcher/LauncherPlugin.java b/examples/org.eclipse.swt.examples.launcher/src/org/eclipse/swt/examples/launcher/LauncherPlugin.java
deleted file mode 100755
index 21a6801..0000000
--- a/examples/org.eclipse.swt.examples.launcher/src/org/eclipse/swt/examples/launcher/LauncherPlugin.java
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.launcher/src/org/eclipse/swt/examples/launcher/LauncherView.java b/examples/org.eclipse.swt.examples.launcher/src/org/eclipse/swt/examples/launcher/LauncherView.java
deleted file mode 100755
index 3047da9..0000000
--- a/examples/org.eclipse.swt.examples.launcher/src/org/eclipse/swt/examples/launcher/LauncherView.java
+++ /dev/null
@@ -1,230 +0,0 @@
-package org.eclipse.swt.examples.launcher;
-
-/*
- * Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.examples.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.ui.*;
-import org.eclipse.ui.part.*;
-import java.lang.reflect.*;
-
-/**
- * Launcher uses <code>org.eclipse.swt</code> 
- * to launch the other registered examples.
- * 
- * @see ViewPart
- */
-public class LauncherView extends ViewPart {
-	private Shell workbenchShell;
-	
-	private Tree launchTree;
-	private Text descriptionText;
-	private Button runButton;
-
-	/**
-	 * Constructs a LauncherView.
-	 */
-	public LauncherView() {
-		LauncherPlugin.initResources();
-	}
-
-	/**
-	 * Creates the example.
-	 * 
-	 * @see ViewPart#createPartControl
-	 */
-	public void createPartControl(Composite parent) {
-		workbenchShell = getSite().getShell();
-		parent.setLayout(new SplitLayout());
-				
-		Group launchGroup = new Group(parent, SWT.NULL);
-		launchGroup.setText(LauncherPlugin.getResourceString("view.launchGroup.text"));
-		
-		GridLayout gridLayout = new GridLayout();
-		gridLayout.numColumns = 2;
-		launchGroup.setLayout(gridLayout);
-
-		launchTree = new Tree(launchGroup, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
-		GridData gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL);
-		gridData.horizontalSpan = 2;
-		launchTree.setLayoutData(gridData);
-		launchTree.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent event) {
-				final ItemDescriptor item = getSelectedItem();
-				setDescriptionByItem(item);
-			}
-			public void widgetDefaultSelected(SelectionEvent event) {
-				final ItemDescriptor item = getSelectedItem();
-				setDescriptionByItem(item);
-				launchItem(getSelectedItem());
-			}
-		});
-		launchTree.addTreeListener(new TreeListener() {
-			public void treeCollapsed(TreeEvent event) {
-				final TreeItem item = (TreeItem) event.item;
-				if (item == null) return;
-				item.setImage(LauncherPlugin.images[LauncherPlugin.liClosedFolder]);
-			}
-			public void treeExpanded(TreeEvent event) {
-				final TreeItem item = (TreeItem) event.item;
-				if (item == null) return;
-				item.setImage(LauncherPlugin.images[LauncherPlugin.liOpenFolder]);
-			}
-		});
-
-		runButton = new Button(launchGroup, SWT.PUSH);
-		runButton.setText(LauncherPlugin.getResourceString("view.launchButton.text"));
-		runButton.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent event) {
-				launchItem(getSelectedItem());
-			}
-			public void widgetDefaultSelected(SelectionEvent event) {
-			}
-		});
-
-		Group descriptionGroup = new Group(parent, SWT.NULL);
-		descriptionGroup.setText(LauncherPlugin.getResourceString("view.descriptionGroup.text"));
-		descriptionGroup.setLayout(new FillLayout());
-		
-		descriptionText = new Text(descriptionGroup, SWT.MULTI | SWT.BORDER |
-			SWT.WRAP | SWT.V_SCROLL | SWT.READ_ONLY);
-
-		setDescriptionByItem(null);
-		setItemDescriptors(LauncherPlugin.getLaunchItemTree());
-	}
-
-	/**
-	 * Called when we must grab focus.
-	 * 
-	 * @see org.eclipse.ui.part.ViewPart#setFocus
-	 */
-	public void setFocus()  {
-		launchTree.setFocus();
-		runButton.getShell().setDefaultButton(runButton);
-	}
-
-	/**
-	 * Called when the View is to be disposed
-	 */	
-	public void dispose() {
-		workbenchShell = null;
-		launchTree = null;
-		descriptionText = null;
-		runButton = null;		
-		super.dispose();
-	}
-
-	/**
-	 * Installs a new launch list.
-	 * 
-	 * @param newRoot the new tree of launch items for the UI
-	 */
-	public void setItemDescriptors(final ItemTreeNode newRoot) {
-		if (workbenchShell == null) return;
-		workbenchShell.getDisplay().syncExec(new Runnable() {
-			public void run() {
-				if ((launchTree == null) || (launchTree.isDisposed())) return;
-				launchTree.removeAll();
-			
-				for (ItemTreeNode node = newRoot.getFirstChild(); node != null;
-					node = node.getNextSibling()) {
-					doNode(node, new TreeItem(launchTree, SWT.NONE)); // top-level TreeItem
-				}
-			}
-			private void addGroup(TreeItem parent, ItemTreeNode node) {
-				for (;node != null; node = node.getNextSibling()) {
-					doNode(node, new TreeItem(parent, SWT.NONE)); // TreeItem at depth > 0
-				}
-			}
-			private void doNode(ItemTreeNode node, TreeItem treeItem) {
-				final ItemDescriptor item = node.getDescriptor();
-				treeItem.setText(item.getName());
-				treeItem.setData(item);
-				if (node.getDescriptor().isFolder()) {
-					treeItem.setExpanded(false);
-					treeItem.setImage(LauncherPlugin.images[LauncherPlugin.liClosedFolder]);
-				} else {
-					treeItem.setImage(node.getDescriptor().getIcon());
-				}
-				addGroup(treeItem, node.getFirstChild());
-			}
-		});
-	}
-
-	/**
-	 * Runs the specified launch item.
-	 * 
-	 * @param itemDescriptor the launch item to execute
-	 */
-	private void launchItem(ItemDescriptor itemDescriptor) {
-		/* Case 1: The launch item is a view */
-		String pluginViewId = itemDescriptor.getView ();
-		if (pluginViewId != null) {
-			final IWorkbenchPart workbenchPart = this;
-			final IWorkbenchPartSite workbenchPartSite = workbenchPart.getSite();
-			final IWorkbenchPage workbenchPage = workbenchPartSite.getPage();
-			try {
-				workbenchPage.showView(pluginViewId);
-			} catch (PartInitException e) {
-				LauncherPlugin.logError(LauncherPlugin.getResourceString("run.error.Invocation"), e);
-			}
-			return;
-		}
-		/* Case 2: The launch item is a standalone program */
-		if (workbenchShell == null) return;
-		try {
-			Class cl = Class.forName(itemDescriptor.getMainType());
-			Display display = workbenchShell.getDisplay();
-			Object exampleInstance = cl.newInstance();
-			Method openMethod = cl.getDeclaredMethod("open", new Class[] {Display.class});
-			openMethod.invoke(exampleInstance, new Object[] {display});
-		} catch (NoSuchMethodException e) {
-			LauncherPlugin.logError(LauncherPlugin.getResourceString("run.error.DoesNotImplementMethod"), null);
-		} catch (ClassNotFoundException e) {
-			LauncherPlugin.logError(LauncherPlugin.getResourceString("run.error.CouldNotFindClass"), e);
-		} catch (Exception e) {
-			LauncherPlugin.logError(LauncherPlugin.getResourceString("run.error.CouldNotInstantiateClass"), e);
-		}		
-	}
-
-	/**
-	 * Obtains the selected launch item.
-	 * 
-	 * @return the currently selected ItemDescriptor
-	 */
-	private ItemDescriptor getSelectedItem() {
-		final TreeItem[] selections = launchTree.getSelection();
-		if (selections.length == 0) return null;
-		final ItemDescriptor itemDescriptor = (ItemDescriptor) selections[0].getData();
-		return itemDescriptor;
-	}
-	
-	/**
-	 * Sets the currently visible description text to reflect that of a particular ItemDescriptor.
-	 *
-	 * @param itemDescriptor the launch item whose description is to be displayed, or null if none
-	 */
-	private void setDescriptionByItem(ItemDescriptor itemDescriptor) {
-		String description;
-		if (itemDescriptor == null) {
-			description = LauncherPlugin.getResourceString("launchitem.Null.description");
-			if (runButton != null) runButton.setEnabled(false);
-		} else {
-			description = itemDescriptor.getDescription();
-			if (description == null)
-				description = LauncherPlugin.getResourceString("launchitem.Missing.description");
-			if (runButton != null) {
-				runButton.setEnabled(itemDescriptor.getView() != null || itemDescriptor.getMainType() != null);
-			}
-		}
-		descriptionText.setText(description);
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.swt.examples.launcher/src/org/eclipse/swt/examples/launcher/SplitLayout.java b/examples/org.eclipse.swt.examples.launcher/src/org/eclipse/swt/examples/launcher/SplitLayout.java
deleted file mode 100755
index 636b5eb..0000000
--- a/examples/org.eclipse.swt.examples.launcher/src/org/eclipse/swt/examples/launcher/SplitLayout.java
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.layouts/.classpath b/examples/org.eclipse.swt.examples.layouts/.classpath
deleted file mode 100644
index 06c9103..0000000
--- a/examples/org.eclipse.swt.examples.layouts/.classpath
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-    <classpathentry kind="src" path="src"/>
-    <classpathentry kind="var" path="JRE_LIB"/>
-    <classpathentry kind="var"
-        path="ECLIPSE_HOME/plugins/org.eclipse.core.runtime_2.0.0/runtime.jar" sourcepath="ECLIPSE_HOME/plugins/org.eclipse.core.runtime_2.0.0/runtimesrc.zip"/>
-    <classpathentry kind="var"
-        path="ECLIPSE_HOME/plugins/org.eclipse.ui_2.0.0/workbench.jar" sourcepath="ECLIPSE_HOME/plugins/org.eclipse.ui_2.0.0/workbenchsrc.zip"/>
-    <classpathentry kind="src" path="/org.eclipse.swt.examples"/>
-    <classpathentry kind="src" path="/org.eclipse.swt"/>
-    <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/examples/org.eclipse.swt.examples.layouts/.cvsignore b/examples/org.eclipse.swt.examples.layouts/.cvsignore
deleted file mode 100644
index c5e82d7..0000000
--- a/examples/org.eclipse.swt.examples.layouts/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
\ No newline at end of file
diff --git a/examples/org.eclipse.swt.examples.layouts/.project b/examples/org.eclipse.swt.examples.layouts/.project
deleted file mode 100644
index cbc0d66..0000000
--- a/examples/org.eclipse.swt.examples.layouts/.project
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.swt.examples.layouts</name>
-	<comment></comment>
-	<projects>
-		<project>org.eclipse.swt</project>
-		<project>org.eclipse.swt.examples</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/examples/org.eclipse.swt.examples.layouts/about.html b/examples/org.eclipse.swt.examples.layouts/about.html
deleted file mode 100644
index 9db411a..0000000
--- a/examples/org.eclipse.swt.examples.layouts/about.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>20th June, 2002</p>	
-<h3>License</h3>
-<p>Eclipse.org makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Common Public License Version 1.0 (&quot;CPL&quot;).  A copy of the CPL is available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>.
-For purposes of the CPL, &quot;Program&quot; will mean the Content.</p>
-
-<h3>Contributions</h3>
-
-<p>If this Content is licensed to you under the terms and conditions of the CPL, any Contributions, as defined in the CPL, uploaded, submitted, or otherwise
-made available to Eclipse.org, members of Eclipse.org and/or the host of Eclipse.org web site, by you that relate to such
-Content are provided under the terms and conditions of the CPL and can be made available to others under the terms of the CPL.</p>
-
-<p>If this Content is licensed to you under license terms and conditions other than the CPL (&quot;Other License&quot;), any modifications, enhancements and/or
-other code and/or documentation (&quot;Modifications&quot;) uploaded, submitted, or otherwise made available to Eclipse.org, members of Eclipse.org and/or the
-host of Eclipse.org, by you that relate to such Content are provided under terms and conditions of the Other License and can be made available
-to others under the terms of the Other License.  In addition, with regard to Modifications for which you are the copyright holder, you are also
-providing the Modifications under the terms and conditions of the CPL and such Modifications can be made available to others under the terms of
-the CPL.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/examples/org.eclipse.swt.examples.layouts/build.properties b/examples/org.eclipse.swt.examples.layouts/build.properties
deleted file mode 100644
index a6d8f5e..0000000
--- a/examples/org.eclipse.swt.examples.layouts/build.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-bin.includes = doc-html/,\
-               icons/,\
-               plugin.properties,\
-               plugin.xml,\
-               about.html,\
-               *.jar
-
-src.includes = about.html
-
-source.layouts.jar = src/
diff --git a/examples/org.eclipse.swt.examples.layouts/doc-html/hglegal2002.htm b/examples/org.eclipse.swt.examples.layouts/doc-html/hglegal2002.htm
deleted file mode 100644
index 74393f0..0000000
--- a/examples/org.eclipse.swt.examples.layouts/doc-html/hglegal2002.htm
+++ /dev/null
@@ -1,14 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <meta name="GENERATOR" content="Microsoft FrontPage 4.0">
-   <title>Legal Notices</title>
-</head>
-<body>
-
-<h3>
-<a NAME="Notices"></a>Notices</h3>
-(c) Copyright IBM Corp. 2000, 2002. All Rights Reserved.
-</body>
-</html>
diff --git a/examples/org.eclipse.swt.examples.layouts/doc-html/ngibmcpy2002.gif b/examples/org.eclipse.swt.examples.layouts/doc-html/ngibmcpy2002.gif
deleted file mode 100644
index 61cef48..0000000
--- a/examples/org.eclipse.swt.examples.layouts/doc-html/ngibmcpy2002.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.layouts/doc-html/swt_layout_ex.html b/examples/org.eclipse.swt.examples.layouts/doc-html/swt_layout_ex.html
deleted file mode 100644
index d021ab3..0000000
--- a/examples/org.eclipse.swt.examples.layouts/doc-html/swt_layout_ex.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <title>SWT - Layout Overview</title>
-</head>
-<body>
-
-<h2>SWT Example - Layout Overview</h2>
-
-<p>	
-This example is a simple demonstration of common SWT layouts. 
-It consists of a tab folder where each tab allows the 
-user to interact with a different SWT layout.
-The user can insert widgets into a layout and set the values of the layout data
-using a property sheet.  When the user has a suitable arrangement, code can be
-generated by clicking on the Code button.
-</p>
-
-<h3>Running the example</h3>
-
-<p>From the Window menu select Show View --> Other.  
-In the Show View dialog, expand SWT Examples and select the
-view named SWT Layouts.  A view titled SWT Layouts will appear in your current perspective.
-</p>
-
-<p><a href="hglegal2002.htm"><img SRC="ngibmcpy2002.gif" ALT="Copyright IBM Corporation and others 2000, 2002.  All Rights Reserved." BORDER=0 height=14 width=324></a></p>
-</body>
-</html>
\ No newline at end of file
diff --git a/examples/org.eclipse.swt.examples.layouts/icons/layouts_example.gif b/examples/org.eclipse.swt.examples.layouts/icons/layouts_example.gif
deleted file mode 100644
index d945dde..0000000
--- a/examples/org.eclipse.swt.examples.layouts/icons/layouts_example.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.layouts/plugin.properties b/examples/org.eclipse.swt.examples.layouts/plugin.properties
deleted file mode 100644
index 2e18a43..0000000
--- a/examples/org.eclipse.swt.examples.layouts/plugin.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-providerName = Eclipse.org
-plugin.SWTLayoutExample.name = SWT Layout Example Plugin
-category.SWTExamples.name = SWT Examples
-view.LayoutExample.name = SWT Layouts
-
-launchcategory.SWTViewExamples.name = Workbench Views
-launchcategory.SWTViewExamples.description = \
-	A collection of Standard Widget Toolkit examples that run as Views inside the Workbench.  \
-	These examples will create a new View in the current Perspective.
-
-launchitem.LayoutExample.name = Layouts
-launchitem.LayoutExample.description = \
-	This example is a simple demonstration of common SWT layouts. \n\n\
-	It consists of a tab folder where each tab allows the \
-	user to interact with a different SWT layout.\
-	The user can insert widgets into a layout and set the values of the layout data \
-	using a property sheet.  When the user has a suitable arrangement, code can be \
-	generated by clicking on the Code button.
diff --git a/examples/org.eclipse.swt.examples.layouts/plugin.xml b/examples/org.eclipse.swt.examples.layouts/plugin.xml
deleted file mode 100644
index eae4784..0000000
--- a/examples/org.eclipse.swt.examples.layouts/plugin.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<plugin
-   id="org.eclipse.swt.examples.layouts"
-   name="%plugin.SWTLayoutExample.name"
-   version="2.1.0"
-   provider-name="%providerName"
-   class="org.eclipse.swt.examples.layouts.LayoutPlugin">
-
-<!-- Runtime -->
-<!-- Runtime -->
-   <runtime>
-      <library name="layouts.jar"/>
-   </runtime>
-<!-- Required plugins -->
-   <requires>
-      <import plugin="org.eclipse.core.runtime"/>
-      <import plugin="org.eclipse.ui"/>
-      <import plugin="org.eclipse.swt"/>
-      <import plugin="org.eclipse.swt.examples"/>
-   </requires>
-
-
-<!-- Extension points -->
-<!-- Extensions -->
-   <extension
-         point="org.eclipse.ui.views">
-      <view
-            name="%view.LayoutExample.name"
-            icon="icons/layouts_example.gif"
-            category="org.eclipse.swt.examples.category"
-            class="org.eclipse.swt.examples.layouts.LayoutView"
-            id="org.eclipse.swt.examples.layouts.view">
-      </view>
-   </extension>
-   <extension
-         point="org.eclipse.swt.examples.launcher.launchItems">
-      <category
-            name="%launchcategory.SWTViewExamples.name"
-            description="%launchcategory.SWTViewExamples.description"
-            id="org.eclipse.swt.examples.launchViewCategory">
-      </category>
-      <item
-            name="%launchitem.LayoutExample.name"
-            icon="icons/layouts_example.gif"
-            description="%launchitem.LayoutExample.description"
-            category="org.eclipse.swt.examples.launchViewCategory"
-            id="org.eclipse.swt.examples.layouts.viewlauncher">
-         <view
-               viewId="org.eclipse.swt.examples.layouts.view">
-         </view>
-      </item>
-   </extension>
-
-</plugin>
diff --git a/examples/org.eclipse.swt.examples.layouts/src/import.properties b/examples/org.eclipse.swt.examples.layouts/src/import.properties
deleted file mode 100644
index 265131a..0000000
--- a/examples/org.eclipse.swt.examples.layouts/src/import.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-# Persist project settings for later import 
-natures = org.eclipse.jdt.core.javanature; org.eclipse.pde.PluginNature
-builders = org.eclipse.jdt.core.javabuilder; org.eclipse.pde.ManifestBuilder; org.eclipse.pde.SchemaBuilder
-var.ECLIPSE_PLUGINS = <<ECLIPSE_PLUGINS>>
diff --git a/examples/org.eclipse.swt.examples.layouts/src/org/eclipse/swt/examples/layouts/LayoutPlugin.java b/examples/org.eclipse.swt.examples.layouts/src/org/eclipse/swt/examples/layouts/LayoutPlugin.java
deleted file mode 100644
index 2a0312a..0000000
--- a/examples/org.eclipse.swt.examples.layouts/src/org/eclipse/swt/examples/layouts/LayoutPlugin.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.eclipse.swt.examples.layouts;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.core.runtime.*;
-import org.eclipse.ui.plugin.*;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class LayoutPlugin extends AbstractUIPlugin {
-	/**
-	 * The constructor.
-	 */
-	public LayoutPlugin(IPluginDescriptor descriptor) {
-		super(descriptor);
-	}
-	
-	/**
-	 * Clean up
-	 */
-	public void shutdown() throws CoreException {
-		super.shutdown();
-	}
-}
diff --git a/examples/org.eclipse.swt.examples.layouts/src/org/eclipse/swt/examples/layouts/LayoutView.java b/examples/org.eclipse.swt.examples.layouts/src/org/eclipse/swt/examples/layouts/LayoutView.java
deleted file mode 100644
index 3ab737a..0000000
--- a/examples/org.eclipse.swt.examples.layouts/src/org/eclipse/swt/examples/layouts/LayoutView.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.eclipse.swt.examples.layouts;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
- 
-import org.eclipse.swt.examples.layoutexample.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.ui.part.*;
-
-/**
- * <code>Layouts</code> is a simple demonstration
- * of the layouts defined by SWT.  It consists of a workbench
- * view and tab folder where each tab in the folder allows the
- * user to interact with a layout.
- * 
- * @see ViewPart
- */
-public class LayoutView extends ViewPart {
-	LayoutExample instance = null;
-	
-	/**
-	 * Create the example
-	 * 
-	 * @see ViewPart#createPartControl
-	 */
-	public void createPartControl(Composite frame) {
-		instance = new LayoutExample(frame);
-	}
-
-	/**
-	 * Called when we must grab focus.
-	 * 
-	 * @see org.eclipse.ui.part.ViewPart#setFocus
-	 */
-	public void setFocus() {
-		instance.setFocus();
-	}
-
-	/**
-	 * Called when the View is to be disposed
-	 */	
-	public void dispose() {
-		instance.dispose();
-		instance = null;
-		super.dispose();
-	}
-}
diff --git a/examples/org.eclipse.swt.examples.ole.win32/.classpath b/examples/org.eclipse.swt.examples.ole.win32/.classpath
deleted file mode 100755
index c964dae..0000000
--- a/examples/org.eclipse.swt.examples.ole.win32/.classpath
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-    <classpathentry kind="src" path="src"/>
-    <classpathentry kind="var" path="JRE_LIB"/>
-    <classpathentry kind="var"
-        path="ECLIPSE_HOME/plugins/org.eclipse.core.runtime_2.0.0/runtime.jar" sourcepath="ECLIPSE_HOME/plugins/org.eclipse.core.runtime_2.0.0/runtimesrc.zip"/>
-    <classpathentry kind="var"
-        path="ECLIPSE_HOME/plugins/org.eclipse.ui_2.0.0/workbench.jar" sourcepath="ECLIPSE_HOME/plugins/org.eclipse.ui_2.0.0/workbenchsrc.zip"/>
-    <classpathentry kind="src" path="/org.eclipse.swt"/>
-    <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/examples/org.eclipse.swt.examples.ole.win32/.cvsignore b/examples/org.eclipse.swt.examples.ole.win32/.cvsignore
deleted file mode 100755
index c5e82d7..0000000
--- a/examples/org.eclipse.swt.examples.ole.win32/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
\ No newline at end of file
diff --git a/examples/org.eclipse.swt.examples.ole.win32/.project b/examples/org.eclipse.swt.examples.ole.win32/.project
deleted file mode 100644
index b160136..0000000
--- a/examples/org.eclipse.swt.examples.ole.win32/.project
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.swt.examples.ole.win32</name>
-	<comment></comment>
-	<projects>
-		<project>org.eclipse.swt</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/examples/org.eclipse.swt.examples.ole.win32/about.html b/examples/org.eclipse.swt.examples.ole.win32/about.html
deleted file mode 100644
index 9db411a..0000000
--- a/examples/org.eclipse.swt.examples.ole.win32/about.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>20th June, 2002</p>	
-<h3>License</h3>
-<p>Eclipse.org makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Common Public License Version 1.0 (&quot;CPL&quot;).  A copy of the CPL is available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>.
-For purposes of the CPL, &quot;Program&quot; will mean the Content.</p>
-
-<h3>Contributions</h3>
-
-<p>If this Content is licensed to you under the terms and conditions of the CPL, any Contributions, as defined in the CPL, uploaded, submitted, or otherwise
-made available to Eclipse.org, members of Eclipse.org and/or the host of Eclipse.org web site, by you that relate to such
-Content are provided under the terms and conditions of the CPL and can be made available to others under the terms of the CPL.</p>
-
-<p>If this Content is licensed to you under license terms and conditions other than the CPL (&quot;Other License&quot;), any modifications, enhancements and/or
-other code and/or documentation (&quot;Modifications&quot;) uploaded, submitted, or otherwise made available to Eclipse.org, members of Eclipse.org and/or the
-host of Eclipse.org, by you that relate to such Content are provided under terms and conditions of the Other License and can be made available
-to others under the terms of the Other License.  In addition, with regard to Modifications for which you are the copyright holder, you are also
-providing the Modifications under the terms and conditions of the CPL and such Modifications can be made available to others under the terms of
-the CPL.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/examples/org.eclipse.swt.examples.ole.win32/build.properties b/examples/org.eclipse.swt.examples.ole.win32/build.properties
deleted file mode 100755
index ac90c6f..0000000
--- a/examples/org.eclipse.swt.examples.ole.win32/build.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-bin.includes = doc-html/,\
-               icons/,\
-               plugin.properties,\
-               plugin.xml,\
-               about.html,\
-               *.jar
-
-src.includes = about.html
-            
-source.olewin32.jar = src/
diff --git a/examples/org.eclipse.swt.examples.ole.win32/doc-html/hglegal2002.htm b/examples/org.eclipse.swt.examples.ole.win32/doc-html/hglegal2002.htm
deleted file mode 100644
index 74393f0..0000000
--- a/examples/org.eclipse.swt.examples.ole.win32/doc-html/hglegal2002.htm
+++ /dev/null
@@ -1,14 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <meta name="GENERATOR" content="Microsoft FrontPage 4.0">
-   <title>Legal Notices</title>
-</head>
-<body>
-
-<h3>
-<a NAME="Notices"></a>Notices</h3>
-(c) Copyright IBM Corp. 2000, 2002. All Rights Reserved.
-</body>
-</html>
diff --git a/examples/org.eclipse.swt.examples.ole.win32/doc-html/ngibmcpy2002.gif b/examples/org.eclipse.swt.examples.ole.win32/doc-html/ngibmcpy2002.gif
deleted file mode 100644
index 61cef48..0000000
--- a/examples/org.eclipse.swt.examples.ole.win32/doc-html/ngibmcpy2002.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.ole.win32/doc-html/swt_ole_ex.html b/examples/org.eclipse.swt.examples.ole.win32/doc-html/swt_ole_ex.html
deleted file mode 100755
index 8191de1..0000000
--- a/examples/org.eclipse.swt.examples.ole.win32/doc-html/swt_ole_ex.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <title>SWT - OLE Web Browser</title>
-</head>
-<body>
-
-<h2>Example - OLE Web Browser</h2>
-
-<p>
-This example demonstrates how to embed an Active X control into an SWT application or an Eclipse view.
-<p>
-</p>
-When the view is opened, it will create an instance of the Windows Internet Explorer
-control.  The OLE Web Browser has
-Back and Forward buttons to take you to recently visited pages.  The browser also contains
-a Home button to take you to the web browser's home page, a Stop button which stops the 
-current transfer, a Search button which will search for text typed in the Address text field, and
-a Refresh button which re-draws the contents of the currently displayed page. There is also a
-Go button which, when clicked, will attempt to load the page specified in the Address field.
-</p>
-
-<h3>Running the example</h3>
-
-<p>
-From the Window menu select Show View --> Other.  
-In the Show View dialog, expand SWT Examples and select
-the view named OLE Web Browser (Win32). A view containing a web browser will appear.
-</p>
-
-<p><a href="hglegal2002.htm"><img SRC="ngibmcpy2002.gif" ALT="Copyright IBM Corporation and others 2000, 2002.  All Rights Reserved." BORDER=0 height=14 width=324></a></p>
-</body>
-</html>
diff --git a/examples/org.eclipse.swt.examples.ole.win32/icons/backward_nav.gif b/examples/org.eclipse.swt.examples.ole.win32/icons/backward_nav.gif
deleted file mode 100755
index 5fcf41b..0000000
--- a/examples/org.eclipse.swt.examples.ole.win32/icons/backward_nav.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.ole.win32/icons/forward_nav.gif b/examples/org.eclipse.swt.examples.ole.win32/icons/forward_nav.gif
deleted file mode 100755
index 3b9b6af..0000000
--- a/examples/org.eclipse.swt.examples.ole.win32/icons/forward_nav.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.ole.win32/icons/home_nav.gif b/examples/org.eclipse.swt.examples.ole.win32/icons/home_nav.gif
deleted file mode 100755
index 77a2306..0000000
--- a/examples/org.eclipse.swt.examples.ole.win32/icons/home_nav.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.ole.win32/icons/refresh_nav.gif b/examples/org.eclipse.swt.examples.ole.win32/icons/refresh_nav.gif
deleted file mode 100755
index e270e18..0000000
--- a/examples/org.eclipse.swt.examples.ole.win32/icons/refresh_nav.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.ole.win32/icons/search_nav.gif b/examples/org.eclipse.swt.examples.ole.win32/icons/search_nav.gif
deleted file mode 100755
index 73ac91b..0000000
--- a/examples/org.eclipse.swt.examples.ole.win32/icons/search_nav.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.ole.win32/icons/stop_nav.gif b/examples/org.eclipse.swt.examples.ole.win32/icons/stop_nav.gif
deleted file mode 100755
index 653d347..0000000
--- a/examples/org.eclipse.swt.examples.ole.win32/icons/stop_nav.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.ole.win32/icons/webbrowser_example.gif b/examples/org.eclipse.swt.examples.ole.win32/icons/webbrowser_example.gif
deleted file mode 100755
index 895e221..0000000
--- a/examples/org.eclipse.swt.examples.ole.win32/icons/webbrowser_example.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.ole.win32/plugin.properties b/examples/org.eclipse.swt.examples.ole.win32/plugin.properties
deleted file mode 100755
index 82d8e49..0000000
--- a/examples/org.eclipse.swt.examples.ole.win32/plugin.properties
+++ /dev/null
@@ -1,50 +0,0 @@
-providerName = Eclipse.org
-plugin.SWTOLEExample.name = SWT OLE Example Plugin (Win32)
-category.SWTExamples.name = SWT Examples
-view.OLEWebBrowserExample.name = OLE Web Browser (Win32)
-
-launchcategory.SWTWin32OnlyExamples.name = Win32 only
-launchcategory.SWTWin32OnlyExamples.description = \
-	A collection of Standard Widget Toolkit examples for Windows systems only.
-
-launchitem.OLEWebBrowserExample.name = OLE Web Browser
-launchitem.OLEWebBrowserExample.description = \
-	This example demonstrates how to embed an Active X control into an SWT application or an Eclipse view.\n\n\
-	When the view is opened, it will create an instance of the Windows Internet Explorer \
-	control.  The OLE Web Browser has \
-	Back and Forward buttons to take you to recently visited pages.  The browser also contains \
-	a Home button to take you to the web browser's home page, a Stop button which stops the \
-	current transfer, a Search button which will search for text typed in the Address text field, and \
-	a Refresh button which re-draws the contents of the currently displayed page. There is also a \
-	Go button which, when clicked, will attempt to load the page specified in the Address field.
-
-browser.Back.text = Backward
-browser.Back.tooltip = Go to previous Web site in the history list
-
-browser.Forward.text = Forward
-browser.Forward.tooltip = Go to next Web site in the history list
-
-browser.Home.text = Home
-browser.Home.tooltip = Go to home Web site
-
-browser.Stop.text = Stop
-browser.Stop.tooltip = Stop loading current Web site
-
-browser.Refresh.text = Refresh
-browser.Refresh.tooltip = Refresh current Web site
-
-browser.Search.text = Search
-browser.Search.tooltip = Search the Web
-
-browser.Address.label = Address :
-
-browser.Go.text = Go
-
-browser.State.Uninitialized.text = Not ready.
-browser.State.Loading.text = Loading Web site...
-browser.State.Loaded.text = Ready.
-browser.State.Interactive.text = Loading Web site...
-browser.State.Complete.text = Done.
-
-error.CouldNotLoadResources = Unable to load resources
-error.CouldNotCreateBrowserControl = Unable to create <<Browser Control>>
diff --git a/examples/org.eclipse.swt.examples.ole.win32/plugin.xml b/examples/org.eclipse.swt.examples.ole.win32/plugin.xml
deleted file mode 100755
index 91d77cd..0000000
--- a/examples/org.eclipse.swt.examples.ole.win32/plugin.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- File written by PDE 1.0 -->
-<plugin
-   id="org.eclipse.swt.examples.ole.win32"
-   name="%plugin.SWTOLEExample.name"
-   version="2.1.0"
-   provider-name="%providerName"
-   class="org.eclipse.swt.examples.ole.win32.OlePlugin">
-<!-- Required plugins -->
-<requires>
-   <import plugin="org.eclipse.core.runtime"/>
-   <import plugin="org.eclipse.core.resources"/>
-   <import plugin="org.eclipse.ui"/>
-   <import plugin="org.eclipse.swt"/>
-</requires>
-
-<!-- Runtime -->
-<!-- Runtime -->
-<runtime>
-   <library name="olewin32.jar"/>
-</runtime>
-
-<!-- Extensions -->
-<!-- Extension points -->
-<extension
-      point="org.eclipse.ui.views">
-   <view
-         name="%view.OLEWebBrowserExample.name"
-         icon="icons/webbrowser_example.gif"
-         category="org.eclipse.swt.examples.category"
-         class="org.eclipse.swt.examples.ole.win32.OleBrowserView"
-         id="org.eclipse.swt.examples.ole.win32.browserView">
-   </view>
-</extension>
-<extension
-      point="org.eclipse.swt.examples.launcher.launchItems">
-   <category
-         name="%launchcategory.SWTWin32OnlyExamples.name"
-         description="%launchcategory.SWTWin32OnlyExamples.description"
-         id="org.eclipse.swt.examples.launchWin32OnlyCategory">
-   </category>
-   <item
-         name="%launchitem.OLEWebBrowserExample.name"
-         icon="icons/webbrowser_example.gif"
-         description="%launchitem.OLEWebBrowserExample.description"
-         category="org.eclipse.swt.examples.launchWin32OnlyCategory"
-         id="org.eclipse.swt.examples.ole.win32.viewlauncher">
-      <view
-            viewId="org.eclipse.swt.examples.ole.win32.browserView">
-      </view>
-   </item>
-</extension>
-</plugin>
diff --git a/examples/org.eclipse.swt.examples.ole.win32/src/import.properties b/examples/org.eclipse.swt.examples.ole.win32/src/import.properties
deleted file mode 100644
index 265131a..0000000
--- a/examples/org.eclipse.swt.examples.ole.win32/src/import.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-# Persist project settings for later import 
-natures = org.eclipse.jdt.core.javanature; org.eclipse.pde.PluginNature
-builders = org.eclipse.jdt.core.javabuilder; org.eclipse.pde.ManifestBuilder; org.eclipse.pde.SchemaBuilder
-var.ECLIPSE_PLUGINS = <<ECLIPSE_PLUGINS>>
diff --git a/examples/org.eclipse.swt.examples.ole.win32/src/org/eclipse/swt/examples/ole/win32/OleBrowserView.java b/examples/org.eclipse.swt.examples.ole.win32/src/org/eclipse/swt/examples/ole/win32/OleBrowserView.java
deleted file mode 100755
index 7a2a006..0000000
--- a/examples/org.eclipse.swt.examples.ole.win32/src/org/eclipse/swt/examples/ole/win32/OleBrowserView.java
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.ole.win32/src/org/eclipse/swt/examples/ole/win32/OlePlugin.java b/examples/org.eclipse.swt.examples.ole.win32/src/org/eclipse/swt/examples/ole/win32/OlePlugin.java
deleted file mode 100755
index 478c97b..0000000
--- a/examples/org.eclipse.swt.examples.ole.win32/src/org/eclipse/swt/examples/ole/win32/OlePlugin.java
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.ole.win32/src/org/eclipse/swt/examples/ole/win32/OleWebBrowser.java b/examples/org.eclipse.swt.examples.ole.win32/src/org/eclipse/swt/examples/ole/win32/OleWebBrowser.java
deleted file mode 100755
index e3f5b76..0000000
--- a/examples/org.eclipse.swt.examples.ole.win32/src/org/eclipse/swt/examples/ole/win32/OleWebBrowser.java
+++ /dev/null
@@ -1,253 +0,0 @@
-package org.eclipse.swt.examples.ole.win32;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.ole.win32.*;
-
-/**
- * Wrapper for an OleAutomation object used to send commands
- * to a Win32 "Shell.Explorer" OLE control.
- * 
- * Instances of this class manage the setup, typical use and teardown of
- * a simple web browser.
- */
-class OleWebBrowser {
-	/* See the Windows Platform SDK documentation for more information about the
-	 * OLE control used here and its usage.
-	 */
-	// Generated from typelib filename: shdocvw.dll
-
-	// Constants for WebBrowser CommandStateChange
-	public static final int CSC_UPDATECOMMANDS = -1;
-	public static final int CSC_NAVIGATEFORWARD = 1;
-	public static final int CSC_NAVIGATEBACK = 2;
-
-	// COnstants for Web Browser ReadyState
-	public static final int READYSTATE_UNINITIALIZED = 0;
-	public static final int READYSTATE_LOADING = 1;
-	public static final int READYSTATE_LOADED = 2;
-	public static final int READYSTATE_INTERACTIVE = 3;
-	public static final int READYSTATE_COMPLETE = 4;
-	
-	// Web Browser Control Events 
-	public static final int BeforeNavigate        = 100; // Fired when a new hyperlink is being navigated to.
-	public static final int NavigateComplete      = 101; // Fired when the document being navigated to becomes visible and enters the navigation stack.
-	public static final int StatusTextChange      = 102; // Statusbar text changed.
-	public static final int ProgressChange        = 108; // Fired when download progress is updated.
-	public static final int DownloadComplete      = 104; // Download of page complete.
-	public static final int CommandStateChange    = 105; // The enabled state of a command changed
-	public static final int DownloadBegin         = 106; // Download of a page started.
-	public static final int NewWindow             = 107; // Fired when a new window should be created.
-	public static final int TitleChange           = 113; // Document title changed.
-	public static final int FrameBeforeNavigate   = 200; // Fired when a new hyperlink is being navigated to in a frame.
-	public static final int FrameNavigateComplete = 201; // Fired when a new hyperlink is being navigated to in a frame.
-	public static final int FrameNewWindow        = 204; // Fired when a new window should be created.
-	public static final int Quit                  = 103; // Fired when application is quiting.
-	public static final int WindowMove            = 109; // Fired when window has been moved.
-	public static final int WindowResize          = 110; // Fired when window has been sized.
-	public static final int WindowActivate        = 111; // Fired when window has been activated.
-	public static final int PropertyChange        = 112; // Fired when the PutProperty method has been called.
-
-	// Web Browser properties
-	public static final int DISPID_READYSTATE = -525;
-
-	private OleAutomation  oleAutomation;
-
-	/**
-	 * Creates a Web browser control.
-	 * <p>
-	 * Typical use:<br>
-	 * <code>
-	 * OleControlSite oleControlSite = new OleControlSite(oleFrame, style, "Shell.Explorer");<br>
-	 * OleAutomation oleAutomation = new OleAutomation(oleControlSite);<br>
-	 * OleWebBrowser webBrowser = new OleWebBrowser(oleControlSite, oleAutomation);<br>
-	 * </code>
-	 * 
-     * @param oleAutomation the OleAutomation object for this control.
-     * @param oleControlSite the OleControlSite object for this control.
-	 */
-	public OleWebBrowser(OleAutomation oleAutomation) {
-		this.oleAutomation = oleAutomation;
-	}
-	
-	
-	/**
-	 * Disposes of the Web browser control.
-	 */
-	public void dispose() {
-		if (oleAutomation != null) oleAutomation.dispose();
-		oleAutomation = null;
-	}
-	
-	/*
-	 * Interact with the Control via OLE Automation
-	 * 
-	 * Note: You can hard code the DISPIDs if you know them beforehand
-	 *       this is of course the fastest way, but you increase coupling
-	 *       to the control.
-	 */
-	 
-	/**
-	 * Returns the current web page title.
-	 * 
-	 * @return the current web page title String
-	 */
-	public String getLocationName() {
-		// dispid=210, type=PROPGET, name="LocationName"
-		int[] rgdispid = oleAutomation.getIDsOfNames(new String[]{"LocationName"}); 
-		int dispIdMember = rgdispid[0];
-		Variant pVarResult = oleAutomation.getProperty(dispIdMember);
-		if (pVarResult == null) return null;
-		return pVarResult.getString();
-	}
-	
-	/**
-	 * Returns the current URL.
-	 * 
-	 * @return the current URL String
-	 */
-	public String getLocationURL() {
-		// dispid=211, type=PROPGET, name="LocationURL"
-		int[] rgdispid = oleAutomation.getIDsOfNames(new String[]{"LocationURL"}); 
-		int dispIdMember = rgdispid[0];
-		
-		Variant pVarResult = oleAutomation.getProperty(dispIdMember);
-		if (pVarResult == null) return null;
-		return pVarResult.getString();
-	}
-	
-	/**
-	 * Returns the current state of the control.
-	 * 
-	 * @return the current state of the control, one of:
-	 *         READYSTATE_UNINITIALIZED;
-	 *         READYSTATE_LOADING;
-	 *         READYSTATE_LOADED;
-	 *         READYSTATE_INTERACTIVE;
-	 *         READYSTATE_COMPLETE.
-	 */
-	public int getReadyState() {
-		// dispid=4294966771, type=PROPGET, name="ReadyState"
-		int[] rgdispid = oleAutomation.getIDsOfNames(new String[]{"ReadyState"}); 
-		int dispIdMember = rgdispid[0];
-		
-		Variant pVarResult = oleAutomation.getProperty(dispIdMember);
-		if (pVarResult == null) return -1;
-		return pVarResult.getInt();
-	}
-	
-	/**
-	 * Navigates backwards through previously visited web sites.
-	 * 
-	 * @return the platform-defined result code for the "GoBack" method invocation
-	 */
-	public int GoBack() {
-	
-		// dispid=100, type=METHOD, name="GoBack"
-		int[] rgdispid = oleAutomation.getIDsOfNames(new String[]{"GoBack"}); 
-		int dispIdMember = rgdispid[0];
-		
-		Variant pVarResult = oleAutomation.invoke(dispIdMember);
-		if (pVarResult == null) return 0;
-		return pVarResult.getInt();
-	}
-	
-	/**
-	 * Navigates backwards through previously visited web sites.
-	 * 
-	 * @return the platform-defined result code for the "GoForward" method invocation
-	 */
-	public int GoForward() {
-	
-		// dispid=101, type=METHOD, name="GoForward"
-		int[] rgdispid = oleAutomation.getIDsOfNames(new String[]{"GoForward"}); 
-		int dispIdMember = rgdispid[0];
-		
-		Variant pVarResult = oleAutomation.invoke(dispIdMember);
-		if (pVarResult == null) return 0;
-		return pVarResult.getInt();
-	}
-	
-	/**
-	 * Navigates to home page.
-	 *
-	 * @return the platform-defined result code for the "GoHome" method invocation
-	 */
-	public int GoHome() {
-		// dispid=102, type=METHOD, name="GoHome"
-		int[] rgdispid = oleAutomation.getIDsOfNames(new String[]{"GoHome"}); 
-		int dispIdMember = rgdispid[0];
-		
-		Variant pVarResult = oleAutomation.invoke(dispIdMember);
-		if (pVarResult == null) return 0;
-		return pVarResult.getInt();
-	}
-	
-	/**
-	 * Navigates to user-specified Web search gateway.
-	 *
-	 * @return the platform-defined result code for the "GoSearch" method invocation
-	 */
-	public int GoSearch() {
-		// dispid=103, type=METHOD, name="GoSearch"
-		int[] rgdispid = oleAutomation.getIDsOfNames(new String[]{"GoSearch"}); 
-		int dispIdMember = rgdispid[0];
-		
-		Variant pVarResult = oleAutomation.invoke(dispIdMember);
-		if (pVarResult == null) return 0;
-		return pVarResult.getInt();
-	}
-	
-	/**
-	 * Navigates to a particular URL.
-	 *
-	 * @return the platform-defined result code for the "Navigate" method invocation
-	 */
-	public int Navigate(String url) {
-		// dispid=104, type=METHOD, name="Navigate"
-		int[] rgdispid = oleAutomation.getIDsOfNames(new String[]{"Navigate", "URL"}); 
-		int dispIdMember = rgdispid[0];
-		
-		Variant[] rgvarg = new Variant[1];
-		rgvarg[0] = new Variant(url);
-		int[] rgdispidNamedArgs = new int[1];
-		rgdispidNamedArgs[0] = rgdispid[1]; // identifier of argument
-		Variant pVarResult = oleAutomation.invoke(dispIdMember, rgvarg, rgdispidNamedArgs);
-	
-		if (pVarResult == null) return 0;
-		return pVarResult.getInt();
-	}
-	
-	/**
-	 * Refreshes the currently viewed page.
-	 *
-	 * @return the platform-defined result code for the "Refresh" method invocation
-	 */
-	public void Refresh(){
-		// dispid= 4294966746, type=METHOD, name="Refresh"
-		int[] rgdispid = oleAutomation.getIDsOfNames(new String[]{"Refresh"}); 
-		int dispIdMember = rgdispid[0];
-		
-		oleAutomation.invokeNoReply(dispIdMember);
-	}
-	
-	/**
-	 * Aborts loading of the currnet page.
-	 *
-	 * @return the platform-defined result code for the "Stop" method invocation
-	 */
-	public void Stop() {
-		// dispid=106, type=METHOD, name="Stop"
-		int[] rgdispid = oleAutomation.getIDsOfNames(new String[]{"Stop"}); 
-		int dispIdMember = rgdispid[0];
-		
-		Variant pVarResult = oleAutomation.invoke(dispIdMember);
-	}	
-}
diff --git a/examples/org.eclipse.swt.examples.paint/.classpath b/examples/org.eclipse.swt.examples.paint/.classpath
deleted file mode 100755
index 1711403..0000000
--- a/examples/org.eclipse.swt.examples.paint/.classpath
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-    <classpathentry kind="src" path="src"/>
-    <classpathentry kind="var" path="JRE_LIB"/>
-    <classpathentry kind="src" path="/org.eclipse.swt"/>
-    <classpathentry kind="var"
-        path="ECLIPSE_HOME/plugins/org.eclipse.core.runtime_2.0.0/runtime.jar" sourcepath="ECLIPSE_HOME/plugins/org.eclipse.core.runtime_2.0.0/runtimesrc.zip"/>
-    <classpathentry kind="var"
-        path="ECLIPSE_HOME/plugins/org.eclipse.ui_2.0.0/workbench.jar" sourcepath="ECLIPSE_HOME/plugins/org.eclipse.ui_2.0.0/workbenchsrc.zip"/>
-    <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/examples/org.eclipse.swt.examples.paint/.cvsignore b/examples/org.eclipse.swt.examples.paint/.cvsignore
deleted file mode 100755
index c5e82d7..0000000
--- a/examples/org.eclipse.swt.examples.paint/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
\ No newline at end of file
diff --git a/examples/org.eclipse.swt.examples.paint/.project b/examples/org.eclipse.swt.examples.paint/.project
deleted file mode 100644
index 3cb7c3e..0000000
--- a/examples/org.eclipse.swt.examples.paint/.project
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.swt.examples.paint</name>
-	<comment></comment>
-	<projects>
-		<project>org.eclipse.swt</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/examples/org.eclipse.swt.examples.paint/about.html b/examples/org.eclipse.swt.examples.paint/about.html
deleted file mode 100644
index 9db411a..0000000
--- a/examples/org.eclipse.swt.examples.paint/about.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>20th June, 2002</p>	
-<h3>License</h3>
-<p>Eclipse.org makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Common Public License Version 1.0 (&quot;CPL&quot;).  A copy of the CPL is available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>.
-For purposes of the CPL, &quot;Program&quot; will mean the Content.</p>
-
-<h3>Contributions</h3>
-
-<p>If this Content is licensed to you under the terms and conditions of the CPL, any Contributions, as defined in the CPL, uploaded, submitted, or otherwise
-made available to Eclipse.org, members of Eclipse.org and/or the host of Eclipse.org web site, by you that relate to such
-Content are provided under the terms and conditions of the CPL and can be made available to others under the terms of the CPL.</p>
-
-<p>If this Content is licensed to you under license terms and conditions other than the CPL (&quot;Other License&quot;), any modifications, enhancements and/or
-other code and/or documentation (&quot;Modifications&quot;) uploaded, submitted, or otherwise made available to Eclipse.org, members of Eclipse.org and/or the
-host of Eclipse.org, by you that relate to such Content are provided under terms and conditions of the Other License and can be made available
-to others under the terms of the Other License.  In addition, with regard to Modifications for which you are the copyright holder, you are also
-providing the Modifications under the terms and conditions of the CPL and such Modifications can be made available to others under the terms of
-the CPL.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/examples/org.eclipse.swt.examples.paint/build.properties b/examples/org.eclipse.swt.examples.paint/build.properties
deleted file mode 100755
index db39eb3..0000000
--- a/examples/org.eclipse.swt.examples.paint/build.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-bin.includes = doc-html/,\
-               icons/,\
-               plugin.properties,\
-               plugin.xml,\
-               about.html,\
-               *.jar
-
-src.includes = about.html
-
-source.paint.jar = src/
diff --git a/examples/org.eclipse.swt.examples.paint/doc-html/hglegal2002.htm b/examples/org.eclipse.swt.examples.paint/doc-html/hglegal2002.htm
deleted file mode 100644
index 74393f0..0000000
--- a/examples/org.eclipse.swt.examples.paint/doc-html/hglegal2002.htm
+++ /dev/null
@@ -1,14 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <meta name="GENERATOR" content="Microsoft FrontPage 4.0">
-   <title>Legal Notices</title>
-</head>
-<body>
-
-<h3>
-<a NAME="Notices"></a>Notices</h3>
-(c) Copyright IBM Corp. 2000, 2002. All Rights Reserved.
-</body>
-</html>
diff --git a/examples/org.eclipse.swt.examples.paint/doc-html/ngibmcpy2002.gif b/examples/org.eclipse.swt.examples.paint/doc-html/ngibmcpy2002.gif
deleted file mode 100644
index 61cef48..0000000
--- a/examples/org.eclipse.swt.examples.paint/doc-html/ngibmcpy2002.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.paint/doc-html/swt_paint_ex.html b/examples/org.eclipse.swt.examples.paint/doc-html/swt_paint_ex.html
deleted file mode 100755
index 8449ba4..0000000
--- a/examples/org.eclipse.swt.examples.paint/doc-html/swt_paint_ex.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <title>SWT - Paint Tool</title>
-</head>
-<body>
-
-<h2>SWT Example - Paint Tool</h2>
-
-<p>	
-This example demonstrates the use of SWT graphics operations in the form of a
-rudimentary bitmap painting program.  The Airbrush Tool implementation also 
-demonstrates a mechanism for managing timed GUI operations in the background 
-that are triggered by user input.
-</p>
-<p>	
-Select a tool with which to draw in the drawing area.  There are a number of tools
-to choose from on the toolbar.  To change the color selection, click on a color in the
-palette below the drawing area: left-click for the foreground color, right-click for the
-background color.
-</p>
-<p>
-Uses SWT's GC and FontDialog, and JFace's InputDialog and action set support.
-</p>
-
-<h3>Running the example</h3>
-
-<p>From the Window menu select Show View --> Other.  
-In the Show View dialog, expand SWT Examples and select the
-view named Paint.  A view titled Paint will appear in your current perspective.
-</p>
-
-<p><a href="hglegal2002.htm"><img SRC="ngibmcpy2002.gif" ALT="Copyright IBM Corporation and others 2000, 2002.  All Rights Reserved." BORDER=0 height=14 width=324></a></p>
-</body>
-</html>
diff --git a/examples/org.eclipse.swt.examples.paint/icons/fill_none.gif b/examples/org.eclipse.swt.examples.paint/icons/fill_none.gif
deleted file mode 100755
index d26dd58..0000000
--- a/examples/org.eclipse.swt.examples.paint/icons/fill_none.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.paint/icons/fill_outline.gif b/examples/org.eclipse.swt.examples.paint/icons/fill_outline.gif
deleted file mode 100755
index c6ccfee..0000000
--- a/examples/org.eclipse.swt.examples.paint/icons/fill_outline.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.paint/icons/fill_solid.gif b/examples/org.eclipse.swt.examples.paint/icons/fill_solid.gif
deleted file mode 100755
index cb34e64..0000000
--- a/examples/org.eclipse.swt.examples.paint/icons/fill_solid.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.paint/icons/linestyle_dash.gif b/examples/org.eclipse.swt.examples.paint/icons/linestyle_dash.gif
deleted file mode 100644
index fb57bb3..0000000
--- a/examples/org.eclipse.swt.examples.paint/icons/linestyle_dash.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.paint/icons/linestyle_dashdot.gif b/examples/org.eclipse.swt.examples.paint/icons/linestyle_dashdot.gif
deleted file mode 100644
index 322968c..0000000
--- a/examples/org.eclipse.swt.examples.paint/icons/linestyle_dashdot.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.paint/icons/linestyle_dot.gif b/examples/org.eclipse.swt.examples.paint/icons/linestyle_dot.gif
deleted file mode 100644
index 4937ccb..0000000
--- a/examples/org.eclipse.swt.examples.paint/icons/linestyle_dot.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.paint/icons/linestyle_solid.gif b/examples/org.eclipse.swt.examples.paint/icons/linestyle_solid.gif
deleted file mode 100644
index 70a57ce..0000000
--- a/examples/org.eclipse.swt.examples.paint/icons/linestyle_solid.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.paint/icons/options_font.gif b/examples/org.eclipse.swt.examples.paint/icons/options_font.gif
deleted file mode 100755
index 965fe08..0000000
--- a/examples/org.eclipse.swt.examples.paint/icons/options_font.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.paint/icons/paint_example.gif b/examples/org.eclipse.swt.examples.paint/icons/paint_example.gif
deleted file mode 100755
index c48d9a9..0000000
--- a/examples/org.eclipse.swt.examples.paint/icons/paint_example.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.paint/icons/tool_airbrush.gif b/examples/org.eclipse.swt.examples.paint/icons/tool_airbrush.gif
deleted file mode 100755
index a310edd..0000000
--- a/examples/org.eclipse.swt.examples.paint/icons/tool_airbrush.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.paint/icons/tool_ellipse.gif b/examples/org.eclipse.swt.examples.paint/icons/tool_ellipse.gif
deleted file mode 100755
index dc2142f..0000000
--- a/examples/org.eclipse.swt.examples.paint/icons/tool_ellipse.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.paint/icons/tool_line.gif b/examples/org.eclipse.swt.examples.paint/icons/tool_line.gif
deleted file mode 100755
index 2ff819f..0000000
--- a/examples/org.eclipse.swt.examples.paint/icons/tool_line.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.paint/icons/tool_pencil.gif b/examples/org.eclipse.swt.examples.paint/icons/tool_pencil.gif
deleted file mode 100755
index f16a234..0000000
--- a/examples/org.eclipse.swt.examples.paint/icons/tool_pencil.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.paint/icons/tool_polyline.gif b/examples/org.eclipse.swt.examples.paint/icons/tool_polyline.gif
deleted file mode 100755
index aa384e9..0000000
--- a/examples/org.eclipse.swt.examples.paint/icons/tool_polyline.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.paint/icons/tool_rectangle.gif b/examples/org.eclipse.swt.examples.paint/icons/tool_rectangle.gif
deleted file mode 100755
index d26dd58..0000000
--- a/examples/org.eclipse.swt.examples.paint/icons/tool_rectangle.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.paint/icons/tool_roundedrectangle.gif b/examples/org.eclipse.swt.examples.paint/icons/tool_roundedrectangle.gif
deleted file mode 100755
index bf845d7..0000000
--- a/examples/org.eclipse.swt.examples.paint/icons/tool_roundedrectangle.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.paint/icons/tool_text.gif b/examples/org.eclipse.swt.examples.paint/icons/tool_text.gif
deleted file mode 100755
index 0d7457f..0000000
--- a/examples/org.eclipse.swt.examples.paint/icons/tool_text.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.paint/plugin.properties b/examples/org.eclipse.swt.examples.paint/plugin.properties
deleted file mode 100755
index 7ec46f1..0000000
--- a/examples/org.eclipse.swt.examples.paint/plugin.properties
+++ /dev/null
@@ -1,124 +0,0 @@
-providerName = Eclipse.org
-plugin.SWTPaintExample.name = SWT Paint Example Plugin
-category.SWTExamples.name = SWT Examples
-view.PaintExample.name = Paint
-
-launchcategory.SWTViewExamples.name = Workbench Views
-launchcategory.SWTViewExamples.description = \
-	A collection of Standard Widget Toolkit examples that run as Views inside the Workbench.  \
-	These examples will create a new View in the current Perspective.
-
-launchitem.PaintExample.name = Paint
-launchitem.PaintExample.description = \
-	This example demonstrates the use of SWT graphics operations in the form of a \
-	rudimentary bitmap painting program.  The Airbrush Tool implementation also \
-	demonstrates a mechanism for managing timed GUI operations in the background \
-	that are triggered by user input.\n\n\
-	Select a tool with which to draw in the drawing area.  There are a number of tools \
-	to choose from on the toolbar.  To change the color selection, click on a color in the \
-	palette below the drawing area: left-click for the foreground color, right-click for the \
-	background color.\n\n\
-	Uses SWT's GC and FontDialog, and JFace's InputDialog and action set support.
-
-menu.Tools.label = Tools
-menu.Options.label = Options
-
-tool.Pencil.label = Pencil
-tool.Pencil.tooltip = Pencil tool
-tool.Pencil.image = icons/tool_pencil.gif
-tool.Pencil.description = Selects the Pencil tool.
-
-tool.Airbrush.label = Airbrush
-tool.Airbrush.tooltip = Airbrush tool
-tool.Airbrush.image = icons/tool_airbrush.gif
-tool.Airbrush.description = Selects the Airbrush tool.
-
-tool.Line.label = Line
-tool.Line.tooltip = Line tool
-tool.Line.image = icons/tool_line.gif
-tool.Line.description = Selects the Line tool.
-
-tool.PolyLine.label = Polygon
-tool.PolyLine.tooltip = Polygon tool
-tool.PolyLine.image = icons/tool_polyline.gif
-tool.PolyLine.description = Selects the PolyLine tool.
-
-tool.Rectangle.label = Rectangle
-tool.Rectangle.tooltip = Rectangle tool
-tool.Rectangle.image = icons/tool_rectangle.gif
-tool.Rectangle.description = Selects the Rectangle tool.
-
-tool.Ellipse.label = Ellipse
-tool.Ellipse.tooltip = Ellipse tool
-tool.Ellipse.image = icons/tool_ellipse.gif
-tool.Ellipse.description = Selects the Ellipse tool.
-
-tool.RoundedRectangle.label = Rounded Rectangle
-tool.RoundedRectangle.tooltip = Rounded Rectangle
-tool.RoundedRectangle.image = icons/tool_roundedrectangle.gif
-tool.RoundedRectangle.description = Selects the Rounded Rectangle tool.
-
-tool.Text.label = Text
-tool.Text.tooltip = Text tool
-tool.Text.image = icons/tool_text.gif
-tool.Text.description = Selects the Text tool.
-tool.Text.settings.defaulttext = Hello!
-tool.Text.dialog.title = Text Tool Settings
-tool.Text.dialog.message = Please enter the new text string to be painted.
-
-tool.Null.label = <none>
-
-fill.None.label = No Fill
-fill.None.tooltip = No fill mode
-fill.None.image = icons/fill_none.gif
-fill.None.description = Selects No Fill mode.
-
-fill.Outline.label = Outline Fill
-fill.Outline.tooltip = Outline fill mode
-fill.Outline.image = icons/fill_outline.gif
-fill.Outline.description = Selects Outline Fill mode.
-
-fill.Solid.label = Solid Fill
-fill.Solid.tooltip = Solid fill mode
-fill.Solid.image = icons/fill_solid.gif
-fill.Solid.description = Selects Solid Fill mode.
-
-linestyle.Solid.label = Solid Line
-linestyle.Solid.tooltip = Solid line style
-linestyle.Solid.image = icons/linestyle_solid.gif
-linestyle.Solid.description = Select Solid Line style.
-
-linestyle.Dot.label = Dotted Line
-linestyle.Dot.tooltip = Dotted line style
-linestyle.Dot.image = icons/linestyle_dot.gif
-linestyle.Dot.description = Select Dotted Line style.
-
-linestyle.Dash.label = Dashed Line
-linestyle.Dash.tooltip = Dashed line style
-linestyle.Dash.image = icons/linestyle_dash.gif
-linestyle.Dash.description = Select Dashed Line style.
-
-linestyle.DashDot.label = Dash-Dot Line
-linestyle.DashDot.tooltip = Dash-Dot line style
-linestyle.DashDot.image = icons/linestyle_dashdot.gif
-linestyle.DashDot.description = Select Dash-Dot Line style.
-
-options.Font.label = Text Tool Font
-options.Font.tooltip = Select Text Tool font
-options.Font.image = icons/options_font.gif
-options.Font.description = Selects Text Tool font.
-options.Font.dialog.title = Text Tool Font
-
-settings.AirbrushRadius.text = Airbrush Radius
-settings.AirbrushIntensity.text = Airbrush Intensity
-
-session.Null.message = Select a tool...
-session.ContinuousPaint.message = Click and drag to draw...
-session.DragInteractivePaint.message = Click and drag to preview, release to draw, right-click to cancel...
-session.SegmentedInteractivePaint.message.anchorMode = Click to set anchor...
-session.SegmentedInteractivePaint.message.interactiveMode = Click to draw, double-click to close figure, right-click to cancel...
-session.Text.message = Click to draw text, right-click to edit text...
-
-status.Coord.format = ({0}, {1})
-status.CoordRange.format = ({0}, {1}) - ({2}, {3})
-status.Bar.format = {0} : {1}   {2}
diff --git a/examples/org.eclipse.swt.examples.paint/plugin.xml b/examples/org.eclipse.swt.examples.paint/plugin.xml
deleted file mode 100755
index 35b5ffb..0000000
--- a/examples/org.eclipse.swt.examples.paint/plugin.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<plugin
-   id="org.eclipse.swt.examples.paint"
-   name="%plugin.SWTPaintExample.name"
-   version="2.1.0"
-   provider-name="%providerName"
-   class="org.eclipse.swt.examples.paint.PaintPlugin">
-
-<!-- Runtime -->
-   <runtime>
-      <library name="paint.jar"/>
-   </runtime>
-<!-- Required plugins -->
-   <requires>
-      <import plugin="org.eclipse.core.runtime"/>
-      <import plugin="org.eclipse.core.resources"/>
-      <import plugin="org.eclipse.ui"/>
-      <import plugin="org.eclipse.swt"/>
-   </requires>
-
-
-<!-- Extension points -->
-<!-- Extensions -->
-   <extension
-         point="org.eclipse.ui.views">
-      <view
-            name="%view.PaintExample.name"
-            icon="icons/paint_example.gif"
-            category="org.eclipse.swt.examples.category"
-            class="org.eclipse.swt.examples.paint.PaintView"
-            id="org.eclipse.swt.examples.paint.view">
-      </view>
-   </extension>
-   <extension
-         point="org.eclipse.swt.examples.launcher.launchItems">
-      <category
-            name="%launchcategory.SWTViewExamples.name"
-            description="%launchcategory.SWTViewExamples.description"
-            id="org.eclipse.swt.examples.launchViewCategory">
-      </category>
-      <item
-            name="%launchitem.PaintExample.name"
-            icon="icons/paint_example.gif"
-            description="%launchitem.PaintExample.description"
-            category="org.eclipse.swt.examples.launchViewCategory"
-            id="org.eclipse.swt.examples.paint.viewlauncher">
-         <view
-               viewId="org.eclipse.swt.examples.paint.view">
-         </view>
-      </item>
-   </extension>
-
-</plugin>
diff --git a/examples/org.eclipse.swt.examples.paint/src/import.properties b/examples/org.eclipse.swt.examples.paint/src/import.properties
deleted file mode 100644
index 265131a..0000000
--- a/examples/org.eclipse.swt.examples.paint/src/import.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-# Persist project settings for later import 
-natures = org.eclipse.jdt.core.javanature; org.eclipse.pde.PluginNature
-builders = org.eclipse.jdt.core.javabuilder; org.eclipse.pde.ManifestBuilder; org.eclipse.pde.SchemaBuilder
-var.ECLIPSE_PLUGINS = <<ECLIPSE_PLUGINS>>
diff --git a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/AirbrushTool.java b/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/AirbrushTool.java
deleted file mode 100755
index b6884de..0000000
--- a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/AirbrushTool.java
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/BasicPaintSession.java b/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/BasicPaintSession.java
deleted file mode 100755
index 1a7e394..0000000
--- a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/BasicPaintSession.java
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/ContainerFigure.java b/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/ContainerFigure.java
deleted file mode 100755
index 8416429..0000000
--- a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/ContainerFigure.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package org.eclipse.swt.examples.paint;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.graphics.*;
-
-/**
- * Container for Figure objects with stacking preview mechanism.
- */
-public class ContainerFigure extends Figure {
-	private static final int INITIAL_ARRAY_SIZE = 16;
-	
-	Figure[]   objectStack = null;
-	int      nextIndex = 0;
-
-	/**
-	 * Constructs an empty Container
-	 */
-	public ContainerFigure() {
-	}
-	/**
-	 * Adds an object to the container for later drawing.
-	 * 
-	 * @param object the object to add to the drawing list
-	 */
-	public void add(Figure object) {
-		if (objectStack == null) {
-			objectStack = new Figure[INITIAL_ARRAY_SIZE];
-		} else if (objectStack.length <= nextIndex) {
-			Figure[] newObjectStack = new Figure[objectStack.length * 2];
-			System.arraycopy(objectStack, 0, newObjectStack, 0, objectStack.length);
-			objectStack = newObjectStack;
-		}
-		objectStack[nextIndex] = object;
-		++nextIndex;
-	}
-	/**
-	 * Determines if the container is empty.
-	 * @return true if the container is empty
-	 */
-	public boolean isEmpty() {
-		return nextIndex == 0;
-	}
-	/**
-	 * Adds an object to the container and draws its preview then updates the supplied preview state.
-	 * 
-	 * @param object the object to add to the drawing list
-	 * @param gc the GC to draw on
-	 * @param offset the offset to add to virtual coordinates to get display coordinates
-	 * @param rememberedState the state returned by a previous drawPreview() or addAndPreview()
-	 *        using this Container, may be null if there was no such previous call
-	 * @return object state that must be passed to erasePreview() later to erase this object
-	 */
-//	public Object addAndPreview(Figure object, GC gc, Point offset, Object rememberedState) {
-//		Object[] stateStack = (Object[]) rememberedState;
-//		if (stateStack == null) {
-//			stateStack = new Object[INITIAL_ARRAY_SIZE];
-//		} else if (stateStack.length <= nextIndex) {
-//			Object[] newStateStack = new Object[stateStack.length * 2];
-//			System.arraycopy(stateStack, 0, newStateStack, 0, stateStack.length);
-//			stateStack = newStateStack;
-//		}
-//		add(object);
-//		stateStack[nextIndex - 1] = object.drawPreview(gc, offset);
-//		return stateStack;
-//	}
-	/**
-	 * Clears the container.
-	 * <p>
-	 * Note that erasePreview() cannot be called after this point to erase any previous
-	 * drawPreview()'s.
-	 * </p>
-	 */
-	public void clear() {
-		while (--nextIndex > 0) objectStack[nextIndex] = null;
-		nextIndex = 0;
-	}
-	public void draw(FigureDrawContext fdc) {
-		for (int i = 0; i < nextIndex; ++i) objectStack[i].draw(fdc);
-	}
-	public void addDamagedRegion(FigureDrawContext fdc, Region region) {
-		for (int i = 0; i < nextIndex; ++i) objectStack[i].addDamagedRegion(fdc, region);
-	}
-}
diff --git a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/ContinuousPaintSession.java b/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/ContinuousPaintSession.java
deleted file mode 100755
index f5efcb7..0000000
--- a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/ContinuousPaintSession.java
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/DragPaintSession.java b/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/DragPaintSession.java
deleted file mode 100755
index 728f170..0000000
--- a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/DragPaintSession.java
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/EllipseFigure.java b/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/EllipseFigure.java
deleted file mode 100755
index 27eedb3..0000000
--- a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/EllipseFigure.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.eclipse.swt.examples.paint;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
-
-/**
- * 2D Ellipse object
- */
-public class EllipseFigure extends Figure {
-	private Color foregroundColor, backgroundColor;
-	private int lineStyle, x1, y1, x2, y2;
-	/**
-	 * Constructs an Ellipse
-	 * These objects are defined by any two diametrically opposing corners of a box
-	 * bounding the ellipse.
-	 * 
-	 * @param color the color for this object
-	 * @param lineStyle the line style for this object
-	 * @param x1 the virtual X coordinate of the first corner
-	 * @param y1 the virtual Y coordinate of the first corner
-	 * @param x2 the virtual X coordinate of the second corner
-	 * @param y2 the virtual Y coordinate of the second corner
-	 */
-	public EllipseFigure(Color foregroundColor, Color backgroundColor, int lineStyle, int x1, int y1, int x2, int y2) {
-		this.foregroundColor = foregroundColor;
-		this.backgroundColor = backgroundColor;
-		this.lineStyle = lineStyle;
-		this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2;
-	}
-	public void draw(FigureDrawContext fdc) {
-		Rectangle r = fdc.toClientRectangle(x1, y1, x2, y2);
-		fdc.gc.setForeground(foregroundColor);
-		fdc.gc.setBackground(backgroundColor);
-		fdc.gc.setLineStyle(lineStyle);
-		fdc.gc.drawOval(r.x, r.y, r.width - 1, r.height - 1);
-		fdc.gc.setLineStyle(SWT.LINE_SOLID);
-	}
-	public void addDamagedRegion(FigureDrawContext fdc, Region region) {
-		region.add(fdc.toClientRectangle(x1, y1, x2, y2));
-	}
-}
diff --git a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/EllipseTool.java b/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/EllipseTool.java
deleted file mode 100755
index 3b3f11f..0000000
--- a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/EllipseTool.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.eclipse.swt.examples.paint;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.graphics.*;
-
-/**
- * A drawing tool.
- */
-public class EllipseTool extends DragPaintSession implements PaintTool {
-	private ToolSettings settings;
-
-	/**
-	 * Constructs a EllipseTool.
-	 * 
-	 * @param toolSettings the new tool settings
-	 * @param paintSurface the PaintSurface we will render on.
-	 */
-	public EllipseTool(ToolSettings toolSettings, PaintSurface paintSurface) {
-		super(paintSurface);
-		set(toolSettings);
-	}
-
-	/**
-	 * Sets the tool's settings.
-	 * 
-	 * @param toolSettings the new tool settings
-	 */
-	public void set(ToolSettings toolSettings) {
-		settings = toolSettings;
-	}
-
-	/**
-	 * Returns name associated with this tool.
-	 * 
-	 * @return the localized name of this tool
-	 */
-	public String getDisplayName() {
-		return PaintPlugin.getResourceString("tool.Ellipse.label");
-	}
-
-	/*
-	 * Template methods for drawing
-	 */
-	protected Figure createFigure(Point a, Point b) {
-		ContainerFigure container = new ContainerFigure();
-		if (settings.commonFillType != ToolSettings.ftNone)
-			container.add(new SolidEllipseFigure(settings.commonBackgroundColor, a.x, a.y, b.x, b.y));
-		if (settings.commonFillType != ToolSettings.ftSolid)
-			container.add(new EllipseFigure(settings.commonForegroundColor, settings.commonBackgroundColor, settings.commonLineStyle,
-				a.x, a.y, b.x, b.y));
-		return container;
-	}
-}
diff --git a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/Figure.java b/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/Figure.java
deleted file mode 100755
index be049d1..0000000
--- a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/Figure.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.eclipse.swt.examples.paint;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.graphics.*;
-
-/**
- * Superinterface for all drawing objects.
- * All drawing objects know how to render themselved to the screen and can draw a
- * temporary version of themselves for previewing the general appearance of the
- * object onscreen before it gets committed.
- */
-public abstract class Figure {
-	/**
-	 * Draws this object.
-	 * 
-	 * @param fdc a parameter block specifying drawing-related information
-	 */
-	public abstract void draw(FigureDrawContext fdc);
-
-	/**
-	 * Computes the damaged screen region caused by drawing this object (imprecise), then
-	 * appends it to the supplied region.
-	 * 
-	 * @param fdc a parameter block specifying drawing-related information
-	 * @param region a region to which additional damage areas will be added
-	 */
-	public abstract void addDamagedRegion(FigureDrawContext fdc, Region region);
-}
diff --git a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/FigureDrawContext.java b/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/FigureDrawContext.java
deleted file mode 100644
index 4c08aa8..0000000
--- a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/FigureDrawContext.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.eclipse.swt.examples.paint;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.graphics.*;
-
-public class FigureDrawContext {
-	/*
-	 * <p>
-	 * The GC must be set up as follows
-	 * (it will be returned to this state upon completion of drawing operations)
-	 * <ul>
-	 *   <li>setXORMode(false)
-	 * </ul>
-	 * </p>
-	 */
-	public GC gc = null;
-	public int xOffset = 0, yOffset = 0; // substract to get GC coords
-	public int xScale = 1, yScale = 1;
-	
-	public Rectangle toClientRectangle(int x1, int y1, int x2, int y2) {
-		return new Rectangle(
-			Math.min(x1, x2) * xScale - xOffset,
-			Math.min(y1, y2) * yScale - yOffset,
-			(Math.abs(x2 - x1) + 1) * xScale,
-			(Math.abs(y2 - y1) + 1) * yScale);
-	}
-	public Point toClientPoint(int x, int y) {
-		return new Point(x * xScale - xOffset, y * yScale - yOffset);
-	}
-}
diff --git a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/LineFigure.java b/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/LineFigure.java
deleted file mode 100755
index f7b0605..0000000
--- a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/LineFigure.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.eclipse.swt.examples.paint;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
-
-/**
- * 2D Line object
- */
-public class LineFigure extends Figure {
-	private Color foregroundColor, backgroundColor;
-	private int lineStyle, x1, y1, x2, y2;
-	/**
-	 * Constructs a Line
-	 * These objects are defined by their two end-points.
-	 * 
-	 * @param color the color for this object
-	 * @param lineStyle the line style for this object
-	 * @param x1 the virtual X coordinate of the first end-point
-	 * @param y1 the virtual Y coordinate of the first end-point
-	 * @param x2 the virtual X coordinate of the second end-point
-	 * @param y2 the virtual Y coordinate of the second end-point
-	 */
-	public LineFigure(Color foregroundColor, Color backgroundColor, int lineStyle, int x1, int y1, int x2, int y2) {
-		this.foregroundColor = foregroundColor;
-		this.backgroundColor = backgroundColor;
-		this.lineStyle = lineStyle;
-		this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2;
-	}
-	public void draw(FigureDrawContext fdc) {
-		Point p1 = fdc.toClientPoint(x1, y1);
-		Point p2 = fdc.toClientPoint(x2, y2);
-		fdc.gc.setForeground(foregroundColor);
-		fdc.gc.setBackground(backgroundColor);
-		fdc.gc.setLineStyle(lineStyle);
-		fdc.gc.drawLine(p1.x, p1.y, p2.x, p2.y);
-		fdc.gc.setLineStyle(SWT.LINE_SOLID);
-	}
-	public void addDamagedRegion(FigureDrawContext fdc, Region region) {
-		region.add(fdc.toClientRectangle(x1, y1, x2, y2));
-	}
-}
diff --git a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/LineTool.java b/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/LineTool.java
deleted file mode 100755
index f919965..0000000
--- a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/LineTool.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.eclipse.swt.examples.paint;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.graphics.*;
-
-/**
- * A line drawing tool
- */
-public class LineTool extends DragPaintSession implements PaintTool {
-	private ToolSettings settings;
-
-	/**
-	 * Constructs a LineTool.
-	 * 
-	 * @param toolSettings the new tool settings
-	 * @param paintSurface the PaintSurface we will render on.
-	 */
-	public LineTool(ToolSettings toolSettings, PaintSurface paintSurface) {
-		super(paintSurface);
-		set(toolSettings);
-	}
-	
-	/**
-	 * Sets the tool's settings.
-	 * 
-	 * @param toolSettings the new tool settings
-	 */
-	public void set(ToolSettings toolSettings) {
-		settings = toolSettings;
-	}
-	
-	/**
-	 * Returns name associated with this tool.
-	 * 
-	 * @return the localized name of this tool
-	 */
-	public String getDisplayName() {
-		return PaintPlugin.getResourceString("tool.Line.label");
-	}
-
-	/*
-	 * Template methods for drawing
-	 */
-	protected Figure createFigure(Point a, Point b) {
-		return new LineFigure(settings.commonForegroundColor, settings.commonBackgroundColor, settings.commonLineStyle,
-			a.x, a.y, b.x, b.y);
-	}
-}
diff --git a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/PaintPlugin.java b/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/PaintPlugin.java
deleted file mode 100755
index e4da0cf..0000000
--- a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/PaintPlugin.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package org.eclipse.swt.examples.paint;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.core.runtime.*;
-import org.eclipse.ui.plugin.*;
-
-import java.text.*;
-import java.util.*;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class PaintPlugin extends AbstractUIPlugin {
-	//The shared instance.
-	private static PaintPlugin plugin;
-	private static ResourceBundle resourceBundle;
-
-	/**
-	 * Constructs the Paint plugin.
-	 */
-	public PaintPlugin(IPluginDescriptor descriptor) {
-		super(descriptor);
-		plugin = this;
-		resourceBundle = descriptor.getResourceBundle();
-	}
-	
-	/**
-	 * Returns the shared instance.
-	 */
-	public static PaintPlugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Log an error to the ILog for this plugin
-	 * 
-	 * @param message the localized error message text
-	 * @param exception the associated exception, or null
-	 */
-	public static void logError(String message, Throwable exception) {
-		plugin.getLog().log(new Status(IStatus.ERROR, plugin.getDescriptor().getUniqueIdentifier(),
-			0, message, exception));
-	}
-
-	/**
-	 * Returns a string from the resource bundle.
-	 * We don't want to crash because of a missing String.
-	 * Returns the key if not found.
-	 */
-	public static String getResourceString(String key) {
-		try {
-			return resourceBundle.getString(key);
-		} catch (MissingResourceException e) {
-			return key;
-		} catch (NullPointerException e) {
-			return "!" + key + "!";
-		}			
-	}
-
-	/**
-	 * Returns a string from the resource bundle and binds it
-	 * with the given arguments. If the key is not found,
-	 * return the key.
-	 */
-	public static String getResourceString(String key, Object[] args) {
-		try {
-			return MessageFormat.format(getResourceString(key), args);
-		} catch (MissingResourceException e) {
-			return key;
-		} catch (NullPointerException e) {
-			return "!" + key + "!";
-		}
-	}
-}
diff --git a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/PaintSession.java b/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/PaintSession.java
deleted file mode 100755
index a5a43d0..0000000
--- a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/PaintSession.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.eclipse.swt.examples.paint;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-
-/**
- * Manages an interactive paint session.
- * Note that the coordinates received via the listener interfaces are virtualized to zero-origin
- * relative to the painting surface.
- */ 
-public interface PaintSession extends MouseListener, MouseMoveListener {
-	/**
-	 * Returns the paint surface associated with this paint session
-	 * 
-	 * @return the associated PaintSurface
-	 */
-	public PaintSurface getPaintSurface();
-
-	/**
-	 * Activates the session.
-	 * 
-	 * Note: When overriding this method, call super.beginSession() at method start.
-	 */
-	public abstract void beginSession();
-	
-	/**
-	 * Deactivates the session.
-     *
-	 * Note: When overriding this method, call super.endSession() at method exit.
-     */
-	public abstract void endSession();
-	
-	/**
-	 * Resets the session.
-	 * Aborts any operation in progress.
-	 * 
-	 * Note: When overriding this method, call super.resetSession() at method exit.
-	 */
-	public abstract void resetSession();
-	
-	
-	/**
-	 * Returns the name associated with this tool.
-	 * 
-	 * @return the localized name of this tool
-	 */
-	public String getDisplayName();
-}
diff --git a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/PaintSurface.java b/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/PaintSurface.java
deleted file mode 100755
index f9fd206..0000000
--- a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/PaintSurface.java
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/PaintTool.java b/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/PaintTool.java
deleted file mode 100755
index da27e96..0000000
--- a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/PaintTool.java
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/PaintView.java b/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/PaintView.java
deleted file mode 100755
index 174de42..0000000
--- a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/PaintView.java
+++ /dev/null
@@ -1,496 +0,0 @@
-package org.eclipse.swt.examples.paint;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.jface.action.*;
-import org.eclipse.jface.resource.*;
-import org.eclipse.swt.*;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.ui.*;
-import org.eclipse.ui.part.*;
-
-import java.net.*;
-import java.util.*;
-
-/**
- * The view for the paint application.
- * All rendering happens inside the area created by createPartControl().
- * 
- * @see ViewPart
- */
-public class PaintView extends ViewPart {
-	private Display workbenchDisplay;
-
-	// current active settings
-	private ToolSettings toolSettings;
-
-	// paint surface for drawing
-	private PaintSurface paintSurface;
-
-	// map action ids to useful data
-	private HashMap /* of String to PaintTool */ paintToolMap;
-	private HashMap /* of String to Integer */ paintFillTypeMap;
-	private HashMap /* of String to Integer */ paintLineStyleMap;
-	
-	/** UI data **/
-	// handle of currently active tool IAction on the UI
-	private IAction activeToolAction;
-	// handle of currently active filltype IAction on the UI
-	private IAction activeFillTypeAction;
-	// handle of currently active linetype IAction on the UI
-	private IAction activeLineStyleAction;
-
-	// handle of active foreground color box Canvas widget
-	private Canvas activeForegroundColorCanvas;
-	// handle of active background color box Canvas widget
-	private Canvas activeBackgroundColorCanvas;
-	
-	private static final int numPaletteRows = 3;
-	private static final int numPaletteCols = 50;
-
-	// shared data	
-	private Color paintColorBlack, paintColorWhite; // alias for paintColors[0] and [1]
-	private Color[] paintColors;
-	private Font paintDefaultFont; // do not free
-
-	/**
-	 * Constructs a Paint view.
-	 */
-	public PaintView() {
-	}
-
-	/**
-	 * Cleanup
-	 */
-	public void dispose() {
-		if (paintSurface != null) paintSurface.dispose();		
-		if (paintColors != null) {
-			for (int i = 0; i < paintColors.length; ++i) {
-				final Color color = paintColors[i];
-				if (color != null) color.dispose();
-			}
-		}
-		paintDefaultFont = null;
-		paintColors = null;
-		paintSurface = null;
-		super.dispose();
-	}
-	
-	/**
-	 * Called when we must grab focus.
-	 * 
-	 * @see org.eclipse.ui.part.ViewPart#setFocus
-	 */
-	public void setFocus() {
-		paintSurface.setFocus();
-	}
-
-	/**
-	 * Creates the example.
-	 * 
-	 * @see ViewPart#createPartControl
-	 */
-	public void createPartControl(Composite parent) {
-		/*** Initialize shared data ***/
-		workbenchDisplay = parent.getDisplay();
-		
-		paintColorWhite = new Color(workbenchDisplay, 255, 255, 255);
-		paintColorBlack = new Color(workbenchDisplay, 0, 0, 0);
-		
-		paintDefaultFont = workbenchDisplay.getSystemFont();
-
-		paintColors = new Color[numPaletteCols * numPaletteRows];
-		paintColors[0] = paintColorBlack;
-		paintColors[1] = paintColorWhite;
-		for (int i = 2; i < paintColors.length; i++) {
-			paintColors[i] = new Color(workbenchDisplay,
-				((i*7)%255),((i*23)%255), ((i*51)%255));
-		}
-
-		toolSettings = new ToolSettings();
-		toolSettings.commonForegroundColor = paintColorBlack;
-		toolSettings.commonBackgroundColor = paintColorWhite;
-		toolSettings.commonFont = paintDefaultFont;
-
-		/*** Add toolbar contributions ***/
-		final IActionBars actionBars = getViewSite().getActionBars();
-		IToolBarManager toolbarManager = actionBars.getToolBarManager();
-
-		toolbarManager.add(new GroupMarker("group.tools"));
-		toolbarManager.appendToGroup("group.tools", new SelectPaintToolAction("tool.Pencil"));
-		toolbarManager.appendToGroup("group.tools", new SelectPaintToolAction("tool.Airbrush"));
-		toolbarManager.appendToGroup("group.tools", new SelectPaintToolAction("tool.Line"));
-		toolbarManager.appendToGroup("group.tools", new SelectPaintToolAction("tool.PolyLine"));
-		toolbarManager.appendToGroup("group.tools", new SelectPaintToolAction("tool.Rectangle"));
-		toolbarManager.appendToGroup("group.tools", new SelectPaintToolAction("tool.RoundedRectangle"));
-		toolbarManager.appendToGroup("group.tools", new SelectPaintToolAction("tool.Ellipse"));
-		toolbarManager.appendToGroup("group.tools", new SelectPaintToolAction("tool.Text"));
-		toolbarManager.add(new Separator());
-		toolbarManager.add(new GroupMarker("group.options.fill"));
-		toolbarManager.appendToGroup("group.options.fill", new SelectFillTypeAction("fill.None"));
-		toolbarManager.appendToGroup("group.options.fill", new SelectFillTypeAction("fill.Outline"));
-		toolbarManager.appendToGroup("group.options.fill", new SelectFillTypeAction("fill.Solid"));
-		toolbarManager.add(new Separator());
-		toolbarManager.add(new GroupMarker("group.options.linestyle"));
-		toolbarManager.appendToGroup("group.options.linestyle", new SelectLineStyleAction("linestyle.Solid"));
-		toolbarManager.appendToGroup("group.options.linestyle", new SelectLineStyleAction("linestyle.Dash"));
-		toolbarManager.appendToGroup("group.options.linestyle", new SelectLineStyleAction("linestyle.Dot"));
-		toolbarManager.appendToGroup("group.options.linestyle", new SelectLineStyleAction("linestyle.DashDot"));
-		toolbarManager.add(new Separator());
-		toolbarManager.add(new GroupMarker("group.options"));
-		toolbarManager.appendToGroup("group.options", new SelectFontAction("options.Font"));
-		actionBars.updateActionBars();
-
-		/*** Build GUI ***/
-		createGUI(parent);
-
-		/*** Set defaults ***/
-		setPaintToolByID("tool.Pencil");
-		setFillTypeByID("fill.None");
-		setLineStyleByID("linestyle.Solid");
-		setForegroundColor(paintColorBlack);
-		setBackgroundColor(paintColorWhite);
-	}
-
-	/**
-	 * Creates the GUI.
-	 */
-	private void createGUI(Composite parent) {
-		GridLayout gridLayout;
-		GridData gridData;
-
-		/*** Create principal GUI layout elements ***/		
-		Composite displayArea = new Composite(parent, SWT.NONE);
-		gridLayout = new GridLayout();
-		gridLayout.numColumns = 1;
-		displayArea.setLayout(gridLayout);
-
-		// Creating these elements here avoids the need to instantiate the GUI elements
-		// in strict layout order.  The natural layout ordering is an artifact of using
-		// SWT layouts, but unfortunately it is not the same order as that required to
-		// instantiate all of the non-GUI application elements to satisfy referential
-		// dependencies.  It is possible to reorder the initialization to some extent, but
-		// this can be very tedious.
-		
-		// paint canvas
-		final Canvas paintCanvas = new Canvas(displayArea, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL |
-			SWT.NO_REDRAW_RESIZE | SWT.NO_BACKGROUND);
-		gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL);
-		paintCanvas.setLayoutData(gridData);
-		paintCanvas.setBackground(paintColorWhite);
-		
-		// color selector frame
-		final Composite colorFrame = new Composite(displayArea, SWT.NONE);
-		gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_FILL);
-		colorFrame.setLayoutData(gridData);
-
-		// tool settings frame
-		final Composite toolSettingsFrame = new Composite(displayArea, SWT.NONE);
-		gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_FILL);
-		toolSettingsFrame.setLayoutData(gridData);
-
-		// status text
-		final Text statusText = new Text(displayArea, SWT.BORDER | SWT.SINGLE | SWT.READ_ONLY);
-		gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_FILL);
-		statusText.setLayoutData(gridData);
-
-		/*** Create the remaining application elements inside the principal GUI layout elements ***/	
-		// paintSurface
-		paintSurface = new PaintSurface(paintCanvas, statusText, paintColorWhite);
-
-		// paintToolMap
-		paintToolMap = new HashMap();
-		paintToolMap.put("tool.Pencil", new PencilTool(toolSettings, paintSurface));
-		paintToolMap.put("tool.Airbrush", new AirbrushTool(toolSettings, paintSurface));
-		paintToolMap.put("tool.Line", new LineTool(toolSettings, paintSurface));
-		paintToolMap.put("tool.PolyLine", new PolyLineTool(toolSettings, paintSurface));
-		paintToolMap.put("tool.Rectangle", new RectangleTool(toolSettings, paintSurface));
-		paintToolMap.put("tool.RoundedRectangle", new RoundedRectangleTool(toolSettings, paintSurface));
-		paintToolMap.put("tool.Ellipse", new EllipseTool(toolSettings, paintSurface));
-		paintToolMap.put("tool.Text", new TextTool(toolSettings, paintSurface));
-		paintToolMap.put("tool.Null", null);
-
-		// paintFillTypeMap
-		paintFillTypeMap = new HashMap();
-		paintFillTypeMap.put("fill.None", new Integer(ToolSettings.ftNone));
-		paintFillTypeMap.put("fill.Outline", new Integer(ToolSettings.ftOutline));
-		paintFillTypeMap.put("fill.Solid", new Integer(ToolSettings.ftSolid));
-
-		// paintLineStyleMap
-		paintLineStyleMap = new HashMap();
-		paintLineStyleMap.put("linestyle.Solid", new Integer(SWT.LINE_SOLID));
-		paintLineStyleMap.put("linestyle.Dash", new Integer(SWT.LINE_DASH));
-		paintLineStyleMap.put("linestyle.Dot", new Integer(SWT.LINE_DOT));
-		paintLineStyleMap.put("linestyle.DashDot", new Integer(SWT.LINE_DASHDOT));
-
-		// colorFrame		
-		gridLayout = new GridLayout();
-		gridLayout.numColumns = 3;
-		gridLayout.marginHeight = 0;
-		gridLayout.marginWidth = 0;
-		colorFrame.setLayout(gridLayout);
-
-		// activeForegroundColorCanvas, activeBackgroundColorCanvas
-		activeForegroundColorCanvas = new Canvas(colorFrame, SWT.BORDER);
-		gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-		gridData.heightHint = 24;
-		gridData.widthHint = 24;
-		activeForegroundColorCanvas.setLayoutData(gridData);
-
-		activeBackgroundColorCanvas = new Canvas(colorFrame, SWT.BORDER);
-		gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-		gridData.heightHint = 24;
-		gridData.widthHint = 24;
-		activeBackgroundColorCanvas.setLayoutData(gridData);
-
-		// paletteCanvas
-		final Canvas paletteCanvas = new Canvas(colorFrame, SWT.BORDER | SWT.NO_BACKGROUND);
-		gridData = new GridData(GridData.FILL_HORIZONTAL);
-		gridData.heightHint = 24;
-		paletteCanvas.setLayoutData(gridData);
-		paletteCanvas.addListener(SWT.MouseDown, new Listener() {
-			public void handleEvent(Event e) {
-				Rectangle bounds = paletteCanvas.getClientArea();
-				Color color = getColorAt(bounds, e.x, e.y);				
-					
-				if (e.button == 1) setForegroundColor(color);
-				else setBackgroundColor(color);
-			}
-			private Color getColorAt(Rectangle bounds, int x, int y) {
-				if (bounds.height <= 1 && bounds.width <= 1) return paintColorWhite;
-				final int row = (y - bounds.y) * numPaletteRows / bounds.height;
-				final int col = (x - bounds.x) * numPaletteCols / bounds.width;
-				return paintColors[Math.min(Math.max(row * numPaletteCols + col, 0), paintColors.length - 1)];
-			}
-		});
-		Listener refreshListener = new Listener() {
-			public void handleEvent(Event e) {
-				if (e.gc == null) return;
-				Rectangle bounds = paletteCanvas.getClientArea();
-				for (int row = 0; row < numPaletteRows; ++row) {
-					for (int col = 0; col < numPaletteCols; ++col) {
-						final int x = bounds.width * col / numPaletteCols;
-						final int y = bounds.height * row / numPaletteRows;
-						final int width = Math.max(bounds.width * (col + 1) / numPaletteCols - x, 1);
-						final int height = Math.max(bounds.height * (row + 1) / numPaletteRows - y, 1);
-						e.gc.setBackground(paintColors[row * numPaletteCols + col]);
-						e.gc.fillRectangle(bounds.x + x, bounds.y + y, width, height);
-					}
-				}
-			}
-		};
-		paletteCanvas.addListener(SWT.Resize, refreshListener);
-		paletteCanvas.addListener(SWT.Paint, refreshListener);
-		//paletteCanvas.redraw();
-		
-		// toolSettingsFrame
-		gridLayout = new GridLayout();
-		gridLayout.numColumns = 4;
-		gridLayout.marginHeight = 0;
-		gridLayout.marginWidth = 0;
-		toolSettingsFrame.setLayout(gridLayout);
-
-		Label label = new Label(toolSettingsFrame, SWT.NONE);
-		label.setText(PaintPlugin.getResourceString("settings.AirbrushRadius.text"));
-
-		final Scale airbrushRadiusScale = new Scale(toolSettingsFrame, SWT.HORIZONTAL);
-		airbrushRadiusScale.setMinimum(5);
-		airbrushRadiusScale.setMaximum(50);
-		airbrushRadiusScale.setSelection(toolSettings.airbrushRadius);
-		airbrushRadiusScale.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_FILL));
-		airbrushRadiusScale.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				toolSettings.airbrushRadius = airbrushRadiusScale.getSelection();
-				updateToolSettings();
-			}
-		});
-
-		label = new Label(toolSettingsFrame, SWT.NONE);
-		label.setText(PaintPlugin.getResourceString("settings.AirbrushIntensity.text"));
-
-		final Scale airbrushIntensityScale = new Scale(toolSettingsFrame, SWT.HORIZONTAL);
-		airbrushIntensityScale.setMinimum(1);
-		airbrushIntensityScale.setMaximum(100);
-		airbrushIntensityScale.setSelection(toolSettings.airbrushIntensity);
-		airbrushIntensityScale.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_FILL));
-		airbrushIntensityScale.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				toolSettings.airbrushIntensity = airbrushIntensityScale.getSelection();
-				updateToolSettings();
-			}
-		});
-	}
-		
-	/**
-	 * Notifies the tool that its settings have changed.
-	 */
-	private void updateToolSettings() {
-		final PaintTool activePaintTool = paintSurface.getPaintTool();
-		if (activePaintTool == null) return;
-		
-		activePaintTool.endSession();
-		activePaintTool.set(toolSettings);
-		activePaintTool.beginSession();
-	}
-
-	/**
-	 * Sets the tool foreground color.
-	 * 
-	 * @param color the new color to use
-	 */
-	public void setForegroundColor(Color color) {
-		if (activeForegroundColorCanvas != null)
-			activeForegroundColorCanvas.setBackground(color);
-		toolSettings.commonForegroundColor = color;
-		updateToolSettings();
-	}
-
-	/**
-	 * Set the tool background color.
-	 * 
-	 * @param color the new color to use
-	 */
-	public void setBackgroundColor(Color color) {
-		if (activeBackgroundColorCanvas != null)
-			activeBackgroundColorCanvas.setBackground(color);
-		toolSettings.commonBackgroundColor = color;
-		updateToolSettings();
-	}
-
-	/**
-	 * Selects a tool given its ID.
-	 */
-	public void setPaintToolByID(String id) {
-		activeToolAction = handleRadioAction(activeToolAction, id);
-		
-		final PaintTool paintTool = (PaintTool) paintToolMap.get(id);
-		paintSurface.setPaintSession(paintTool);
-		updateToolSettings();
-	}
-	
-	/**
-	 * Selects a filltype given its ID.
-	 */
-	public void setFillTypeByID(String id) {
-		activeFillTypeAction = handleRadioAction(activeFillTypeAction, id);
-		
-		final Integer fillType = (Integer) paintFillTypeMap.get(id);
-		toolSettings.commonFillType = fillType.intValue();
-		updateToolSettings();		
-	}
-
-	/**
-	 * Selects line type given its ID.
-	 */
-	public void setLineStyleByID(String id) {
-		activeLineStyleAction = handleRadioAction(activeLineStyleAction, id);
-		
-		final Integer lineType = (Integer) paintLineStyleMap.get(id);
-		toolSettings.commonLineStyle = lineType.intValue();
-		updateToolSettings();		
-	}
-
-	/**
-	 * Gets the IAction for an ID belonging to a set of mutually exclusive actions, and
-	 * toggles the old action off if necessary.
-	 */
-	private IAction handleRadioAction(IAction oldAction, String id) {
-		IAction action = getActionByID(id);
-		if (action != null) {
-			if (oldAction != null) oldAction.setChecked(false);
-			if (! action.isChecked()) action.setChecked(true);
-			return action;
-		}
-		return oldAction;
-	}
-
-	/**
-	 * Gets the IAction representing the UI toolbar button with the specified ID.
-	 */
-	private IAction getActionByID(String id) {
-		final IActionBars actionBars = getViewSite().getActionBars();
-		IToolBarManager toolbarManager = actionBars.getToolBarManager();
-		ActionContributionItem contributionItem = (ActionContributionItem) toolbarManager.find(id);
-		if (contributionItem == null) return null;
-		return contributionItem.getAction();
-	}
-
-	/**
-	 * Returns the Display.
-	 * 
-	 * @return the display we're using
-	 */
-	public Display getDisplay() {
-		return workbenchDisplay;
-	}
-	
-	/**
-	 * Action set glue.
-	 */
-	abstract class PaintAction extends Action {
-		public PaintAction(String id) {
-			super();
-			setId(id);
-
-			try {
-				final URL installUrl = PaintPlugin.getDefault().getDescriptor().getInstallURL();
-				final URL imageUrl = new URL(installUrl, PaintPlugin.getResourceString(id + ".image"));
-				setImageDescriptor(ImageDescriptor.createFromURL(imageUrl));
-			} catch (MalformedURLException e) {
-				PaintPlugin.logError("", e);	
-			}
-
-			setText(PaintPlugin.getResourceString(id + ".label"));
-			setToolTipText(PaintPlugin.getResourceString(id + ".tooltip"));
-			setDescription(PaintPlugin.getResourceString(id + ".description"));
-		}
-	}
-	class SelectPaintToolAction extends PaintAction {
-		public SelectPaintToolAction(String id) { super(id); }
-		public int getStyle() { return IAction.AS_CHECK_BOX; }
-		public void run() { setPaintToolByID(getId()); }
-		
-	}
-	class SelectFillTypeAction extends PaintAction {
-		public SelectFillTypeAction(String id) { super(id); }
-		public int getStyle() { return IAction.AS_CHECK_BOX; }
-		public void run() { setFillTypeByID(getId()); }
-	}
-	class SelectLineStyleAction extends PaintAction {
-		public SelectLineStyleAction(String id) { super(id); }
-		public int getStyle() { return IAction.AS_CHECK_BOX; }
-		public void run() { setLineStyleByID(getId()); }
-	}
-	class SelectFontAction extends PaintAction {
-		public SelectFontAction(String id) { super(id); }
-		public int getStyle() { return IAction.AS_PUSH_BUTTON; }
-		public void run() {
-			FontDialog fontDialog = new FontDialog(paintSurface.getShell(), SWT.PRIMARY_MODAL);
-			FontData[] fontDatum = toolSettings.commonFont.getFontData();
-			if (fontDatum != null && fontDatum.length > 0) {
-				fontDialog.setFontData(fontDatum[0]);
-			}
-			fontDialog.setText(PaintPlugin.getResourceString("options.Font.dialog.title"));
-
-			paintSurface.hideRubberband();
-			FontData fontData = fontDialog.open();
-			paintSurface.showRubberband();
-			if (fontData != null) {
-				try {
-					Font font = new Font(workbenchDisplay, fontData);
-					toolSettings.commonFont = font;
-					updateToolSettings();
-				} catch (SWTException e) {
-				}
-			}
-		}
-	}
-}
diff --git a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/PencilTool.java b/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/PencilTool.java
deleted file mode 100755
index 4f8ee2f..0000000
--- a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/PencilTool.java
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/PointFigure.java b/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/PointFigure.java
deleted file mode 100644
index 07fedbd..0000000
--- a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/PointFigure.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.eclipse.swt.examples.paint;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.graphics.*;
-
-/**
- * 2D Point object
- */
-public class PointFigure extends Figure {
-	private Color color;
-	private int x, y;
-	/**
-	 * Constructs a Point
-	 * 
-	 * @param color the color for this object
-	 * @param x the virtual X coordinate of the first end-point
-	 * @param y the virtual Y coordinate of the first end-point
-	 */
-	public PointFigure(Color color, int x, int y) {
-		this.color = color; this.x = x; this.y = y;
-	}
-	public void draw(FigureDrawContext fdc) {
-		Point p = fdc.toClientPoint(x, y);
-		fdc.gc.setBackground(color);
-		fdc.gc.fillRectangle(p.x, p.y, 1, 1);
-	}
-	public void addDamagedRegion(FigureDrawContext fdc, Region region) {
-		region.add(fdc.toClientRectangle(x, y, x, y));
-	}
-}
diff --git a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/PolyLineTool.java b/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/PolyLineTool.java
deleted file mode 100755
index f2db962..0000000
--- a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/PolyLineTool.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package org.eclipse.swt.examples.paint;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.graphics.*;
-
-/**
- * A polyline drawing tool.
- */
-public class PolyLineTool extends SegmentedPaintSession implements PaintTool {
-	private ToolSettings settings;
-
-	/**
-	 * Constructs a PolyLineTool.
-	 * 
-	 * @param toolSettings the new tool settings
-	 * @param paintSurface the PaintSurface we will render on.
-	 */
-	public PolyLineTool(ToolSettings toolSettings, PaintSurface paintSurface) {
-		super(paintSurface);
-		set(toolSettings);
-	}
-	
-	/**
-	 * Sets the tool's settings.
-	 * 
-	 * @param toolSettings the new tool settings
-	 */
-	public void set(ToolSettings toolSettings) {
-		settings = toolSettings;
-	}
-
-	/**
-	 * Returns the name associated with this tool.
-	 * 
-	 * @return the localized name of this tool
-	 */
-	public String getDisplayName() {
-		return PaintPlugin.getResourceString("tool.PolyLine.label");
-	}
-
-	/*
-	 * Template methods for drawing
-	 */
-	protected Figure createFigure(Point[] points, int numPoints, boolean closed) {
-		ContainerFigure container = new ContainerFigure();
-		if (closed && settings.commonFillType != ToolSettings.ftNone && numPoints >= 3) {
-			container.add(new SolidPolygonFigure(settings.commonBackgroundColor, points, numPoints));
-		}
-		if (! closed || settings.commonFillType != ToolSettings.ftSolid || numPoints < 3) {
-			for (int i = 0; i < numPoints - 1; ++i) {
-				final Point a = points[i];
-				final Point b = points[i + 1];
-				container.add(new LineFigure(settings.commonForegroundColor, settings.commonBackgroundColor, settings.commonLineStyle,
-					a.x, a.y, b.x, b.y));
-			}
-			if (closed) {
-				final Point a = points[points.length - 1];
-				final Point b = points[0];
-				container.add(new LineFigure(settings.commonForegroundColor, settings.commonBackgroundColor, settings.commonLineStyle,
-					a.x, a.y, b.x, b.y));
-			}
-		}
-		return container;
-	}
-}
diff --git a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/RectangleFigure.java b/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/RectangleFigure.java
deleted file mode 100755
index a2b4625..0000000
--- a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/RectangleFigure.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package org.eclipse.swt.examples.paint;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
-
-/**
- * 2D Rectangle object
- */
-public class RectangleFigure extends Figure {
-	private Color foregroundColor, backgroundColor;
-	private int lineStyle, x1, y1, x2, y2;
-	/**
-	 * Constructs a Rectangle
-	 * These objects are defined by any two diametrically opposing corners.
-	 * 
-	 * @param color the color for this object
-	 * @param lineStyle the line style for this object
-	 * @param x1 the virtual X coordinate of the first corner
-	 * @param y1 the virtual Y coordinate of the first corner
-	 * @param x2 the virtual X coordinate of the second corner
-	 * @param y2 the virtual Y coordinate of the second corner
-	 */
-	public RectangleFigure(Color foregroundColor, Color backgroundColor, int lineStyle, int x1, int y1, int x2, int y2) {
-		this.foregroundColor = foregroundColor;
-		this.backgroundColor = backgroundColor;
-		this.lineStyle = lineStyle;
-		this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2;
-	}
-	public void draw(FigureDrawContext fdc) {
-		Rectangle r = fdc.toClientRectangle(x1, y1, x2, y2);
-		fdc.gc.setForeground(foregroundColor);
-		fdc.gc.setBackground(backgroundColor);
-		fdc.gc.setLineStyle(lineStyle);
-		fdc.gc.drawRectangle(r.x, r.y, r.width - 1, r.height - 1);
-		fdc.gc.setLineStyle(SWT.LINE_SOLID);
-	}
-	public void addDamagedRegion(FigureDrawContext fdc, Region region) {
-		region.add(fdc.toClientRectangle(x1, y1, x2, y2));
-	}
-}
diff --git a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/RectangleTool.java b/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/RectangleTool.java
deleted file mode 100755
index 2da6fa3..0000000
--- a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/RectangleTool.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package org.eclipse.swt.examples.paint;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.graphics.*;
-
-/**
- * A drawing tool.
- */
-public class RectangleTool extends DragPaintSession implements PaintTool {
-	private ToolSettings settings;
-
-	/**
-	 * Constructs a RectangleTool.
-	 * 
-	 * @param toolSettings the new tool settings
-	 * @param paintSurface the PaintSurface we will render on.
-	 */
-	public RectangleTool(ToolSettings toolSettings, PaintSurface paintSurface) {
-		super(paintSurface);
-		set(toolSettings);
-	}
-	
-	/**
-	 * Sets the tool's settings.
-	 * 
-	 * @param toolSettings the new tool settings
-	 */
-	public void set(ToolSettings toolSettings) {
-		settings = toolSettings;
-	}
-	
-	/**
-	 * Returns name associated with this tool.
-	 * 
-	 * @return the localized name of this tool
-	 */
-	public String getDisplayName() {
-		return PaintPlugin.getResourceString("tool.Rectangle.label");
-	}
-
-	/*
-	 * Template method for drawing
-	 */
-	protected Figure createFigure(Point a, Point b) {
-		switch (settings.commonFillType) {
-			default:
-			case ToolSettings.ftNone:
-				return new RectangleFigure(settings.commonForegroundColor, settings.commonBackgroundColor, settings.commonLineStyle,
-					a.x, a.y, b.x, b.y);
-			case ToolSettings.ftSolid:
-				return new SolidRectangleFigure(settings.commonBackgroundColor, a.x, a.y, b.x, b.y);
-			case ToolSettings.ftOutline: {
-				ContainerFigure container = new ContainerFigure();
-				container.add(new SolidRectangleFigure(settings.commonBackgroundColor, a.x, a.y, b.x, b.y));
-				container.add(new RectangleFigure(settings.commonForegroundColor, settings.commonBackgroundColor, settings.commonLineStyle,
-					a.x, a.y, b.x, b.y));
-				return container;
-			}
-		}
-	}
-}
diff --git a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/RoundedRectangleFigure.java b/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/RoundedRectangleFigure.java
deleted file mode 100755
index 2dd0bfd..0000000
--- a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/RoundedRectangleFigure.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package org.eclipse.swt.examples.paint;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
-
-/**
- * 2D Rectangle object
- */
-public class RoundedRectangleFigure extends Figure {
-	private Color foregroundColor, backgroundColor;
-	private int lineStyle, x1, y1, x2, y2, diameter;
-	/**
-	 * Constructs a Rectangle
-	 * These objects are defined by any two diametrically opposing corners.
-	 * 
-	 * @param color the color for this object
-	 * @param lineStyle the line style for this object
-	 * @param x1 the virtual X coordinate of the first corner
-	 * @param y1 the virtual Y coordinate of the first corner
-	 * @param x2 the virtual X coordinate of the second corner
-	 * @param y2 the virtual Y coordinate of the second corner
-	 * @param diameter the diameter of curvature of all four corners
-	 */
-	public RoundedRectangleFigure(Color foregroundColor, Color backgroundColor, int lineStyle, int x1, int y1, int x2, int y2, int diameter) {
-		this.foregroundColor = foregroundColor;
-		this.backgroundColor = backgroundColor;
-		this.lineStyle = lineStyle;
-		this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2;
-		this.diameter = diameter;
-	}
-	public void draw(FigureDrawContext fdc) {
-		Rectangle r = fdc.toClientRectangle(x1, y1, x2, y2);
-		fdc.gc.setForeground(foregroundColor);
-		fdc.gc.setBackground(backgroundColor);
-		fdc.gc.setLineStyle(lineStyle);
-		fdc.gc.drawRoundRectangle(r.x, r.y, r.width - 1, r.height - 1, diameter, diameter);
-		fdc.gc.setLineStyle(SWT.LINE_SOLID);
-	}
-	public void addDamagedRegion(FigureDrawContext fdc, Region region) {
-		region.add(fdc.toClientRectangle(x1, y1, x2, y2));
-	}
-}
diff --git a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/RoundedRectangleTool.java b/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/RoundedRectangleTool.java
deleted file mode 100755
index beec38e..0000000
--- a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/RoundedRectangleTool.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.eclipse.swt.examples.paint;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.graphics.*;
-
-/**
- * A drawing tool.
- */
-public class RoundedRectangleTool extends DragPaintSession implements PaintTool {
-	private ToolSettings settings;
-
-	/**
-	 * Constructs a RoundedRectangleTool.
-	 * 
-	 * @param toolSettings the new tool settings
-	 * @param paintSurface the PaintSurface we will render on.
-	 */
-	public RoundedRectangleTool(ToolSettings toolSettings, PaintSurface paintSurface) {
-		super(paintSurface);
-		set(toolSettings);
-	}
-	
-	/**
-	 * Sets the tool's settings.
-	 * 
-	 * @param toolSettings the new tool settings
-	 */
-	public void set(ToolSettings toolSettings) {
-		settings = toolSettings;
-	}
-	
-	/**
-	 * Returns name associated with this tool.
-	 * 
-	 * @return the localized name of this tool
-	 */
-	public String getDisplayName() {
-		return PaintPlugin.getResourceString("tool.RoundedRectangle.label");
-	}
-
-	/*
-	 * Template methods for drawing
-	 */
-	protected Figure createFigure(Point a, Point b) {
-		ContainerFigure container = new ContainerFigure();
-		if (settings.commonFillType != ToolSettings.ftNone)
-			container.add(new SolidRoundedRectangleFigure(settings.commonBackgroundColor,
-				a.x, a.y, b.x, b.y, settings.roundedRectangleCornerDiameter));
-		if (settings.commonFillType != ToolSettings.ftSolid)
-			container.add(new RoundedRectangleFigure(settings.commonForegroundColor, settings.commonBackgroundColor,
-				settings.commonLineStyle, a.x, a.y, b.x, b.y, settings.roundedRectangleCornerDiameter));
-		return container;
-	}
-}
diff --git a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/SegmentedPaintSession.java b/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/SegmentedPaintSession.java
deleted file mode 100755
index d1697eb..0000000
--- a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/SegmentedPaintSession.java
+++ /dev/null
@@ -1,155 +0,0 @@
-package org.eclipse.swt.examples.paint;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.graphics.*;
-
-import java.util.*;
-
-/**
- * The superclass for paint tools that contruct objects from individually
- * picked segments.
- */
-public abstract class SegmentedPaintSession extends BasicPaintSession {
-	/**
-	 * The set of control points making up the segmented selection
-	 */
-	private Vector /* of Point */ controlPoints = new Vector();
-
-	/**
-	 * The previous figure (so that we can abort with right-button)
-	 */
-	private Figure previousFigure = null;
-
-	/**
-	 * The current figure (so that we can abort with right-button)
-	 */
-	private Figure currentFigure = null;
-
-	/**
-	 * Constructs a PaintSession.
-	 * 
-	 * @param paintSurface the drawing surface to use
-	 */
-	protected SegmentedPaintSession(PaintSurface paintSurface) {
-		super(paintSurface);
-	}
-
-	/**
-	 * Activates the tool.
-	 */
-	public void beginSession() {
-		getPaintSurface().setStatusMessage(PaintPlugin.getResourceString(
-			"session.SegmentedInteractivePaint.message.anchorMode"));
-		previousFigure = null;
-		currentFigure = null;
-		controlPoints.clear();
-	}
-	
-	/**
-	 * Deactivates the tool.
-     */
-	public void endSession() {
-		getPaintSurface().clearRubberbandSelection();
-		if (previousFigure != null) getPaintSurface().drawFigure(previousFigure);
-	}
-	
-	/**
-	 * Resets the tool.
-	 * Aborts any operation in progress.
-	 */
-	public void resetSession() {
-		getPaintSurface().clearRubberbandSelection();
-		if (previousFigure != null) getPaintSurface().drawFigure(previousFigure);
-		
-		getPaintSurface().setStatusMessage(PaintPlugin.getResourceString(
-			"session.SegmentedInteractivePaint.message.anchorMode"));
-		previousFigure = null;
-		currentFigure = null;
-		controlPoints.clear();
-	}
-
-	/**
-	 * Handles a mouseDown event.
-	 * 
-	 * @param event the mouse event detail information
-	 */
-	public void mouseDown(MouseEvent event) {
-		if (event.button != 1) return;
-
-		getPaintSurface().setStatusMessage(PaintPlugin.getResourceString(
-			"session.SegmentedInteractivePaint.message.interactiveMode"));
-		previousFigure = currentFigure;
-
-		if (controlPoints.size() > 0) {
-			final Point lastPoint = (Point) controlPoints.elementAt(controlPoints.size() - 1);
-			if (lastPoint.x == event.x || lastPoint.y == event.y) return; // spurious event
-		}
-		controlPoints.add(new Point(event.x, event.y));
-	}
-
-	/**
-	 * Handles a mouseDoubleClick event.
-	 * 
-	 * @param event the mouse event detail information
-	 */
-	public void mouseDoubleClick(MouseEvent event) {
-		if (event.button != 1) return;
-		if (controlPoints.size() >= 2) {
-			getPaintSurface().clearRubberbandSelection();
-			previousFigure = createFigure(
-				(Point[]) controlPoints.toArray(new Point[controlPoints.size()]),
-				controlPoints.size(), true);
-		}
-		resetSession();
-	}
-
-	/**
-	 * Handles a mouseUp event.
-	 * 
-	 * @param event the mouse event detail information
-	 */
-	public void mouseUp(MouseEvent event) {
-		if (event.button != 1) {
-			resetSession(); // abort if right or middle mouse button pressed
-			return;
-		}
-	}
-	
-	/**
-	 * Handles a mouseMove event.
-	 * 
-	 * @param event the mouse event detail information
-	 */
-	public void mouseMove(MouseEvent event) {
-		final PaintSurface ps = getPaintSurface();
-		if (controlPoints.size() == 0) {
-			ps.setStatusCoord(ps.getCurrentPosition());
-			return; // spurious event
-		} else {
-			ps.setStatusCoordRange((Point) controlPoints.elementAt(controlPoints.size() - 1),
-				ps.getCurrentPosition());
-		}
-
-		ps.clearRubberbandSelection();
-		Point[] points = (Point[]) controlPoints.toArray(new Point[controlPoints.size() + 1]);
-		points[controlPoints.size()] = ps.getCurrentPosition();
-		currentFigure = createFigure(points, points.length, false);
-		ps.addRubberbandSelection(currentFigure);
-	}	
-
-	/**
-	 * Template Method: Creates a Figure for drawing rubberband entities and the final product
-	 * 
-	 * @param points the array of control points
-	 * @param numPoints the number of valid points in the array (n >= 2)
-	 * @param closed true if the user double-clicked on the final control point
-	 */
-	protected abstract Figure createFigure(Point[] points, int numPoints, boolean closed);
-}
diff --git a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/SolidEllipseFigure.java b/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/SolidEllipseFigure.java
deleted file mode 100755
index 123417f..0000000
--- a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/SolidEllipseFigure.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.eclipse.swt.examples.paint;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.graphics.*;
-
-/**
- * 2D Solid Ellipse object
- */
-public class SolidEllipseFigure extends Figure {
-	private Color color;
-	private int x1, y1, x2, y2;
-	/**
-	 * Constructs a SolidEllipse
-	 * These objects are defined by any two diametrically opposing corners of a box
-	 * bounding the ellipse.
-	 * 
-	 * @param color the color for this object
-	 * @param x1 the virtual X coordinate of the first corner
-	 * @param y1 the virtual Y coordinate of the first corner
-	 * @param x2 the virtual X coordinate of the second corner
-	 * @param y2 the virtual Y coordinate of the second corner
-	 */
-	public SolidEllipseFigure(Color color, int x1, int y1, int x2, int y2) {
-		this.color = color; this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2;
-	}
-	public void draw(FigureDrawContext fdc) {
-		Rectangle r = fdc.toClientRectangle(x1, y1, x2, y2);
-		fdc.gc.setBackground(color);
-		fdc.gc.fillOval(r.x, r.y, r.width, r.height);
-	}
-	public void addDamagedRegion(FigureDrawContext fdc, Region region) {
-		region.add(fdc.toClientRectangle(x1, y1, x2, y2));
-	}
-}
diff --git a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/SolidPolygonFigure.java b/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/SolidPolygonFigure.java
deleted file mode 100755
index 30b4710..0000000
--- a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/SolidPolygonFigure.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package org.eclipse.swt.examples.paint;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.graphics.*;
-
-/**
- * 2D Line object
- */
-public class SolidPolygonFigure extends Figure {
-	private Color color;
-	private int[] points;
-	/**
-	 * Constructs a SolidPolygon
-	 * These objects are defined by a sequence of vertices.
-	 * 
-	 * @param color the color for this object
-	 * @param vertices the array of vertices making up the polygon
-	 * @param numPoint the number of valid points in the array (n >= 3)
-	 */
-	public SolidPolygonFigure(Color color, Point[] vertices, int numPoints) {
-		this.color = color;
-		this.points = new int[numPoints * 2];
-		for (int i = 0; i < numPoints; ++i) {
-			points[i * 2] = vertices[i].x;
-			points[i * 2 + 1] = vertices[i].y;
-		}
-	}
-	public void draw(FigureDrawContext fdc) {
-		int[] drawPoints = new int[points.length];
-		for (int i = 0; i < points.length; i += 2) {
-			drawPoints[i] = points[i] * fdc.xScale - fdc.xOffset;
-			drawPoints[i + 1] = points[i + 1] * fdc.yScale - fdc.yOffset;
-		}
-		fdc.gc.setBackground(color);
-		fdc.gc.fillPolygon(drawPoints);
-	}
-	public void addDamagedRegion(FigureDrawContext fdc, Region region) {
-		int xmin = Integer.MAX_VALUE, ymin = Integer.MAX_VALUE;
-		int xmax = Integer.MIN_VALUE, ymax = Integer.MIN_VALUE;
-
-		for (int i = 0; i < points.length; i += 2) {
-			if (points[i] < xmin) xmin = points[i];
-			if (points[i] > xmax) xmax = points[i];
-			if (points[i+1] < ymin) ymin = points[i+1];
-			if (points[i+1] > ymax) ymax = points[i+1];
-		}		
-		region.add(fdc.toClientRectangle(xmin, ymin, xmax, ymax));
-	}
-}
diff --git a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/SolidRectangleFigure.java b/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/SolidRectangleFigure.java
deleted file mode 100755
index 9f2d7b6..0000000
--- a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/SolidRectangleFigure.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.eclipse.swt.examples.paint;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.graphics.*;
-
-/**
- * 2D SolidRectangle object
- */
-public class SolidRectangleFigure extends Figure {
-	private Color color;
-	private int x1, y1, x2, y2;
-	/**
-	 * Constructs a SolidRectangle
-	 * These objects are defined by any two diametrically opposing corners.
-	 * 
-	 * @param color the color for this object
-	 * @param x1 the virtual X coordinate of the first corner
-	 * @param y1 the virtual Y coordinate of the first corner
-	 * @param x2 the virtual X coordinate of the second corner
-	 * @param y2 the virtual Y coordinate of the second corner
-	 */
-	public SolidRectangleFigure(Color color, int x1, int y1, int x2, int y2) {
-		this.color = color; this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2;
-	}
-	public void draw(FigureDrawContext fdc) {
-		Rectangle r = fdc.toClientRectangle(x1, y1, x2, y2);
-		fdc.gc.setBackground(color);
-		fdc.gc.fillRectangle(r.x, r.y, r.width, r.height);
-	}
-	public void addDamagedRegion(FigureDrawContext fdc, Region region) {
-		region.add(fdc.toClientRectangle(x1, y1, x2, y2));
-	}
-}
diff --git a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/SolidRoundedRectangleFigure.java b/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/SolidRoundedRectangleFigure.java
deleted file mode 100755
index de07824..0000000
--- a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/SolidRoundedRectangleFigure.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.eclipse.swt.examples.paint;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.graphics.*;
-
-/**
- * 2D SolidRectangle object
- */
-public class SolidRoundedRectangleFigure extends Figure {
-	private Color color;
-	private int x1, y1, x2, y2, diameter;
-	/**
-	 * Constructs a SolidRectangle
-	 * These objects are defined by any two diametrically opposing corners.
-	 * 
-	 * @param color the color for this object
-	 * @param x1 the virtual X coordinate of the first corner
-	 * @param y1 the virtual Y coordinate of the first corner
-	 * @param x2 the virtual X coordinate of the second corner
-	 * @param y2 the virtual Y coordinate of the second corner
-	 * @param diameter the diameter of curvature of all four corners
-	 */
-	public SolidRoundedRectangleFigure(Color color, int x1, int y1, int x2, int y2, int diameter) {
-		this.color = color; this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2;
-		this.diameter = diameter;
-	}
-	public void draw(FigureDrawContext fdc) {
-		Rectangle r = fdc.toClientRectangle(x1, y1, x2, y2);
-		fdc.gc.setBackground(color);
-		fdc.gc.fillRoundRectangle(r.x, r.y, r.width, r.height, diameter, diameter);
-	}
-	public void addDamagedRegion(FigureDrawContext fdc, Region region) {
-		region.add(fdc.toClientRectangle(x1, y1, x2, y2));
-	}
-}
diff --git a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/TextFigure.java b/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/TextFigure.java
deleted file mode 100755
index 9317772..0000000
--- a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/TextFigure.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.eclipse.swt.examples.paint;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.graphics.*;
-
-/**
- * 2D Rectangle object
- */
-public class TextFigure extends Figure {
-	private Color  color;
-	private Font   font;
-	private String text;
-	private int x, y;
-	/**
-	 * Constructs a TextFigure
-	 * 
-	 * @param color the color for this object
-	 * @param font  the font for this object
-	 * @param text  the text to draw, tab and new-line expansion is performed
-	 * @param x     the virtual X coordinate of the top-left corner of the text bounding box
-	 * @param y     the virtual Y coordinate of the top-left corner of the text bounding box
-	 */
-	public TextFigure(Color color, Font font, String text, int x, int y) {
-		this.color = color; this.font = font; this.text = text; this.x = x; this.y = y;
-	}
-	public void draw(FigureDrawContext fdc) {
-		Point p = fdc.toClientPoint(x, y);
-		fdc.gc.setFont(font);
-		fdc.gc.setForeground(color);
-		fdc.gc.drawText(text, p.x, p.y, true);
-	}
-	public void addDamagedRegion(FigureDrawContext fdc, Region region) {
-		Font oldFont = fdc.gc.getFont();
-		fdc.gc.setFont(font);
-		Point textExtent = fdc.gc.textExtent(text);
-		fdc.gc.setFont(oldFont);
-		region.add(fdc.toClientRectangle(x, y, x + textExtent.x, y + textExtent.y));
-	}
-}
diff --git a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/TextTool.java b/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/TextTool.java
deleted file mode 100755
index 1b7c8b1..0000000
--- a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/TextTool.java
+++ /dev/null
@@ -1,124 +0,0 @@
-package org.eclipse.swt.examples.paint;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.jface.dialogs.*;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.graphics.*;
-
-/**
- * A text drawing tool.
- */
-public class TextTool extends BasicPaintSession implements PaintTool {
-	private ToolSettings settings;
-	private String drawText = PaintPlugin.getResourceString("tool.Text.settings.defaulttext");
-
-	/**
-	 * Constructs a PaintTool.
-	 * 
-	 * @param toolSettings the new tool settings
-	 * @param paintSurface the PaintSurface we will render on.
-	 */
-	public TextTool(ToolSettings toolSettings, PaintSurface paintSurface) {
-		super(paintSurface);
-		set(toolSettings);
-	}
-	
-	/**
-	 * Sets the tool's settings.
-	 * 
-	 * @param toolSettings the new tool settings
-	 */
-	public void set(ToolSettings toolSettings) {
-		settings = toolSettings;
-	}
-	
-	/**
-	 * Returns name associated with this tool.
-	 * 
-	 * @return the localized name of this tool
-	 */
-	public String getDisplayName() {
-		return PaintPlugin.getResourceString("tool.Text.label");
-	}
-	
-	/**
-	 * Activates the tool.
-	 */
-	public void beginSession() {
-		getPaintSurface().setStatusMessage(PaintPlugin.getResourceString(
-			"session.Text.message"));
-	}
-	
-	/**
-	 * Deactivates the tool.
-     */
-	public void endSession() {
-		getPaintSurface().clearRubberbandSelection();
-	}
-	
-	/**
-	 * Aborts the current operation.
-	 */
-	public void resetSession() {
-		getPaintSurface().clearRubberbandSelection();
-	}
-	
-	/**
-	 * Handles a mouseDown event.
-	 * 
-	 * @param event the mouse event detail information
-	 */
-	public void mouseDown(MouseEvent event) {
-		if (event.button == 1) {
-			// draw with left mouse button
-			getPaintSurface().commitRubberbandSelection();
-		} else {
-			// set text with right mouse button
-			getPaintSurface().clearRubberbandSelection();
-			InputDialog inputDialog = new InputDialog(getPaintSurface().getShell(),
-				PaintPlugin.getResourceString("tool.Text.dialog.title"),
-				PaintPlugin.getResourceString("tool.Text.dialog.message"),
-				drawText, null);
-			inputDialog.setBlockOnOpen(true);
-			inputDialog.open();
-			if (inputDialog.getReturnCode() == InputDialog.OK) drawText = inputDialog.getValue();
-			inputDialog.close();
-		}	
-	}
-
-	/**
-	 * Handles a mouseDoubleClick event.
-	 * 
-	 * @param event the mouse event detail information
-	 */
-	public void mouseDoubleClick(MouseEvent event) {
-	}
-
-	/**
-	 * Handles a mouseUp event.
-	 * 
-	 * @param event the mouse event detail information
-	 */
-	public void mouseUp(MouseEvent event) {
-	}
-	
-	/**
-	 * Handles a mouseMove event.
-	 * 
-	 * @param event the mouse event detail information
-	 */
-	public void mouseMove(MouseEvent event) {
-		final PaintSurface ps = getPaintSurface();
-		ps.setStatusCoord(ps.getCurrentPosition());
-		ps.clearRubberbandSelection();
-		ps.addRubberbandSelection(
-			new TextFigure(settings.commonForegroundColor, settings.commonFont,
-				drawText, event.x, event.y));
-	}
-}
diff --git a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/ToolSettings.java b/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/ToolSettings.java
deleted file mode 100755
index 6c5aee8..0000000
--- a/examples/org.eclipse.swt.examples.paint/src/org/eclipse/swt/examples/paint/ToolSettings.java
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/.classpath b/examples/org.eclipse.swt.examples/.classpath
deleted file mode 100755
index 07ce282..0000000
--- a/examples/org.eclipse.swt.examples/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-    <classpathentry kind="src" path="src"/>
-    <classpathentry kind="var" path="JRE_LIB"/>
-    <classpathentry kind="src" path="/org.eclipse.swt"/>
-    <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/examples/org.eclipse.swt.examples/.cvsignore b/examples/org.eclipse.swt.examples/.cvsignore
deleted file mode 100755
index c5e82d7..0000000
--- a/examples/org.eclipse.swt.examples/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
\ No newline at end of file
diff --git a/examples/org.eclipse.swt.examples/.project b/examples/org.eclipse.swt.examples/.project
deleted file mode 100644
index 7dfd92e..0000000
--- a/examples/org.eclipse.swt.examples/.project
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.swt.examples</name>
-	<comment></comment>
-	<projects>
-		<project>org.eclipse.swt</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/examples/org.eclipse.swt.examples/about.html b/examples/org.eclipse.swt.examples/about.html
deleted file mode 100644
index 9db411a..0000000
--- a/examples/org.eclipse.swt.examples/about.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>20th June, 2002</p>	
-<h3>License</h3>
-<p>Eclipse.org makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Common Public License Version 1.0 (&quot;CPL&quot;).  A copy of the CPL is available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>.
-For purposes of the CPL, &quot;Program&quot; will mean the Content.</p>
-
-<h3>Contributions</h3>
-
-<p>If this Content is licensed to you under the terms and conditions of the CPL, any Contributions, as defined in the CPL, uploaded, submitted, or otherwise
-made available to Eclipse.org, members of Eclipse.org and/or the host of Eclipse.org web site, by you that relate to such
-Content are provided under the terms and conditions of the CPL and can be made available to others under the terms of the CPL.</p>
-
-<p>If this Content is licensed to you under license terms and conditions other than the CPL (&quot;Other License&quot;), any modifications, enhancements and/or
-other code and/or documentation (&quot;Modifications&quot;) uploaded, submitted, or otherwise made available to Eclipse.org, members of Eclipse.org and/or the
-host of Eclipse.org, by you that relate to such Content are provided under terms and conditions of the Other License and can be made available
-to others under the terms of the Other License.  In addition, with regard to Modifications for which you are the copyright holder, you are also
-providing the Modifications under the terms and conditions of the CPL and such Modifications can be made available to others under the terms of
-the CPL.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/examples/org.eclipse.swt.examples/build.properties b/examples/org.eclipse.swt.examples/build.properties
deleted file mode 100755
index 62ce80a..0000000
--- a/examples/org.eclipse.swt.examples/build.properties
+++ /dev/null
@@ -1,9 +0,0 @@
-bin.includes = doc-html/,\
-               plugin.properties,\
-               plugin.xml,\
-               about.html,\
-               swtexamples.jar
-
-src.includes = about.html
-               
-source.swtexamples.jar = src/
diff --git a/examples/org.eclipse.swt.examples/doc-html/hglegal2002.htm b/examples/org.eclipse.swt.examples/doc-html/hglegal2002.htm
deleted file mode 100644
index 74393f0..0000000
--- a/examples/org.eclipse.swt.examples/doc-html/hglegal2002.htm
+++ /dev/null
@@ -1,14 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <meta name="GENERATOR" content="Microsoft FrontPage 4.0">
-   <title>Legal Notices</title>
-</head>
-<body>
-
-<h3>
-<a NAME="Notices"></a>Notices</h3>
-(c) Copyright IBM Corp. 2000, 2002. All Rights Reserved.
-</body>
-</html>
diff --git a/examples/org.eclipse.swt.examples/doc-html/ngibmcpy2002.gif b/examples/org.eclipse.swt.examples/doc-html/ngibmcpy2002.gif
deleted file mode 100644
index 61cef48..0000000
--- a/examples/org.eclipse.swt.examples/doc-html/ngibmcpy2002.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/doc-html/swt_addressbook_ex.html b/examples/org.eclipse.swt.examples/doc-html/swt_addressbook_ex.html
deleted file mode 100755
index 74a6801..0000000
--- a/examples/org.eclipse.swt.examples/doc-html/swt_addressbook_ex.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <title>SWT - Address Book Example</title>
-</head>
-<body>
-
-<h2>SWT Standalone Example - Address Book</h2>
-
-<p>
-The AddressBook example shows how the Table control can be used to
-present information in a tabular format. The application can save and load data 
-from a file, sort the entries, and search for strings within the fields.
-</p>
-
-<h3>Running the example</h3>
-<p>
-Follow the <a href="swt_manual_setup.html">Manual Setup</a> 
-instructions to install and run the example from your workspace.
-</p>
-<p>
-The "Main" class is <code>org.eclipse.swt.examples.addressbook.AddressBook</code>.
-</p>
-<p>
-This example can also be run using the <a href="swt_launcher_ex.html">Example Launcher</a>.
-Select the Address Book item from the Standalone category and click Run.
-</p>
-<p><a href="hglegal2002.htm"><img SRC="ngibmcpy2002.gif" ALT="Copyright IBM Corporation and others 2000, 2002.  All Rights Reserved." BORDER=0 height=14 width=324></a></p>
-</body>
-</html>
diff --git a/examples/org.eclipse.swt.examples/doc-html/swt_controls_ex.html b/examples/org.eclipse.swt.examples/doc-html/swt_controls_ex.html
deleted file mode 100644
index 80d63e2..0000000
--- a/examples/org.eclipse.swt.examples/doc-html/swt_controls_ex.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <title>SWT - Controls Overview</title>
-</head>
-<body>
-
-<h2>SWT Standalone Example - Controls Example</h2>
-
-<p>
-The Controls example is a simple demonstration of common SWT controls. 
-It consists of a tab folder where each tab in the folder allows the user 
-to interact with a different control.
-The user can change styles and settings and view how this affects the control.
-</p>
-
-<h3>Running the example</h3>
-<p>
-Follow the <a href="swt_manual_setup.html">Manual Setup</a> 
-instructions to install and run the example from your workspace.
-</p>
-<p>
-The "Main" class is <code>org.eclipse.swt.examples.controlexample.ControlExample</code>.
-</p>
-
-
-<p><a href="hglegal2002.htm"><img SRC="ngibmcpy2002.gif" ALT="Copyright IBM Corporation and others 2000, 2002.  All Rights Reserved." BORDER=0 height=14 width=324></a></p>
-</body>
-</html>
diff --git a/examples/org.eclipse.swt.examples/doc-html/swt_fileviewer_ex.html b/examples/org.eclipse.swt.examples/doc-html/swt_fileviewer_ex.html
deleted file mode 100755
index a3d06c1..0000000
--- a/examples/org.eclipse.swt.examples/doc-html/swt_fileviewer_ex.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <title>SWT - File Viewer Example</title>
-</head>
-<body>
-
-<h2>SWT Standalone Example - File Viewer</h2>
-
-<p>
-The File Viewer example shows how a simple application can be implemented using SWT.
-This application provides the ability to navigate files and folders and manipulate them via Drag and Drop.
-It includes the use of alternate threads for long actions and demonstrates the use of the Tree,
-Table, Toolbar and Program.
-</p>
-
-<h3>Running the example</h3>
-<p>
-Follow the <a href="swt_manual_setup.html">Manual Setup</a> 
-instructions to install and run the example from your workspace.
-</p>
-<p>
-The "Main" class is <code>org.eclipse.swt.examples.fileviewer.FileViewer</code>.
-</p>
-<p>
-This example can also be run using the <a href="swt_launcher_ex.html">Example Launcher</a>.
-Select the File Viewer item from the Standalone category and click Run.
-</p>
-
-<p><a href="hglegal2002.htm"><img SRC="ngibmcpy2002.gif" ALT="Copyright IBM Corporation and others 2000, 2002.  All Rights Reserved." BORDER=0 height=14 width=324></a></p>
-</body>
-</html>
diff --git a/examples/org.eclipse.swt.examples/doc-html/swt_helloworld_ex.html b/examples/org.eclipse.swt.examples/doc-html/swt_helloworld_ex.html
deleted file mode 100755
index f9e8953..0000000
--- a/examples/org.eclipse.swt.examples/doc-html/swt_helloworld_ex.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <title>SWT - Hello World Examples</title>
-</head>
-<body>
-
-<h2>SWT Standalone Example - Hello World</h2>
-
-<p>
-The Hello World examples are a set of introductory examples to show how to get started 
-creating an application with SWT.  They cover creating a shell, using event listeners, 
-processing events in an event loop, using layouts, and drawing with a Graphic Context.
-</p>
-
-<h4>Hello World 1</h4>
-<p>
-This example demonstrates how to open a Shell and process the events.
-</p>
-
-<h4>Hello World 2</h4>
-<p>
-This example builds on HelloWorld1 and demonstrates how to display a Label inside the Shell.
-</p>
-
-<h4>Hello World 3</h4>
-<p>
-This example builds on HelloWorld2 and demonstrates how to resize the Label
-when the Shell resizes using a Listener mechanism.
-</p>
-
-<h4>Hello World 4</h4>
-<p>
-This example builds on HelloWorld2 and demonstrates how to resize the Label
-when the Shell resizes using a Layout.
-</p>
-
-<h4>Hello World 5</h4>
-<p>
-This example builds on HelloWorld1 and demonstrates how to draw directly
-on an SWT Control using a graphic context.
-</p>
-
-<h3>Running the example</h3>
-
-<p>
-Follow the <a href="swt_manual_setup.html">Manual Setup</a> 
-instructions to install and run the example from your workspace.
-</p>
-<p>
-The "Main" class is <code>org.eclipse.swt.examples.helloworld.HelloWorld[1-5]</code>.
-</p>
-<p>
-This example can also be run using the <a href="swt_launcher_ex.html">Example Launcher</a>.
-Select the Hello World item from the Standalone category and click Run.
-</p>
-
-<p><a href="hglegal2002.htm"><img SRC="ngibmcpy2002.gif" ALT="Copyright IBM Corporation and others 2000, 2002.  All Rights Reserved." BORDER=0 height=14 width=324></a></p>
-</body>
-</html>
diff --git a/examples/org.eclipse.swt.examples/doc-html/swt_hoverhelp_ex.html b/examples/org.eclipse.swt.examples/doc-html/swt_hoverhelp_ex.html
deleted file mode 100755
index 29712fa..0000000
--- a/examples/org.eclipse.swt.examples/doc-html/swt_hoverhelp_ex.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <title>SWT - Hover Help Example</title>
-</head>
-<body>
-
-<h2>SWT Standalone Example - Hover Help</h2>
-
-<p>
-The Hover Help example shows how to implement custom tooltips and hover help support
-on a number of different SWT controls including Buttons, TableItems, ToolItems and TreeItems.
-The example implements its own tooltip and hover help support.
-To see the custom tooltips in action, hover over an item or button in the UI.
-Notice that images appear in the left-hand corner of the tooltip.
-To see the custom hover help in action, hover over an item or button in the UI until
-the tooltip is displayed.  Without moving the mouse, hit F1.  A new Shell will pop up with the
-extended hover help information for the UI element in question.
-</p>	
-
-<h3>Running the example</h3>
-<p>
-Follow the <a href="swt_manual_setup.html">Manual Setup</a> 
-instructions to install and run the example from your workspace.
-</p>
-<p>
-The "Main" class is <code>org.eclipse.swt.examples.hoverhelp.HoverHelp</code>.
-</p>
-<p>
-This example can also be run using the <a href="swt_launcher_ex.html">Example Launcher</a>.
-Select the Hover Help item from the Standalone category and click Run.
-</p>
-
-<p><a href="hglegal2002.htm"><img SRC="ngibmcpy2002.gif" ALT="Copyright IBM Corporation and others 2000, 2002.  All Rights Reserved." BORDER=0 height=14 width=324></a></p>
-</body>
-</html>
diff --git a/examples/org.eclipse.swt.examples/doc-html/swt_imageanalyzer_ex.html b/examples/org.eclipse.swt.examples/doc-html/swt_imageanalyzer_ex.html
deleted file mode 100755
index 5a25923..0000000
--- a/examples/org.eclipse.swt.examples/doc-html/swt_imageanalyzer_ex.html
+++ /dev/null
@@ -1,57 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <title>SWT - Image Analyzer Example</title>
-</head>
-<body>
-
-<h2>SWT Standalone Example - Image Analyzer</h2>
-
-<p>
-The ImageAnalyzer opens image files and displays the visual contents of the file along with a
-summary of the data in the image file.
-The user can make adjustments to various elements of the image such as scaling and Alpha
-blending and can save these changes to a file.
-</p>
-<p>
-The ImageAnalyzer will load and display image files of type GIF, JPEG, BMP, ICO, and PNG.
-To open a file, use the File --> Open... menu item, and select the image file in the FileDialog.
-If the file is an interlaced GIF or PNG or a progressive JPEG, and Incremental Display is selected,
-then the ImageAnalyzer displays the image increments as they are being loaded.
-If the file contains an animated GIF, then the Next, Previous, and Animate buttons become enabled,
-and they can be used to cycle through the images in the file, or animate them. If a GIF defines a background color,
-as many animated GIFs do, selecting Background will use the GIF's background color.
-If the image has transparency (possible with GIF, PNG, or ICO), then selecting Display Mask will draw the image's transparency
-mask to the right of the image. You can change the background color of the ImageAnalyzer to see the transparency work.
-To turn off the transparency, deselect Display Transparency.
-After an image is loaded, it can be scaled or have alpha transparency applied, using the Scale and Alpha-K combos,
-and the Alpha menu. File --> Reopen restores scaling and Alpha to their default values and reloads the current image file.
-File --> Save As... can be used to save the currently loaded image to another type of image file. If the image has transparency,
-File --> Save Mask As... saves the image's transparency mask.
-</p>
-<p>
-When SWT loads an image file, an instance of org.eclipse.swt.graphics.ImageData is created. (In the case of an ICO file or
-multi-image GIF, an array of ImageData instances is created). The ImageAnalyzer displays all of the data stored in the ImageData
-instance(s) for the currently loaded image file, including the pixel data. Hovering over a pixel in the image display will show the RGB
-color data for that pixel. For certain images (particularly animated GIFs) additional data is stored in the org.eclipse.swt.graphics.ImageLoader
-instance used to load the image. The ImageAnalyzer displays this data as well.
-</p>
-
-<h3>Running the example</h3>
-
-<p>
-Follow the <a href="swt_manual_setup.html">Manual Setup</a> 
-instructions to install and run the example from your workspace.
-</p>
-<p>
-The "Main" class is <code>org.eclipse.swt.examples.imageanalyzer.ImageAnalyzer</code>.
-</p>
-<p>
-This example can also be run using the <a href="swt_launcher_ex.html">Example Launcher</a>.
-Select the Image Analyzer item from the Standalone category and click Run.
-</p>
-
-<p><a href="hglegal2002.htm"><img SRC="ngibmcpy2002.gif" ALT="Copyright IBM Corporation and others 2000, 2002.  All Rights Reserved." BORDER=0 height=14 width=324></a></p>
-</body>
-</html>
diff --git a/examples/org.eclipse.swt.examples/doc-html/swt_javaviewer_ex.html b/examples/org.eclipse.swt.examples/doc-html/swt_javaviewer_ex.html
deleted file mode 100755
index be071be..0000000
--- a/examples/org.eclipse.swt.examples/doc-html/swt_javaviewer_ex.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <title>SWT - Java Syntax Viewer Example</title>
-</head>
-<body>
-
-<h2>SWT Standalone Example - Java Syntax Viewer</h2>
-
-<p>
-This example demonstrates how to implement a user-defined line styler for the StyledText widget.
-The example provides a typical editor interface.
-To see the effect of the line styler, open a *.java file.
-When the contents of the file are displayed in the editor area, notice that the keywords have been highlighted.
-</p>
-
-<h3>Running the example</h3>
-<p>
-Follow the <a href="swt_manual_setup.html">Manual Setup</a> 
-instructions to install and run the example from your workspace.
-</p>
-<p>
-The "Main" class is <code>org.eclipse.swt.examples.javaviewer.JavaViewer</code>.
-</p>
-<p>
-This example can also be run using the <a href="swt_launcher_ex.html">Example Launcher</a>.
-Select the Java Syntax Viewer item from the Standalone category and click Run.
-</p>
-
-<p><a href="hglegal2002.htm"><img SRC="ngibmcpy2002.gif" ALT="Copyright IBM Corporation and others 2000, 2002.  All Rights Reserved." BORDER=0 height=14 width=324></a></p>
-</body>
-</html>
diff --git a/examples/org.eclipse.swt.examples/doc-html/swt_launcher_ex.html b/examples/org.eclipse.swt.examples/doc-html/swt_launcher_ex.html
deleted file mode 100644
index 9f882bd..0000000
--- a/examples/org.eclipse.swt.examples/doc-html/swt_launcher_ex.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <title>SWT - Example Launcher</title>
-</head>
-<body>
-
-<h2>SWT Example Launcher</h2>
-
-<p>
-The Example Launcher is used to launch SWT examples which can either be Workbench Views, 
-or Standalone applications.
-</p>
-
-<ul>
-<li>Workbench Views are examples that are integrated into Eclipse.  When the Launcher
-starts a Workbench View, it is opened in the currently active perspective.
-<li>Standalone applications are launched in a separate window.
-</ul>
-
-<p>
-For information on how to run the standalone examples without the SWT Example Launcher, 
-refer to <a href="swt_manual_setup.html">Manual Setup</a>.
-</p>
-<p>
-The SWT workbench view examples can also be launched directly without using the SWT Example 
-Launcher.  SWT workbench view examples can be found under the SWT Examples category of the 
-Show Views dialog.
-</p>
-
-<h3>Running the Example Launcher</h3>
-
-<p>
-From the Window menu, select Show View --> Other. 
-In the Show View dialog, expand SWT Examples and select the SWT Example Launcher view. 
-A view containing a list of examples will appear in your current perspective.
-Select an example from the list.  A brief description of the example is displayed.
-Click on the Run button to launch the example.
-</p>
-
-
-<h3>Details</h3>
-<p>The example launcher view contains a tree list, a text area, and a button.
-The tree list contains a list of all the SWT examples you can choose
-to run. When an example is selected from the tree, the text area
-displays a short description of the example. The selected example can
-be launched by clicking on the Run button.  Standalone examples are run in the 
-same thread as the workbench's UI but they are not integrated into the perspective. 
-The launcher invokes the <code>open()</code> method of the standalone example.
-</p>
-
-<p><a href="hglegal2002.htm"><img SRC="ngibmcpy2002.gif" ALT="Copyright IBM Corporation and others 2000, 2002.  All Rights Reserved." BORDER=0 height=14 width=324></a></p>
-</body>
-</html>
diff --git a/examples/org.eclipse.swt.examples/doc-html/swt_layout_ex.html b/examples/org.eclipse.swt.examples/doc-html/swt_layout_ex.html
deleted file mode 100644
index 51dced6..0000000
--- a/examples/org.eclipse.swt.examples/doc-html/swt_layout_ex.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <title>SWT - Layout Example</title>
-</head>
-<body>
-
-<h2>SWT Standalone Example - Layout Example</h2>
-
-<p>
-This example is a simple demonstration of common SWT layouts. 
-It consists of a tab folder where each tab in the folder allows the 
-user to interact with a different SWT layout.
-The user can insert widgets into a layout and set the values of the layout data
-using a property sheet.  When the user has a suitable arrangement, code can be
-generated by clicking on the Code button.
-</p>
-
-<h3>Running the example</h3>
-<p>
-Follow the <a href="swt_manual_setup.html">Manual Setup</a> 
-instructions to install and run the example from your workspace.
-</p>
-<p>
-The "Main" class is <code>org.eclipse.swt.examples.layoutexample.LayoutExample</code>.
-</p>
-
-<p><a href="hglegal2002.htm"><img SRC="ngibmcpy2002.gif" ALT="Copyright IBM Corporation and others 2000, 2002.  All Rights Reserved." BORDER=0 height=14 width=324></a></p>
-</body>
-</html>
\ No newline at end of file
diff --git a/examples/org.eclipse.swt.examples/doc-html/swt_manual_setup.html b/examples/org.eclipse.swt.examples/doc-html/swt_manual_setup.html
deleted file mode 100755
index 9f36ca2..0000000
--- a/examples/org.eclipse.swt.examples/doc-html/swt_manual_setup.html
+++ /dev/null
@@ -1,119 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <title>SWT Standalone Examples Setup</title>
-</head>
-<body>
-
-<h2>SWT Standalone Examples Setup</h2>
-
-<h3>Importing Example Source</h3>
-
-<p>
-*** In the following description, substitute the location in which you installed Eclipse for INSTALLDIR ***
-</p>
-
-<p>Import the example code and all its required resources into your workspace:</p>
-
-<ol>
-<li>Create a Java Project called "SWT Examples".
-<li>Select the project "SWT Examples" in the Packages view.
-<li>Select the File --> Import menu.  Select Zip File. Click on Next.
-<li>Locate the source zip file for the SWT examples.  For example:
-	<ul>
-    <li><b>win32: </b><code>INSTALLDIR\eclipse\plugins\org.eclipse.swt.examples_2.0.0\swtexamplessrc.zip</code>
-    <li><b>*nix: </b><code>INSTALLDIR/eclipse/plugins/org.eclipse.swt.examples_2.0.0/swtexamplessrc.zip</code>
-    </ul>
-<li>Click on Finish.
-<li>Select the File --> Import menu. In the Import dialog, select Zip File. Click on Next.
-<li>Locate the jar file for the SWT examples.  For example:
-    <ul>
-    <li><b>win32: </b><code>INSTALLDIR\eclipse\plugins\org.eclipse.swt.examples_2.0.0\swtexamples.jar</code>
-    <li><b>*nix: </b><code>INSTALLDIR/eclipse/plugins/org.eclipse.swt.examples_2.0.0/swtexamples.jar</code>
-    </ul>
-<li>Expand the top level directory of the zip file (/). <b>Uncheck "org" and "META-INF"</b>.
-<li>Click on Finish.
-</ol>
-
-<p>Now you need to compile the SWT examples.  In order to do this, you must add the SWT jar(s) to 
-the compile path:</p>
-<ol>
-<li>Select the project "SWT Examples" in the Packages view and from the pop up menu select Properties.
-<li>Select the Java Build Path item.
-<li>Go to the Libraries tab.
-<li>Click on the Add External JARS... button.
-<li>Locate the swt jar for the platform on which you wish to run:<br>
-    <ul>
-    <li><b>win32: </b><code>INSTALLDIR\eclipse\plugins\org.eclipse.swt.win32_2.0.0\ws\win32\swt.jar</code>
-    <li><b>gtk: </b><code>INSTALLDIR/eclipse/plugins/org.eclipse.swt.gtk_2.0.0/ws/gtk/swt.jar</code>
-    <li><b>motif: </b><code>INSTALLDIR/eclipse/plugins/org.eclipse.swt.motif_2.0.0/ws/motif/swt.jar</code>
-    <li><b>photon: </b><code>INSTALLDIR/eclipse/plugins/org.eclipse.swt.photon_2.0.0/ws/photon/swt.jar</code>
-    <li><b>macosx: </b><code>INSTALLDIR/eclipse/plugins/org.eclipse.swt.carbon_2.0.0/ws/carbon/swt.jar</code>
-    </ul>
-<li>Click on OK.
-</ol>
-<p><b>NOTE:</b> For some platforms (such as GTK), more than one jar is required to run SWT (on
-GTK there is a swt.jar and a swt-pi.jar file).  In this case, all the required jars must 
-be added to the class path.  This is done by repeating the steps above for each jar file.
-All jar files are located in the same directory/folder.</p>
-
-<p>At this point your SWT examples should be compiled without any errors.  Check the Task 
-view for errors.  If you get an error like "<code>java.lang.Object</code> not found" it means 
-you have not configured a JRE.  Go to the Window --> Preferences dialog.  
-Select Java --> Installed JREs and ensure that a JRE is installed 
-and that the path to the JRE is correct.</p>
-
-<h3><a NAME="Run"></a>Running the Example</h3>
-
-<p>Now you have to configure Eclipse to run the example.  This requires putting the SWT
-JNI libraries on the library path so that the VM can find them:
-
-<ol>
-<li>Open the Java Perspective.
-<li>In the Packages view, select the Main class that you want to run.  
-    For example, the Main class for the Address Book example is 
-    &nbsp;&nbsp;&nbsp;&nbsp;<code>org.eclipse.swt.examples.addressbook.AddressBook</code>.
-<li>SelectRun --> Run... from the main menu.  
-<li>In the Launch Configurations dialog that appears, select Java Application and click 
-    on the New button.
-<li>Fill in the Name, Project and Main class fields according to the example you wish to run.
-<li>Select the Arguments tab.  In the VM Arguements area specify the location of the SWT 
-    library depending on your target platform as follows:
-    <ul>
-	<li><b>win32: </b><code>-Djava.library.path=INSTALLDIR\plugins\org.eclipse.swt.win32_2.0.0\os\win32\x86</code>
-	<li><b>linux gtk: </b><code>-Djava.library.path=INSTALLDIR/eclipse/plugins/org.eclipse.swt.gtk_2.0.0/os/linux/x86</code>
-	<li><b>linux motif: </b><code>-Djava.library.path=INSTALLDIR/eclipse/plugins/org.eclipse.swt.motif_2.0.0/os/linux/x86</code>
-	<li><b>solaris motif: </b><code>-Djava.library.path=INSTALLDIR/eclipse/plugins/org.eclipse.swt.motif_2.0.0/os/solaris/sparc</code>
-	<li><b>aix motif: </b><code>-Djava.library.path=INSTALLDIR/eclipse/plugins/org.eclipse.swt.motif_2.0.0/os/aix/ppc</code>
-	<li><b>hpux motif: </b><code>-Djava.library.path=INSTALLDIR/eclipse/plugins/org.eclipse.swt.motif_2.0.0/os/hpux/PA_RISC</code>
-	<li><b>photon qnx: </b><code>-Djava.library.path=INSTALLDIR/eclipse/plugins/org.eclipse.swt.photon_2.0.0/os/qnx/x86</code>
-	<li><b>macosx: </b><code>-Djava.library.path=INSTALLDIR/eclipse/plugins/org.eclipse.swt.carbon_2.0.0/os/macosx/ppc</code>
-	</ul>
-<li>Click on the Run button.
-</ol>
-
-
-<h3>Examples Overview</h3>
-<p>
-Consult the documentation of each individual example for the names of
-its Main class and additional details.
-</p>
-<p>
-The following examples are included in the <code>swtexamples.jar</code>:
-</p>
-<ul>
-<li><a href="swt_addressbook_ex.html">Address Book</a>
-<li><a href="swt_controls_ex.html">Controls</a>
-<li><a href="swt_fileviewer_ex.html">File Viewer</a>
-<li><a href="swt_helloworld_ex.html">Hello World [1-5]</a>
-<li><a href="swt_hoverhelp_ex.html">Hover Help</a>
-<li><a href="swt_imageanalyzer_ex.html">Image Analyzer</a>
-<li><a href="swt_javaviewer_ex.html">Java Viewer</a>
-<li><a href="swt_layout_ex.html">Layout</a>
-<li><a href="swt_texteditor_ex.html">Text Editor</a>
-</ul>
-
-<p><br><a href="hglegal2002.htm"><img SRC="ngibmcpy2002.gif" ALT="Copyright IBM Corporation and others 2000, 2002.  All Rights Reserved." BORDER=0 height=14 width=324></a>
-</body>
-</html>
diff --git a/examples/org.eclipse.swt.examples/doc-html/swt_texteditor_ex.html b/examples/org.eclipse.swt.examples/doc-html/swt_texteditor_ex.html
deleted file mode 100755
index 3d5571b..0000000
--- a/examples/org.eclipse.swt.examples/doc-html/swt_texteditor_ex.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <title>SWT - Text Editor Example</title>
-</head>
-<body>
-
-<h2>SWT Standalone Example - Text Editor</h2>
-
-<p>
-This example demonstrates how to use the StyledText widget to implement
-a text editor with formatting support.
-The example has a typical text editor interface.
-The Edit menu contains Cut, Copy, Paste and Set Font items and the toolbar
-provides a bold text toggle, three colour tools that operate on the current
-selection, and a reset to defaults button that also operates on the current selection.
-</p>
-
-<h3>Running the example</h3>
-<p>
-Follow the <a href="swt_manual_setup.html">Manual Setup</a> 
-instructions to install and run the example from your workspace.
-</p>
-<p>
-The "Main" class is <code>org.eclipse.swt.examples.texteditor.TextEditor</code>.
-</p>
-<p>
-This example can also be run using the <a href="swt_launcher_ex.html">Example Launcher</a>.
-Select the Text Editor item from the Standalone category and click Run.
-</p>
-
-<p><a href="hglegal2002.htm"><img SRC="ngibmcpy2002.gif" ALT="Copyright IBM Corporation and others 2000, 2002.  All Rights Reserved." BORDER=0 height=14 width=324></a></p>
-</body>
-</html>
diff --git a/examples/org.eclipse.swt.examples/plugin.properties b/examples/org.eclipse.swt.examples/plugin.properties
deleted file mode 100755
index 6382611..0000000
--- a/examples/org.eclipse.swt.examples/plugin.properties
+++ /dev/null
@@ -1,113 +0,0 @@
-providerName = Eclipse.org
-plugin.SWTStandaloneExampleSet.name = SWT Standalone Examples Plugin
-
-launchcategory.SWTStandaloneExamples.name = Standalone
-launchcategory.SWTStandaloneExamples.description = \
-	A collection of Standard Widget Toolkit examples that run independant \
-	of the Eclipse Platform.
-
-launchitem.AddressBook.name = Address Book
-launchitem.AddressBook.description = \
-	The AddressBook example shows how the Table control can be used to \
-	present information in a tabular format.\n\n\
-	The application can save and load data from a file, sort the entries, and \
-	search for strings within the fields.
-
-launchitem.ControlExample.name = SWT Controls Example
-launchitem.ControlExample.description = \
-	The Controls example is a simple demonstration of common SWT controls. \n\n\
-	It consists of a tab folder where each tab in the folder allows the user \
-	to interact with a different control. \
-	The user can change styles and settings and view how this affects the control.
-
-launchitem.FileViewer.name = File Viewer
-launchitem.FileViewer.description = \
-	The File Viewer example shows how a simple application can be implemented using SWT.\n\n\
-	This application provides the ability to navigate files and folders and manipulate them via Drag and Drop.  \
-	It includes the use of alternate threads for long actions and demonstrates the use of the Tree, \
-	Table, Toolbar and Program.
-
-launchitem.HoverHelp.name = Hover Help
-launchitem.HoverHelp.description = \
-	The Hover Help example shows how to implement custom tooltips and hover help support \
-	on a number of different SWT controls including Buttons, TableItems, ToolItems and TreeItems.\n\n\
-	The example implements its own tooltip and hover help support.  \
-	To see the custom tooltips in action, hover over an item or button in the UI.  \
-	An image appears in the left-hand corner of the tooltip.\n\n\
-	To see the custom hover help in action, hover over an item or button in the UI until \
-	the tooltip is displayed.  Without moving the mouse, hit F1.  A new Shell will pop up with the \
-	extended hover help information for the UI element in question
-
-launchitem.HelloWorld1.name = Hello World (1)
-launchitem.HelloWorld1.description = \
-	This example demonstrates how to open a Shell and process the events.
-
-launchitem.HelloWorld2.name = Hello World (2)
-launchitem.HelloWorld2.description = \
-	This example builds on HelloWorld1 and demonstrates how to display a Label inside the Shell.
-
-launchitem.HelloWorld3.name = Hello World (3)
-launchitem.HelloWorld3.description = \
-	This example builds on HelloWorld2 and demonstrates how to resize the Label \
-	when the Shell resizes using a Listener mechanism.
-
-launchitem.HelloWorld4.name = Hello World (4)
-launchitem.HelloWorld4.description = \
-	This example builds on HelloWorld2 and demonstrates how to resize the Label \
-	when the Shell resizes using a Layout.
-
-launchitem.HelloWorld5.name = Hello World (5)
-launchitem.HelloWorld5.description = \
-	This example builds on HelloWorld1 and demonstrates how to draw directly on an SWT Control using a graphic context.
-
-launchitem.ImageAnalyzer.name = Image Analyzer
-launchitem.ImageAnalyzer.description = \
-	The ImageAnalyzer opens image files and displays the visual contents of the file along with a \
-	summary of the data in the image file.\n\n\
-	The user can make adjustments to various elements of the image such as scaling and Alpha \
-	blending and can save these changes to a file.\n\n\
-	The ImageAnalyzer will load and display image files of type GIF, JPEG, BMP, ICO, and PNG.  \
-	To open a file, use the File->Open... menu item, and select the image file in the FileDialog.\n\n\
-	If the file is an interlaced GIF or PNG or a progressive JPEG, and Incremental Display is selected, \
-	then the ImageAnalyzer displays the image increments as they are being loaded.\n\n\
-	If the file contains an animated GIF, then the Next, Previous, and Animate buttons become enabled, \
-	and they can be used to cycle through the images in the file, or animate them. If a GIF defines a background color, \
-	as many animated GIFs do, selecting Background will use the GIF's background color.\n\n\
-	If the image has transparency (possible with GIF, PNG, or ICO), then selecting Display Mask will draw the image's transparency \
-	mask to the right of the image. You can change the background color of the ImageAnalyzer to see the transparency work. \
-	To turn off the transparency, deselect Display Transparency.\n\n\
-	After an image is loaded, it can be scaled or have alpha transparency applied, using the Scale and Alpha-K combos, \
-	and the Alpha menu. File->Reopen restores scaling and Alpha to their default values and reloads the current image file.\n\n\
-	File->Save As... can be used to save the currently loaded image to another type of image file. If the image has transparency, \
-	File->Save Mask As... saves the image's transparency mask.\n\n\
-	When SWT loads an image file, an instance of org.eclipse.swt.graphics.ImageData is created. (In the case of an ICO file or \
-	multi-image GIF, an array of ImageData instances is created). The ImageAnalyzer displays all of the data stored in the ImageData \
-	instance(s) for the currently loaded image file, including the pixel data. Hovering over a pixel in the image display will show the RGB \
-	color data for that pixel. For certain images (particularly animated GIFs) additional data is stored in the org.eclipse.swt.graphics.ImageLoader \
-	instance used to load the image. The ImageAnalyzer displays this data as well.
-
-launchitem.JavaViewer.name = Java Syntax Viewer
-launchitem.JavaViewer.description = \
-	This example demonstrates how to implement a user-defined line styler for the StyledText widget.\n\n\
-	The example provides a typical editor interface.  \
-	To see the effect of the line styler, open a *.java file.  \
-	When the contents of the file are displayed in the editor area, notice that the keywords have been highlighted.
-
-launchitem.LayoutExample.name = Layout Example
-launchitem.LayoutExample.description = \
-	This example is a simple demonstration of common SWT layouts. \n\n\
-	It consists of a tab folder where each tab in the folder allows the \
-	user to interact with a different SWT layout. \
-	The user can insert widgets into a layout and set the values of the layout data \
-	using a property sheet.  When the user has a suitable arrangement, code can be \
-	generated by clicking on the Code button.
-
-launchitem.TextEditor.name = Text Editor
-launchitem.TextEditor.description = \
-	This example demonstrates how to use the StyledText widget to implement \
-	a text editor with formatting support.\n\n\
-	The example has a typical text editor interface.  \
-	The Edit menu contains Cut, Copy, Paste and Set Font items and the toolbar \
-	provides a bold text toggle, three colour tools that operate on the current \
-	selection, and a reset to defaults button that also operates on the current selection.
-	
\ No newline at end of file
diff --git a/examples/org.eclipse.swt.examples/plugin.xml b/examples/org.eclipse.swt.examples/plugin.xml
deleted file mode 100755
index 2179dab..0000000
--- a/examples/org.eclipse.swt.examples/plugin.xml
+++ /dev/null
@@ -1,141 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- File written by PDE 1.0 -->
-<plugin
-   id="org.eclipse.swt.examples"
-   name="%plugin.SWTStandaloneExampleSet.name"
-   version="2.1.0"
-   provider-name="%providerName"
-   class="">
-<!-- Required plugins -->
-<requires>
-   <import plugin="org.eclipse.swt"/>
-</requires>
-
-<!-- Runtime -->
-<runtime>
-   <library name="swtexamples.jar">
-      <export name="*"/>
-   </library>
-</runtime>
-
-<!-- Extensions -->
-<!-- Extension points -->
-<extension
-      point="org.eclipse.swt.examples.launcher.launchItems">
-   <category
-         name="%launchcategory.SWTStandaloneExamples.name"
-         description="%launchcategory.SWTStandaloneExamples.description"
-         id="org.eclipse.swt.examples.launchStandaloneCategory">
-   </category>
-   <item
-         name="%launchitem.AddressBook.name"
-         description="%launchitem.AddressBook.description"
-         category="org.eclipse.swt.examples.launchStandaloneCategory"
-         id="org.eclipse.swt.examples.addressbook.standalonelauncher">
-      <program
-            pluginId="org.eclipse.swt.examples"
-            mainClass="org.eclipse.swt.examples.addressbook.AddressBook">
-      </program>
-   </item>
-   <item
-         name="%launchitem.FileViewer.name"
-         description="%launchitem.FileViewer.description"
-         category="org.eclipse.swt.examples.launchStandaloneCategory"
-         id="org.eclipse.swt.examples.fileviewer.standalonelauncher">
-      <program
-            pluginId="org.eclipse.swt.examples"
-            mainClass="org.eclipse.swt.examples.fileviewer.FileViewer">
-      </program>
-   </item>
-   <item
-         name="%launchitem.HoverHelp.name"
-         description="%launchitem.HoverHelp.description"
-         category="org.eclipse.swt.examples.launchStandaloneCategory"
-         id="org.eclipse.swt.examples.hoverhelp.standalonelauncher">
-      <program
-            pluginId="org.eclipse.swt.examples"
-            mainClass="org.eclipse.swt.examples.hoverhelp.HoverHelp">
-      </program>
-   </item>
-   <item
-         name="%launchitem.HelloWorld1.name"
-         description="%launchitem.HelloWorld1.description"
-         category="org.eclipse.swt.examples.launchStandaloneCategory"
-         id="org.eclipse.swt.examples.helloworld1.standalonelauncher">
-      <program
-            pluginId="org.eclipse.swt.examples"
-            mainClass="org.eclipse.swt.examples.helloworld.HelloWorld1">
-      </program>
-   </item>
-   <item
-         name="%launchitem.HelloWorld2.name"
-         description="%launchitem.HelloWorld2.description"
-         category="org.eclipse.swt.examples.launchStandaloneCategory"
-         id="org.eclipse.swt.examples.helloworld2.standalonelauncher">
-      <program
-            pluginId="org.eclipse.swt.examples"
-            mainClass="org.eclipse.swt.examples.helloworld.HelloWorld2">
-      </program>
-   </item>
-   <item
-         name="%launchitem.HelloWorld3.name"
-         description="%launchitem.HelloWorld3.description"
-         category="org.eclipse.swt.examples.launchStandaloneCategory"
-         id="org.eclipse.swt.examples.helloworld3.standalonelauncher">
-      <program
-            pluginId="org.eclipse.swt.examples"
-            mainClass="org.eclipse.swt.examples.helloworld.HelloWorld3">
-      </program>
-   </item>
-   <item
-         name="%launchitem.HelloWorld4.name"
-         description="%launchitem.HelloWorld4.description"
-         category="org.eclipse.swt.examples.launchStandaloneCategory"
-         id="org.eclipse.swt.examples.helloworld4.standalonelauncher">
-      <program
-            pluginId="org.eclipse.swt.examples"
-            mainClass="org.eclipse.swt.examples.helloworld.HelloWorld4">
-      </program>
-   </item>
-   <item
-         name="%launchitem.HelloWorld5.name"
-         description="%launchitem.HelloWorld5.description"
-         category="org.eclipse.swt.examples.launchStandaloneCategory"
-         id="org.eclipse.swt.examples.helloworld5.standalonelauncher">
-      <program
-            pluginId="org.eclipse.swt.examples"
-            mainClass="org.eclipse.swt.examples.helloworld.HelloWorld5">
-      </program>
-   </item>
-   <item
-         name="%launchitem.ImageAnalyzer.name"
-         description="%launchitem.ImageAnalyzer.description"
-         category="org.eclipse.swt.examples.launchStandaloneCategory"
-         id="org.eclipse.swt.examples.imageanalyzer.standalonelauncher">
-      <program
-            pluginId="org.eclipse.swt.examples"
-            mainClass="org.eclipse.swt.examples.imageanalyzer.ImageAnalyzer">
-      </program>
-   </item>
-   <item
-         name="%launchitem.JavaViewer.name"
-         description="%launchitem.JavaViewer.description"
-         category="org.eclipse.swt.examples.launchStandaloneCategory"
-         id="org.eclipse.swt.examples.javaviewer.standalonelauncher">
-      <program
-            pluginId="org.eclipse.swt.examples"
-            mainClass="org.eclipse.swt.examples.javaviewer.JavaViewer">
-      </program>
-   </item>
-   <item
-         name="%launchitem.TextEditor.name"
-         description="%launchitem.TextEditor.description"
-         category="org.eclipse.swt.examples.launchStandaloneCategory"
-         id="org.eclipse.swt.examples.texteditor.standalonelauncher">
-      <program
-            pluginId="org.eclipse.swt.examples"
-            mainClass="org.eclipse.swt.examples.texteditor.TextEditor">
-      </program>
-   </item>
-</extension>
-</plugin>
diff --git a/examples/org.eclipse.swt.examples/src/examples_addressbook.properties b/examples/org.eclipse.swt.examples/src/examples_addressbook.properties
deleted file mode 100644
index b416bed..0000000
--- a/examples/org.eclipse.swt.examples/src/examples_addressbook.properties
+++ /dev/null
@@ -1,59 +0,0 @@
-Last_name = Last Name
-First_name = First Name
-Business_phone = Business Phone
-Home_phone = Home Phone
-Email = Email
-Fax = Fax
-Close_save = The address book contents have changed.\nDo you want to save the changes?
-New_title = Untitled
-Column = Column:
-Book_extension = .adr
-Book_filter_name = Address Books
-All_filter_name = All Files
-File = File 
-Does_not_exist = does not exist.
-File_not_found = File not found:
-IO_error_read = IO error reading text file:
-IO_error_write = IO error writing text file:
-IO_error_close = IO error closing text file:
-Title_bar = Address Book - 
-Save_as_title = Save As
-Query_overwrite = already exists.\nDo you want to replace it?
-File_menu_title = &File
-New_contact = &New Contact\tCtrl+N
-Edit_contact = &Edit Contact\tCtrl+E
-New_address_book = New Address &Book\tCtrl+B
-Open_address_book = &Open Address Book\tCtrl+O
-Save_address_book = &Save Address Book\tCtrl+S
-Save_book_as = Save &Address Book As
-Exit = E&xit
-Edit_menu_title = &Edit
-Edit = &Edit\tCtrl+E
-Copy = &Copy\tCtrl+C
-Paste = &Paste\tCtrl+V
-Delete = De&lete\tDel
-Sort = &Sort
-Search_menu_title = &Search
-Find = &Find...\tCtrl+F
-Find_next = Find &Next...\tF3
-Pop_up_new = &New
-Pop_up_edit = &Edit
-Pop_up_copy = &Copy
-Pop_up_paste = &Paste
-Pop_up_delete = &Delete
-Pop_up_find = &Find...
-Help_menu_title = &Help
-About = &About Address Book...
-About_1 = About 
-About_2 = \nversion 1.0
-OK = OK
-Cancel = Cancel
-Search_dialog_title = Find
-Dialog_find_what = Fi&nd what:
-Dialog_match_case = Match &case
-Dialog_match_word = Match &whole word
-Dialog_direction = Direction
-Dialog_dir_up = &Up
-Dialog_dir_down = &Down
-Dialog_find = &Find
-Cannot_find = Cannot find 
\ No newline at end of file
diff --git a/examples/org.eclipse.swt.examples/src/examples_control.properties b/examples/org.eclipse.swt.examples/src/examples_control.properties
deleted file mode 100644
index 000e342..0000000
--- a/examples/org.eclipse.swt.examples/src/examples_control.properties
+++ /dev/null
@@ -1,139 +0,0 @@
-error.CouldNotLoadResources = Unable to load resources
-window.title = SWT Controls
-
-Text_Buttons		= Text Buttons
-Size 				= Size
-Alignment			= Alignment
-Left				= Left
-Right				= Right
-Up					= Up
-Down				= Down
-Center				= Center
-One					= One
-Two					= Two
-Three				= Three
-Image_Buttons		= Image Buttons
-Control_Example		= Control Example
-Parameters			= Parameters
-State				= State
-Enabled				= Enabled
-Visible				= Visible
-Preferred 			= Preferred
-Styles	 			= Styles
-Text_Labels			= Text Labels
-Image_Labels		= Image Labels
-One_Two_Three		= One Two Three
-Text_ToolBar 		= Text ToolBar
-Image_ToolBar 		= Image ToolBar
-Maximum				= Maximum
-Minimum				= Minimum
-Selection			= Selection
-Increment			= Increment
-Page_Increment		= Page Increment
-Thumb				= Thumb
-Tree_With_Images	= Tree With Images
-Dialog_Type			= Dialog Type
-Create_Dialog		= Create Dialog
-Button_Styles		= Button Styles
-Icon_Styles			= Icon Styles
-Modal_Styles		= Modal Styles
-File_Dialog_Styles	= File Dialog Styles
-Item_Styles			= Item Styles
-Dialog_Result		= Dialog Result
-ColorDialog			= ColorDialog
-DirectoryDialog		= DirectoryDialog
-FileDialog			= FileDialog
-FontDialog			= FontDialog
-PrintDialog			= PrintDialog
-MessageBox			= MessageBox
-Multi_line			= A multi line text widget.
-Example_string		= The quick brown fox jumps over the lazy dog.
-Header_Visible		= Header Visible
-Lines_Visible		= Lines Visible
-Locked				= Locked
-Node_1				= Node 1
-Node_2				= Node 2
-Node_3				= Node 3
-Node_4				= Node 4
-Node_1_1			= Node 1.1
-Node_2_1			= Node 2.1
-Node_3_1			= Node 3.1
-Node_2_2			= Node 2.2
-Node_2_2_1			= Node 2.2.1
-Parent				= Parent
-No_Parent			= No Parent
-Decoration_Styles	= Decoration Styles
-Create_Shell		= Create Shell
-Close_All_Shells	= Close All Shells
-Push				= Push
-Radio				= Radio
-Check				= Check
-Drop_Down			= Drop Down
-Images_failed		= Warning: Failed to load images
-readme_txt			= readme.txt
-Index				= Index:
-Title				= Title:
-Close				= Close
-Result				= Result: {0}
-FilterName_0		= Text Files
-FilterName_1		= Batch Files
-FilterName_2		= Doc Files
-TableTitle_0		= Name
-TableTitle_1		= Type
-TableTitle_2		= Size
-TableTitle_3		= Modified
-TableLine0_0		= <empty>
-TableLine0_1		= classes
-TableLine0_2		= 0
-TableLine0_3		= today
-TableLine1_0		= <empty>
-TableLine1_1		= databases
-TableLine1_2		= 2556
-TableLine1_3		= <empty>
-TableLine2_0		= <empty>
-TableLine2_1		= images
-TableLine2_2		= 91571
-TableLine2_3		= yesterday
-ListData0_0			= Line 1
-ListData0_1			= Line 2
-ListData0_2			= Line 3
-ListData0_3			= Line 4
-ListData0_4			= Line 5
-ListData0_5			= Line 6
-ListData0_6			= Line 7
-ListData0_7			= Line 8
-ListData0_8			= Longest Line In List
-ListData1_0			= Apples
-ListData1_1			= Oranges
-ListData1_2			= Bananas
-ListData1_3			= Grapefruit
-ListData1_4			= Peaches
-ListData1_5			= Kiwi
-ListData1_6			= Apricots
-ListData1_7			= Strawberries
-ListData1_8			= The Longest String
-DropDownData_0			= Apples
-DropDownData_1			= Oranges
-DropDownData_2			=
-DropDownData_3			= Grapefruit
-DropDownData_4			= Peaches
-DropDownData_5			= Kiwi
-DropDownData_6			=
-DropDownData_7			= Strawberries
-DropDownData_8			= The Longest String
-Slider_and_Scale	= Slider and Scale
-Colors 				= Colors and Font
-Item_Colors			= Item Colors
-Background_Color	= Background Color
-Foreground_Color	= Foreground Color
-Item_Background_Color	= Item Background Color
-Item_Foreground_Color  	= Item Foreground Color
-Font				= Set Font
-Wrap_Text			= Jack and Jill went up the hill to fetch a pail of water, \
-					  Jack fell down and broke his crown and Jill came tumbling after!
-Foreground_Style	= Foreground Style
-Background_Style 	= Background Style
-StyledText_Styles	= StyledText Styles
-StyledText_Style_Instructions	= Select text, then style.
-Bold				= Bold
-Fill				= Horizontal Fill
diff --git a/examples/org.eclipse.swt.examples/src/examples_fileviewer.properties b/examples/org.eclipse.swt.examples/src/examples_fileviewer.properties
deleted file mode 100644
index 3fc373e..0000000
--- a/examples/org.eclipse.swt.examples/src/examples_fileviewer.properties
+++ /dev/null
@@ -1,59 +0,0 @@
-Title = SWT FileViewer - {0}
-
-menu.File.text = &File
-menu.File.Close.text = &Close
-menu.File.SimulateOnly.text = Simulate File Operations
-menu.Help.text = &Help
-menu.Help.About.text = &About
-
-tool.Cut.tiptext = Cut
-tool.Copy.tiptext = Copy
-tool.Delete.tiptext = Delete
-tool.Parent.tiptext = Parent
-tool.Paste.tiptext = Paste
-tool.Print.tiptext = Print
-tool.Refresh.tiptext = Refresh
-tool.Rename.tiptext = Rename
-tool.Search.tiptext = Search
-
-details.AllFolders.text = All Folders
-details.ContentsOf.text = Contents of ''{0}''
-details.FileSize.text = {0} bytes
-details.DirNumberOfObjects.text = {0} object(s)
-details.NumberOfSelectedFiles.text = {0} object(s) selected
-
-table.Name.title = Name
-table.Size.title = Size
-table.Type.title = Type
-table.Modified.title = Modified
-
-filetype.Unknown = {0} File
-filetype.None = File
-filetype.Folder = Folder
-filesize.KB = {0} kb
-
-dialog.About.title = About SWT FileViewer
-dialog.About.description = SWT FileViewer\n\nVersion: 0.9\n\nRunning on: {0}
-
-dialog.NotImplemented.title = Not Implemented
-dialog.ActionNotImplemented.description = Sorry!  The action you selected has not been implemented.
-
-dialog.FailedCopy.title = Copy Files Error
-dialog.FailedCopy.description = An error occured while trying to copy "{0}" to "{1}".
-
-dialog.FailedDelete.title = Delete Files Error
-dialog.FailedDelete.description = An error occured while trying to delete "{0}".
-
-progressDialog.cancelButton.text = Cancel
-progressDialog.Copy.title = Copy Files
-progressDialog.Copy.description = Copying files.
-progressDialog.Copy.operation = Copying... {0}
-progressDialog.Move.title = Move Files
-progressDialog.Move.description = Moving files.
-progressDialog.Delete.operation = Deleting... {0}
-
-simulate.CopyFromTo.text = Simulated copy from "{0}" to "{1}".
-simulate.DirectoriesCreated.text = Simulated directories created for "{0}".
-simulate.Delete.text = Simulated delete of "{0}".
-
-error.FailedLaunch.message = Could not launch "{0}"
diff --git a/examples/org.eclipse.swt.examples/src/examples_helloworld.properties b/examples/org.eclipse.swt.examples/src/examples_helloworld.properties
deleted file mode 100644
index 2db6671..0000000
--- a/examples/org.eclipse.swt.examples/src/examples_helloworld.properties
+++ /dev/null
@@ -1 +0,0 @@
-Hello_world = Hello World
\ No newline at end of file
diff --git a/examples/org.eclipse.swt.examples/src/examples_hoverhelp.properties b/examples/org.eclipse.swt.examples/src/examples_hoverhelp.properties
deleted file mode 100644
index b1e118e..0000000
--- a/examples/org.eclipse.swt.examples/src/examples_hoverhelp.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-error.CouldNotLoadResources = Unable to load resources : {0}
-
-ToolItem.text = ToolItem {0}
-ToolItem.tooltip = Tooltip for {0}. Try F1 on me.
-ToolItem.help = Help text for {0}.
-
-TableItem.text = TableItem {0}
-TableItem.tooltip = Tooltip for {0}. Try F1 on me.
-TableItem.help = Help text for {0}.
-
-TreeItem.text = TreeItem {0}
-TreeItem.tooltip = Tooltip for {0}. Try F1 on me.
-TreeItem.help = Help text for {0}.
-
-Hello.text = Hello
-Hello.tooltip = Greetings!
diff --git a/examples/org.eclipse.swt.examples/src/examples_images.properties b/examples/org.eclipse.swt.examples/src/examples_images.properties
deleted file mode 100644
index 3f1d7b7..0000000
--- a/examples/org.eclipse.swt.examples/src/examples_images.properties
+++ /dev/null
@@ -1,101 +0,0 @@
-Image_analyzer 				= Image Analyzer
-None 						= None
-White 						= White
-Black 						= Black
-Red 						= Red
-Green 						= Green
-Blue 						= Blue
-X_scale 					= X Scale
-Y_scale 					= Y Scale
-Alpha_K 					= Alpha-K
-Display 					= Display
-Incremental 				= Incremental
-Transparent 				= Transparent
-Transparent_lc 				= transparent
-Mask 						= Mask
-Background 					= Background
-Animation 					= Animation
-Previous 					= < &Previous
-Next 						= &Next >
-Animate 					= &Animate
-Type_initial 				= Type:
-Type_string 				= Type: {0}
-Type_index 					= Type: {0} [{1,number,integer} of {2,number,integer}]
-Size_initial 				= Size:
-Size_value 					= Size: {0,number,integer} x {1,number,integer}
-Depth_initial 				= Depth:
-Depth_value 				= Depth: {0}
-Transparent_pixel_initial 	= Transparent pixel:
-Transparent_pixel_value		= Transparent pixel: {0}
-Time_to_load_initial 		= Time to load:
-Time_to_load_value			= Time to load: {0} ms
-Animation_size_initial 		= Animation size:
-Animation_size_value 		= Animation size: {0,number,integer} x {1,number,integer}
-Background_pixel_initial 	= Background pixel:
-Background_pixel_value 		= Background pixel: {0}
-Image_location_initial 		= Image location:
-Image_location_value 		= Image location: ({0,number,integer}, {1,number,integer})
-Disposal_initial 			= Disposal:
-Disposal_value 				= Disposal: {0,number,integer} ({1})
-Delay_initial 				= Delay:
-Delay_value 				= Delay: {0,number,integer} ms (using {1,number,integer} ms)
-Delay_used 					= Delay: {0,number,integer} ms
-Repeats_initial 			= Repeats:
-Repeats_value 				= Repeats: {0,number,integer}
-Repeats_forever 			= Repeats: {0,number,integer} (forever)
-Palette_initial 			= Palette:
-Palette_direct 				= Palette: Direct
-Palette_value 				= Palette size: {0,number,integer}
-Pixel_data_initial 			= Pixel data:
-Pixel_data_value 			= Pixel data:  Bytes per line: {0,number,integer}  \
-							  Scanline pad: {1,number,integer} {2}
-File 						= &File
-OpenFile 					= &Open File...\tCtrl+O
-OpenURL						= Open &URL...\tCtrl+U
-Reopen 						= &Reopen
-Save 						= &Save\tCtrl+S
-Save_as 					= Save &As...
-Save_mask_as 				= Save &Mask As...
-Print 						= &Print\tCtrl+P
-Exit 						= E&xit
-Alpha 						= Alpha
-OpenURLDialog				= Open URL
-EnterURL					= Enter the URL for an image (bmp, gif, ico, jpg, jpeg, png):
-All_images 					= All Image Files
-Loading_lc 					= loading
-Saving_lc 					= saving
-Unknown_extension 			= Unknown file extension: {0}\nPlease use bmp, gif, ico, \
-							  jpg, jpeg, or png.
-Overwrite 					= Overwrite {0}?
-Analyzer_on 				= Image Analyzer on: {0}
-Reloading_lc 				= reloading
-Color_at 					= Image color at ({0,number,integer}, {1,number,integer}) \
-							  index {2,number,integer} (0x{3}) is {4}
-Color_at_trans 				= Image color at ({0,number,integer}, {1,number,integer}) \
-							  index {2,number,integer} (0x{3}) is {4} (transparent)
-Creating_image 				= Creating image # {0,number,integer} from 
-OK							= OK
-Cancel						= Cancel
-Stop 						= &Stop
-Creating_from 				= Creating image read from
-Palette_direct 				= Palette: Direct
-Palette_size 				= Palette size: {0,number,integer}
-Bytes_per_line 				= Bytes per line:
-Scanline_pad 				= Scanline pad:
-Printing_error				= Printing error: 
-Error 						= Error {0} file\n{1}\n\n
-Pixels_per_byte 			= pixels per byte
-Byte_per_pixel 				= byte per pixel
-Bytes_per_pixel 			= bytes per pixel
-Unsupported_lc 				= unsupported
-None_lc 					= none
-Background_lc 				= background
-Previous_lc 				= previous
-Unspecified_lc 				= unspecified
-Unknown_ac 					= UNKNOWN
-Forever_lc 					= forever
-Depth_info 					= Depth: {0,number,integer} -- {1}
-One_byte 					= 1 byte per pixel
-Multi_bytes 				= {0,number,integer} bytes per pixel
-Multi_pixels 				= {0,number,integer} pixels per byte {1}
-Max_length_string 			= Transparent pixel: -1 (none)
\ No newline at end of file
diff --git a/examples/org.eclipse.swt.examples/src/examples_javaviewer.properties b/examples/org.eclipse.swt.examples/src/examples_javaviewer.properties
deleted file mode 100644
index 8c589d1..0000000
--- a/examples/org.eclipse.swt.examples/src/examples_javaviewer.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-Open_menuitem=&Open
-Close_menuitem=&Close
-File_menuitem=&File
-Window_title=SWT Java Viewer
-Err_file_no_exist=File {0} does not exist.
-Err_file_io=IO error reading file:\n{0}
-Err_file_not_found=File not found:\n{0}
\ No newline at end of file
diff --git a/examples/org.eclipse.swt.examples/src/examples_layout.properties b/examples/org.eclipse.swt.examples/src/examples_layout.properties
deleted file mode 100644
index 5861297..0000000
--- a/examples/org.eclipse.swt.examples/src/examples_layout.properties
+++ /dev/null
@@ -1,41 +0,0 @@
-window.title = SWT Layouts
-
-Add					= &Add
-Delete	 			= &Delete
-Clear				= &Clear
-Children			= Children
-Type				= Type
-Layout				= Layout
-Preferred_Size		= Preferred Size
-Code				= C&ode
-Generated_Code		= Generated Code
-Parameters			= Parameters
-Properties			= Properties
-Margins				= Margins
-Margins_Spacing		= Margins and Spacing
-Columns				= Columns
-Attach_Edit			= Edit
-Left_Attachment		= Edit Left Attachment
-Right_Attachment	= Edit Right Attachment
-Top_Attachment		= Edit Top Attachment
-Bottom_Attachment	= Edit Bottom Attachment
-Position			= Position
-Control				= Control
-Offset				= Offset [+/-]
-Item				= Item {0}
-Combo_Index			= Combo {0}
-Group_Index			= Group {0}
-Label_Index			= Label {0}
-Button_Index		= Button {0}
-StyledText_Index	= StyledText {0}
-Text_Index			= Text {0}
-OK					= OK
-Cancel				= Cancel
-Edit				= &Edit
-Select_All			= Select &All\tCtrl+A
-Copy				= &Copy\tCtrl+C
-Exit				= E&xit
-Name_Title			= Enter Names
-Name_Label			= Enter names for your controls
-Invalid_Name 		= Invalid Name - Please enter valid variable names for your controls
-Default				= Default
\ No newline at end of file
diff --git a/examples/org.eclipse.swt.examples/src/examples_texteditor.properties b/examples/org.eclipse.swt.examples/src/examples_texteditor.properties
deleted file mode 100644
index e53ce09..0000000
--- a/examples/org.eclipse.swt.examples/src/examples_texteditor.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-Cut_menuitem=Cu&t\tCtrl+X
-Copy_menuitem=&Copy\tCtrl+C
-Paste_menuitem=&Paste\tCtrl+V
-Window_title=SWT Text Editor
-Font_menuitem=Set &Font...
-Edit_menuitem=&Edit
\ No newline at end of file
diff --git a/examples/org.eclipse.swt.examples/src/import.properties b/examples/org.eclipse.swt.examples/src/import.properties
deleted file mode 100644
index 97c8220..0000000
--- a/examples/org.eclipse.swt.examples/src/import.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-# Persist project settings for later import 
-natures = org.eclipse.jdt.core.javanature; org.eclipse.pde.PluginNature
-builders = org.eclipse.jdt.core.javabuilder; org.eclipse.pde.ManifestBuilder; org.eclipse.pde.SchemaBuilder
-var.ECLIPSE_PLUGINS = <<ECLIPSE_PLUGINS>>
-vmargs.org/eclipse/swt/examples/addressbook/AddressBook.java%AddressBook = "-Djava.library.path=<<SWT_LIBRARY_PATH>>"
-vmargs.org/eclipse/swt/examples/controlexample/ControlExample.java%ControlExample = "-Djava.library.path=<<SWT_LIBRARY_PATH>>"
-vmargs.org/eclipse/swt/examples/fileviewer/FileViewer.java%FileViewer = "-Djava.library.path=<<SWT_LIBRARY_PATH>>"
-vmargs.org/eclipse/swt/examples/helloworld/HelloWorld1.java%HelloWorld1 = "-Djava.library.path=<<SWT_LIBRARY_PATH>>"
-vmargs.org/eclipse/swt/examples/helloworld/HelloWorld2.java%HelloWorld2 = "-Djava.library.path=<<SWT_LIBRARY_PATH>>"
-vmargs.org/eclipse/swt/examples/helloworld/HelloWorld3.java%HelloWorld3 = "-Djava.library.path=<<SWT_LIBRARY_PATH>>"
-vmargs.org/eclipse/swt/examples/helloworld/HelloWorld4.java%HelloWorld4 = "-Djava.library.path=<<SWT_LIBRARY_PATH>>"
-vmargs.org/eclipse/swt/examples/helloworld/HelloWorld5.java%HelloWorld5 = "-Djava.library.path=<<SWT_LIBRARY_PATH>>"
-vmargs.org/eclipse/swt/examples/hoverhelp/HoverHelp.java%HoverHelp = "-Djava.library.path=<<SWT_LIBRARY_PATH>>"
-vmargs.org/eclipse/swt/examples/imageanalyzer/ImageAnalyzer.java%ImageAnalyzer = "-Djava.library.path=<<SWT_LIBRARY_PATH>>"
-vmargs.org/eclipse/swt/examples/javaviewer/JavaViewer.java%JavaViewer = "-Djava.library.path=<<SWT_LIBRARY_PATH>>"
-vmargs.org/eclipse/swt/examples/texteditor/TextEditor.java%TextEditor = "-Djava.library.path=<<SWT_LIBRARY_PATH>>"
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/addressbook/AddressBook.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/addressbook/AddressBook.java
deleted file mode 100755
index 33697ed..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/addressbook/AddressBook.java
+++ /dev/null
@@ -1,857 +0,0 @@
-package org.eclipse.swt.examples.addressbook;
-
-/*
- * Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-/* Imports */
-import java.io.*;
-import java.util.*;
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.widgets.*;
-
-/**
- * AddressBookExample is an example that uses <code>org.eclipse.swt</code> 
- * libraries to implement a simple address book.  This application has 
- * save, load, sorting, and searching functions common
- * to basic address books.
- */
-public class AddressBook {
-
-	private static ResourceBundle resAddressBook = ResourceBundle.getBundle("examples_addressbook");
-	private Shell shell;
-	
-	private Table table;
-	private SearchDialog searchDialog;
-	
-	private File file;
-	private boolean isModified;
-	
-	private String[] copyBuffer;
-	
-	private static final String DELIMITER = "\t";
-	private static final String[] columnNames = {resAddressBook.getString("Last_name"),
-												 resAddressBook.getString("First_name"),
-												 resAddressBook.getString("Business_phone"),
-												 resAddressBook.getString("Home_phone"),
-												 resAddressBook.getString("Email"),
-												 resAddressBook.getString("Fax")};
-	
-public static void main(String[] args) {
-	Display display = new Display();
-	AddressBook application = new AddressBook();
-	Shell shell = application.open(display);
-	while(!shell.isDisposed()){
-		if(!display.readAndDispatch())
-			display.sleep();
-	}
-	display.dispose();
-}
-public Shell open(Display display) {
-	shell = new Shell(display);
-	shell.setLayout(new FillLayout());
-	shell.addShellListener(new ShellAdapter() {
-		public void shellClosed(ShellEvent e) {
-			e.doit = closeAddressBook();
-		}
-	});
-	
-	createMenuBar();
-
-	searchDialog = new SearchDialog(shell);
-	searchDialog.setSearchAreaNames(columnNames);
-	searchDialog.setSearchAreaLabel(resAddressBook.getString("Column"));
-	searchDialog.addFindListener(new FindListener () {
-		public boolean find() {
-			return findEntry();
-		}
-	});
-					
-	table = new Table(shell, SWT.SINGLE | SWT.BORDER | SWT.FULL_SELECTION);
-	table.setHeaderVisible(true);	
-	table.setMenu(createPopUpMenu());	
-	table.addSelectionListener(new SelectionAdapter() {
-		public void widgetDefaultSelected(SelectionEvent e) {
-			TableItem[] items = table.getSelection();
-			if (items.length > 0) editEntry(items[0]);
-		}
-	});
-	for(int i = 0; i < columnNames.length; i++) {
-		TableColumn column = new TableColumn(table, SWT.NONE);
-		column.setText(columnNames[i]);
-		column.setWidth(150);
-		final int columnIndex = i;
-		column.addSelectionListener(new SelectionAdapter() {		
-			public void widgetSelected(SelectionEvent e) {
-				sort(columnIndex);
-			}
-		});
-	}
-
-	newAddressBook();
-
-	shell.setSize(table.computeSize(SWT.DEFAULT, SWT.DEFAULT).x, 300);
-	shell.open();
-	return shell;
-}
-
-private boolean closeAddressBook() {
-	if(isModified) {
-		//ask user if they want to save current address book
-		MessageBox box = new MessageBox(shell, SWT.ICON_WARNING | SWT.YES | SWT.NO | SWT.CANCEL);
-		box.setText(shell.getText());
-		box.setMessage(resAddressBook.getString("Close_save"));
-	
-		int choice = box.open();
-		if(choice == SWT.CANCEL) {
-			return false;
-		} else if(choice == SWT.YES) {
-			if (!save()) return false;
-		}
-	}
-		
-	TableItem[] items = table.getItems();
-	for (int i = 0; i < items.length; i ++) {
-		items[i].dispose();
-	}
-	
-	return true;
-}
-/**
- * Creates the menu at the top of the shell where most
- * of the programs functionality is accessed.
- *
- * @return		The <code>Menu</code> widget that was created
- */
-private Menu createMenuBar() {
-	Menu menuBar = new Menu(shell, SWT.BAR);
-	shell.setMenuBar(menuBar);
-	
-	//create each header and subMenu for the menuBar
-	createFileMenu(menuBar);
-	createEditMenu(menuBar);
-	createSearchMenu(menuBar);
-	createHelpMenu(menuBar);
-	
-	return menuBar;
-}
-
-/**
- * Converts an encoded <code>String</code> to a String array representing a table entry.
- */
-private String[] decodeLine(String line) {
-	if(line == null) return null;
-	
-	String[] parsedLine = new String[table.getColumnCount()];
-	for(int i = 0; i < parsedLine.length - 1; i++) {
-		String newString = "";
-		int index = line.indexOf(DELIMITER);
-		if (index > -1) {
-			parsedLine[i] = line.substring(0, index);
-			line = line.substring(index + DELIMITER.length(), line.length());
-		} else {
-			return null;
-		}
-	}
-	
-	if (line.indexOf(DELIMITER) != -1) return null;
-	
-	parsedLine[parsedLine.length - 1] = line;
-
-	return parsedLine;
-}
-private void displayError(String msg) {
-	MessageBox box = new MessageBox(shell, SWT.ICON_ERROR);
-	box.setMessage(msg);
-	box.open();
-}
-private void editEntry(TableItem item) {
-	DataEntryDialog dialog = new DataEntryDialog(shell);
-	dialog.setLabels(columnNames);
-	String[] values = new String[table.getColumnCount()];
-	for (int i = 0; i < values.length; i++) {
-		values[i] = item.getText(i);
-	}
-	dialog.setValues(values);
-	values = dialog.open();
-	if (values != null) {
-		item.setText(values);
-		isModified = true;
-	}
-}
-private String encodeLine(String[] tableItems) {
-	String line = "";
-	for (int i = 0; i < tableItems.length - 1; i++) {
-		line += tableItems[i] + DELIMITER;
-	}
-	line += tableItems[tableItems.length - 1] + "\n";
-	
-	return line;
-}
-private boolean findEntry() {
-	Cursor waitCursor = new Cursor(shell.getDisplay(), SWT.CURSOR_WAIT);
-	shell.setCursor(waitCursor);
-	
-	boolean matchCase = searchDialog.getMatchCase();
-	boolean matchWord = searchDialog.getMatchWord();
-	String searchString = searchDialog.getSearchString();
-	int column = searchDialog.getSelectedSearchArea();
-	
-	searchString = matchCase ? searchString : searchString.toLowerCase();
-	
-	boolean found = false;
-	if (searchDialog.getSearchDown()) {
-		for(int i = table.getSelectionIndex() + 1; i < table.getItemCount(); i++) {
-			if (found = findMatch(searchString, table.getItem(i), column, matchWord, matchCase)){
-				table.setSelection(i);
-				break;
-			}
-		}
-	} else {
-		for(int i = table.getSelectionIndex() - 1; i > -1; i--) {
-			if (found = findMatch(searchString, table.getItem(i), column, matchWord, matchCase)){
-				table.setSelection(i);
-				break;
-			}
-		}
-	}
-	
-	shell.setCursor(null);
-	if (waitCursor != null)
-		waitCursor.dispose();
-		
-	return found;
-}
-private boolean findMatch(String searchString, TableItem item, int column, boolean matchWord, boolean matchCase) {
-	
-	String tableText = matchCase ? item.getText(column) : item.getText(column).toLowerCase();
-	if (matchWord) {
-		if (tableText != null && tableText.equals(searchString)) {
-			return true;
-		}
-		
-	} else {
-		if(tableText!= null && tableText.indexOf(searchString) != -1) {
-			return true;
-		}
-	}
-	return false;
-}
-private void newAddressBook() {	
-	shell.setText(resAddressBook.getString("Title_bar") + resAddressBook.getString("New_title"));
-	file = null;
-	isModified = false;
-}
-private void newEntry() {
-	DataEntryDialog dialog = new DataEntryDialog(shell);
-	dialog.setLabels(columnNames);
-	String[] data = dialog.open();
-	if (data != null) {
-		TableItem item = new TableItem(table, SWT.NONE);
-		item.setText(data);
-		isModified = true;
-	}
-}
-
-private void openAddressBook() {	
-	FileDialog fileDialog = new FileDialog(shell, SWT.OPEN);
-
-	fileDialog.setFilterExtensions(new String[] {"*.adr;", "*.*"});
-	fileDialog.setFilterNames(new String[] {resAddressBook.getString("Book_filter_name") + " (*.adr)", 
-											resAddressBook.getString("All_filter_name") + " (*.*)"});
-	fileDialog.open();
-	String name = fileDialog.getFileName();
-	
-	if(name == null) return;
-
-	File file = new File(fileDialog.getFilterPath(), name);
-	if (!file.exists()) {
-		displayError(resAddressBook.getString("File")+file.getName()+" "+resAddressBook.getString("Does_not_exist")); 
-		return;
-	}
-	
-	Cursor waitCursor = new Cursor(shell.getDisplay(), SWT.CURSOR_WAIT);
-	shell.setCursor(waitCursor);
-	
-	FileReader fileReader = null;
-	BufferedReader bufferedReader = null;
-	String[] data = new String[0];
-	try {
-		fileReader = new FileReader(file.getAbsolutePath());
-		bufferedReader = new BufferedReader(fileReader);
-		String nextLine = bufferedReader.readLine();
-		while (nextLine != null){
-			String[] newData = new String[data.length + 1];
-			System.arraycopy(data, 0, newData, 0, data.length);
-			newData[data.length] = nextLine;
-			data = newData;
-			nextLine = bufferedReader.readLine();
-		}
-	} catch(FileNotFoundException e) {
-		displayError(resAddressBook.getString("File_not_found") + "\n" + file.getName());
-		return;
-	} catch (IOException e ) {
-		displayError(resAddressBook.getString("IO_error_read") + "\n" + file.getName());
-		return;
-	} finally {	
-		
-		shell.setCursor(null);
-		waitCursor.dispose();
-	
-		if(fileReader != null) {
-			try {
-				fileReader.close();
-			} catch(IOException e) {
-				displayError(resAddressBook.getString("IO_error_close") + "\n" + file.getName());
-				return;
-			}
-		}
-	}
-	
-	String[][] tableInfo = new String[data.length][table.getColumnCount()];
-	for (int i = 0; i < data.length; i++) {
-		tableInfo[i] = decodeLine(data[i]);
-	}
-
-	Arrays.sort(tableInfo, new RowComparator(0));
-
-	for (int i = 0; i < tableInfo.length; i++) {
-		TableItem item = new TableItem(table, SWT.NONE);
-		item.setText(tableInfo[i]);
-	}
-	shell.setText(resAddressBook.getString("Title_bar")+fileDialog.getFileName());
-	isModified = false;
-	this.file = file;
-}
-private boolean save() {
-	if(file == null) return saveAs();
-	
-	Cursor waitCursor = new Cursor(shell.getDisplay(), SWT.CURSOR_WAIT);
-	shell.setCursor(waitCursor);
-	
-	TableItem[] items = table.getItems();
-	String[] lines = new String[items.length];
-	for(int i = 0; i < items.length; i++) {
-		String[] itemText = new String[table.getColumnCount()];
-		for (int j = 0; j < itemText.length; j++) {
-			itemText[j] = items[i].getText(j);
-		}
-		lines[i] = encodeLine(itemText);
-	}
-		
-	FileWriter fileWriter = null;
-	try { 
-		fileWriter = new FileWriter(file.getAbsolutePath(), false);
-		for (int i = 0; i < lines.length; i++) {
-			fileWriter.write(lines[i]);
-		}
-	} catch(FileNotFoundException e) {
-		displayError(resAddressBook.getString("File_not_found") + "\n" + file.getName());
-		return false;
-	} catch(IOException e ) {
-		displayError(resAddressBook.getString("IO_error_write") + "\n" + file.getName());
-		return false;
-	} finally {
-		shell.setCursor(null);
-		waitCursor.dispose();
-		
-		if(fileWriter != null) {
-			try {
-				fileWriter.close();
-			} catch(IOException e) {
-				displayError(resAddressBook.getString("IO_error_close") + "\n" + file.getName());
-				return false;
-			}
-		}
-	}
-
-	shell.setText(resAddressBook.getString("Title_bar")+file.getName());
-	isModified = false;
-	return true;
-}
-private boolean saveAs() {
-		
-	FileDialog saveDialog = new FileDialog(shell, SWT.SAVE);
-	saveDialog.setFilterExtensions(new String[] {"*.adr;",  "*.*"});
-	saveDialog.setFilterNames(new String[] {"Address Books (*.adr)", "All Files "});
-	
-	saveDialog.open();
-	String name = saveDialog.getFileName();
-		
-	if(name.equals("")) return false;
-
-	if(name.indexOf(".adr") != name.length() - 4) {
-		name += ".adr";
-	}
-
-	File file = new File(saveDialog.getFilterPath(), name);
-	if(file.exists()) {
-		MessageBox box = new MessageBox(shell, SWT.ICON_WARNING | SWT.YES | SWT.NO);
-		box.setText(resAddressBook.getString("Save_as_title"));
-		box.setMessage(resAddressBook.getString("File") + file.getName()+" "+resAddressBook.getString("Query_overwrite"));
-		if(box.open() != SWT.YES) {
-			return false;
-		}
-	}
-	this.file = file;
-	return save();	
-}
-private void sort(int column) {
-	if(table.getItemCount() <= 1)	return;
-
-	TableItem[] items = table.getItems();
-	String[][] data = new String[items.length][table.getColumnCount()];
-	for(int i = 0; i < items.length; i++) {
-		for(int j = 0; j < table.getColumnCount(); j++) {
-			data[i][j] = items[i].getText(j);
-		}
-	}
-	
-	Arrays.sort(data, new RowComparator(column));
-	
-	for (int i = 0; i < data.length; i++) {
-		items[i].setText(data[i]);
-	}
-	
-}
-/**
- * Creates all the items located in the File submenu and
- * associate all the menu items with their appropriate
- * functions.
- *
- * @param	menuBar Menu
- *				the <code>Menu</code> that file contain
- *				the File submenu.
- */
-private void createFileMenu(Menu menuBar) {
-	//File menu.
-	MenuItem item = new MenuItem(menuBar, SWT.CASCADE);
-	item.setText(resAddressBook.getString("File_menu_title"));
-	Menu menu = new Menu(shell, SWT.DROP_DOWN);
-	item.setMenu(menu);
-	/** 
-	 * Adds a listener to handle enabling and disabling 
-	 * some items in the Edit submenu.
-	 */
-	menu.addMenuListener(new MenuAdapter() {
-		public void menuShown(MenuEvent e) {
-			Menu menu = (Menu)e.widget;
-			MenuItem[] items = menu.getItems();
-			items[1].setEnabled(table.getSelectionCount() != 0); // edit contact
-			items[5].setEnabled((file != null) && isModified); // save
-			items[6].setEnabled(table.getItemCount() != 0); // save as
-		}
-	});
-
-
-	//File -> New Contact
-	MenuItem subItem = new MenuItem(menu, SWT.NULL);
-	subItem.setText(resAddressBook.getString("New_contact"));
-	subItem.setAccelerator(SWT.CTRL + 'N');
-	subItem.addSelectionListener(new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent e) {
-			newEntry();
-		}
-	});
-	subItem = new MenuItem(menu, SWT.NULL);
-	subItem.setText(resAddressBook.getString("Edit_contact"));
-	subItem.setAccelerator(SWT.CTRL + 'E');
-	subItem.addSelectionListener(new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent e) {
-			TableItem[] items = table.getSelection();
-			if (items.length == 0) return;
-			editEntry(items[0]);
-		}
-	});
-
-	
-	new MenuItem(menu, SWT.SEPARATOR);
-	
-	//File -> New Address Book
-	subItem = new MenuItem(menu, SWT.NULL);
-	subItem.setText(resAddressBook.getString("New_address_book"));
-	subItem.setAccelerator(SWT.CTRL + 'B');
-	subItem.addSelectionListener(new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent e) {
-			closeAddressBook();
-			newAddressBook();
-		}
-	});
-
-	//File -> Open
-	subItem = new MenuItem(menu, SWT.NULL);
-	subItem.setText(resAddressBook.getString("Open_address_book"));
-	subItem.setAccelerator(SWT.CTRL + 'O');
-	subItem.addSelectionListener(new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent e) {
-			closeAddressBook();
-			openAddressBook();
-		}
-	});
-
-	//File -> Save.
-	subItem = new MenuItem(menu, SWT.NULL);
-	subItem.setText(resAddressBook.getString("Save_address_book"));
-	subItem.setAccelerator(SWT.CTRL + 'S');
-	subItem.addSelectionListener(new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent e) {
-			save();
-		}
-	});
-	
-	//File -> Save As.
-	subItem = new MenuItem(menu, SWT.NULL);
-	subItem.setText(resAddressBook.getString("Save_book_as"));
-	subItem.addSelectionListener(new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent e) {
-			saveAs();
-		}
-	});
-
-		
-	new MenuItem(menu, SWT.SEPARATOR);
-	
-	//File -> Exit.
-	subItem = new MenuItem(menu, SWT.NULL);
-	subItem.setText(resAddressBook.getString("Exit"));
-	subItem.addSelectionListener(new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent e) {
-			shell.close();
-		}
-	});
-}
-
-/**
- * Creates all the items located in the Edit submenu and
- * associate all the menu items with their appropriate
- * functions.
- *
- * @param	menuBar Menu
- *				the <code>Menu</code> that file contain
- *				the Edit submenu.
- *
- * @see	#createSortMenu()
- */
-private MenuItem createEditMenu(Menu menuBar) {
-	//Edit menu.
-	MenuItem item = new MenuItem(menuBar, SWT.CASCADE);
-	item.setText(resAddressBook.getString("Edit_menu_title"));
-	Menu menu = new Menu(shell, SWT.DROP_DOWN);
-	item.setMenu(menu);
-	
-	/** 
-	 * Add a listener to handle enabling and disabling 
-	 * some items in the Edit submenu.
-	 */
-	menu.addMenuListener(new MenuAdapter() {
-		public void menuShown(MenuEvent e) {
-			Menu menu = (Menu)e.widget;
-			MenuItem[] items = menu.getItems();
-			int count = table.getSelectionCount();
-			items[0].setEnabled(count != 0); // edit
-			items[1].setEnabled(count != 0); // copy
-			items[2].setEnabled(copyBuffer != null); // paste
-			items[3].setEnabled(count != 0); // delete
-			items[5].setEnabled(table.getItemCount() != 0); // sort
-		}
-	});
-	
-	//Edit -> Edit
-	MenuItem subItem = new MenuItem(menu, SWT.CASCADE);
-	subItem.setText(resAddressBook.getString("Edit"));
-	subItem.setAccelerator(SWT.CTRL + 'E');
-	subItem.addSelectionListener(new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent e) {
-			TableItem[] items = table.getSelection();
-			if (items.length == 0) return;
-			editEntry(items[0]);
-		}
-	});
-
-	//Edit -> Copy
-	subItem = new MenuItem(menu, SWT.NULL);
-	subItem.setText(resAddressBook.getString("Copy"));
-	subItem.setAccelerator(SWT.CTRL + 'C');
-	subItem.addSelectionListener(new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent e) {
-			TableItem[] items = table.getSelection();
-			if (items.length == 0) return;
-			copyBuffer = new String[table.getColumnCount()];
-			for (int i = 0; i < copyBuffer.length; i++) {
-				copyBuffer[i] = items[0].getText(i);
-			}
-		}
-	});
-	
-	//Edit -> Paste
-	subItem = new MenuItem(menu, SWT.NULL);
-	subItem.setText(resAddressBook.getString("Paste"));
-	subItem.setAccelerator(SWT.CTRL + 'V');
-	subItem.addSelectionListener(new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent e) {
-			if (copyBuffer == null) return;
-			TableItem item = new TableItem(table, SWT.NONE);
-			item.setText(copyBuffer);
-			isModified = true;
-		}
-	});
-	
-	//Edit -> Delete
-	subItem = new MenuItem(menu, SWT.NULL);
-	subItem.setText(resAddressBook.getString("Delete"));
-	subItem.addSelectionListener(new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent e) {
-			TableItem[] items = table.getSelection();
-			if (items.length == 0) return;
-			items[0].dispose();
-			isModified = true;		}
-	});
-	
-	new MenuItem(menu, SWT.SEPARATOR);
-	
-	//Edit -> Sort(Cascade)
-	subItem = new MenuItem(menu, SWT.CASCADE);
-	subItem.setText(resAddressBook.getString("Sort"));
-	Menu submenu = createSortMenu();
-	subItem.setMenu(submenu);
-	
-	return item;
-	
-}
-
-/**
- * Creates all the items located in the Sort cascading submenu and
- * associate all the menu items with their appropriate
- * functions.
- *
- * @return	Menu
- *			The cascading menu with all the sort menu items on it.
- */
-private Menu createSortMenu() {
-	Menu submenu = new Menu(shell, SWT.DROP_DOWN);
-	MenuItem subitem;
-	for(int i = 0; i < columnNames.length; i++) {
-		subitem = new MenuItem (submenu, SWT.NULL);
-		subitem.setText(columnNames [i]);
-		final int column = i;
-		subitem.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				sort(column);
-			}
-		});
-
-	}
-	
-	return submenu;
-}
-
-/**
- * Creates all the items located in the Search submenu and
- * associate all the menu items with their appropriate
- * functions.
- *
- * @param	menuBar	Menu
- *				the <code>Menu</code> that file contain
- *				the Search submenu.
- */
-private void createSearchMenu(Menu menuBar) {
-	//Search menu.
-	MenuItem item = new MenuItem(menuBar, SWT.CASCADE);
-	item.setText(resAddressBook.getString("Search_menu_title"));
-	Menu searchMenu = new Menu(shell, SWT.DROP_DOWN);
-	item.setMenu(searchMenu);
-
-	//Search -> Find...
-	item = new MenuItem(searchMenu, SWT.NULL);
-	item.setText(resAddressBook.getString("Find"));
-	item.setAccelerator(SWT.CTRL + 'F');
-	item.addSelectionListener(new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent e) {
-			searchDialog.setMatchCase(false);
-			searchDialog.setMatchWord(false);
-			searchDialog.setSearchDown(true);
-			searchDialog.setSearchString("");
-			searchDialog.setSelectedSearchArea(0);
-			searchDialog.open();
-		}
-	});
-
-	//Search -> Find Next
-	item = new MenuItem(searchMenu, SWT.NULL);
-	item.setText(resAddressBook.getString("Find_next"));
-	item.setAccelerator(SWT.F3);
-	item.addSelectionListener(new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent e) {
-			searchDialog.open();
-		}
-	});
-}
-
-/** 
- * Creates all items located in the popup menu and associates
- * all the menu items with their appropriate functions.
- *
- * @return	Menu
- *			The created popup menu.
- */
-private Menu createPopUpMenu() {
-	Menu popUpMenu = new Menu(shell, SWT.POP_UP);
-
-	/** 
-	 * Adds a listener to handle enabling and disabling 
-	 * some items in the Edit submenu.
-	 */
-	popUpMenu.addMenuListener(new MenuAdapter() {
-		public void menuShown(MenuEvent e) {
-			Menu menu = (Menu)e.widget;
-			MenuItem[] items = menu.getItems();
-			int count = table.getSelectionCount();
-			items[2].setEnabled(count != 0); // edit
-			items[3].setEnabled(count != 0); // copy
-			items[4].setEnabled(copyBuffer != null); // paste
-			items[5].setEnabled(count != 0); // delete
-			items[7].setEnabled(table.getItemCount() != 0); // find
-		}
-	});
-
-	//New
-	MenuItem item = new MenuItem(popUpMenu, SWT.CASCADE);
-	item.setText(resAddressBook.getString("Pop_up_new"));
-	item.addSelectionListener(new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent e) {
-			newEntry();
-		}
-	});
-	
-	new MenuItem(popUpMenu, SWT.SEPARATOR);	
-	
-	//Edit
-	item = new MenuItem(popUpMenu, SWT.CASCADE);
-	item.setText(resAddressBook.getString("Pop_up_edit"));
-	item.addSelectionListener(new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent e) {
-			TableItem[] items = table.getSelection();
-			if (items.length == 0) return;
-			editEntry(items[0]);
-		}
-	});
-
-	//Copy
-	item = new MenuItem(popUpMenu, SWT.CASCADE);
-	item.setText(resAddressBook.getString("Pop_up_copy"));
-	item.addSelectionListener(new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent e) {
-			TableItem[] items = table.getSelection();
-			if (items.length == 0) return;
-			copyBuffer = new String[table.getColumnCount()];
-			for (int i = 0; i < copyBuffer.length; i++) {
-				copyBuffer[i] = items[0].getText(i);
-			}
-		}
-	});
-	
-	//Paste
-	item = new MenuItem(popUpMenu, SWT.CASCADE);
-	item.setText(resAddressBook.getString("Pop_up_paste"));
-	item.addSelectionListener(new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent e) {
-			if (copyBuffer == null) return;
-			TableItem item = new TableItem(table, SWT.NONE);
-			item.setText(copyBuffer);
-			isModified = true;
-		}
-	});
-	
-	//Delete
-	item = new MenuItem(popUpMenu, SWT.CASCADE);
-	item.setText(resAddressBook.getString("Pop_up_delete"));
-	item.addSelectionListener(new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent e) {
-			TableItem[] items = table.getSelection();
-			if (items.length == 0) return;
-			items[0].dispose();
-			isModified = true;
-		}
-	});
-	
-	new MenuItem(popUpMenu, SWT.SEPARATOR);	
-	
-	//Find...
-	item = new MenuItem(popUpMenu, SWT.NULL);
-	item.setText(resAddressBook.getString("Pop_up_find"));
-	item.addSelectionListener(new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent e) {
-			searchDialog.open();
-		}
-	});
-
-	return popUpMenu;
-}
-
-/**
- * Creates all the items located in the Help submenu and
- * associate all the menu items with their appropriate
- * functions.
- *
- * @param	menuBar	Menu
- *				the <code>Menu</code> that file contain
- *				the Help submenu.
- */
-private void createHelpMenu(Menu menuBar) {
-	
-	//Help Menu
-	MenuItem item = new MenuItem(menuBar, SWT.CASCADE);
-	item.setText(resAddressBook.getString("Help_menu_title"));	
-	Menu menu = new Menu(shell, SWT.DROP_DOWN);
-	item.setMenu(menu);
-	
-	//Help -> About Text Editor
-	MenuItem subItem = new MenuItem(menu, SWT.NULL);
-	subItem.setText(resAddressBook.getString("About"));
-	subItem.addSelectionListener(new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent e) {
-			MessageBox box = new MessageBox(shell, SWT.NONE);
-			box.setText(resAddressBook.getString("About_1") + shell.getText());
-			box.setMessage(shell.getText() + resAddressBook.getString("About_2"));
-			box.open();		
-		}
-	});
-}
-
-/**
- * To compare entries (rows) by the given column
- */
-private class RowComparator implements Comparator {
-	private int column;
-	
-	/**
-	 * Constructs a RowComparator given the column index
-	 * @param col The index (starting at zero) of the column
-	 */
-	public RowComparator(int col) {
-		column = col;
-	}
-	
-	/**
-	 * Compares two rows (type String[]) using the specified
-	 * column entry.
-	 * @param obj1 First row to compare
-	 * @param obj2 Second row to compare
-	 * @return negative if obj1 less than obj2, positive if
-	 * 			obj1 greater than obj2, and zero if equal.
-	 */
-	public int compare(Object obj1, Object obj2) {
-		String[] row1 = (String[])obj1;
-		String[] row2 = (String[])obj2;
-		
-		return row1[column].compareTo(row2[column]);
-	}
-}
-}
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/addressbook/DataEntryDialog.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/addressbook/DataEntryDialog.java
deleted file mode 100755
index 6be9f90..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/addressbook/DataEntryDialog.java
+++ /dev/null
@@ -1,159 +0,0 @@
-package org.eclipse.swt.examples.addressbook;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-/* Imports */
-import org.eclipse.swt.*;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.widgets.*;
-import java.util.ResourceBundle;
-
-/**
- * DataEntryDialog class uses <code>org.eclipse.swt</code> 
- * libraries to implement a dialog that accepts basic personal information that
- * is added to a <code>Table</code> widget or edits a <code>TableItem</code> entry 
- * to represent the entered data.
- */
-public class DataEntryDialog {
-
-	private static ResourceBundle resAddressBook = ResourceBundle.getBundle("examples_addressbook");
-	
-	Shell shell;
-	String[] values;
-	String[] labels;
-	
-public DataEntryDialog(Shell parent) {
-	shell = new Shell(parent, SWT.DIALOG_TRIM | SWT.PRIMARY_MODAL);
-	shell.setLayout(new GridLayout());		
-}
-
-private void addTextListener(final Text text) {
-	text.addModifyListener(new ModifyListener() {
-		public void modifyText(ModifyEvent e){
-			Integer index = (Integer)(text.getData("index"));
-			values[index.intValue()] = text.getText();
-		}
-	});
-}
-private void createControlButtons() {
-	Composite composite = new Composite(shell, SWT.NULL);
-	composite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER));
-	GridLayout layout = new GridLayout();
-	layout.numColumns = 2;
-	composite.setLayout(layout);
-	
-	Button okButton = new Button(composite, SWT.PUSH);
-	okButton.setText(resAddressBook.getString("OK"));
-	okButton.addSelectionListener(new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent e) {
-			shell.close();
-		}
-	});
-	
-	Button cancelButton = new Button(composite, SWT.PUSH);
-	cancelButton.setText(resAddressBook.getString("Cancel"));
-	cancelButton.addSelectionListener(new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent e) {
-			values = null;
-			shell.close();
-		}
-	});
-	
-	shell.setDefaultButton(okButton);
-}
-
-private void createTextWidgets() {
-	if (labels == null) return;
-	
-	Composite composite = new Composite(shell, SWT.NULL);
-	composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-	GridLayout layout= new GridLayout();
-	layout.numColumns = 2;
-	composite.setLayout(layout);
-	
-	if (values == null)
-		values = new String[labels.length];
-	
-	for (int i = 0; i < labels.length; i++) {
-		Label label = new Label(composite, SWT.RIGHT);
-		label.setText(labels[i]);	
-		Text text = new Text(composite, SWT.BORDER);
-		GridData gridData = new GridData();
-		gridData.widthHint = 400;
-		text.setLayoutData(gridData);
-		if (values[i] != null) {
-			text.setText(values[i]);
-		}
-		text.setData("index", new Integer(i));
-		addTextListener(text);	
-	}
-}
-
-public String[] getLabels() {
-	return labels;
-}
-public String getTitle() {
-	return shell.getText();
-}
-/**
- * Returns the contents of the <code>Text</code> widgets in the dialog in a 
- * <code>String</code> array.
- *
- * @return	String[]	
- *			The contents of the text widgets of the dialog.
- *			May return null if all text widgets are empty.
- */ 
-public String[] getValues() {
-	return values;
-}
-/** 
- * Opens the dialog in the given state.  Sets <code>Text</code> widget contents 
- * and dialog behaviour accordingly.
- *
- * @param 	dialogState	int
- *					The state the dialog should be opened in.
- */
-public String[] open() {
-	createTextWidgets();
-	createControlButtons();
-	shell.pack();
-	shell.open();
-	Display display = shell.getDisplay();
-	while(!shell.isDisposed()){
-		if(!display.readAndDispatch())
-			display.sleep();
-	}
-	
-	return getValues();
-}
-public void setLabels(String[] labels) {
-	this.labels = labels;
-}
-public void setTitle(String title) {
-	shell.setText(title);
-}
-/**
- * Sets the values of the <code>Text</code> widgets of the dialog to
- * the values supplied in the parameter array.
- *
- * @param	itemInfo	String[]
- * 						The values to which the dialog contents will be set.
- */
-public void setValues(String[] itemInfo) {
-	if (labels == null) return;
-	
-	if (values == null)
-		values = new String[labels.length];
-
-	int numItems = Math.min(values.length, itemInfo.length);
-	for(int i = 0; i < numItems; i++) {
-		values[i] = itemInfo[i];
-	}	
-}
-}
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/addressbook/FindListener.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/addressbook/FindListener.java
deleted file mode 100755
index ab0f020..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/addressbook/FindListener.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package org.eclipse.swt.examples.addressbook;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-public interface FindListener {
-
-public boolean find();
-
-}
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/addressbook/SearchDialog.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/addressbook/SearchDialog.java
deleted file mode 100755
index 8afb207..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/addressbook/SearchDialog.java
+++ /dev/null
@@ -1,199 +0,0 @@
-package org.eclipse.swt.examples.addressbook;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-/* Imports */
-import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.events.*;
-import java.util.ResourceBundle;
-
-/**
- * SearchDialog is a simple class that uses <code>org.eclipse.swt</code> 
- * libraries to implement a basic search dialog.
- */
-public class SearchDialog {
-
-	private static ResourceBundle resAddressBook = ResourceBundle.getBundle("examples_addressbook");
-
-	Shell shell;
-	Text searchText;
-	Combo searchArea;
-	Label searchAreaLabel;
-	Button matchCase;
-	Button matchWord;
-	Button findButton;
-	Button down;
-	FindListener findHandler;
-
-/**
- * Class constructor that sets the parent shell and the table widget that
- * the dialog will search.
- *
- * @param parent	Shell 
- *			The shell that is the parent of the dialog.
- */
-public SearchDialog(Shell parent) {
-	shell = new Shell(parent, SWT.CLOSE | SWT.BORDER | SWT.TITLE);
-	GridLayout layout = new GridLayout();
-	layout.numColumns = 2;
-	shell.setLayout(layout);
-	shell.setText(resAddressBook.getString("Search_dialog_title"));
-	shell.addShellListener(new ShellAdapter(){
-		public void shellClosed(ShellEvent e) {
-			// don't dispose of the shell, just hide it for later use
-			e.doit = false;
-			shell.setVisible(false);
-		}
-	});
-		
-	Label label = new Label(shell, SWT.LEFT);
-	label.setText(resAddressBook.getString("Dialog_find_what"));	
-	searchText = new Text(shell, SWT.BORDER);
-	GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-	gridData.widthHint = 200;
-	searchText.setLayoutData(gridData);
-	searchText.addModifyListener(new ModifyListener() {
-		public void modifyText(ModifyEvent e) {
-			boolean enableFind = (searchText.getCharCount() != 0);
-			findButton.setEnabled(enableFind);
-		}
-	});
-
-	searchAreaLabel = new Label(shell, SWT.LEFT);
-	searchArea = new Combo(shell, SWT.DROP_DOWN | SWT.READ_ONLY);
-	gridData = new GridData(GridData.FILL_HORIZONTAL);
-	gridData.widthHint = 200;
-	searchArea.setLayoutData(gridData);
-	
-	matchCase = new Button(shell, SWT.CHECK);
-	matchCase.setText(resAddressBook.getString("Dialog_match_case"));
-	gridData = new GridData();
-	gridData.horizontalSpan = 2;
-	matchCase.setLayoutData(gridData);
-	
-	matchWord = new Button(shell, SWT.CHECK);
-	matchWord.setText(resAddressBook.getString("Dialog_match_word"));
-	gridData = new GridData();
-	gridData.horizontalSpan = 2;
-	matchWord.setLayoutData(gridData);
-	
-	Group direction = new Group(shell, SWT.NONE);
-	gridData = new GridData();
-	gridData.horizontalSpan = 2;
-	direction.setLayoutData(gridData);
-	direction.setLayout (new FillLayout ());	
-	direction.setText(resAddressBook.getString("Dialog_direction"));
-	
-	Button up = new Button(direction, SWT.RADIO);
-	up.setText(resAddressBook.getString("Dialog_dir_up"));
-	up.setSelection(false);
-		
-	down = new Button(direction, SWT.RADIO);
-	down.setText(resAddressBook.getString("Dialog_dir_down"));
-	down.setSelection(true);
-
-	Composite composite = new Composite(shell, SWT.NONE);
-	gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-	gridData.horizontalSpan = 2;
-	composite.setLayoutData(gridData);
-	layout = new GridLayout();
-	layout.numColumns = 2;
-	layout.makeColumnsEqualWidth = true;
-	composite.setLayout(layout);
-	
-	findButton = new Button(composite, SWT.PUSH);
-	findButton.setText(resAddressBook.getString("Dialog_find"));
-	findButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
-	findButton.setEnabled(false);
-	findButton.addSelectionListener(new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent e) {
-			if (!findHandler.find()){
-				MessageBox box = new MessageBox(shell, SWT.ICON_INFORMATION | SWT.OK | SWT.PRIMARY_MODAL);
-				box.setText(shell.getText());
-				box.setMessage(resAddressBook.getString("Cannot_find") + "\"" + searchText.getText() + "\"");
-				box.open();	
-			}		
-		}
-	});
-			
-	Button cancelButton = new Button(composite, SWT.PUSH);
-	cancelButton.setText(resAddressBook.getString("Cancel"));
-	cancelButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
-	cancelButton.addSelectionListener(new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent e) {
-			shell.setVisible(false);
-		}
-	});
-	
-	shell.pack();
-}
-public String getSearchAreaLabel(String label) {
-	return searchAreaLabel.getText();
-}
-
-public String[] getsearchAreaNames() {
-	return searchArea.getItems();
-}
-public boolean getMatchCase() {
-	return matchCase.getSelection();
-}
-public boolean getMatchWord() {
-	return matchWord.getSelection();
-}
-public String getSearchString() {
-	return searchText.getText();
-}
-public boolean getSearchDown(){
-	return down.getSelection();
-}
-public int getSelectedSearchArea() {
-	return searchArea.getSelectionIndex();
-}
-public void open() {
-	if (shell.isVisible()) {
-		shell.setFocus();
-	} else {
-		shell.open();
-	}
-	searchText.setFocus();
-}
-public void setSearchAreaNames(String[] names) {
-	for (int i = 0; i < names.length; i++) {
-		searchArea.add(names[i]);
-	}
-	searchArea.select(0);
-}
-public void setSearchAreaLabel(String label) {
-	searchAreaLabel.setText(label);
-}
-public void setMatchCase(boolean match) {
-	matchCase.setSelection(match);
-}
-public void setMatchWord(boolean match) {
-	matchWord.setSelection(match);
-}
-public void setSearchDown(boolean searchDown){
-	down.setSelection(searchDown);
-}
-public void setSearchString(String searchString) {
-	searchText.setText(searchString);
-}
-
-public void setSelectedSearchArea(int index) {
-	searchArea.select(index);
-}
-public void addFindListener(FindListener listener) {
-	this.findHandler = listener;	
-}
-public void removeFindListener(FindListener listener) {
-	this.findHandler = null;
-}
-}
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/AlignableTab.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/AlignableTab.java
deleted file mode 100755
index 0ae087c..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/AlignableTab.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package org.eclipse.swt.examples.controlexample;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.events.*;
-
-/**
- * <code>AlignableTab</code> is the abstract
- * superclass of example controls that can be
- * aligned.
- */
-abstract class AlignableTab extends Tab {
-
-	/* Allignment Controls */
-	Button leftButton, rightButton, centerButton;
-
-	/* Alignment Group */
-	Group allignmentGroup;
-
-	/**
-	 * Creates the Tab within a given instance of ControlExample.
-	 */
-	AlignableTab(ControlExample instance) {
-		super(instance);
-	}
-
-	/**
-	 * Creates the "Control" group. 
-	 */
-	void createControlGroup () {
-		super.createControlGroup ();
-		
-		/* Create the group */
-		allignmentGroup = new Group (controlGroup, SWT.NULL);
-		allignmentGroup.setLayout (new GridLayout ());
-		allignmentGroup.setLayoutData (new GridData(GridData.HORIZONTAL_ALIGN_FILL |
-			GridData.VERTICAL_ALIGN_FILL));
-		allignmentGroup.setText (ControlExample.getResourceString("Alignment"));
-	
-		/* Create the controls */
-		leftButton = new Button (allignmentGroup, SWT.RADIO);
-		leftButton.setText (ControlExample.getResourceString("Left"));
-		centerButton = new Button (allignmentGroup, SWT.RADIO);
-		centerButton.setText(ControlExample.getResourceString("Center"));
-		rightButton = new Button (allignmentGroup, SWT.RADIO);
-		rightButton.setText (ControlExample.getResourceString("Right"));
-	
-		/* Add the listeners */
-		SelectionListener selectionListener = new SelectionAdapter () {
-			public void widgetSelected(SelectionEvent event) {
-				if (!((Button) event.widget).getSelection ()) return;
-				setExampleWidgetAlignment ();
-			};
-		};
-		leftButton.addSelectionListener (selectionListener);
-		centerButton.addSelectionListener (selectionListener);
-		rightButton.addSelectionListener (selectionListener);
-	}
-	
-	/**
-	 * Sets the alignment of the "Example" widgets.
-	 */
-	abstract void setExampleWidgetAlignment ();
-	
-	/**
-	 * Sets the state of the "Example" widgets.
-	 */
-	void setExampleWidgetState () {
-		super.setExampleWidgetState ();
-		Control [] controls = getExampleWidgets ();
-		if (controls.length != 0) {
-			leftButton.setSelection ((controls [0].getStyle () & SWT.LEFT) != 0);
-			centerButton.setSelection ((controls [0].getStyle () & SWT.CENTER) != 0);
-			rightButton.setSelection ((controls [0].getStyle () & SWT.RIGHT) != 0);
-		}
-	}
-}
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/ButtonTab.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/ButtonTab.java
deleted file mode 100755
index c747b2a..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/ButtonTab.java
+++ /dev/null
@@ -1,194 +0,0 @@
-package org.eclipse.swt.examples.controlexample;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.events.*;
-
-/**
- * <code>ButtonTab</code> is the class that
- * demonstrates SWT buttons.
- */
-class ButtonTab extends AlignableTab {
-
-	/* Example widgets and groups that contain them */
-	Button button1, button2, button3, button4, button5, button6;
-	Group textButtonGroup, imageButtonGroup;
-
-	/* Allignment widgets added to the "Control" group */
-	Button upButton, downButton;
-
-	/* Style widgets added to the "Style" group */
-	Button pushButton, checkButton, radioButton, toggleButton, arrowButton, flatButton;
-	
-	/**
-	 * Creates the Tab within a given instance of ControlExample.
-	 */
-	ButtonTab(ControlExample instance) {
-		super(instance);
-	}
-	
-	/**
-	 * Creates the "Control" group. 
-	 */
-	void createControlGroup () {
-		super.createControlGroup ();
-	
-		/* Create the controls */
-		upButton = new Button (allignmentGroup, SWT.RADIO);
-		upButton.setText (ControlExample.getResourceString("Up"));
-		downButton = new Button (allignmentGroup, SWT.RADIO);
-		downButton.setText (ControlExample.getResourceString("Down"));
-	
-		/* Add the listeners */
-		SelectionListener selectionListener = new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				if (!((Button) event.widget).getSelection()) return;
-				setExampleWidgetAlignment ();
-			};
-		};
-		upButton.addSelectionListener(selectionListener);
-		downButton.addSelectionListener(selectionListener);
-	}
-	
-	/**
-	 * Creates the "Example" group.
-	 */
-	void createExampleGroup () {
-		super.createExampleGroup ();
-		
-		/* Create a group for text buttons */
-		textButtonGroup = new Group(exampleGroup, SWT.NONE);
-		GridLayout gridLayout = new GridLayout ();
-		textButtonGroup.setLayout(gridLayout);
-		gridLayout.numColumns = 3;
-		textButtonGroup.setLayoutData (new GridData (GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
-		textButtonGroup.setText (ControlExample.getResourceString("Text_Buttons"));
-	
-		/* Create a group for the image buttons */
-		imageButtonGroup = new Group(exampleGroup, SWT.NONE);
-		gridLayout = new GridLayout();
-		imageButtonGroup.setLayout(gridLayout);
-		gridLayout.numColumns = 3;
-		imageButtonGroup.setLayoutData (new GridData (GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
-		imageButtonGroup.setText (ControlExample.getResourceString("Image_Buttons"));
-	}
-	
-	/**
-	 * Creates the "Example" widgets.
-	 */
-	void createExampleWidgets () {
-	
-		/* Compute the widget style */
-		int style = SWT.NONE;
-		if (pushButton.getSelection()) style |= SWT.PUSH;
-		if (checkButton.getSelection()) style |= SWT.CHECK;
-		if (radioButton.getSelection()) style |= SWT.RADIO;
-		if (toggleButton.getSelection()) style |= SWT.TOGGLE;
-		if (arrowButton.getSelection()) style |= SWT.ARROW;
-		if (flatButton.getSelection()) style |= SWT.FLAT;
-		if (borderButton.getSelection()) style |= SWT.BORDER;
-	
-		/* Create the example widgets */
-		button1 = new Button(textButtonGroup, style);
-		button1.setText(ControlExample.getResourceString("One"));
-		button2 = new Button(textButtonGroup, style);
-		button2.setText(ControlExample.getResourceString("Two"));
-		button3 = new Button(textButtonGroup, style);
-		button3.setText(ControlExample.getResourceString("Three"));
-		button4 = new Button(imageButtonGroup, style);
-		button4.setImage(instance.images[ControlExample.ciClosedFolder]);
-		button5 = new Button(imageButtonGroup, style);
-		button5.setImage(instance.images[ControlExample.ciOpenFolder]);
-		button6 = new Button(imageButtonGroup, style);
-		button6.setImage(instance.images[ControlExample.ciTarget]);
-	}
-	
-	/**
-	 * Creates the "Style" group.
-	 */
-	void createStyleGroup() {
-		super.createStyleGroup ();
-	
-		/* Create the extra widgets */
-		pushButton = new Button (styleGroup, SWT.RADIO);
-		pushButton.setText("SWT.PUSH");
-		checkButton = new Button (styleGroup, SWT.RADIO);
-		checkButton.setText ("SWT.CHECK");
-		radioButton = new Button (styleGroup, SWT.RADIO);
-		radioButton.setText ("SWT.RADIO");
-		toggleButton = new Button (styleGroup, SWT.RADIO);
-		toggleButton.setText ("SWT.TOGGLE");
-		arrowButton = new Button (styleGroup, SWT.RADIO);
-		arrowButton.setText ("SWT.ARROW");
-		flatButton = new Button (styleGroup, SWT.CHECK);
-		flatButton.setText ("SWT.FLAT");
-		borderButton = new Button (styleGroup, SWT.CHECK);
-		borderButton.setText ("SWT.BORDER");
-	}
-	
-	/**
-	 * Gets the "Example" widget children.
-	 */
-	Control [] getExampleWidgets () {
-		return new Control [] {button1, button2, button3, button4, button5, button6};
-	}
-	
-	/**
-	 * Gets the text for the tab folder item.
-	 */
-	String getTabText () {
-		return "Button";
-	}
-	
-	/**
-	 * Sets the alignment of the "Example" widgets.
-	 */
-	void setExampleWidgetAlignment () {
-		int allignment = 0;
-		if (leftButton.getSelection ()) allignment = SWT.LEFT;
-		if (centerButton.getSelection ()) allignment = SWT.CENTER;
-		if (rightButton.getSelection ()) allignment = SWT.RIGHT;
-		if (upButton.getSelection ()) allignment = SWT.UP;
-		if (downButton.getSelection ()) allignment = SWT.DOWN;
-		button1.setAlignment (allignment);
-		button2.setAlignment (allignment);
-		button3.setAlignment (allignment);
-		button4.setAlignment (allignment);
-		button5.setAlignment (allignment);
-		button6.setAlignment (allignment);
-	}
-	
-	/**
-	 * Sets the state of the "Example" widgets.
-	 */
-	void setExampleWidgetState () {
-		super.setExampleWidgetState ();
-		if (arrowButton.getSelection ()) {
-			upButton.setEnabled (true);
-			centerButton.setEnabled (false);
-			downButton.setEnabled (true);
-		} else {
-			upButton.setEnabled (false);
-			centerButton.setEnabled (true);
-			downButton.setEnabled (false);
-		}
-		upButton.setSelection ((button1.getStyle () & SWT.UP) != 0);
-		downButton.setSelection ((button1.getStyle () & SWT.DOWN) != 0);
-		pushButton.setSelection ((button1.getStyle () & SWT.PUSH) != 0);
-		checkButton.setSelection ((button1.getStyle () & SWT.CHECK) != 0);
-		radioButton.setSelection ((button1.getStyle () & SWT.RADIO) != 0);
-		toggleButton.setSelection ((button1.getStyle () & SWT.TOGGLE) != 0);
-		arrowButton.setSelection ((button1.getStyle () & SWT.ARROW) != 0);
-		flatButton.setSelection ((button1.getStyle () & SWT.FLAT) != 0);
-		borderButton.setSelection ((button1.getStyle () & SWT.BORDER) != 0);
-	}
-}
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/ComboTab.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/ComboTab.java
deleted file mode 100755
index 1ef6946..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/ComboTab.java
+++ /dev/null
@@ -1,116 +0,0 @@
-package org.eclipse.swt.examples.controlexample;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.events.*;
-
-class ComboTab extends Tab {
-
-	/* Example widgets and groups that contain them */
-	Combo combo1;
-	Group comboGroup;
-	
-	/* Style widgets added to the "Style" group */
-	Button dropDownButton, readOnlyButton, simpleButton;
-	
-	static String [] ListData = {ControlExample.getResourceString("ListData0_0"),
-								 ControlExample.getResourceString("ListData0_1"),
-								 ControlExample.getResourceString("ListData0_2"),
-								 ControlExample.getResourceString("ListData0_3"),
-								 ControlExample.getResourceString("ListData0_4"),
-								 ControlExample.getResourceString("ListData0_5"),
-								 ControlExample.getResourceString("ListData0_6"),
-								 ControlExample.getResourceString("ListData0_7"),
-								 ControlExample.getResourceString("ListData0_8")};
-
-	/**
-	 * Creates the Tab within a given instance of ControlExample.
-	 */
-	ComboTab(ControlExample instance) {
-		super(instance);
-	}
-	
-	/**
-	 * Creates the "Example" group.
-	 */
-	void createExampleGroup () {
-		super.createExampleGroup ();
-		
-		/* Create a group for the combo box */
-		comboGroup = new Group (exampleGroup, SWT.NULL);
-		comboGroup.setLayout (new GridLayout ());
-		comboGroup.setLayoutData (new GridData (GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
-		comboGroup.setText ("Combo");
-	}
-	
-	/**
-	 * Creates the "Example" widgets.
-	 */
-	void createExampleWidgets () {
-		
-		/* Compute the widget style */
-		int style = SWT.NONE;
-		if (dropDownButton.getSelection ()) style |= SWT.DROP_DOWN;
-		if (readOnlyButton.getSelection ()) style |= SWT.READ_ONLY;
-		if (simpleButton.getSelection ()) style |= SWT.SIMPLE;
-		if (borderButton.getSelection ()) style |= SWT.BORDER;
-		
-		/* Create the example widgets */
-		combo1 = new Combo (comboGroup, style);
-		combo1.setItems (ListData);
-		if (ListData.length >= 3) {
-			combo1.setText(ListData [2]);
-		}
-	}
-	
-	/**
-	 * Creates the "Style" group.
-	 */
-	void createStyleGroup () {
-		super.createStyleGroup ();
-	
-		/* Create the extra widgets */
-		dropDownButton = new Button (styleGroup, SWT.RADIO);
-		dropDownButton.setText ("SWT.DROP_DOWN");
-		simpleButton = new Button (styleGroup, SWT.RADIO);
-		simpleButton.setText("SWT.SIMPLE");
-		readOnlyButton = new Button (styleGroup, SWT.CHECK);
-		readOnlyButton.setText ("SWT.READ_ONLY");
-		borderButton = new Button (styleGroup, SWT.CHECK);
-		borderButton.setText ("SWT.BORDER");
-	}
-	
-	/**
-	 * Gets the "Example" widget children.
-	 */
-	Control [] getExampleWidgets () {
-		return new Control [] {combo1};
-	}
-	
-	/**
-	 * Gets the text for the tab folder item.
-	 */
-	String getTabText () {
-		return "Combo";
-	}
-	
-	/**
-	 * Sets the state of the "Example" widgets.
-	 */
-	void setExampleWidgetState () {
-		super.setExampleWidgetState ();
-		dropDownButton.setSelection ((combo1.getStyle () & SWT.DROP_DOWN) != 0);
-		simpleButton.setSelection ((combo1.getStyle () & SWT.SIMPLE) != 0);
-		readOnlyButton.setSelection ((combo1.getStyle () & SWT.READ_ONLY) != 0);
-		borderButton.setSelection ((combo1.getStyle () & SWT.BORDER) != 0);
-	}
-}
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/ControlExample.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/ControlExample.java
deleted file mode 100755
index 300e433..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/ControlExample.java
+++ /dev/null
@@ -1,179 +0,0 @@
-package org.eclipse.swt.examples.controlexample;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.widgets.*;
-
-import java.text.*;
-import java.util.*;
-
-public class ControlExample {
-	private static ResourceBundle resourceBundle =
-		ResourceBundle.getBundle("examples_control");
-	private ShellTab shellTab;
-	private TabFolder tabFolder;
-
-	static final int
-		ciClosedFolder = 0,
-		ciOpenFolder = 1,
-		ciTarget = 2;
-	static final String[] imageLocations = {
-		"closedFolder.gif",
-		"openFolder.gif",
-		"target.gif" };
-	Image images[];
-
-	/**
-	 * Creates an instance of a ControlExample embedded inside
-	 * the supplied parent Composite.
-	 * 
-	 * @param parent the container of the example
-	 */
-	public ControlExample(Composite parent) {
-		initResources();
-		tabFolder = new TabFolder (parent, SWT.NULL);
-		Tab [] tabs = new Tab [] {
-			new ButtonTab (this),
-			new ComboTab (this),
-			new CoolBarTab (this),
-			new DialogTab (this),
-			new LabelTab (this),
-			new ListTab (this),
-			new ProgressBarTab (this),
-			new SashTab (this),
-			shellTab = new ShellTab(this),
-			new SliderTab (this),
-			new TableTab (this),
-			new TextTab (this),
-			new ToolBarTab (this),
-			new TreeTab (this),
-		};
-		for (int i=0; i<tabs.length; i++) {
-			TabItem item = new TabItem (tabFolder, SWT.NULL);
-		    item.setText (tabs [i].getTabText ());
-		    item.setControl (tabs [i].createTabFolderPage (tabFolder));
-		}
-	}
-	
-	/**
-	 * Grabs input focus.
-	 */
-	public void setFocus() {
-		tabFolder.setFocus();
-	}
-
-	/**
-	 * Disposes of all resources associated with a particular
-	 * instance of the ControlExample.
-	 */	
-	public void dispose() {
-		/*
-		 * Destroy any shells that may have been created
-		 * by the Shells tab.  When a shell is disposed,
-		 * all child shells are also disposed.  Therefore
-		 * it is necessary to check for disposed shells
-		 * in the shells list to avoid disposing a shell
-		 * twice.
-		 */
-		if (shellTab != null) shellTab.closeAllShells ();
-		shellTab = null;
-		tabFolder = null;
-		freeResources();
-	}
-
-	/**
-	 * Invokes as a standalone program.
-	 */
-	public static void main(String[] args) {
-		Display display = new Display();
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		ControlExample instance = new ControlExample(shell);
-		shell.setText(getResourceString("window.title"));
-		shell.open();
-		while (! shell.isDisposed()) {
-			if (! display.readAndDispatch()) display.sleep();
-		}
-		instance.dispose();
-	}
-
-	/**
-	 * Gets a string from the resource bundle.
-	 * We don't want to crash because of a missing String.
-	 * Returns the key if not found.
-	 */
-	static String getResourceString(String key) {
-		try {
-			return resourceBundle.getString(key);
-		} catch (MissingResourceException e) {
-			return key;
-		} catch (NullPointerException e) {
-			return "!" + key + "!";
-		}			
-	}
-
-	/**
-	 * Gets a string from the resource bundle and binds it
-	 * with the given arguments. If the key is not found,
-	 * return the key.
-	 */
-	static String getResourceString(String key, Object[] args) {
-		try {
-			return MessageFormat.format(getResourceString(key), args);
-		} catch (MissingResourceException e) {
-			return key;
-		} catch (NullPointerException e) {
-			return "!" + key + "!";
-		}
-	}
-
-	/**
-	 * Loads the resources
-	 */
-	private void initResources() {
-		final Class clazz = ControlExample.class;
-		if (resourceBundle != null) {
-			try {
-				if (images == null) {
-					images = new Image[imageLocations.length];
-					
-					for (int i = 0; i < imageLocations.length; ++i) {
-						ImageData source = new ImageData(clazz.getResourceAsStream(
-							imageLocations[i]));
-						ImageData mask = source.getTransparencyMask();
-						images[i] = new Image(null, source, mask);
-					}
-				}
-				return;
-			} catch (Throwable t) {
-			}
-		}
-		String error = (resourceBundle != null) ?
-			getResourceString("error.CouldNotLoadResources") :
-			"Unable to load resources";
-		freeResources();
-		throw new RuntimeException(error);
-	}
-
-	/**
-	 * Frees the resources
-	 */
-	private void freeResources() {
-		if (images != null) {
-			for (int i = 0; i < images.length; ++i) {
-				final Image image = images[i];
-				if (image != null) image.dispose();
-			}
-			images = null;
-		}
-	}
-}
-
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/CoolBarTab.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/CoolBarTab.java
deleted file mode 100644
index 4a64b57..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/CoolBarTab.java
+++ /dev/null
@@ -1,426 +0,0 @@
-package org.eclipse.swt.examples.controlexample;
-
-/*
- * Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
- 
-import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.events.*;
-
-class CoolBarTab extends Tab {
-	Button dropDownButton, lockedButton;
-
-	/* Example widgets and group that contains them */
-	CoolBar coolBar;
-	CoolItem pushItem, dropDownItem, radioItem, checkItem;
-	Group coolBarGroup;
-	
-	Point[] sizes;
-	int[] wrapIndices;
-	int[] order;
-	
-	/**
-	 * Creates the Tab within a given instance of ControlExample.
-	 */
-	CoolBarTab(ControlExample instance) {
-		super(instance);
-	}
-	
-	/**
-	 * Creates the "Display" group.
-	 */
-	void createDisplayGroup () {
-		super.createDisplayGroup ();
-	
-		/* Create display controls specific to this example */
-		lockedButton = new Button (displayGroup, SWT.CHECK);
-		lockedButton.setText (ControlExample.getResourceString("Locked"));
-	
-		/* Add the listeners */
-		lockedButton.addSelectionListener (new SelectionAdapter () {
-			public void widgetSelected (SelectionEvent event) {
-				setWidgetLocked ();
-			}
-		});
-	}
-	
-	/**
-	 * Creates the "Example" group.
-	 */
-	void createExampleGroup () {
-		super.createExampleGroup ();
-		coolBarGroup = new Group (exampleGroup, SWT.NULL);
-		coolBarGroup.setLayout (new GridLayout ());
-		coolBarGroup.setLayoutData (new GridData (GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
-		coolBarGroup.setText ("CoolBar");
-	}
-	
-	/**
-	 * Creates the "Example" widgets.
-	 */
-	void createExampleWidgets () {
-		int style = 0, itemStyle = 0;
-
-		/* Compute the widget style */
-		int toolBarStyle = SWT.FLAT;
-		if (borderButton.getSelection()) style |= SWT.BORDER;
-		if (dropDownButton.getSelection()) itemStyle |= SWT.DROP_DOWN;
-	
-		/*
-		* Create the example widgets.
-		*/
-		coolBar = new CoolBar (coolBarGroup, style);
-		
-		/* create the push button toolbar */
-		ToolBar toolBar = new ToolBar (coolBar, toolBarStyle);
-		ToolItem item = new ToolItem (toolBar, SWT.PUSH);
-		item.setImage (instance.images[ControlExample.ciClosedFolder]);
-		item.setToolTipText ("SWT.PUSH");
-		item = new ToolItem (toolBar, SWT.PUSH);
-		item.setImage (instance.images[ControlExample.ciOpenFolder]);
-		item.setToolTipText ("SWT.PUSH");
-		item = new ToolItem (toolBar, SWT.PUSH);
-		item.setImage (instance.images[ControlExample.ciTarget]);
-		item.setToolTipText ("SWT.PUSH");
-		item = new ToolItem (toolBar, SWT.SEPARATOR);
-		item = new ToolItem (toolBar, SWT.PUSH);
-		item.setImage (instance.images[ControlExample.ciClosedFolder]);
-		item.setToolTipText ("SWT.PUSH");
-		item = new ToolItem (toolBar, SWT.PUSH);
-		item.setImage (instance.images[ControlExample.ciOpenFolder]);
-		item.setToolTipText ("SWT.PUSH");		
-		pushItem = new CoolItem (coolBar, itemStyle);
-		pushItem.setControl (toolBar);
-		Point pushSize = toolBar.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-		pushSize = pushItem.computeSize(pushSize.x, pushSize.y);
-		pushItem.setSize(pushSize);
-		pushItem.setMinimumSize(item.getWidth(), pushSize.y);
-        pushItem.addSelectionListener (new CoolItemSelectionListener());
-				
-		/* create the dropdown toolbar */
-		toolBar = new ToolBar (coolBar, toolBarStyle);
-		item = new ToolItem (toolBar, SWT.DROP_DOWN);
-		item.setImage (instance.images[ControlExample.ciOpenFolder]);
-		item.setToolTipText ("SWT.DROP_DOWN");
-		item.addSelectionListener (new DropDownSelectionListener());
-		item = new ToolItem (toolBar, SWT.DROP_DOWN);
-		item.setImage (instance.images[ControlExample.ciClosedFolder]);
-		item.setToolTipText ("SWT.DROP_DOWN");
-		item.addSelectionListener (new DropDownSelectionListener());
-		dropDownItem = new CoolItem (coolBar, itemStyle);
-		dropDownItem.setControl (toolBar);
-		Point dropSize = toolBar.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-		dropSize = dropDownItem.computeSize(dropSize.x, dropSize.y);
-		dropDownItem.setSize(dropSize);
-		dropDownItem.setMinimumSize(item.getWidth(), dropSize.y);
-        dropDownItem.addSelectionListener (new CoolItemSelectionListener());
-				
-		/* create the radio button toolbar */
-		toolBar = new ToolBar (coolBar, toolBarStyle);
-		item = new ToolItem (toolBar, SWT.RADIO);
-		item.setImage (instance.images[ControlExample.ciClosedFolder]);
-		item.setToolTipText ("SWT.RADIO");
-		item = new ToolItem (toolBar, SWT.RADIO);
-		item.setImage (instance.images[ControlExample.ciClosedFolder]);
-		item.setToolTipText ("SWT.RADIO");
-		item = new ToolItem (toolBar, SWT.RADIO);
-		item.setImage (instance.images[ControlExample.ciClosedFolder]);
-		item.setToolTipText ("SWT.RADIO");
-		radioItem = new CoolItem (coolBar, itemStyle);
-		radioItem.setControl (toolBar);
-		Point radioSize = toolBar.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-		radioSize = radioItem.computeSize(radioSize.x, radioSize.y);
-		radioItem.setSize(radioSize);
-		radioItem.setMinimumSize(item.getWidth(), radioSize.y);
-        radioItem.addSelectionListener (new CoolItemSelectionListener());
-		
-		/* create the check button toolbar */
-		toolBar = new ToolBar (coolBar, toolBarStyle);
-		item = new ToolItem (toolBar, SWT.CHECK);
-		item.setImage (instance.images[ControlExample.ciClosedFolder]);
-		item.setToolTipText ("SWT.CHECK");
-		item = new ToolItem (toolBar, SWT.CHECK);
-		item.setImage (instance.images[ControlExample.ciTarget]);
-		item.setToolTipText ("SWT.CHECK");
-		item = new ToolItem (toolBar, SWT.CHECK);
-		item.setImage (instance.images[ControlExample.ciOpenFolder]);
-		item.setToolTipText ("SWT.CHECK");
-		item = new ToolItem (toolBar, SWT.CHECK);
-		item.setImage (instance.images[ControlExample.ciTarget]);
-		item.setToolTipText ("SWT.CHECK");
-		checkItem = new CoolItem (coolBar, itemStyle);
-		checkItem.setControl (toolBar);
-		Point checkSize = toolBar.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-		checkSize = checkItem.computeSize(checkSize.x, checkSize.y);
-		checkItem.setSize(checkSize);
-		checkItem.setMinimumSize(item.getWidth(), checkSize.y);
-        checkItem.addSelectionListener (new CoolItemSelectionListener());
-		
-		/* if we have saved state, restore it */
-		if (order != null) {
-			coolBar.setItemLayout(order, wrapIndices, sizes);
-			/* 
-			 * special case: because setItemLayout will restore the items
-			 * to the sizes the user left them at, the preferred size may not
-			 * be the same as the actual size. Thus we must explicitly set
-			 * the preferred sizes.
-			 */
-			pushItem.setPreferredSize(pushSize);
-			dropDownItem.setPreferredSize(dropSize);
-			radioItem.setPreferredSize(radioSize);
-			checkItem.setPreferredSize(checkSize);
-		}
-		else {
-			coolBar.setWrapIndices(new int[] {1, 3});
-		}
-		
-		/* add a listener to resize the group box to match the coolbar */
-		coolBar.addListener(SWT.Resize, new Listener() {
-			public void handleEvent(Event event) {
-				exampleGroup.layout();
-			}
-		});
-	}
-	
-	/**
-	 * Creates the "Style" group.
-	 */
-	void createStyleGroup() {
-		super.createStyleGroup();
-	
-		/* Create the extra widget */
-		borderButton = new Button (styleGroup, SWT.CHECK);
-		borderButton.setText ("SWT.BORDER");
-		Group itemGroup = new Group(styleGroup, SWT.NONE);
-		itemGroup.setLayout (new GridLayout ());
-		itemGroup.setLayoutData (new GridData (GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
-		itemGroup.setText(ControlExample.getResourceString("Item_Styles"));
-		dropDownButton = new Button (itemGroup, SWT.CHECK);
-		dropDownButton.setText ("SWT.DROP_DOWN");
-		dropDownButton.addSelectionListener (new SelectionAdapter () {
-			public void widgetSelected (SelectionEvent event) {
-				recreateExampleWidgets ();
-			}
-		});
-	}
-	
-	/**
-	 * Disposes the "Example" widgets.
-	 */
-	void disposeExampleWidgets () {
-		/* store the state of the toolbar if applicable */
-		if (coolBar != null) {
-			sizes = coolBar.getItemSizes();
-			wrapIndices = coolBar.getWrapIndices();
-			order = coolBar.getItemOrder();
-		}
-		super.disposeExampleWidgets();	
-	}
-
-	/**
-	 * Gets the "Example" widget children.
-	 */
-	Control [] getExampleWidgets () {
-		return new Control [] {coolBar};
-	}
-	
-	/**
-	 * Gets the text for the tab folder item.
-	 */
-	String getTabText () {
-		return "CoolBar";
-	}
-	
-	/**
-	 * Sets the state of the "Example" widgets.
-	 */
-	void setExampleWidgetState () {
-		super.setExampleWidgetState ();
-		borderButton.setSelection ((coolBar.getStyle () & SWT.BORDER) != 0);
-		dropDownButton.setSelection ((coolBar.getItem(0).getStyle () & SWT.DROP_DOWN) != 0);
-		setWidgetLocked ();
-	}
-	
-	/**
-	 * Sets the header visible state of the "Example" widgets.
-	 */
-	void setWidgetLocked () {
-		coolBar.setLocked (lockedButton.getSelection ());
-	}
-	
-	/**
-	 * Listens to widgetSelected() events on SWT.DROP_DOWN type ToolItems
-	 * and opens/closes a menu when appropriate.
-	 */
-	class DropDownSelectionListener extends SelectionAdapter {
-		private Menu menu = null;
-		private boolean visible = false;
-		
-		public void widgetSelected(SelectionEvent event) {
-			// Create the menu if it has not already been created
-			if (menu == null) {
-				// Lazy create the menu.
-				Shell shell = tabFolderPage.getShell();
-				menu = new Menu(shell);
-				for (int i = 0; i < 9; ++i) {
-					final String text = ControlExample.getResourceString("DropDownData_" + i);
-					if (text.length() != 0) {
-						MenuItem menuItem = new MenuItem(menu, SWT.NONE);
-						menuItem.setText(text);
-						/*
-						 * Add a menu selection listener so that the menu is hidden
-						 * when the user selects an item from the drop down menu.
-						 */
-						menuItem.addSelectionListener(new SelectionAdapter() {
-							public void widgetSelected(SelectionEvent e) {
-								setMenuVisible(false);
-							}
-						});
-					} else {
-						MenuItem menuItem = new MenuItem(menu, SWT.SEPARATOR);
-					}
-				}
-			}
-			
-			/**
-			 * A selection event will be fired when a drop down tool
-			 * item is selected in the main area and in the drop
-			 * down arrow.  Examine the event detail to determine
-			 * where the widget was selected.
-			 */		
-			if (event.detail == SWT.ARROW) {
-				/*
-				 * The drop down arrow was selected.
-				 */
-				if (visible) {
-					// Hide the menu to give the Arrow the appearance of being a toggle button.
-					setMenuVisible(false);
-				} else {	
-					// Position the menu below and vertically aligned with the the drop down tool button.
-					final ToolItem toolItem = (ToolItem) event.widget;
-					final ToolBar  toolBar = toolItem.getParent();
-					
-					Rectangle toolItemBounds = toolItem.getBounds();
-					Point point = toolBar.toDisplay(new Point(toolItemBounds.x, toolItemBounds.y));
-					menu.setLocation(point.x, point.y + toolItemBounds.height);
-					setMenuVisible(true);
-				}
-			} else {
-				/*
-				 * Main area of drop down tool item selected.
-				 * An application would invoke the code to perform the action for the tool item.
-				 */
-			}
-		}
-		private void setMenuVisible(boolean visible) {
-			menu.setVisible(visible);
-			this.visible = visible;
-		}
-	}
-
-	/**
-	 * Listens to widgetSelected() events on SWT.DROP_DOWN type CoolItems
-	 * and opens/closes a menu when appropriate.
-	 */
-	class CoolItemSelectionListener extends SelectionAdapter {
-		private Menu menu = null;
-		
-		public void widgetSelected(SelectionEvent event) {
-			/**
-			 * A selection event will be fired when the cool item
-			 * is selected by its gripper or if the drop down arrow
-			 * (or 'chevron') is selected. Examine the event detail
-			 * to determine where the widget was selected.
-			 */
-			if (event.detail == SWT.ARROW) {
-				/* If the popup menu is already up (i.e. user pressed arrow twice),
-				 * then dispose it.
-				 */
-				if (menu != null) {
-					menu.dispose();
-					menu = null;
-					return;
-				}
-				
-				/* Get the cool item and convert its bounds to display coordinates. */
-				CoolItem coolItem = (CoolItem) event.widget;
-				Rectangle itemBounds = coolItem.getBounds ();
-				Point pt = coolBar.toDisplay(new Point (itemBounds.x, itemBounds.y));
-				itemBounds.x = pt.x;
-				itemBounds.y = pt.y;
-				
-				/* Get the toolbar from the cool item. */
-				ToolBar toolBar = (ToolBar) coolItem.getControl ();
-				ToolItem[] tools = toolBar.getItems ();
-				int toolCount = tools.length;
-								
-				/* Convert the bounds of each tool item to display coordinates,
-				 * and determine which ones are past the bounds of the cool item.
-				 */
-				int i = 0;
-				while (i < toolCount) {
-					Rectangle toolBounds = tools[i].getBounds ();
-					pt = toolBar.toDisplay(new Point(toolBounds.x, toolBounds.y));
-					toolBounds.x = pt.x;
-					toolBounds.y = pt.y;
-			  		Rectangle intersection = itemBounds.intersection (toolBounds);
-			  		if (!intersection.equals (toolBounds)) break;
-			  		i++;
-				}
-				
-				/* Create a pop-up menu with items for each of the hidden buttons. */
-				menu = new Menu (coolBar);
-				for (int j = i; j < toolCount; j++) {
-					ToolItem tool = tools[j];
-					Image image = tool.getImage();
-					if (image == null) {
-						new MenuItem (menu, SWT.SEPARATOR);
-					} else {
-						if ((tool.getStyle() & SWT.DROP_DOWN) != 0) {
-							MenuItem menuItem = new MenuItem (menu, SWT.CASCADE);
-							menuItem.setImage(image);
-							Menu m = new Menu(menu);
-							menuItem.setMenu(m);
-							for (int k = 0; k < 9; ++k) {
-								String text = ControlExample.getResourceString("DropDownData_" + k);
-								if (text.length() != 0) {
-									MenuItem mi = new MenuItem(m, SWT.NONE);
-									mi.setText(text);
-									/* Application code to perform the action for the submenu item would go here. */
-								} else {
-									new MenuItem(m, SWT.SEPARATOR);
-								}
-							}
-						} else {
-							MenuItem menuItem = new MenuItem (menu, SWT.NONE);
-							menuItem.setImage(image);
-						}
-						/* Application code to perform the action for the menu item would go here. */
-
-					}
-				}
-				
-				/* Display the pop-up menu at the lower left corner of the arrow button.
-				 * Dispose the menu when the user is done with it.
-				 */
-				pt = coolBar.toDisplay(new Point(event.x, event.y));
-				menu.setLocation (pt.x, pt.y);
-				menu.setVisible (true);
-				Display display = coolBar.getDisplay ();
-				while (menu != null && menu.isVisible ()) {
-					if (!display.readAndDispatch ()) display.sleep ();
-				}
-				if (menu != null) {
-					menu.dispose ();
-					menu = null;
-				}
-			}
-		}
-	}
-}
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/DialogTab.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/DialogTab.java
deleted file mode 100755
index 6f4150d..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/DialogTab.java
+++ /dev/null
@@ -1,442 +0,0 @@
-package org.eclipse.swt.examples.controlexample;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.printing.*;
-import org.eclipse.swt.events.*;
-
-class DialogTab extends Tab {
-	/* Example widgets and groups that contain them */
-	Group dialogStyleGroup, resultGroup;
-	Text textWidget;
-	
-	/* Style widgets added to the "Style" group */
-	Combo dialogCombo;
-	Button okButton, cancelButton;
-	Button yesButton, noButton;
-	Button retryButton;
-	Button abortButton, ignoreButton;
-	Button iconErrorButton, iconInformationButton, iconQuestionButton;
-	Button iconWarningButton, iconWorkingButton;
-	Button modelessButton, primaryModalButton, applicationModalButton, systemModalButton;
-	Button saveButton, openButton;
-
-	static String [] FilterExtensions	= {"*.txt", "*.bat", "*.doc"};
-	static String [] FilterNames		= {ControlExample.getResourceString("FilterName_0"),
-										   ControlExample.getResourceString("FilterName_1"),
-										   ControlExample.getResourceString("FilterName_2")};
-
-	/**
-	 * Creates the Tab within a given instance of ControlExample.
-	 */
-	DialogTab(ControlExample instance) {
-		super(instance);
-	}
-
-	/**
-	 * Handle a button style selection event.
-	 *
-	 * @param event the selection event
-	 */
-	void buttonStyleSelected(SelectionEvent event) {
-		/*
-		 * Only certain combinations of button styles are
-		 * supported for various dialogs.  Make sure the
-		 * control widget reflects only valid combinations.
-		 */
-		okButton.setEnabled (
-			!(yesButton.getSelection () || noButton.getSelection () || 
-				retryButton.getSelection () || abortButton.getSelection () ||
-					ignoreButton.getSelection ()));
-		cancelButton.setEnabled (
-			!(abortButton.getSelection () || ignoreButton.getSelection ()));
-		yesButton.setEnabled (
-			!(okButton.getSelection () || retryButton.getSelection () ||
-				abortButton.getSelection () || ignoreButton.getSelection ()));
-		noButton.setEnabled (
-			!(okButton.getSelection () || retryButton.getSelection () ||
-				abortButton.getSelection () || ignoreButton.getSelection ()));
-		retryButton.setEnabled (
-			!(okButton.getSelection() || yesButton.getSelection() || noButton.getSelection ()));
-		abortButton.setEnabled (
-			!(okButton.getSelection () || cancelButton.getSelection () ||
-				yesButton.getSelection () || noButton.getSelection ()));
-		ignoreButton.setEnabled (
-			!(okButton.getSelection () || cancelButton.getSelection () |
-				yesButton.getSelection () || noButton.getSelection ()));
-	}
-	
-	/**
-	 * Handle the create button selection event.
-	 *
-	 * @param event org.eclipse.swt.events.SelectionEvent
-	 */
-	void createButtonSelected(SelectionEvent event) {
-	
-		/* Compute the appropriate dialog style */
-		int style = SWT.NULL;
-		if (okButton.getEnabled () && okButton.getSelection ()) style |= SWT.OK;
-		if (cancelButton.getEnabled () && cancelButton.getSelection ()) style |= SWT.CANCEL;
-		if (yesButton.getEnabled () && yesButton.getSelection ()) style |= SWT.YES;
-		if (noButton.getEnabled () && noButton.getSelection ()) style |= SWT.NO;
-		if (retryButton.getEnabled () && retryButton.getSelection ()) style |= SWT.RETRY;
-		if (abortButton.getEnabled () && abortButton.getSelection ()) style |= SWT.ABORT;
-		if (ignoreButton.getEnabled () && ignoreButton.getSelection ()) style |= SWT.IGNORE;
-		if (iconErrorButton.getEnabled () && iconErrorButton.getSelection ()) style |= SWT.ICON_ERROR;
-		if (iconInformationButton.getEnabled () && iconInformationButton.getSelection ()) style |= SWT.ICON_INFORMATION;
-		if (iconQuestionButton.getEnabled () && iconQuestionButton.getSelection ()) style |= SWT.ICON_QUESTION;
-		if (iconWarningButton.getEnabled () && iconWarningButton.getSelection ()) style |= SWT.ICON_WARNING;
-		if (iconWorkingButton.getEnabled () && iconWorkingButton.getSelection ()) style |= SWT.ICON_WORKING;
-		if (primaryModalButton.getEnabled () && primaryModalButton.getSelection ()) style |= SWT.PRIMARY_MODAL;
-		if (applicationModalButton.getEnabled () && applicationModalButton.getSelection ()) style |= SWT.APPLICATION_MODAL;
-		if (systemModalButton.getEnabled () && systemModalButton.getSelection ()) style |= SWT.SYSTEM_MODAL;
-		if (saveButton.getEnabled () && saveButton.getSelection ()) style |= SWT.SAVE;
-		if (openButton.getEnabled () && openButton.getSelection ()) style |= SWT.OPEN;
-	
-		/* Open the appropriate dialog type */
-		String name = dialogCombo.getText ();
-		Shell shell = tabFolderPage.getShell ();
-		
-		if (name.equals (instance.getResourceString("ColorDialog"))) {
-			ColorDialog dialog = new ColorDialog (shell ,style);
-			dialog.setRGB (new RGB (100, 100, 100));
-			dialog.setText (instance.getResourceString("Title"));
-			RGB result = dialog.open ();
-			textWidget.append (instance.getResourceString("ColorDialog") + Text.DELIMITER);
-			textWidget.append (instance.getResourceString("Result", new String [] {"" + result}) + Text.DELIMITER + Text.DELIMITER);
-			return;
-		}
-		
-		if (name.equals (instance.getResourceString("DirectoryDialog"))) {
-			DirectoryDialog dialog = new DirectoryDialog (shell, style);
-			dialog.setMessage (instance.getResourceString("Example_string"));
-			dialog.setText (instance.getResourceString("Title"));
-			String result = dialog.open ();
-			textWidget.append (instance.getResourceString("DirectoryDialog") + Text.DELIMITER);
-			textWidget.append (instance.getResourceString("Result", new String [] {"" + result}) + Text.DELIMITER + Text.DELIMITER);
-			return;
-		}
-		
-		if (name.equals (instance.getResourceString("FileDialog"))) {
-			FileDialog dialog = new FileDialog (shell, style);
-			dialog.setFileName (instance.getResourceString("readme_txt"));
-			dialog.setFilterNames (FilterNames);
-			dialog.setFilterExtensions (FilterExtensions);
-			dialog.setText (instance.getResourceString("Title"));
-			String result = dialog.open();
-			textWidget.append (instance.getResourceString("FileDialog") + Text.DELIMITER);
-			textWidget.append (instance.getResourceString("Result", new String [] {"" + result}) + Text.DELIMITER + Text.DELIMITER);
-			return;
-		}
-		
-		if (name.equals (instance.getResourceString("FontDialog"))) {
-			FontDialog dialog = new FontDialog (shell, style);
-			dialog.setText (instance.getResourceString("Title"));
-			FontData result = dialog.open ();
-			textWidget.append (instance.getResourceString("FontDialog") + Text.DELIMITER);
-			textWidget.append (instance.getResourceString("Result", new String [] {"" + result}) + Text.DELIMITER + Text.DELIMITER);
-			return;
-		}
-		
-		if (name.equals (instance.getResourceString("PrintDialog"))) {
-			PrintDialog dialog = new PrintDialog (shell, style);
-			dialog.setText(instance.getResourceString("Title"));
-			PrinterData result = dialog.open ();
-			textWidget.append (instance.getResourceString("PrintDialog") + Text.DELIMITER);
-			textWidget.append (instance.getResourceString("Result", new String [] {"" + result}) + Text.DELIMITER + Text.DELIMITER);
-			return;
-		}
-	
-		if (name.equals(instance.getResourceString("MessageBox"))) {
-			MessageBox dialog = new MessageBox (shell, style);
-			dialog.setMessage (instance.getResourceString("Example_string"));
-			dialog.setText (instance.getResourceString("Title"));
-			int result = dialog.open ();
-			textWidget.append (instance.getResourceString("MessageBox") + Text.DELIMITER);
-			/*
-			 * The resulting integer depends on the original
-			 * dialog style.  Decode the result and display it.
-			 */
-			switch (result) {
-				case SWT.OK:
-					textWidget.append (instance.getResourceString("Result", new String [] {"SWT.OK"}));
-					break;
-				case SWT.YES:
-					textWidget.append (instance.getResourceString("Result", new String [] {"SWT.YES"}));
-					break;
-				case SWT.NO:
-					textWidget.append (instance.getResourceString("Result", new String [] {"SWT.NO"}));
-					break;
-				case SWT.CANCEL:
-					textWidget.append (instance.getResourceString("Result", new String [] {"SWT.CANCEL"}));
-					break;
-				case SWT.ABORT: 
-					textWidget.append (instance.getResourceString("Result", new String [] {"SWT.ABORT"}));
-					break;
-				case SWT.RETRY:
-					textWidget.append (instance.getResourceString("Result", new String [] {"SWT.RETRY"}));
-					break;
-				case SWT.IGNORE:
-					textWidget.append (instance.getResourceString("Result", new String [] {"SWT.IGNORE"}));
-					break;
-				default:
-					textWidget.append(instance.getResourceString("Result", new String [] {"" + result}));
-					break;
-			}
-			textWidget.append (Text.DELIMITER + Text.DELIMITER);
-		}
-	}
-	
-	/**
-	 * Creates the "Control" group. 
-	 */
-	void createControlGroup () {
-		/*
-		 * Create the "Control" group.  This is the group on the
-		 * left half of each example tab.  It consists of the
-		 * style group, the display group and the size group.
-		 */			
-		controlGroup = new Group (tabFolderPage, SWT.NULL);
-		GridLayout gridLayout= new GridLayout ();
-		controlGroup.setLayout(gridLayout);
-		gridLayout.numColumns = 2;
-		gridLayout.makeColumnsEqualWidth = true;
-		controlGroup.setLayoutData (new GridData (GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
-		controlGroup.setText (instance.getResourceString("Parameters"));
-		
-		/*
-		 * Create a group to hold the dialog style combo box and
-		 * create dialog button.
-		 */
-		dialogStyleGroup = new Group (controlGroup, SWT.NULL);
-		dialogStyleGroup.setLayout (new GridLayout ());
-		GridData gridData = new GridData (GridData.HORIZONTAL_ALIGN_CENTER);
-		gridData.horizontalSpan = 2;
-		dialogStyleGroup.setLayoutData (gridData);
-		dialogStyleGroup.setText (instance.getResourceString("Dialog_Type"));
-	}
-	
-	/**
-	 * Creates the "Control" widget children.
-	 */
-	void createControlWidgets () {
-	
-		/* Create the combo */
-		String [] strings = {
-			instance.getResourceString("ColorDialog"), 
-			instance.getResourceString("DirectoryDialog"),
-			instance.getResourceString("FileDialog"),
-			instance.getResourceString("FontDialog"),
-			instance.getResourceString("PrintDialog"),
-			instance.getResourceString("MessageBox"),
-		};
-		dialogCombo = new Combo (dialogStyleGroup, SWT.READ_ONLY);
-		dialogCombo.setItems (strings);
-		dialogCombo.setText (strings [0]);
-	
-		/* Create the create dialog button */
-		Button createButton = new Button(dialogStyleGroup, SWT.NULL);
-		createButton.setText (instance.getResourceString("Create_Dialog"));
-		createButton.setLayoutData (new GridData(GridData.HORIZONTAL_ALIGN_CENTER));
-	
-		/* Create a group for the various dialog button style controls */
-		Group buttonStyleGroup = new Group (controlGroup, SWT.NULL);
-		buttonStyleGroup.setLayout (new GridLayout ());
-		buttonStyleGroup.setLayoutData (new GridData (GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
-		buttonStyleGroup.setText (instance.getResourceString("Button_Styles"));
-	
-		/* Create the button style buttons */
-		okButton = new Button (buttonStyleGroup, SWT.CHECK);
-		okButton.setText ("SWT.OK");
-		cancelButton = new Button (buttonStyleGroup, SWT.CHECK);
-		cancelButton.setText ("SWT.CANCEL");
-		yesButton = new Button (buttonStyleGroup, SWT.CHECK);
-		yesButton.setText ("SWT.YES");
-		noButton = new Button (buttonStyleGroup, SWT.CHECK);
-		noButton.setText ("SWT.NO");
-		retryButton = new Button (buttonStyleGroup, SWT.CHECK);
-		retryButton.setText ("SWT.RETRY");
-		abortButton = new Button (buttonStyleGroup, SWT.CHECK);
-		abortButton.setText ("SWT.ABORT");
-		ignoreButton = new Button (buttonStyleGroup, SWT.CHECK);
-		ignoreButton.setText ("SWT.IGNORE");
-	
-		/* Create a group for the icon style controls */
-		Group iconStyleGroup = new Group (controlGroup, SWT.NULL);
-		iconStyleGroup.setLayout (new GridLayout ());
-		iconStyleGroup.setLayoutData (new GridData (GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
-		iconStyleGroup.setText (instance.getResourceString("Icon_Styles"));
-	
-		/* Create the icon style buttons */
-		iconErrorButton = new Button (iconStyleGroup, SWT.RADIO);
-		iconErrorButton.setText ("SWT.ICON_ERROR");
-		iconInformationButton = new Button (iconStyleGroup, SWT.RADIO);
-		iconInformationButton.setText ("SWT.ICON_INFORMATION");
-		iconQuestionButton = new Button (iconStyleGroup, SWT.RADIO);
-		iconQuestionButton.setText ("SWT.ICON_QUESTION");
-		iconWarningButton = new Button (iconStyleGroup, SWT.RADIO);
-		iconWarningButton.setText ("SWT.ICON_WARNING");
-		iconWorkingButton = new Button (iconStyleGroup, SWT.RADIO);
-		iconWorkingButton.setText ("SWT.ICON_WORKING");
-	
-		/* Create a group for the modal style controls */
-		Group modalStyleGroup = new Group (controlGroup, SWT.NULL);
-		modalStyleGroup.setLayout (new GridLayout ());
-		modalStyleGroup.setLayoutData (new GridData (GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
-		modalStyleGroup.setText (instance.getResourceString("Modal_Styles"));
-	
-		/* Create the modal style buttons */
-		modelessButton = new Button (modalStyleGroup, SWT.RADIO);
-		modelessButton.setText ("SWT.MODELESS");
-		primaryModalButton = new Button (modalStyleGroup, SWT.RADIO);
-		primaryModalButton.setText ("SWT.PRIMARY_MODAL");
-		applicationModalButton = new Button (modalStyleGroup, SWT.RADIO);
-		applicationModalButton.setText ("SWT.APPLICATION_MODAL");
-		systemModalButton = new Button (modalStyleGroup, SWT.RADIO);
-		systemModalButton.setText ("SWT.SYSTEM_MODAL");
-	
-		/* Create a group for the file dialog style controls */
-		Group fileDialogStyleGroup = new Group (controlGroup, SWT.NULL);
-		fileDialogStyleGroup.setLayout (new GridLayout ());
-		fileDialogStyleGroup.setLayoutData (new GridData (GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
-		fileDialogStyleGroup.setText (instance.getResourceString("File_Dialog_Styles"));
-	
-		/* Create the file dialog style buttons */
-		saveButton = new Button (fileDialogStyleGroup, SWT.RADIO);
-		saveButton.setText ("SWT.SAVE");
-		openButton = new Button(fileDialogStyleGroup, SWT.RADIO);
-		openButton.setText("SWT.OPEN");
-	
-		/* Add the listeners */
-		dialogCombo.addSelectionListener (new SelectionAdapter () {
-			public void widgetSelected (SelectionEvent event) {
-				dialogSelected (event);
-			};
-		});
-		createButton.addSelectionListener (new SelectionAdapter () {
-			public void widgetSelected (SelectionEvent event) {
-				createButtonSelected (event);
-			};
-		});
-		SelectionListener buttonStyleListener = new SelectionAdapter () {
-			public void widgetSelected (SelectionEvent event) {
-				buttonStyleSelected (event);
-			};
-		};
-		okButton.addSelectionListener (buttonStyleListener);
-		cancelButton.addSelectionListener (buttonStyleListener);
-		yesButton.addSelectionListener (buttonStyleListener);
-		noButton.addSelectionListener (buttonStyleListener);
-		retryButton.addSelectionListener (buttonStyleListener);
-		abortButton.addSelectionListener (buttonStyleListener);
-		ignoreButton.addSelectionListener (buttonStyleListener);
-	
-		/* Set default values for style buttons */
-		okButton.setEnabled (false);
-		cancelButton.setEnabled (false);
-		yesButton.setEnabled (false);
-		noButton.setEnabled (false);
-		retryButton.setEnabled (false);
-		abortButton.setEnabled (false);
-		ignoreButton.setEnabled (false);
-		iconErrorButton.setEnabled (false);
-		iconInformationButton.setEnabled (false);
-		iconQuestionButton.setEnabled (false);
-		iconWarningButton.setEnabled (false);
-		iconWorkingButton.setEnabled (false);
-		saveButton.setEnabled (false);
-		openButton.setEnabled (false);
-		openButton.setSelection (true);
-		iconInformationButton.setSelection (true);
-		modelessButton.setSelection (true);
-	}
-	
-	/**
-	 * Creates the "Example" group.
-	 */
-	void createExampleGroup () {
-		super.createExampleGroup ();
-		
-		/*
-		 * Create a group for the text widget to display
-		 * the results returned by the example dialogs.
-		 */
-		resultGroup = new Group (exampleGroup, SWT.NULL);
-		resultGroup.setLayout (new GridLayout ());
-		resultGroup.setLayoutData (new GridData (GridData.FILL_BOTH));
-		resultGroup.setText (instance.getResourceString("Dialog_Result"));
-	}
-	
-	/**
-	 * Creates the "Example" widgets.
-	 */
-	void createExampleWidgets () {
-		/*
-		 * Create a multi lined, scrolled text widget for output.
-		 */
-		textWidget = new Text(resultGroup, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-		GridData gridData = new GridData (GridData.FILL_BOTH);
-		textWidget.setLayoutData (gridData);	
-	}
-	
-	/**
-	 * Handle a dialog type combo selection event.
-	 *
-	 * @param event the selection event
-	 */
-	void dialogSelected (SelectionEvent event) {
-	
-		/* Enable/Disable the buttons */
-		String name = dialogCombo.getText ();
-		boolean isMessageBox = name.equals (instance.getResourceString("MessageBox"));
-		boolean isFileDialog = name.equals (instance.getResourceString("FileDialog"));
-		okButton.setEnabled (isMessageBox);
-		cancelButton.setEnabled (isMessageBox);
-		yesButton.setEnabled (isMessageBox);
-		noButton.setEnabled (isMessageBox);
-		retryButton.setEnabled (isMessageBox);
-		abortButton.setEnabled (isMessageBox);
-		ignoreButton.setEnabled (isMessageBox);
-		iconErrorButton.setEnabled (isMessageBox);
-		iconInformationButton.setEnabled (isMessageBox);
-		iconQuestionButton.setEnabled (isMessageBox);
-		iconWarningButton.setEnabled (isMessageBox);
-		iconWorkingButton.setEnabled  (isMessageBox);
-		saveButton.setEnabled (isFileDialog);
-		openButton.setEnabled (isFileDialog);
-	
-		/* Unselect the buttons */
-		if (!isMessageBox) {
-			okButton.setSelection (false);
-			cancelButton.setSelection (false);
-			yesButton.setSelection (false);
-			noButton.setSelection (false);
-			retryButton.setSelection (false);
-			abortButton.setSelection (false);
-			ignoreButton.setSelection (false);
-		}
-	}
-	
-	/**
-	 * Gets the "Example" widget children.
-	 */
-	Control [] getExampleWidgets () {
-		return new Control [0];
-	}
-	
-	/**
-	 * Gets the text for the tab folder item.
-	 */
-	String getTabText () {
-		return "Dialog";
-	}
-}
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/LabelTab.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/LabelTab.java
deleted file mode 100755
index fe21b4d..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/LabelTab.java
+++ /dev/null
@@ -1,176 +0,0 @@
-package org.eclipse.swt.examples.controlexample;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.events.*;
-
-class LabelTab extends AlignableTab {
-	/* Example widgets and groups that contain them */
-	Label label1, label2, label3, label4, label5, label6;
-	Group textLabelGroup, imageLabelGroup;
-
-	/* Style widgets added to the "Style" group */
-	Button separatorButton, wrapButton, horizontalButton, verticalButton, shadowInButton, shadowOutButton;
-	
-	/**
-	 * Creates the Tab within a given instance of ControlExample.
-	 */
-	LabelTab(ControlExample instance) {
-		super(instance);
-	}
-	
-	/**
-	 * Creates the "Example" group.
-	 */
-	void createExampleGroup () {
-		super.createExampleGroup ();
-		
-		/* Create a group for the text labels */
-		textLabelGroup = new Group(exampleGroup, SWT.NULL);
-		GridLayout gridLayout = new GridLayout ();
-		textLabelGroup.setLayout (gridLayout);
-		gridLayout.numColumns = 3;
-		textLabelGroup.setLayoutData (new GridData (GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
-		textLabelGroup.setText (ControlExample.getResourceString("Text_Labels"));
-	
-		/* Create a group for the image labels */
-		imageLabelGroup = new Group (exampleGroup, SWT.SHADOW_NONE);
-		gridLayout = new GridLayout ();
-		imageLabelGroup.setLayout (gridLayout);
-		gridLayout.numColumns = 3;
-		imageLabelGroup.setLayoutData (new GridData (GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
-		imageLabelGroup.setText (ControlExample.getResourceString("Image_Labels"));
-	}
-	
-	/**
-	 * Creates the "Example" widgets.
-	 */
-	void createExampleWidgets () {
-		
-		/* Compute the widget style */
-		int style = SWT.NONE;
-		if (separatorButton.getSelection ()) style |= SWT.SEPARATOR;
-		if (wrapButton.getSelection ()) style |= SWT.WRAP;
-		if (horizontalButton.getSelection ()) style |= SWT.HORIZONTAL;
-		if (verticalButton.getSelection ()) style |= SWT.VERTICAL;
-		if (shadowInButton.getSelection ()) style |= SWT.SHADOW_IN;
-		if (shadowOutButton.getSelection ()) style |= SWT.SHADOW_OUT;
-		if (borderButton.getSelection ()) style |= SWT.BORDER;
-	
-		/* Create the example widgets */
-		label1 = new Label (textLabelGroup, style);
-		label1.setText(ControlExample.getResourceString("One"));
-		label2 = new Label (textLabelGroup, style);
-		label2.setText(ControlExample.getResourceString("Two"));
-		label3 = new Label (textLabelGroup, style);
-		if (wrapButton.getSelection ()) {
-			label3.setText (ControlExample.getResourceString("Wrap_Text"));
-		} else {
-			label3.setText (ControlExample.getResourceString("Three"));
-		}
-		label4 = new Label (imageLabelGroup, style);
-		label4.setImage (instance.images[ControlExample.ciClosedFolder]);
-		label5 = new Label (imageLabelGroup, style);
-		label5.setImage (instance.images[ControlExample.ciOpenFolder]);
-		label6 = new Label(imageLabelGroup, style);
-		label6.setImage (instance.images[ControlExample.ciTarget]);
-	}
-	
-	/**
-	 * Creates the "Style" group.
-	 */
-	void createStyleGroup() {
-		super.createStyleGroup ();
-		
-		/* Create the extra widgets */
-		separatorButton = new Button (styleGroup, SWT.CHECK);
-		separatorButton.setText ("SWT.SEPARATOR");
-		wrapButton = new Button (styleGroup, SWT.CHECK);
-		wrapButton.setText ("SWT.WRAP");
-		horizontalButton = new Button (styleGroup, SWT.RADIO);
-		horizontalButton.setText ("SWT.HORIZONTAL");
-		verticalButton = new Button (styleGroup, SWT.RADIO);
-		verticalButton.setText ("SWT.VERTICAL");
-		Group styleSubGroup = new Group (styleGroup, SWT.NULL);
-		styleSubGroup.setLayout (new GridLayout ());
-		shadowInButton = new Button (styleSubGroup, SWT.RADIO);
-		shadowInButton.setText ("SWT.SHADOW_IN");
-		shadowOutButton = new Button (styleSubGroup, SWT.RADIO);
-		shadowOutButton.setText ("SWT.SHADOW_OUT");
-		borderButton = new Button(styleGroup, SWT.CHECK);
-		borderButton.setText("SWT.BORDER");
-	
-		/* Add the listeners */
-		SelectionListener selectionListener = new SelectionAdapter () {
-			public void widgetSelected(SelectionEvent event) {
-				if ((event.widget.getStyle() & SWT.RADIO) != 0) {
-					if (!((Button) event.widget).getSelection ()) return;
-				}
-				recreateExampleWidgets ();
-			};
-		};
-		shadowInButton.addSelectionListener (selectionListener);
-		shadowOutButton.addSelectionListener (selectionListener);
-	}
-	
-	/**
-	 * Gets the "Example" widget children.
-	 */
-	Control [] getExampleWidgets () {
-		return new Control [] {label1, label2, label3, label4, label5, label6};
-	}
-	
-	/**
-	 * Gets the text for the tab folder item.
-	 */
-	String getTabText () {
-		return "Label";
-	}
-	
-	/**
-	 * Sets the alignment of the "Example" widgets.
-	 */
-	void setExampleWidgetAlignment () {
-		int allignment = 0;
-		if (leftButton.getSelection ()) allignment = SWT.LEFT;
-		if (centerButton.getSelection ()) allignment = SWT.CENTER;
-		if (rightButton.getSelection ()) allignment = SWT.RIGHT;
-		label1.setAlignment (allignment);
-		label2.setAlignment (allignment);
-		label3.setAlignment (allignment);
-		label4.setAlignment (allignment);
-		label5.setAlignment (allignment);
-		label6.setAlignment (allignment);
-	}
-	
-	/**
-	 * Sets the state of the "Example" widgets.
-	 */
-	void setExampleWidgetState () {
-		super.setExampleWidgetState ();
-		boolean isSeparator = (label1.getStyle () & SWT.SEPARATOR) != 0;
-		wrapButton.setSelection (!isSeparator && (label1.getStyle () & SWT.WRAP) != 0);
-		leftButton.setSelection (!isSeparator && (label1.getStyle () & SWT.LEFT) != 0);
-		centerButton.setSelection (!isSeparator && (label1.getStyle () & SWT.CENTER) != 0);
-		rightButton.setSelection (!isSeparator && (label1.getStyle () & SWT.RIGHT) != 0);
-		shadowInButton.setSelection (isSeparator && (label1.getStyle () & SWT.SHADOW_IN) != 0);
-		shadowOutButton.setSelection (!shadowInButton.getSelection ());
-		wrapButton.setEnabled (!isSeparator);
-		leftButton.setEnabled (!isSeparator);
-		centerButton.setEnabled (!isSeparator);
-		rightButton.setEnabled (!isSeparator);
-		shadowInButton.setEnabled (isSeparator);
-		shadowOutButton.setEnabled (isSeparator);
-		horizontalButton.setEnabled (isSeparator);
-		verticalButton.setEnabled (isSeparator);
-	}
-}
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/ListTab.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/ListTab.java
deleted file mode 100755
index 66c6fb8..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/ListTab.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package org.eclipse.swt.examples.controlexample;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.events.*;
-
-class ListTab extends ScrollableTab {
-
-	/* Example widgets and groups that contain them */
-	List list1;
-	Group listGroup;
-	
-	static String [] ListData1 = {ControlExample.getResourceString("ListData1_0"),
-								  ControlExample.getResourceString("ListData1_1"),
-								  ControlExample.getResourceString("ListData1_2"),
-								  ControlExample.getResourceString("ListData1_3"),
-								  ControlExample.getResourceString("ListData1_4"),
-								  ControlExample.getResourceString("ListData1_5"),
-								  ControlExample.getResourceString("ListData1_6"),
-								  ControlExample.getResourceString("ListData1_7"),
-								  ControlExample.getResourceString("ListData1_8")};
-
-	/**
-	 * Creates the Tab within a given instance of ControlExample.
-	 */
-	ListTab(ControlExample instance) {
-		super(instance);
-	}
-	
-	/**
-	 * Creates the "Example" group.
-	 */
-	void createExampleGroup () {
-		super.createExampleGroup ();
-		
-		/* Create a group for the list */
-		listGroup = new Group (exampleGroup, SWT.NULL);
-		listGroup.setLayout (new GridLayout ());
-		listGroup.setLayoutData (new GridData (GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
-		listGroup.setText ("List");
-	}
-	
-	/**
-	 * Creates the "Example" widgets.
-	 */
-	void createExampleWidgets () {
-		
-		/* Compute the widget style */
-		int style = SWT.NONE;
-		if (singleButton.getSelection ()) style |= SWT.SINGLE;
-		if (multiButton.getSelection ()) style |= SWT.MULTI;
-		if (horizontalButton.getSelection ()) style |= SWT.H_SCROLL;
-		if (verticalButton.getSelection ()) style |= SWT.V_SCROLL;
-		if (borderButton.getSelection ()) style |= SWT.BORDER;
-	
-		/* Create the example widgets */
-		list1 = new List (listGroup, style);
-		list1.setItems (ListData1);
-	}
-	
-	/**
-	 * Gets the "Example" widget children.
-	 */
-	Control [] getExampleWidgets () {
-		return new Control [] {list1};
-	}
-	
-	/**
-	 * Gets the text for the tab folder item.
-	 */
-	String getTabText () {
-		return "List";
-	}
-}
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/ProgressBarTab.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/ProgressBarTab.java
deleted file mode 100755
index 0d69353..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/ProgressBarTab.java
+++ /dev/null
@@ -1,129 +0,0 @@
-package org.eclipse.swt.examples.controlexample;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.events.*;
-
-class ProgressBarTab extends RangeTab {
-	/* Example widgets and groups that contain them */
-	ProgressBar progressBar1;
-	Group progressBarGroup;
-
-	/* Style widgets added to the "Style" group */
-	Button smoothButton;
-	
-	/**
-	 * Creates the Tab within a given instance of ControlExample.
-	 */
-	ProgressBarTab(ControlExample instance) {
-		super(instance);
-	}
-
-	/**
-	 * Creates the "Example" group.
-	 */
-	void createExampleGroup() {
-		super.createExampleGroup ();
-		
-		/* Create a group for the progress bar */
-		progressBarGroup = new Group (exampleGroup, SWT.NULL);
-		progressBarGroup.setLayout (new GridLayout ());
-		progressBarGroup.setLayoutData (new GridData (GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
-		progressBarGroup.setText ("ProgressBar");
-	}
-	
-	/**
-	 * Creates the "Example" widgets.
-	 */
-	void createExampleWidgets () {
-		
-		/* Compute the widget style */
-		int style = SWT.NONE;
-		if (horizontalButton.getSelection ()) style |= SWT.HORIZONTAL;
-		if (verticalButton.getSelection ()) style |= SWT.VERTICAL;
-		if (smoothButton.getSelection ()) style |= SWT.SMOOTH;
-		if (borderButton.getSelection ()) style |= SWT.BORDER;
-	
-		/* Create the example widgets */
-		progressBar1 = new ProgressBar (progressBarGroup, style);
-		progressBar1.setMaximum (100);
-		progressBar1.setSelection (50);
-	}
-	
-	/**
-	 * Creates the "Style" group.
-	 */
-	void createStyleGroup () {
-		super.createStyleGroup ();
-	
-		/* Create the extra widgets */
-		smoothButton = new Button (styleGroup, SWT.CHECK);
-		smoothButton.setText ("SWT.SMOOTH");
-	}
-	
-	/**
-	 * Gets the "Example" widget children.
-	 */
-	Control [] getExampleWidgets () {
-		return new Control [] {progressBar1};
-	}
-	
-	/**
-	 * Gets the text for the tab folder item.
-	 */
-	String getTabText () {
-		return "ProgressBar";
-	}
-	
-	/**
-	 * Sets the state of the "Example" widgets.
-	 */
-	void setExampleWidgetState () {
-		super.setExampleWidgetState ();
-		maximumScale.setMaximum (progressBar1.getMaximum ());
-		smoothButton.setSelection ((progressBar1.getStyle () & SWT.SMOOTH) != 0);
-	}
-	
-	/**
-	 * Sets the maximum of the "Example" widgets.
-	 */
-	void setWidgetMaximum () {
-		progressBar1.setMaximum (maximumScale.getSelection ());
-		updateScales ();
-	}
-	
-	/**
-	 * Sets the minimim of the "Example" widgets.
-	 */
-	void setWidgetMinimum () { 
-		progressBar1.setMinimum (minimumScale.getSelection ());
-		updateScales ();
-	}
-	
-	/**
-	 * Sets the selection of the "Example" widgets.
-	 */
-	void setWidgetSelection () {
-		progressBar1.setSelection (selectionScale.getSelection ());
-		updateScales ();
-	}
-
-	/**
-	 * Update the scale widgets to reflect the actual value set 
-	 * on the "Example" widget.
-	 */
-	void updateScales () {
-		minimumScale.setSelection (progressBar1.getMinimum ());
-		selectionScale.setSelection (progressBar1.getSelection ());
-		maximumScale.setSelection (progressBar1.getMaximum ());				
- 	}
-}
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/RangeTab.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/RangeTab.java
deleted file mode 100755
index 4fa0ad1..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/RangeTab.java
+++ /dev/null
@@ -1,179 +0,0 @@
-package org.eclipse.swt.examples.controlexample;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.events.*;
-
-abstract class RangeTab extends Tab {
-	/* Style widgets added to the "Style" group */
-	Button horizontalButton, verticalButton;
-
-	/* Scale widgets added to the "Control" group */
-	Scale minimumScale, selectionScale, maximumScale;
-
-	/**
-	 * Creates the Tab within a given instance of ControlExample.
-	 */
-	RangeTab(ControlExample instance) {
-		super(instance);
-	}
-
-	/**
-	 * Creates the "Control" widget children.
-	 */
-	void createControlWidgets () {
-		/* Create controls specific to this example */
-		createMinimumGroup ();
-		createMaximumGroup ();
-		createSelectionGroup ();
-	}
-	
-	/**
-	 * Create a group of widgets to control the maximum
-	 * attribute of the example widget.
-	 */
-	void createMaximumGroup() {
-	
-		/* Create the group */
-		Group maximumGroup = new Group (controlGroup, SWT.NULL);
-		maximumGroup.setLayout (new GridLayout ());
-		maximumGroup.setText (ControlExample.getResourceString("Maximum"));
-		maximumGroup.setLayoutData (new GridData (GridData.FILL_HORIZONTAL));
-	
-		/* Create a scale widget */
-		maximumScale = new Scale (maximumGroup, SWT.NULL);
-		maximumScale.setMaximum (100);
-		maximumScale.setSelection (100);
-		maximumScale.setPageIncrement (10);
-		maximumScale.setIncrement (5);
-		
-		GridData data = new GridData (GridData.FILL_HORIZONTAL);
-		data.widthHint = 100;
-		maximumScale.setLayoutData (data);
-	
-		/* Add the listeners */
-		maximumScale.addSelectionListener(new SelectionAdapter () {
-			public void widgetSelected (SelectionEvent event) {
-				setWidgetMaximum ();
-			};
-		});
-	}
-	
-	/**
-	 * Create a group of widgets to control the minimum
-	 * attribute of the example widget.
-	 */
-	void createMinimumGroup() {
-	
-		/* Create the group */
-		Group minimumGroup = new Group (controlGroup, SWT.NULL);
-		minimumGroup.setLayout (new GridLayout ());
-		minimumGroup.setText (ControlExample.getResourceString("Minimum"));
-		minimumGroup.setLayoutData (new GridData (GridData.FILL_HORIZONTAL));
-	
-		/* Create a scale widget */
-		minimumScale = new Scale (minimumGroup, SWT.NULL);
-		minimumScale.setMaximum (100);
-		minimumScale.setPageIncrement (10);
-		minimumScale.setIncrement (5);
-	
-		GridData data = new GridData (GridData.FILL_HORIZONTAL);
-		data.widthHint = 100;
-		minimumScale.setLayoutData (data);
-
-		/* Add the listeners */
-		minimumScale.addSelectionListener (new SelectionAdapter () {
-			public void widgetSelected (SelectionEvent event) {
-				setWidgetMinimum ();
-			};
-		});
-	
-	}
-	
-	/**
-	 * Create a group of widgets to control the selection
-	 * attribute of the example widget.
-	 */
-	void createSelectionGroup() {
-	
-		/* Create the group */
-		Group selectionGroup = new Group(controlGroup, SWT.NULL);
-		selectionGroup.setLayout(new GridLayout());
-		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-		selectionGroup.setLayoutData(gridData);
-		selectionGroup.setText(ControlExample.getResourceString("Selection"));
-	
-		/* Create a scale widget */
-		selectionScale = new Scale (selectionGroup, SWT.NULL);
-		selectionScale.setMaximum (100);
-		selectionScale.setSelection (50);
-		selectionScale.setPageIncrement (10);
-		selectionScale.setIncrement (5);
-	
-		GridData data = new GridData (GridData.FILL_HORIZONTAL);
-		data.widthHint = 100;
-		selectionScale.setLayoutData (data);
-
-		/* Add the listeners */
-		selectionScale.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				setWidgetSelection ();
-			};
-		});
-		
-	}
-	
-	/**
-	 * Creates the "Style" group.
-	 */
-	void createStyleGroup () {
-		super.createStyleGroup ();
-	
-		/* Create the extra widgets */
-		horizontalButton = new Button (styleGroup, SWT.RADIO);
-		horizontalButton.setText ("SWT.HORIZONTAL");
-		verticalButton = new Button (styleGroup, SWT.RADIO);
-		verticalButton.setText ("SWT.VERTICAL");
-		borderButton = new Button (styleGroup, SWT.CHECK);
-		borderButton.setText ("SWT.BORDER");
-	}
-	
-	/**
-	 * Sets the state of the "Example" widgets.
-	 */
-	void setExampleWidgetState () {
-		super.setExampleWidgetState ();
-		setWidgetMinimum ();
-		setWidgetMaximum ();
-		setWidgetSelection ();
-		Control [] controls = getExampleWidgets ();
-		if (controls.length != 0){
-			horizontalButton.setSelection ((controls [0].getStyle () & SWT.HORIZONTAL) != 0);
-			verticalButton.setSelection ((controls [0].getStyle () & SWT.VERTICAL) != 0);
-			borderButton.setSelection ((controls [0].getStyle () & SWT.BORDER) != 0);
-		}
-	}
-	
-	/**
-	 * Sets the maximum of the "Example" widgets.
-	 */
-	abstract void setWidgetMaximum ();
-	
-	/**
-	 * Sets the minimim of the "Example" widgets.
-	 */
-	abstract void setWidgetMinimum ();
-	
-	/**
-	 * Sets the selection of the "Example" widgets.
-	 */
-	abstract void setWidgetSelection ();
-}
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/SashTab.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/SashTab.java
deleted file mode 100755
index e41a8cc..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/SashTab.java
+++ /dev/null
@@ -1,167 +0,0 @@
-package org.eclipse.swt.examples.controlexample;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.events.*;
-
-class SashTab extends Tab {
-	/* Example widgets and groups that contain them */
-	Sash hSash, vSash;
-	List list1, list2, list3;
-	Text text;
-
-	static String [] ListData0 = {ControlExample.getResourceString("ListData0_0"),
-								  ControlExample.getResourceString("ListData0_1"),
-								  ControlExample.getResourceString("ListData0_2"),
-								  ControlExample.getResourceString("ListData0_3"),
-								  ControlExample.getResourceString("ListData0_4"),
-								  ControlExample.getResourceString("ListData0_5"),
-								  ControlExample.getResourceString("ListData0_6"),
-								  ControlExample.getResourceString("ListData0_7"),
-								  ControlExample.getResourceString("ListData0_8")};
-								  
-	static String [] ListData1 = {ControlExample.getResourceString("ListData1_0"),
-								  ControlExample.getResourceString("ListData1_1"),
-								  ControlExample.getResourceString("ListData1_2"),
-								  ControlExample.getResourceString("ListData1_3"),
-								  ControlExample.getResourceString("ListData1_4"),
-								  ControlExample.getResourceString("ListData1_5"),
-								  ControlExample.getResourceString("ListData1_6"),
-								  ControlExample.getResourceString("ListData1_7"),
-								  ControlExample.getResourceString("ListData1_8")};
-
-	/* Constants */
-	static final int SASH_WIDTH = 3;
-
-	/**
-	 * Creates the Tab within a given instance of ControlExample.
-	 */
-	SashTab(ControlExample instance) {
-		super(instance);
-	}
-
-	/**
-	 * Creates the tab folder page.
-	 */
-	Composite createTabFolderPage (TabFolder tabFolder) {
-		/*
-		 * Create the page.  This example does not use layouts.
-		 */
-		tabFolderPage = new Composite(tabFolder, SWT.BORDER);
-	
-		/* Create the list and text widgets */
-		list1 = new List (tabFolderPage, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER);
-		list1.setItems (ListData0);
-		list2 = new List (tabFolderPage, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER);
-		list2.setItems (ListData1);
-		text = new Text (tabFolderPage, SWT.MULTI | SWT.BORDER);
-		text.setText (ControlExample.getResourceString("Multi_line"));
-	
-		/* Create the sashes */
-		vSash = new Sash (tabFolderPage, SWT.VERTICAL);
-		hSash = new Sash (tabFolderPage, SWT.HORIZONTAL);
-		
-		/* Add the listeners */
-		hSash.addSelectionListener (new SelectionAdapter () {
-			public void widgetSelected (SelectionEvent event) {
-				if (event.detail != SWT.DRAG) {
-					hSash.setBounds (event.x, event.y, event.width, event.height);
-					layout ();
-				}
-			}
-		});
-		vSash.addSelectionListener (new SelectionAdapter () {
-			public void widgetSelected (SelectionEvent event) {
-				if (event.detail != SWT.DRAG) {
-					vSash.setBounds(event.x, event.y, event.width, event.height);
-					layout ();
-				}
-			}
-		});
-		tabFolderPage.addControlListener (new ControlAdapter () {
-			public void controlResized (ControlEvent event) {
-				shellResized ();
-			}
-		});
-	
-		/*
-		* Do not set the bounds of the lists, text and sashes here 
-		* because this method is run before the widget is opened 
-		* so we do not know how big the tabComposite is going to be.
-		* When the widget is opened a resize event will occur 
-		* and the contained widgets can be sized accordingly.
-		*/
-		return tabFolderPage; 
-	}
-	
-	/**
-	 * Gets the text for the tab folder item.
-	 */
-	String getTabText () {
-		return "Sash";
-	}
-	
-	/**
-	 * Layout the list and text widgets according to the new
-	 * positions of the sashes..events.SelectionEvent
-	 */
-	void layout () {
-		
-		Rectangle tabCompositeBounds = tabFolderPage.getClientArea ();
-		Rectangle hSashBounds = hSash.getBounds ();
-		Rectangle vSashBounds = vSash.getBounds ();
-		
-		list1.setBounds (0, 0, vSashBounds.x, hSashBounds.y);
-		list2.setBounds (vSashBounds.x + vSashBounds.width, 0, tabCompositeBounds.width - (vSashBounds.x + vSashBounds.width), hSashBounds.y);
-		text.setBounds (0, hSashBounds.y + hSashBounds.height, tabCompositeBounds.width, tabCompositeBounds.height - (hSashBounds.y + hSashBounds.height));
-	
-		/**
-		* If the horizontal sash has been moved then the vertical
-		* sash is either too long or too short and its size must
-		* be adjusted.
-		*/
-		vSashBounds.height = hSashBounds.y;
-		vSash.setBounds (vSashBounds);
-	}
-	
-	/**
-	 * Handle the shell resized event.
-	 */
-	void shellResized () {
-	
-		/* Get the client area for the shell */
-		Rectangle tabFolderPageBounds = tabFolderPage.getClientArea ();
-		
-		/*
-		* Make list 1 half the width and half the height of the tab leaving room for the sash.
-		* Place list 1 in the top left quadrant of the tab.
-		*/
-		Rectangle list1Bounds = new Rectangle (0, 0, (tabFolderPageBounds.width - SASH_WIDTH) / 2, (tabFolderPageBounds.height - SASH_WIDTH) / 2);
-		list1.setBounds (list1Bounds);
-	
-		/*
-		* Make list 2 half the width and half the height of the tab leaving room for the sash.
-		* Place list 2 in the top right quadrant of the tab.
-		*/
-		list2.setBounds (list1Bounds.width + SASH_WIDTH, 0, tabFolderPageBounds.width - (list1Bounds.width + SASH_WIDTH), list1Bounds.height);
-	
-		/*
-		* Make the text area the full width and half the height of the tab leaving room for the sash.
-		* Place the text area in the bottom half of the tab.
-		*/
-		text.setBounds (0, list1Bounds.height + SASH_WIDTH, tabFolderPageBounds.width, tabFolderPageBounds.height - (list1Bounds.height + SASH_WIDTH));
-	
-		/* Position the sashes */
-		vSash.setBounds (list1Bounds.width, 0, SASH_WIDTH, list1Bounds.height);
-		hSash.setBounds (0, list1Bounds.height, tabFolderPageBounds.width, SASH_WIDTH);
-	}
-}
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/ScrollableTab.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/ScrollableTab.java
deleted file mode 100755
index cf7a405..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/ScrollableTab.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.eclipse.swt.examples.controlexample;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-
-abstract class ScrollableTab extends Tab {
-	/* Style widgets added to the "Style" group */	
-	Button singleButton, multiButton, horizontalButton, verticalButton, borderButton;
-
-	/**
-	 * Creates the Tab within a given instance of ControlExample.
-	 */
-	ScrollableTab(ControlExample instance) {
-		super(instance);
-	}
-
-	/**
-	 * Creates the "Style" group.
-	 */
-	void createStyleGroup () {
-		super.createStyleGroup ();
-	
-		/* Create the extra widgets */
-		singleButton = new Button (styleGroup, SWT.RADIO);
-		singleButton.setText ("SWT.SINGLE");
-		multiButton = new Button (styleGroup, SWT.RADIO);
-		multiButton.setText ("SWT.MULTI");
-		horizontalButton = new Button (styleGroup, SWT.CHECK);
-		horizontalButton.setText ("SWT.H_SCROLL");
-		horizontalButton.setSelection(true);
-		verticalButton = new Button (styleGroup, SWT.CHECK);
-		verticalButton.setText ("SWT.V_SCROLL");
-		verticalButton.setSelection(true);
-		borderButton = new Button (styleGroup, SWT.CHECK);
-		borderButton.setText ("SWT.BORDER");
-	}
-	
-	/**
-	 * Sets the state of the "Example" widgets.
-	 */
-	void setExampleWidgetState () {
-		super.setExampleWidgetState ();
-		Control [] controls = getExampleWidgets ();
-		if (controls.length != 0){
-			singleButton.setSelection ((controls [0].getStyle () & SWT.SINGLE) != 0);
-			multiButton.setSelection ((controls [0].getStyle () & SWT.MULTI) != 0);
-			horizontalButton.setSelection ((controls [0].getStyle () & SWT.H_SCROLL) != 0);
-			verticalButton.setSelection ((controls [0].getStyle () & SWT.V_SCROLL) != 0);
-			borderButton.setSelection ((controls [0].getStyle () & SWT.BORDER) != 0);
-		}
-	}
-}
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/ShellTab.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/ShellTab.java
deleted file mode 100755
index e41ca37..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/ShellTab.java
+++ /dev/null
@@ -1,288 +0,0 @@
-package org.eclipse.swt.examples.controlexample;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.events.*;
-
-class ShellTab extends Tab {	
-	/* Style widgets added to the "Style" group */
-	Button noParentButton, parentButton;
-	Button noTrimButton, closeButton, titleButton, minButton, maxButton, borderButton, resizeButton, onTopButton;
-	Button createButton, closeAllButton;
-	Button modelessButton, primaryModalButton, applicationModalButton, systemModalButton;
-	Group parentStyleGroup, modalStyleGroup;
-
-	/* Variables used to track the open shells */
-	int shellCount = 0;
-	Shell [] shells = new Shell [4];
-	
-	/**
-	 * Creates the Tab within a given instance of ControlExample.
-	 */
-	ShellTab(ControlExample instance) {
-		super(instance);
-	}
-
-	/**
-	 * Close all the example shells.
-	 */
-	void closeAllShells() {
-		for (int i = 0; i<shellCount; i++) {
-			if (shells[i] != null & !shells [i].isDisposed ()) {
-				shells [i].dispose();
-			}
-		}
-		shellCount = 0;
-	}
-	
-	/**
-	 * Handle the Create button selection event.
-	 *
-	 * @param event org.eclipse.swt.events.SelectionEvent
-	 */
-	public void createButtonSelected(SelectionEvent event) {
-	
-		/*
-		 * Remember the example shells so they
-		 * can be disposed by the user.
-		 */
-		if (shellCount >= shells.length) {
-			Shell [] newShells = new Shell [shells.length + 4];
-			System.arraycopy (shells, 0, newShells, 0, shells.length);
-			shells = newShells;
-		}
-	
-		/* Compute the shell style */
-		int style = SWT.NONE;
-		if (noTrimButton.getSelection()) style |= SWT.NO_TRIM;
-		if (closeButton.getSelection()) style |= SWT.CLOSE;
-		if (titleButton.getSelection()) style |= SWT.TITLE;
-		if (minButton.getSelection()) style |= SWT.MIN;
-		if (maxButton.getSelection()) style |= SWT.MAX;
-		if (borderButton.getSelection()) style |= SWT.BORDER;
-		if (resizeButton.getSelection()) style |= SWT.RESIZE;
-		if (onTopButton.getSelection()) style |= SWT.ON_TOP;
-		if (modelessButton.getSelection()) style |= SWT.MODELESS;
-		if (primaryModalButton.getSelection()) style |= SWT.PRIMARY_MODAL;
-		if (applicationModalButton.getSelection()) style |= SWT.APPLICATION_MODAL;
-		if (systemModalButton.getSelection()) style |= SWT.SYSTEM_MODAL;
-	
-		/* Create the shell with or without a parent */
-		if (noParentButton.getSelection ()) {
-			shells [shellCount] = new Shell (style);
-		} else {
-			Shell shell = tabFolderPage.getShell ();
-			shells [shellCount] = new Shell (shell, style);
-		}
-		final Shell currentShell = shells [shellCount];
-		Button button = new Button(currentShell, SWT.PUSH);
-		button.setBounds(20, 20, 120, 30);
-		Button closeButton = new Button(currentShell, SWT.PUSH);
-		closeButton.setBounds(160, 20, 120, 30);
-		closeButton.setText(ControlExample.getResourceString("Close"));
-		closeButton.addListener(SWT.Selection, new Listener() {
-			public void handleEvent(Event event) {
-				currentShell.dispose();
-			}
-		});
-	
-		/* Set the size, title and open the shell */
-		currentShell.setSize (300, 100);
-		currentShell.setText (ControlExample.getResourceString("Title") + shellCount);
-		currentShell.open ();
-		shellCount++;
-	}
-	
-	/**
-	 * Creates the "Control" group. 
-	 */
-	void createControlGroup () {
-		/*
-		 * Create the "Control" group.  This is the group on the
-		 * left half of each example tab.  It consists of the
-		 * style group, the display group and the size group.
-		 */		
-		controlGroup = new Group (tabFolderPage, SWT.NULL);
-		GridLayout gridLayout= new GridLayout ();
-		controlGroup.setLayout (gridLayout);
-		gridLayout.numColumns = 1;
-		gridLayout.makeColumnsEqualWidth = true;
-		controlGroup.setLayoutData (new GridData (GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
-		controlGroup.setText (ControlExample.getResourceString("Parameters"));
-	
-		/* Create individual groups inside the "Control" group */
-		styleGroup = new Group (controlGroup, SWT.NULL);
-		gridLayout = new GridLayout ();
-		styleGroup.setLayout (gridLayout);
-		gridLayout.numColumns = 2;
-		gridLayout.makeColumnsEqualWidth = true;
-		styleGroup.setLayoutData (new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
-		styleGroup.setText (ControlExample.getResourceString("Styles"));
-	
-		/* Create a group for the parent style controls */
-		parentStyleGroup = new Group (styleGroup, SWT.NULL);
-		parentStyleGroup.setLayout (new GridLayout ());
-		GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-		parentStyleGroup.setLayoutData (gridData);
-		parentStyleGroup.setText (ControlExample.getResourceString("Parent"));
-	}
-	
-	/**
-	 * Creates the "Control" widget children.
-	 */
-	void createControlWidgets () {
-	
-		/* Create the parent style buttons */
-		noParentButton = new Button (parentStyleGroup, SWT.RADIO);
-		noParentButton.setText (ControlExample.getResourceString("No_Parent"));
-		parentButton = new Button (parentStyleGroup, SWT.RADIO);
-		parentButton.setText (ControlExample.getResourceString("Parent"));
-	
-		/* Create a group for the decoration style controls */
-		Group decorationStyleGroup = new Group(styleGroup, SWT.NULL);
-		decorationStyleGroup.setLayout (new GridLayout ());
-		GridData gridData = new GridData (GridData.HORIZONTAL_ALIGN_FILL);
-		gridData.verticalSpan = 2;
-		decorationStyleGroup.setLayoutData (gridData);
-		decorationStyleGroup.setText (ControlExample.getResourceString("Decoration_Styles"));
-	
-		/* Create the decoration style buttons */
-		noTrimButton = new Button (decorationStyleGroup, SWT.CHECK);
-		noTrimButton.setText ("SWT.NO_TRIM");
-		closeButton = new Button (decorationStyleGroup, SWT.CHECK);
-		closeButton.setText ("SWT.CLOSE");
-		titleButton = new Button (decorationStyleGroup, SWT.CHECK);
-		titleButton.setText ("SWT.TITLE");
-		minButton = new Button (decorationStyleGroup, SWT.CHECK);
-		minButton.setText ("SWT.MIN");
-		maxButton = new Button (decorationStyleGroup, SWT.CHECK);
-		maxButton.setText ("SWT.MAX");
-		borderButton = new Button (decorationStyleGroup, SWT.CHECK);
-		borderButton.setText ("SWT.BORDER");
-		resizeButton = new Button (decorationStyleGroup, SWT.CHECK);
-		resizeButton.setText ("SWT.RESIZE");
-		onTopButton = new Button (decorationStyleGroup, SWT.CHECK);
-		onTopButton.setText ("SWT.ON_TOP");
-	
-		/* Create a group for the modal style controls */
-		modalStyleGroup = new Group (styleGroup, SWT.NONE);
-		modalStyleGroup.setLayout (new GridLayout ());
-		modalStyleGroup.setText (ControlExample.getResourceString("Modal_Styles"));
-		gridData = new GridData ();
-		gridData.verticalAlignment = GridData.FILL;
-		modalStyleGroup.setLayoutData(gridData);
-		
-		/* Create the modal style buttons */
-		modelessButton = new Button (modalStyleGroup, SWT.RADIO);
-		modelessButton.setText ("SWT.MODELESS");
-		primaryModalButton = new Button (modalStyleGroup, SWT.RADIO);
-		primaryModalButton.setText ("SWT.PRIMARY_MODAL");
-		applicationModalButton = new Button (modalStyleGroup, SWT.RADIO);
-		applicationModalButton.setText ("SWT.APPLICATION_MODAL");
-		systemModalButton = new Button (modalStyleGroup, SWT.RADIO);
-		systemModalButton.setText ("SWT.SYSTEM_MODAL");
-	
-		/* Create the "create" and "closeAll" buttons */
-		createButton = new Button (styleGroup, SWT.NULL);
-		gridData = new GridData (GridData.HORIZONTAL_ALIGN_END);
-		createButton.setLayoutData (gridData);
-		createButton.setText (ControlExample.getResourceString("Create_Shell"));
-		closeAllButton = new Button (styleGroup, SWT.NULL);
-		gridData = new GridData (GridData.HORIZONTAL_ALIGN_BEGINNING);
-		closeAllButton.setText (ControlExample.getResourceString("Close_All_Shells"));
-		closeAllButton.setLayoutData (gridData);
-	
-		/* Add the listeners */
-		createButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				createButtonSelected(e);
-			};
-		});
-		closeAllButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				closeAllShells ();
-			};
-		});
-		SelectionListener decorationButtonListener = new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				decorationButtonSelected(event);
-			};
-		};
-		noTrimButton.addSelectionListener (decorationButtonListener);
-		closeButton.addSelectionListener (decorationButtonListener);
-		titleButton.addSelectionListener (decorationButtonListener);
-		minButton.addSelectionListener (decorationButtonListener);
-		maxButton.addSelectionListener (decorationButtonListener);
-		borderButton.addSelectionListener (decorationButtonListener);
-		resizeButton.addSelectionListener (decorationButtonListener);
-		applicationModalButton.addSelectionListener (decorationButtonListener);
-		systemModalButton.addSelectionListener (decorationButtonListener);
-	
-		/* Set the default state */
-		noParentButton.setSelection (true);
-		modelessButton.setSelection (true);
-	}
-	
-	/**
-	 * Handle a decoration button selection event.
-	 *
-	 * @param event org.eclipse.swt.events.SelectionEvent
-	 */
-	public void decorationButtonSelected(SelectionEvent event) {
-	
-		/* Make sure if the modal style is SWT.APPLICATION_MODAL or 
-		 * SWT.SYSTEM_MODAL the style SWT.CLOSE is also selected.
-		 * This is to make sure the user can close the shell.
-		 */
-		Button widget = (Button) event.widget;
-		if (widget == applicationModalButton || widget == systemModalButton) {
-			if (widget.getSelection()) {
-				closeButton.setSelection (true);
-				noTrimButton.setSelection (false);
-			} 
-			return;
-		}
-		if (widget == closeButton) {
-			if (applicationModalButton.getSelection() || systemModalButton.getSelection()) {
-				closeButton.setSelection (true);
-			}
-		}	
-		/*
-		 * Make sure if the No Trim button is selected then
-		 * all other decoration buttons are deselected.
-		 */
-		if (widget.getSelection() && widget != noTrimButton) {
-			noTrimButton.setSelection (false);
-			return;
-		}
-		if (widget.getSelection() && widget == noTrimButton) {
-			if (applicationModalButton.getSelection() || systemModalButton.getSelection()) {
-				noTrimButton.setSelection (false);
-				return;
-			}
-			closeButton.setSelection (false);
-			titleButton.setSelection (false);
-			minButton.setSelection (false);
-			maxButton.setSelection (false);
-			borderButton.setSelection (false);
-			resizeButton.setSelection (false);
-			return;
-		}
-	}
-	
-	/**
-	 * Gets the text for the tab folder item.
-	 */
-	String getTabText () {
-		return "Shell";
-	}
-}
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/SliderTab.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/SliderTab.java
deleted file mode 100755
index 45ba2ec..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/SliderTab.java
+++ /dev/null
@@ -1,253 +0,0 @@
-package org.eclipse.swt.examples.controlexample;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.events.*;
-
-class SliderTab extends RangeTab {
-	/* Example widgets and groups that contain them */
-	Scale scale1;
-	Slider slider1;
-	Group sliderGroup, scaleGroup;
-
-	/* Scale widgets added to the "Control" group */
-	Scale incrementScale, pageIncrementScale, thumbScale;
-	
-	/* Flag for setting slider background color */
-	boolean defaultColor = true;
-	
-	/**
-	 * Creates the Tab within a given instance of ControlExample.
-	 */
-	SliderTab(ControlExample instance) {
-		super(instance);
-	}
-
-	/**
-	 * Creates the "Control" widget children.
-	 */
-	void createControlWidgets () {
-		super.createControlWidgets ();
-		createThumbGroup ();
-		createIncrementGroup ();
-		createPageIncrementGroup ();
-	}
-	
-	/**
-	 * Creates the "Example" group.
-	 */
-	void createExampleGroup () {
-		super.createExampleGroup ();
-		
-		/* Create a group for the slider */
-		sliderGroup = new Group (exampleGroup, SWT.NULL);
-		sliderGroup.setLayout (new GridLayout ());
-		sliderGroup.setLayoutData (new GridData (GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
-		sliderGroup.setText ("Slider");
-	
-		/* Create a group for the scale */
-		scaleGroup = new Group (exampleGroup, SWT.NULL);
-		scaleGroup.setLayout (new GridLayout ());
-		scaleGroup.setLayoutData (new GridData (GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
-		scaleGroup.setText ("Scale");
-	
-	}
-	
-	/**
-	 * Creates the "Example" widgets.
-	 */
-	void createExampleWidgets () {
-		
-		/* Compute the widget style */
-		int style = SWT.NONE;
-		if (horizontalButton.getSelection ()) style |= SWT.HORIZONTAL;
-		if (verticalButton.getSelection ()) style |= SWT.VERTICAL;
-		if (borderButton.getSelection ()) style |= SWT.BORDER;
-	
-		/* Create the example widgets */
-		scale1 = new Scale (scaleGroup, style);
-		scale1.setMaximum (100);
-		scale1.setSelection (50);
-		scale1.setIncrement (5);
-		scale1.setPageIncrement (10);
-		slider1 = new Slider(sliderGroup, style);
-		slider1.setMaximum (100);
-		slider1.setSelection (50);
-		slider1.setIncrement(5);
-		slider1.setPageIncrement (10);
-		slider1.setThumb (10);
-	}
-	
-	/**
-	 * Create a group of widgets to control the increment
-	 * attribute of the example widget.
-	 */
-	void createIncrementGroup() {
-	
-		/* Create the group */
-		Group incrementGroup = new Group (controlGroup, SWT.NULL);
-		incrementGroup.setLayout (new GridLayout ());
-		incrementGroup.setText (ControlExample.getResourceString("Increment"));
-		incrementGroup.setLayoutData (new GridData (GridData.FILL_HORIZONTAL));
-	
-		/* Create the scale widget */
-		incrementScale = new Scale (incrementGroup, SWT.NULL);
-		incrementScale.setMaximum (100);
-		incrementScale.setSelection (5);
-		incrementScale.setPageIncrement (10);
-		incrementScale.setIncrement (5);
-
-		GridData data = new GridData (GridData.FILL_HORIZONTAL);
-		data.widthHint = 100;
-		incrementScale.setLayoutData (data);
-	
-		/* Add the listeners */
-		incrementScale.addSelectionListener (new SelectionAdapter () {
-			public void widgetSelected (SelectionEvent e) {		
-				setWidgetIncrement ();
-			};
-		});
-	}
-	
-	/**
-	 * Create a group of widgets to control the page increment
-	 * attribute of the example widget.
-	 */
-	void createPageIncrementGroup() {
-	
-		/* Create the group */
-		Group pageIncrementGroup = new Group (controlGroup, SWT.NULL);
-		pageIncrementGroup.setLayout (new GridLayout ());
-		pageIncrementGroup.setText (ControlExample.getResourceString("Page_Increment"));
-		pageIncrementGroup.setLayoutData (new GridData (GridData.FILL_HORIZONTAL));
-			
-		/* Create the scale widget */
-		pageIncrementScale = new Scale (pageIncrementGroup, SWT.NULL);
-		pageIncrementScale.setMaximum (100);
-		pageIncrementScale.setSelection (10);
-		pageIncrementScale.setPageIncrement (10);
-		pageIncrementScale.setIncrement (5);
-	
-		GridData data = new GridData (GridData.FILL_HORIZONTAL);
-		data.widthHint = 100;
-		pageIncrementScale.setLayoutData (data);
-
-		/* Add the listeners */
-		pageIncrementScale.addSelectionListener (new SelectionAdapter () {
-			public void widgetSelected (SelectionEvent event) {
-				setWidgetPageIncrement ();
-			}
-		});
-	}
-	
-	/**
-	 * Create a group of widgets to control the thumb
-	 * attribute of the example widget.
-	 */
-	void createThumbGroup() {
-	
-		/* Create the group */
-		Group thumbGroup = new Group (controlGroup, SWT.NULL);
-		thumbGroup.setLayout (new GridLayout ());
-		thumbGroup.setText (ControlExample.getResourceString("Thumb"));
-		thumbGroup.setLayoutData (new GridData (GridData.FILL_HORIZONTAL));
-		
-		/* Create the scale widget */
-		thumbScale = new Scale (thumbGroup, SWT.NULL);
-		thumbScale.setMaximum (100);
-		thumbScale.setSelection (10);
-		thumbScale.setPageIncrement (10);
-		thumbScale.setIncrement (5);
-	
-		GridData data = new GridData (GridData.FILL_HORIZONTAL);
-		data.widthHint = 100;
-		thumbScale.setLayoutData (data);
-
-		/* Add the listeners */
-		thumbScale.addSelectionListener (new SelectionAdapter () {
-			public void widgetSelected (SelectionEvent event) {
-				setWidgetThumb ();
-			};
-		});
-	}
-	
-	/**
-	 * Gets the "Example" widget children.
-	 */
-	Control [] getExampleWidgets () {
-		return new Control [] {scale1, slider1};
-	}
-	
-	/**
-	 * Gets the text for the tab folder item.
-	 */
-	String getTabText () {
-		return ControlExample.getResourceString("Slider_and_Scale");
-	}
-	
-	/**
-	 * Sets the state of the "Example" widgets.
-	 */
-	void setExampleWidgetState () {
-		super.setExampleWidgetState ();
-		setWidgetIncrement ();
-		setWidgetPageIncrement ();
-		setWidgetThumb ();
-	}
-	
-	/**
-	 * Sets the increment of the "Example" widgets.
-	 */
-	void setWidgetIncrement () {
-		slider1.setIncrement (incrementScale.getSelection ());
-		scale1.setIncrement (incrementScale.getSelection ());
-	}
-	
-	/**
-	 * Sets the minimim of the "Example" widgets.
-	 */
-	void setWidgetMaximum () {
-		slider1.setMaximum (maximumScale.getSelection ());
-		scale1.setMaximum (maximumScale.getSelection ());
-	}
-	
-	/**
-	 * Sets the minimim of the "Example" widgets.
-	 */
-	void setWidgetMinimum () {
-		slider1.setMinimum (minimumScale.getSelection ());
-		scale1.setMinimum (minimumScale.getSelection ());
-	}
-	
-	/**
-	 * Sets the page increment of the "Example" widgets.
-	 */
-	void setWidgetPageIncrement () {
-		slider1.setPageIncrement (pageIncrementScale.getSelection ());
-		scale1.setPageIncrement (pageIncrementScale.getSelection ());
-	}
-	
-	/**
-	 * Sets the selection of the "Example" widgets.
-	 */
-	void setWidgetSelection () {
-		slider1.setSelection (selectionScale.getSelection ());
-		scale1.setSelection (selectionScale.getSelection ());
-	}
-	
-	/**
-	 * Sets the thumb of the "Example" widgets.
-	 */
-	void setWidgetThumb () {
-		slider1.setThumb (thumbScale.getSelection ());
-	}
-}
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/Tab.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/Tab.java
deleted file mode 100755
index 1c53bc8..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/Tab.java
+++ /dev/null
@@ -1,521 +0,0 @@
-package org.eclipse.swt.examples.controlexample;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.events.*;
-
-/**
- * <code>Tab</code> is the abstract superclass of every page
- * in the example's tab folder.  Each page in the tab folder
- * describes a control.
- *
- * A Tab itself is not a control but instead provides a
- * hierarchy with which to share code that is common to
- * every page in the folder.
- *
- * A typical page in a Tab contains a two column composite.
- * The left column contains the "Example" group.  The right
- * column contains "Control" group.  The "Control" group
- * contains controls that allow the user to interact with
- * the example control.  The "Control" group typically
- * contains a "Style", "Display" and "Size" group.  Subclasses
- * can override these defaults to augment a group or stop
- * a group from being created.
- */
-abstract class Tab {	
-	/* Common control buttons */
-	Button borderButton, enabledButton, visibleButton;
-	Button preferredButton, tooSmallButton, smallButton, largeButton, fillButton;
-
-	/* Common groups and composites */
-	Composite tabFolderPage;
-	Group exampleGroup, controlGroup, displayGroup, sizeGroup, styleGroup, colorGroup;
-
-	/* Controlling instance */
-	final ControlExample instance;
-
-	/* Sizing constants for the "Size" group */
-	static final int TOO_SMALL_SIZE	= 10;
-	static final int SMALL_SIZE		= 50;
-	static final int LARGE_SIZE		= 100;
-
-	/* Common controls for the "Colors" group */
-	Button backgroundButton, foregroundButton, fontButton;
-	Color backgroundColor, foregroundColor;
-	Font font;	
-
-	/**
-	 * Creates the Tab within a given instance of ControlExample.
-	 */
-	Tab(ControlExample instance) {
-		this.instance = instance;
-	}
-
-	/**
-	 * Creates the "Control" group.  The "Control" group
-	 * is typically the right hand column in the tab.
-	 */
-	void createControlGroup () {
-	
-		/*
-		 * Create the "Control" group.  This is the group on the
-		 * left half of each example tab.  It consists of the
-		 * style group, the display group and the size group.
-		 */	
-		controlGroup = new Group (tabFolderPage, SWT.NONE);
-		GridLayout gridLayout= new GridLayout ();
-		controlGroup.setLayout (gridLayout);
-		gridLayout.numColumns = 2;
-		gridLayout.makeColumnsEqualWidth = true;
-		controlGroup.setLayoutData (new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
-		controlGroup.setText (ControlExample.getResourceString("Parameters"));
-	
-		/* Create individual groups inside the "Control" group */
-		createStyleGroup ();
-		createDisplayGroup ();
-		createSizeGroup ();
-		createColorGroup ();
-	
-		/*
-		 * For each Button child in the style group, add a selection
-		 * listener that will recreate the example controls.  If the
-		 * style group button is a RADIO button, ensure that the radio
-		 * button is selected before recreating the example controls.
-		 * When the user selects a RADIO button, the current RADIO
-		 * button in the group is deselected and the new RADIO button
-		 * is selected automatically.  The listeners are notified for
-		 * both these operations but typically only do work when a RADIO
-		 * button is selected.
-		 */
-		SelectionListener selectionListener = new SelectionAdapter () {
-			public void widgetSelected (SelectionEvent event) {
-				if ((event.widget.getStyle () & SWT.RADIO) != 0) {
-					if (!((Button) event.widget).getSelection ()) return;
-				}
-				recreateExampleWidgets ();
-			};
-		};
-		Control [] children = styleGroup.getChildren ();
-		for (int i=0; i<children.length; i++) {
-			if (children [i] instanceof Button) {
-				Button button = (Button) children [i];
-				button.addSelectionListener (selectionListener);
-			}
-		}
-	}
-	
-	/**
-	 * Creates the "Control" widget children.
-	 * Subclasses override this method to augment
-	 * the standard controls created in the "Style",
-	 * "Display" and "Size" groups.
-	 */
-	void createControlWidgets () {
-	}
-	
-	/**
-	 * Creates the "Color" group. This is typically
-	 * a child of the "Control" group. Subclasses override
-	 * this method to customize and set system colors.
-	 */
-	void createColorGroup () {
-		/* Create the group */
-		colorGroup = new Group(controlGroup, SWT.NULL);
-		colorGroup.setLayout (new GridLayout (2, false));
-		colorGroup.setLayoutData (new GridData (GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
-		colorGroup.setText (ControlExample.getResourceString ("Colors"));
-		new Label (colorGroup, SWT.NONE).setText (ControlExample.getResourceString ("Foreground_Color"));
-		foregroundButton = new Button (colorGroup, SWT.PUSH);
-		new Label (colorGroup, SWT.NONE).setText (ControlExample.getResourceString ("Background_Color"));
-		backgroundButton = new Button (colorGroup, SWT.PUSH);
-		fontButton = new Button (colorGroup, SWT.PUSH);
-		fontButton.setText(ControlExample.getResourceString("Font"));
-		
-		Shell shell = backgroundButton.getShell ();
-		final ColorDialog backgroundDialog = new ColorDialog (shell);
-		final ColorDialog foregroundDialog = new ColorDialog (shell);
-		final FontDialog fontDialog = new FontDialog (shell);
-
-		/* Create images to display current colors */
-		int imageSize = 12;
-		Display display = shell.getDisplay ();
-		final Image backgroundImage = new Image (display, imageSize, imageSize);	
-		final Image foregroundImage = new Image (display, imageSize, imageSize);
-
-		/* Add listeners to set the colors and font */
-		backgroundButton.setImage(backgroundImage);
-		backgroundButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				RGB rgb = backgroundDialog.open();
-				if (rgb == null) return;
-				Color oldColor = backgroundColor;
-				backgroundColor = new Color (backgroundButton.getDisplay(), rgb);
-				setExampleWidgetBackground ();
-				if (oldColor != null) oldColor.dispose ();
-			}
-		});
-		foregroundButton.setImage(foregroundImage);
-		foregroundButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				RGB rgb = foregroundDialog.open();
-				if (rgb == null) return;
-				Color oldColor = foregroundColor;
-				foregroundColor = new Color (foregroundButton.getDisplay(), rgb);
-				setExampleWidgetForeground ();
-				if (oldColor != null) oldColor.dispose ();
-			}
-		});
-		fontButton.addSelectionListener(new SelectionAdapter () {
-			public void widgetSelected (SelectionEvent e) {
-				FontData fontData = fontDialog.open ();
-				if (fontData == null) return;
-				Font oldFont = font;
-				font = new Font (fontButton.getDisplay(), fontData);
-				setExampleWidgetFont ();
-				setExampleWidgetSize ();
-				if (oldFont != null) oldFont.dispose ();
-			}
-		});
-		backgroundButton.addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent event) {
-				if (backgroundImage != null) backgroundImage.dispose();
-				if (foregroundImage != null) foregroundImage.dispose();
-				if (backgroundColor != null) backgroundColor.dispose();
-				if (foregroundColor != null) foregroundColor.dispose();
-				if (font != null) font.dispose();
-				backgroundColor = null;
-				foregroundColor = null;
-				font = null;				
-			}
-		});
-	}
-	
-	/**
-	 * Creates the "Display" group.  This is typically
-	 * a child of the "Control" group.
-	 */
-	void createDisplayGroup () {
-		/* Create the group */
-		displayGroup = new Group (controlGroup, SWT.NONE);
-		displayGroup.setLayout (new GridLayout ());
-		displayGroup.setLayoutData (new GridData (GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
-		displayGroup.setText (ControlExample.getResourceString("State"));
-	
-		/* Create the controls */
-		enabledButton = new Button(displayGroup, SWT.CHECK);
-		enabledButton.setText(ControlExample.getResourceString("Enabled"));
-		visibleButton = new Button(displayGroup, SWT.CHECK);
-		visibleButton.setText(ControlExample.getResourceString("Visible"));
-	
-		/* Add the listeners */
-		enabledButton.addSelectionListener (new SelectionAdapter () {
-			public void widgetSelected (SelectionEvent event) {
-				setExampleWidgetEnabled ();
-			}
-		});
-		visibleButton.addSelectionListener (new SelectionAdapter () {
-			public void widgetSelected (SelectionEvent event) {
-				setExampleWidgetVisibility ();
-			}
-		});
-	
-		/* Set the default state */
-		enabledButton.setSelection(true);
-		visibleButton.setSelection(true);
-	}
-	
-	/**
-	 * Creates the "Example" group.  The "Example" group
-	 * is typically the left hand column in the tab.
-	 */
-	void createExampleGroup () {	
-		exampleGroup = new Group (tabFolderPage, SWT.NONE);
-		GridLayout gridLayout = new GridLayout ();
-		exampleGroup.setLayout (gridLayout);
-		exampleGroup.setLayoutData (new GridData (GridData.FILL_BOTH));
-	}
-	
-	/**
-	 * Creates the "Example" widget children of the "Example" group.
-	 * Subclasses override this method to create the particular
-	 * example control.
-	 */
-	void createExampleWidgets () {
-		/* Do nothing */
-	}
-	
-	/**
-	 * Creates the "Size" group.  The "Size" group contains
-	 * controls that allow the user to change the size of
-	 * the example widgets.
-	 */
-	void createSizeGroup () {
-		/* Create the group */
-		sizeGroup = new Group (controlGroup, SWT.NONE);
-		sizeGroup.setLayout (new GridLayout());
-		sizeGroup.setLayoutData (new GridData (GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
-		sizeGroup.setText (ControlExample.getResourceString("Size"));
-	
-		/* Create the controls */
-	
-		/*
-		 * The preferred size of a widget is the size returned
-		 * by widget.computeSize (SWT.DEFAULT, SWT.DEFAULT).
-		 * This size is defined on a widget by widget basis.
-		 * Many widgets will attempt to display their contents.
-		 */
-		preferredButton = new Button (sizeGroup, SWT.RADIO);
-		preferredButton.setText (ControlExample.getResourceString("Preferred"));
-		tooSmallButton = new Button (sizeGroup, SWT.RADIO);
-		tooSmallButton.setText (TOO_SMALL_SIZE + " X " + TOO_SMALL_SIZE);
-		smallButton = new Button(sizeGroup, SWT.RADIO);
-		smallButton.setText (SMALL_SIZE + " X " + SMALL_SIZE);
-		largeButton = new Button (sizeGroup, SWT.RADIO);
-		largeButton.setText (LARGE_SIZE + " X " + LARGE_SIZE);
-		fillButton = new Button (sizeGroup, SWT.RADIO);
-		fillButton.setText (ControlExample.getResourceString("Fill"));
-	
-		/* Add the listeners */
-		SelectionAdapter selectionListener = new SelectionAdapter () {
-			public void widgetSelected (SelectionEvent event) {
-				if (!((Button) event.widget).getSelection ()) return;
-				setExampleWidgetSize ();
-			};
-		};
-		preferredButton.addSelectionListener(selectionListener);
-		tooSmallButton.addSelectionListener(selectionListener);
-		smallButton.addSelectionListener(selectionListener);
-		largeButton.addSelectionListener(selectionListener);
-		fillButton.addSelectionListener(selectionListener);
-	
-		/* Set the default state */
-		preferredButton.setSelection (true);
-	}
-	
-	/**
-	 * Creates the "Style" group.  The "Style" group contains
-	 * controls that allow the user to change the style of
-	 * the example widgets.  Changing a widget "Style" causes
-	 * the widget to be destroyed and recreated.
-	 */
-	void createStyleGroup () {
-		styleGroup = new Group (controlGroup, SWT.NONE);
-		styleGroup.setLayout (new GridLayout ());
-		styleGroup.setLayoutData (new GridData (GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
-		styleGroup.setText (ControlExample.getResourceString("Styles"));
-	}
-	
-	/**
-	 * Creates the tab folder page.
-	 *
-	 * @param tabFolder org.eclipse.swt.widgets.TabFolder
-	 * @return the new page for the tab folder
-	 */
-	Composite createTabFolderPage (TabFolder tabFolder) {
-		/*
-		* Create a two column page.
-		*/
-		tabFolderPage = new Composite (tabFolder, SWT.NULL);
-		GridLayout gridLayout = new GridLayout ();
-		tabFolderPage.setLayout (gridLayout);
-		gridLayout.numColumns = 2;
-	
-		/* Create the "Example" and "Control" columns */
-		createExampleGroup ();
-		createControlGroup ();
-	
-		/* Create the widgets in the two columns */
-		createExampleWidgets ();
-		createControlWidgets ();
-		setExampleWidgetState ();
-		
-		return tabFolderPage;
-	}
-	
-	/**
-	 * Disposes the "Example" widgets.
-	 */
-	void disposeExampleWidgets () {
-		Control [] controls = getExampleWidgets ();
-		for (int i=0; i<controls.length; i++) {
-			controls [i].dispose ();
-		}
-	}
-	
-	void drawImage (Image image, Color color) {
-		GC gc = new GC(image);
-		gc.setBackground(color);
-		Rectangle bounds = image.getBounds();
-		gc.fillRectangle(0, 0, bounds.width, bounds.height);
-		gc.drawRectangle(0, 0, bounds.width - 1, bounds.height - 1);
-		gc.dispose();
-	}
-	
-	/**
-	 * Gets the "Example" widget children.
-	 *
-	 * @return an array of example widget children
-	 */
-	Control [] getExampleWidgets () {
-		return new Control [0];
-	}
-	
-	/**
-	 * Gets the text for the tab folder item.
-	 *
-	 * @return the text for the tab item
-	 */
-	String getTabText () {
-		return "";
-	}
-	
-	/**
-	 * Recreates the "Example" widgets.
-	 */
-	void recreateExampleWidgets () {
-		disposeExampleWidgets ();
-		createExampleWidgets ();
-		setExampleWidgetState ();
-	}
-	
-	/**
-	 * Sets the background color of the "Example" widgets.
-	 */
-	void setExampleWidgetBackground () {
-		if (backgroundButton == null) return;
-		Control [] controls = getExampleWidgets ();
-		Color color = backgroundColor;
-		if (color == null) color = controls [0].getBackground ();
-		Image image = backgroundButton.getImage ();
-		drawImage (image, color);
-		backgroundButton.setImage (image);
-		if (backgroundColor == null) return;
-		for (int i = 0; i < controls.length; i++) {
-			Control control = controls[i];
-			control.setBackground (backgroundColor);
-		}
-	}
-	
-	/**
-	 * Sets the enabled state of the "Example" widgets.
-	 */
-	void setExampleWidgetEnabled () {
-		Control [] controls = getExampleWidgets ();
-		for (int i=0; i<controls.length; i++) {
-			controls [i].setEnabled (enabledButton.getSelection ());
-		}
-	}
-	
-	/**
-	 * Sets the font of the "Example" widgets.
-	 */
-	void setExampleWidgetFont () {
-		if (font == null) return;
-		Control [] controls = getExampleWidgets ();
-		for (int i = 0; i < controls.length; i++) {
-			Control control = controls[i];
-			control.setFont(font);
-		}
-	}
-	
-	/**
-	 * Sets the foreground color of the "Example" widgets.
-	 */
-	void setExampleWidgetForeground () {
-		if (foregroundButton == null) return;
-		Control [] controls = getExampleWidgets ();
-		Color color = foregroundColor;
-		if (color == null) color = controls [0].getForeground ();
-		Image image = foregroundButton.getImage ();
-		drawImage (image, color);
-		foregroundButton.setImage (image);
-		if (foregroundColor == null) return;
-		for (int i = 0; i < controls.length; i++) {
-			Control control = controls[i];
-			control.setForeground (foregroundColor);
-		}
-	}
-	
-	/**
-	 * Sets the size of the "Example" widgets.
-	 */
-	void setExampleWidgetSize () {
-		int size = SWT.DEFAULT;
-		if (preferredButton == null) return;
-		if (preferredButton.getSelection()) size = SWT.DEFAULT;
-		if (tooSmallButton.getSelection()) size = TOO_SMALL_SIZE;
-		if (smallButton.getSelection()) size = SMALL_SIZE;
-		if (largeButton.getSelection()) size = LARGE_SIZE;
-		Control [] controls = getExampleWidgets ();
-		for (int i=0; i<controls.length; i++) {
-			GridData gridData; 
-			if (fillButton.getSelection()) {
-				gridData = new GridData (GridData.FILL_BOTH);
-			} else {
-				gridData = new GridData ();
-				gridData.widthHint = size;
-				gridData.heightHint = size;
-			}
-			controls [i].setLayoutData (gridData);
-		}
-		/*
-		 * Force the entire widget tree to layout,
-		 * even when the child sizes may not have
-		 * changed.
-		 */
-		int seenCount = 0;
-		Composite [] seen = new Composite [4];
-		for (int i=0; i<controls.length; i++) {
-			Control control = controls [i];
-			while (control != exampleGroup) {
-				Composite parent = control.getParent ();
-				int index = 0;
-				while (index < seenCount) {
-					if (seen [index] == parent) break;
-					index++;
-				}
-				if (index == seenCount) parent.layout ();
-				if (seenCount == seen.length) {
-					Composite [] newSeen = new Composite [seen.length + 4];
-					System.arraycopy (seen, 0, newSeen, 0, seen.length);
-					seen = newSeen;
-				}
-				seen [seenCount++] = parent;
-				control = control.getParent ();
-			}
-		}
-	}
-	
-	/**
-	 * Sets the state of the "Example" widgets.  Subclasses
-	 * reimplement this method to set "Example" widget state
-	 * that is specific to the widget.
-	 */
-	void setExampleWidgetState () {
-		setExampleWidgetEnabled ();
-		setExampleWidgetVisibility ();
-		setExampleWidgetBackground ();
-		setExampleWidgetForeground ();
-		setExampleWidgetFont ();
-		setExampleWidgetSize ();
-	}
-	
-	/**
-	 * Sets the visibility of the "Example" widgets.
-	 */
-	void setExampleWidgetVisibility () {
-		Control [] controls = getExampleWidgets ();
-		for (int i=0; i<controls.length; i++) {
-			controls [i].setVisible (visibleButton.getSelection ());
-		}
-	}
-}
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/TableTab.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/TableTab.java
deleted file mode 100755
index 5be8d9d..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/TableTab.java
+++ /dev/null
@@ -1,290 +0,0 @@
-package org.eclipse.swt.examples.controlexample;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.events.*;
-
-class TableTab extends ScrollableTab {
-	/* Example widgets and groups that contain them */
-	Table table1;
-	Group tableGroup, tableItemGroup;
-
-	/* Style widgets added to the "Style" group */
-	Button checkButton, fullSelectionButton;
-
-	/* Display widgets added to the "Display" group */
-	Button headerVisibleButton, linesVisibleButton;
-	
-	/* Color widgets added to the "Color" group */
-	Button itemBackgroundButton, itemForegroundButton;
-	Color itemBackgroundColor, itemForegroundColor;
-	
-	static String [] columnTitles	= {ControlExample.getResourceString("TableTitle_0"),
-									   ControlExample.getResourceString("TableTitle_1"),
-									   ControlExample.getResourceString("TableTitle_2"),
-									   ControlExample.getResourceString("TableTitle_3")};
-									   
-	static String [] stringLine0		= {ControlExample.getResourceString("TableLine0_0"),
-										  ControlExample.getResourceString("TableLine0_1"),
-										  ControlExample.getResourceString("TableLine0_2"),
-										  ControlExample.getResourceString("TableLine0_3")};
-									   
-	static String [] stringLine1		= {ControlExample.getResourceString("TableLine1_0"),
-										  ControlExample.getResourceString("TableLine1_1"),
-										  ControlExample.getResourceString("TableLine1_2"),
-										  ControlExample.getResourceString("TableLine1_3")};
-									   
-	static String [] stringLine2		= {ControlExample.getResourceString("TableLine2_0"),
-										  ControlExample.getResourceString("TableLine2_1"),
-										  ControlExample.getResourceString("TableLine2_2"),
-										  ControlExample.getResourceString("TableLine2_3")};
-
-	/**
-	 * Creates the Tab within a given instance of ControlExample.
-	 */
-	TableTab(ControlExample instance) {
-		super(instance);
-	}
-	
-	/**
-	 * Creates the "Colors" group.
-	 */
-	void createColorGroup () {
-		super.createColorGroup();
-		
-		tableItemGroup = new Group (colorGroup, SWT.NONE);
-		tableItemGroup.setText (ControlExample.getResourceString ("Item_Colors"));
-		GridData data = new GridData ();
-		data.horizontalSpan = 2;
-		tableItemGroup.setLayoutData (data);
-		tableItemGroup.setLayout (new GridLayout (2, false));
-		new Label (tableItemGroup, SWT.NONE).setText (ControlExample.getResourceString ("Item_Foreground_Color"));
-		itemForegroundButton = new Button (tableItemGroup, SWT.PUSH);
-		new Label (tableItemGroup, SWT.NONE).setText (ControlExample.getResourceString ("Item_Background_Color"));
-		itemBackgroundButton = new Button (tableItemGroup, SWT.PUSH);
-		
-		Shell shell = itemBackgroundButton.getShell ();
-		final ColorDialog backgroundDialog = new ColorDialog (shell);
-		final ColorDialog foregroundDialog = new ColorDialog (shell);
-
-		int imageSize = 12;
-		Display display = shell.getDisplay ();
-		final Image itemBackgroundImage = new Image(display, imageSize, imageSize);
-		final Image itemForegroundImage = new Image(display, imageSize, imageSize);
-
-		/* Add listeners to set the colors and font */
-		itemBackgroundButton.setImage(itemBackgroundImage);
-		itemBackgroundButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				RGB rgb = backgroundDialog.open();
-				if (rgb == null) return;
-				Color oldColor = itemBackgroundColor;
-				itemBackgroundColor = new Color (itemBackgroundButton.getDisplay(), rgb);
-				setItemsBackground ();
-				if (oldColor != null) oldColor.dispose ();
-			}
-		});
-		itemForegroundButton.setImage(itemForegroundImage);
-		itemForegroundButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				RGB rgb = foregroundDialog.open();
-				if (rgb == null) return;
-				Color oldColor = itemForegroundColor;
-				itemForegroundColor = new Color (itemForegroundButton.getDisplay(), rgb);
-				setItemsForeground ();
-				if (oldColor != null) oldColor.dispose ();
-			}
-		});
-		itemBackgroundButton.addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent event) {
-				if (itemBackgroundImage != null) itemBackgroundImage.dispose();
-				if (itemForegroundImage != null) itemForegroundImage.dispose();
-				if (itemBackgroundColor != null) itemBackgroundColor.dispose();
-				if (itemForegroundColor != null) itemForegroundColor.dispose();
-				itemBackgroundColor = null;
-				itemForegroundColor = null;			
-			}
-		});
-	}
-
-	/**
-	 * Creates the "Display" group.
-	 */
-	void createDisplayGroup () {
-		super.createDisplayGroup ();
-	
-		/* Create display controls specific to this example */
-		headerVisibleButton = new Button (displayGroup, SWT.CHECK);
-		headerVisibleButton.setText (ControlExample.getResourceString("Header_Visible"));
-		linesVisibleButton = new Button (displayGroup, SWT.CHECK);
-		linesVisibleButton.setText (ControlExample.getResourceString("Lines_Visible"));
-	
-		/* Add the listeners */
-		headerVisibleButton.addSelectionListener (new SelectionAdapter () {
-			public void widgetSelected (SelectionEvent event) {
-				setWidgetHeaderVisible ();
-			}
-		});
-		linesVisibleButton.addSelectionListener (new SelectionAdapter () {
-			public void widgetSelected (SelectionEvent event) {
-				setWidgetLinesVisible ();
-			};
-		});
-	}
-	
-	/**
-	 * Creates the "Example" group.
-	 */
-	void createExampleGroup () {
-		super.createExampleGroup ();
-		
-		/* Create a group for the table */
-		tableGroup = new Group (exampleGroup, SWT.NULL);
-		tableGroup.setLayout (new GridLayout ());
-		tableGroup.setLayoutData (new GridData (GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
-		tableGroup.setText ("Table");
-	}
-	
-	/**
-	 * Creates the "Example" widgets.
-	 */
-	void createExampleWidgets () {	
-		/* Compute the widget style */
-		int style = SWT.NONE;
-		if (singleButton.getSelection ()) style |= SWT.SINGLE;
-		if (multiButton.getSelection ()) style |= SWT.MULTI;
-		if (verticalButton.getSelection ()) style |= SWT.V_SCROLL;
-		if (horizontalButton.getSelection ()) style |= SWT.H_SCROLL;
-		if (checkButton.getSelection ()) style |= SWT.CHECK;
-		if (fullSelectionButton.getSelection ()) style |= SWT.FULL_SELECTION;
-		if (borderButton.getSelection ()) style |= SWT.BORDER;
-	
-		/* Create the table widget */
-		table1 = new Table (tableGroup, style);
-	
-		/* Fill the table with data */
-		for (int i = 0; i < columnTitles.length; i++) {
-			TableColumn tableColumn = new TableColumn(table1, SWT.NULL);
-			tableColumn.setText(columnTitles[i]);
-		}	
-		for (int i=0; i<16; i++) {
-			TableItem item = new TableItem (table1, SWT.NULL);
-			item.setImage (instance.images [i % 3]);
-			switch (i % 3) {
-				case 0:
-					stringLine0 [0] = ControlExample.getResourceString("Index") + i;
-					item.setText(stringLine0);
-					break;
-				case 1:
-					stringLine1 [0] = ControlExample.getResourceString("Index") + i;
-					item.setText(stringLine1);
-					break;
-				case 2:
-					stringLine2 [0] = ControlExample.getResourceString("Index") + i;
-					item.setText(stringLine2);
-					break;
-			}
-		}
-		for (int i = 0; i < columnTitles.length; i++) {
-			TableColumn tableColumn = table1.getColumn(i);
-			tableColumn.pack();
-		}
-	}
-	
-	/**
-	 * Creates the "Style" group.
-	 */
-	void createStyleGroup () {
-		super.createStyleGroup ();
-		
-		/* Create the extra widgets */
-		checkButton = new Button (styleGroup, SWT.CHECK);
-		checkButton.setText ("SWT.CHECK");
-		fullSelectionButton = new Button (styleGroup, SWT.CHECK);
-		fullSelectionButton.setText ("SWT.FULL_SELECTION");
-	}
-	
-	/**
-	 * Gets the "Example" widget children.
-	 */
-	Control [] getExampleWidgets () {
-		return new Control [] {table1};
-	}
-	
-	/**
-	 * Gets the text for the tab folder item.
-	 */
-	String getTabText () {
-		return "Table";
-	}
-	
-	/**
-	 * Sets the background color of the TableItems.
-	 */
-	void setItemsBackground () {
-		if (itemBackgroundButton == null) return;
-		Color color = itemBackgroundColor;
-		if (color == null) color = table1.getItem (0).getBackground ();
-		Image image = itemBackgroundButton.getImage ();
-		drawImage (image, color);
-		itemBackgroundButton.setImage (image);
-		if (itemBackgroundColor == null) return;
-		TableItem [] items = table1.getSelection ();
-		for (int i = 0; i < items.length; i++) {
-			items [i].setBackground (itemBackgroundColor);
-		}
-	}
-	
-	/**
-	 * Sets the foreground color of the TableItems.
-	 */
-	void setItemsForeground () {
-		if (itemForegroundButton == null) return;
-		Color color = itemForegroundColor;
-		if (color == null) color = table1.getItem (0).getForeground ();
-		Image image = itemForegroundButton.getImage ();
-		drawImage (image, color);
-		itemForegroundButton.setImage (image);
-		if (itemForegroundColor == null) return;
-		TableItem [] items = table1.getSelection ();
-		for (int i = 0; i < items.length; i++) {
-			items [i].setForeground (itemForegroundColor);
-		}
-	}
-	
-	/**
-	 * Sets the state of the "Example" widgets.
-	 */
-	void setExampleWidgetState () {
-		super.setExampleWidgetState ();
-		setItemsBackground ();
-		setItemsForeground ();
-		setWidgetHeaderVisible ();
-		setWidgetLinesVisible ();
-		checkButton.setSelection ((table1.getStyle () & SWT.CHECK) != 0);
-		fullSelectionButton.setSelection ((table1.getStyle () & SWT.FULL_SELECTION) != 0);
-	}
-	
-	/**
-	 * Sets the header visible state of the "Example" widgets.
-	 */
-	void setWidgetHeaderVisible () {
-		table1.setHeaderVisible (headerVisibleButton.getSelection ());
-	}
-	
-	/**
-	 * Sets the lines visible state of the "Example" widgets.
-	 */
-	void setWidgetLinesVisible () {
-		table1.setLinesVisible (linesVisibleButton.getSelection ());
-	}
-}
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/TextTab.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/TextTab.java
deleted file mode 100755
index ed84770..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/TextTab.java
+++ /dev/null
@@ -1,219 +0,0 @@
-package org.eclipse.swt.examples.controlexample;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.custom.*;
-
-class TextTab extends ScrollableTab {
-	/* Example widgets and groups that contain them */
-	Text text;
-	StyledText styledText;
-	Group textGroup, styledTextGroup, styledTextStyleGroup;
-
-	/* Style widgets added to the "Style" group */
-	Button wrapButton, readOnlyButton;
-	
-	/* Buttons for adding StyleRanges to StyledText */
-	Button boldButton, redButton, yellowButton;
-	Image boldImage, redImage, yellowImage;
-
-	/**
-	 * Creates the Tab within a given instance of ControlExample.
-	 */
-	TextTab(ControlExample instance) {
-		super(instance);
-	}
-	
-	/**
-	 * Creates a bitmap image. 
-	 */
-	Image createBitmapImage (Display display, String name) {
-		ImageData source = new ImageData(ControlExample.class.getResourceAsStream(name + ".bmp"));
-		ImageData mask = new ImageData(ControlExample.class.getResourceAsStream(name + "_mask.bmp"));
-		return new Image (display, source, mask);
-	}
-	
-	/**
-	 * Creates the "Control" widget children.
-	 */
-	void createControlWidgets () {
-		super.createControlWidgets ();
-		
-		/* Add a group for modifying the StyledText widget */
-		createStyledTextStyleGroup ();
-	}
-
-	/**
-	 * Creates the "Example" group.
-	 */
-	void createExampleGroup () {
-		super.createExampleGroup ();
-		
-		/* Create a group for the text widget */
-		textGroup = new Group (exampleGroup, SWT.NULL);
-		textGroup.setLayout (new GridLayout ());
-		textGroup.setLayoutData (new GridData (GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
-		textGroup.setText ("Text");
-	
-		/* Create a group for the styled text widget */
-		styledTextGroup = new Group (exampleGroup, SWT.NULL);
-		styledTextGroup.setLayout (new GridLayout ());
-		styledTextGroup.setLayoutData (new GridData (GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
-		styledTextGroup.setText ("StyledText");
-	}
-	
-	/**
-	 * Creates the "Example" widgets.
-	 */
-	void createExampleWidgets () {
-		
-		/* Compute the widget style */
-		int style = SWT.NONE;
-		if (singleButton.getSelection ()) style |= SWT.SINGLE;
-		if (multiButton.getSelection ()) style |= SWT.MULTI;
-		if (horizontalButton.getSelection ()) style |= SWT.H_SCROLL;
-		if (verticalButton.getSelection ()) style |= SWT.V_SCROLL;
-		if (wrapButton.getSelection ()) style |= SWT.WRAP;
-		if (readOnlyButton.getSelection ()) style |= SWT.READ_ONLY;
-		if (borderButton.getSelection ()) style |= SWT.BORDER;
-	
-		/* Create the example widgets */
-		text = new Text (textGroup, style);
-		text.setText (ControlExample.getResourceString("Example_string") + text.DELIMITER + ControlExample.getResourceString("One_Two_Three"));
-		styledText = new StyledText (styledTextGroup, style);
-		styledText.setText (ControlExample.getResourceString("Example_string"));
-		styledText.append ("\n");
-		styledText.append (ControlExample.getResourceString("One_Two_Three"));
-	}
-	
-	/**
-	 * Creates the "Style" group.
-	 */
-	void createStyleGroup() {
-		super.createStyleGroup();
-	
-		/* Create the extra widgets */
-		wrapButton = new Button (styleGroup, SWT.CHECK);
-		wrapButton.setText ("SWT.WRAP");
-		readOnlyButton = new Button (styleGroup, SWT.CHECK);
-		readOnlyButton.setText ("SWT.READ_ONLY");
-	}
-	
-	/**
-	 * Creates the "StyledText Style" group.
-	 */
-	void createStyledTextStyleGroup () {
-		final Display display = controlGroup.getDisplay ();
-		styledTextStyleGroup = new Group (controlGroup, SWT.NONE);
-		styledTextStyleGroup.setText (ControlExample.getResourceString ("StyledText_Styles"));
-		styledTextStyleGroup.setLayout (new GridLayout(2, false));
-		styledTextStyleGroup.setLayoutData (new GridData (GridData.HORIZONTAL_ALIGN_FILL));
-		
-		/* Get images */
-		boldImage = createBitmapImage (display, "bold");
-		redImage = createBitmapImage (display, "red");
-		yellowImage = createBitmapImage (display, "yellow");
-		
-		/* Create controls to modify the StyledText */
-		Label label = new Label (styledTextStyleGroup, SWT.NONE);
-		label.setText (ControlExample.getResourceString ("StyledText_Style_Instructions"));
-		GridData data = new GridData(GridData.FILL_HORIZONTAL);
-		data.horizontalSpan = 2;
-		label.setLayoutData(data);
-		new Label (styledTextStyleGroup, SWT.NONE).setText (ControlExample.getResourceString ("Bold"));
-		boldButton = new Button (styledTextStyleGroup, SWT.PUSH);
-		boldButton.setImage (boldImage);
-		boldButton.addSelectionListener(new SelectionAdapter () {
-			public void widgetSelected (SelectionEvent e) {
-				Point sel = styledText.getSelectionRange();
-				if ((sel == null) || (sel.y == 0)) return;
-				StyleRange style;
-				for (int i = sel.x; i<sel.x+sel.y; i++) {
-					StyleRange range = styledText.getStyleRangeAtOffset(i);
-					if (range == null) {style = new StyleRange(i, 1, null, null, SWT.BOLD);}
-					else {style = new StyleRange(i, 1, range.foreground, range.background, SWT.BOLD);};
-					styledText.setStyleRange(style);
-				}
-				styledText.setSelectionRange(sel.x + sel.y, 0);
-			}
-		});
-		new Label (styledTextStyleGroup, SWT.NONE).setText (ControlExample.getResourceString ("Foreground_Style"));
-		redButton = new Button (styledTextStyleGroup, SWT.PUSH);
-		redButton.setImage (redImage);
-		new Label (styledTextStyleGroup, SWT.NONE).setText (ControlExample.getResourceString ("Background_Style"));
-		yellowButton = new Button (styledTextStyleGroup, SWT.PUSH);
-		yellowButton.setImage (yellowImage);
-		SelectionListener colorListener = new SelectionAdapter () {
-			public void widgetSelected (SelectionEvent e) {
-				Point sel = styledText.getSelectionRange();
-				if ((sel == null) || (sel.y == 0)) return;
-				Color fg, bg;
-				if (e.widget == redButton) {
-					fg = display.getSystemColor (SWT.COLOR_RED);
-					bg = null;
-				} else if (e.widget == yellowButton) {
-					fg = null;
-					bg = display.getSystemColor (SWT.COLOR_YELLOW);
-				} else {
-					fg = bg = null;
-				}
-				StyleRange style;
-				for (int i = sel.x; i<sel.x+sel.y; i++) {
-					StyleRange range = styledText.getStyleRangeAtOffset(i);
-					if (range == null) {
-						style = new StyleRange(i, 1, fg, bg, SWT.NORMAL);
-					}
-					else {
-						if (range.foreground != null) fg = range.foreground;
-						if (range.background != null) bg = range.background;
-						style = new StyleRange(i, 1, fg, bg, range.fontStyle);
-					};
-					styledText.setStyleRange(style);
-				}
-				styledText.setSelectionRange(sel.x + sel.y, 0);
-			};
-		};
-		redButton.addSelectionListener(colorListener);
-		yellowButton.addSelectionListener(colorListener);
-		yellowButton.addDisposeListener(new DisposeListener () {
-			public void widgetDisposed (DisposeEvent e) {
-				boldImage.dispose();
-				redImage.dispose();
-				yellowImage.dispose();
-			}
-		});
-	}
-	
-	/**
-	 * Gets the "Example" widget children.
-	 */
-	Control [] getExampleWidgets () {
-		return new Control [] {text, styledText};
-	}
-	
-	/**
-	 * Gets the text for the tab folder item.
-	 */
-	String getTabText () {
-		return "Text";
-	}
-	
-	/**
-	 * Sets the state of the "Example" widgets.
-	 */
-	void setExampleWidgetState () {
-		super.setExampleWidgetState ();
-		wrapButton.setSelection ((text.getStyle () & SWT.WRAP) != 0);
-		readOnlyButton.setSelection ((text.getStyle () & SWT.READ_ONLY) != 0);
-	}
-}
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/ToolBarTab.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/ToolBarTab.java
deleted file mode 100755
index 0f840cd..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/ToolBarTab.java
+++ /dev/null
@@ -1,248 +0,0 @@
-package org.eclipse.swt.examples.controlexample;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.events.*;
-
-class ToolBarTab extends Tab {
-	/* Example widgets and groups that contain them */
-	ToolBar imageToolBar, textToolBar;
-	Group imageToolBarGroup, textToolBarGroup;
-	
-	/* Style widgets added to the "Style" group */
-	Button flatButton, wrapButton;
-
-	/**
-	 * Creates the Tab within a given instance of ControlExample.
-	 */
-	ToolBarTab(ControlExample instance) {
-		super(instance);
-	}
-
-	/**
-	 * Creates the "Example" group.
-	 */
-	void createExampleGroup () {
-		super.createExampleGroup ();
-		
-		/* Create a group for the image tool bar */
-		imageToolBarGroup = new Group (exampleGroup, SWT.NULL);
-		imageToolBarGroup.setLayout (new GridLayout ());
-		imageToolBarGroup.setLayoutData (new GridData (GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
-		imageToolBarGroup.setText (ControlExample.getResourceString("Image_ToolBar"));
-	
-		/* Create a group for the text tool bar */
-		textToolBarGroup = new Group (exampleGroup, SWT.NULL);
-		textToolBarGroup.setLayout (new GridLayout ());
-		textToolBarGroup.setLayoutData (new GridData (GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
-		textToolBarGroup.setText (ControlExample.getResourceString("Text_ToolBar"));
-	}
-	
-	/**
-	 * Creates the "Example" widgets.
-	 */
-	void createExampleWidgets () {
-	
-		/* Compute the widget style */
-		int style = SWT.NONE;
-		if (flatButton.getSelection()) style |= SWT.FLAT;
-		if (wrapButton.getSelection()) style |= SWT.WRAP;
-		if (borderButton.getSelection()) style |= SWT.BORDER;
-	
-		/*
-		* Create the example widgets.
-		*
-		* A tool bar must consist of all image tool
-		* items or all text tool items but not both.
-		*/
-	
-		/* Create the image tool bar */
-		imageToolBar = new ToolBar (imageToolBarGroup, style);
-		ToolItem item = new ToolItem (imageToolBar, SWT.PUSH);
-		item.setImage (instance.images[ControlExample.ciClosedFolder]);
-		item.setToolTipText("SWT.PUSH");
-		item = new ToolItem (imageToolBar, SWT.PUSH);
-		item.setImage (instance.images[ControlExample.ciClosedFolder]);
-		item.setToolTipText ("SWT.PUSH");
-		item = new ToolItem (imageToolBar, SWT.RADIO);
-		item.setImage (instance.images[ControlExample.ciOpenFolder]);
-		item.setToolTipText ("SWT.RADIO");
-		item = new ToolItem (imageToolBar, SWT.RADIO);
-		item.setImage (instance.images[ControlExample.ciOpenFolder]);
-		item.setToolTipText ("SWT.RADIO");
-		item = new ToolItem (imageToolBar, SWT.CHECK);
-		item.setImage (instance.images[ControlExample.ciTarget]);
-		item.setToolTipText ("SWT.CHECK");
-		item = new ToolItem (imageToolBar, SWT.RADIO);
-		item.setImage (instance.images[ControlExample.ciClosedFolder]);
-		item.setToolTipText ("SWT.RADIO");
-		item = new ToolItem (imageToolBar, SWT.RADIO);
-		item.setImage (instance.images[ControlExample.ciClosedFolder]);
-		item.setToolTipText ("SWT.RADIO");
-		item = new ToolItem (imageToolBar, SWT.SEPARATOR);
-		item.setToolTipText("SWT.SEPARATOR");
-		item = new ToolItem (imageToolBar, SWT.DROP_DOWN);
-		item.setImage (instance.images[ControlExample.ciTarget]);
-		item.setToolTipText ("SWT.DROP_DOWN");
-		item.addSelectionListener(new DropDownSelectionListener());
-	
-		/* Create the text tool bar */
-		textToolBar = new ToolBar (textToolBarGroup, style);
-		item = new ToolItem (textToolBar, SWT.PUSH);
-		item.setText (ControlExample.getResourceString("Push"));
-		item.setToolTipText("SWT.PUSH");
-		item = new ToolItem (textToolBar, SWT.PUSH);
-		item.setText (ControlExample.getResourceString("Push"));
-		item.setToolTipText("SWT.PUSH");
-		item = new ToolItem (textToolBar, SWT.RADIO);
-		item.setText (ControlExample.getResourceString("Radio"));
-		item.setToolTipText("SWT.RADIO");
-		item = new ToolItem (textToolBar, SWT.RADIO);
-		item.setText (ControlExample.getResourceString("Radio"));
-		item.setToolTipText("SWT.RADIO");
-		item = new ToolItem (textToolBar, SWT.CHECK);
-		item.setText (ControlExample.getResourceString("Check"));
-		item.setToolTipText("SWT.CHECK");
-		item = new ToolItem (textToolBar, SWT.RADIO);
-		item.setText (ControlExample.getResourceString("Radio"));
-		item.setToolTipText("SWT.RADIO");
-		item = new ToolItem (textToolBar, SWT.RADIO);
-		item.setText (ControlExample.getResourceString("Radio"));
-		item.setToolTipText("SWT.RADIO");
-		item = new ToolItem (textToolBar, SWT.SEPARATOR);
-		item.setToolTipText("SWT.SEPARATOR");
-		item = new ToolItem (textToolBar, SWT.DROP_DOWN);
-		item.setText (ControlExample.getResourceString("Drop_Down"));
-		item.setToolTipText("SWT.DROP_DOWN");
-		item.addSelectionListener(new DropDownSelectionListener());
-	
-		/*
-		* Do not add the selection event for this drop down
-		* tool item.  Without hooking the event, the drop down
-		* widget does nothing special when the drop down area
-		* is selected.
-		*/
-	}
-	
-	/**
-	 * Creates the "Style" group.
-	 */
-	void createStyleGroup() {
-		super.createStyleGroup();
-	
-		/* Create the extra widgets */
-		flatButton = new Button (styleGroup, SWT.CHECK);
-		flatButton.setText ("SWT.FLAT");
-		wrapButton = new Button (styleGroup, SWT.CHECK);
-		wrapButton.setText ("SWT.WRAP");
-		borderButton = new Button (styleGroup, SWT.CHECK);
-		borderButton.setText ("SWT.BORDER");
-	}
-	
-	void disposeExampleWidgets () {
-		super.disposeExampleWidgets ();
-	}
-	
-	/**
-	 * Gets the "Example" widget children.
-	 */
-	Control [] getExampleWidgets () {
-		return new Control [] {imageToolBar, textToolBar};
-	}
-	
-	/**
-	 * Gets the text for the tab folder item.
-	 */
-	String getTabText () {
-		return "ToolBar";
-	}
-	
-	/**
-	 * Sets the state of the "Example" widgets.
-	 */
-	void setExampleWidgetState () {
-		super.setExampleWidgetState ();
-		flatButton.setSelection ((imageToolBar.getStyle () & SWT.FLAT) != 0);
-		wrapButton.setSelection ((imageToolBar.getStyle () & SWT.WRAP) != 0);
-		borderButton.setSelection ((imageToolBar.getStyle () & SWT.BORDER) != 0);
-	}
-	
-	/**
-	 * Listens to widgetSelected() events on SWT.DROP_DOWN type ToolItems
-	 * and opens/closes a menu when appropriate.
-	 */
-	class DropDownSelectionListener extends SelectionAdapter {
-		private Menu    menu = null;
-		private boolean visible = false;
-		
-		public void widgetSelected(SelectionEvent event) {
-			// Create the menu if it has not already been created
-			if (menu == null) {
-				// Lazy create the menu.
-				Shell shell = tabFolderPage.getShell();
-				menu = new Menu(shell);
-				for (int i = 0; i < 9; ++i) {
-					final String text = ControlExample.getResourceString("DropDownData_" + i);
-					if (text.length() != 0) {
-						MenuItem menuItem = new MenuItem(menu, SWT.NONE);
-						menuItem.setText(text);
-						/*
-						 * Add a menu selection listener so that the menu is hidden
-						 * when the user selects an item from the drop down menu.
-						 */
-						menuItem.addSelectionListener(new SelectionAdapter() {
-							public void widgetSelected(SelectionEvent e) {
-								setMenuVisible(false);
-							}
-						});
-					} else {
-						MenuItem menuItem = new MenuItem(menu, SWT.SEPARATOR);
-					}
-				}
-			}
-			
-			/**
-			 * A selection event will be fired when a drop down tool
-			 * item is selected in the main area and in the drop
-			 * down arrow.  Examine the event detail to determine
-			 * where the widget was selected.
-			 */		
-			if (event.detail == SWT.ARROW) {
-				/*
-				 * The drop down arrow was selected.
-				 */
-				if (visible) {
-					// Hide the menu to give the Arrow the appearance of being a toggle button.
-					setMenuVisible(false);
-				} else {	
-					// Position the menu below and vertically aligned with the the drop down tool button.
-					final ToolItem toolItem = (ToolItem) event.widget;
-					final ToolBar  toolBar = toolItem.getParent();
-					
-					Rectangle toolItemBounds = toolItem.getBounds();
-					Point point = toolBar.toDisplay(new Point(toolItemBounds.x, toolItemBounds.y));
-					menu.setLocation(point.x, point.y + toolItemBounds.height);
-					setMenuVisible(true);
-				}
-			} else {
-				/*
-				 * Main area of drop down tool item selected.
-				 * An application would invoke the code to perform the action for the tool item.
-				 */
-			}
-		}
-		private void setMenuVisible(boolean visible) {
-			menu.setVisible(visible);
-			this.visible = visible;
-		}
-	}
-}
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/TreeTab.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/TreeTab.java
deleted file mode 100755
index 5a1d224..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/TreeTab.java
+++ /dev/null
@@ -1,138 +0,0 @@
-package org.eclipse.swt.examples.controlexample;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.events.*;
-
-class TreeTab extends ScrollableTab {
-	/* Example widgets and groups that contain them */
-	Tree tree1, tree2;
-	Group treeGroup, imageTreeGroup;
-	
-	/* Style widgets added to the "Style" group */
-	Button checkButton;
-
-	/**
-	 * Creates the Tab within a given instance of ControlExample.
-	 */
-	TreeTab(ControlExample instance) {
-		super(instance);
-	}
-
-	/**
-	 * Creates the "Example" group.
-	 */
-	void createExampleGroup () {
-		super.createExampleGroup ();
-		
-		/* Create a group for the text tree */
-		treeGroup = new Group (exampleGroup, SWT.NULL);
-		treeGroup.setLayout (new GridLayout ());
-		treeGroup.setLayoutData (new GridData (GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
-		treeGroup.setText ("Tree");
-	
-		/* Create a group for the image tree */
-		imageTreeGroup = new Group (exampleGroup, SWT.NULL);
-		imageTreeGroup.setLayout (new GridLayout ());
-		imageTreeGroup.setLayoutData (new GridData (GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
-		imageTreeGroup.setText (ControlExample.getResourceString("Tree_With_Images"));
-	}
-	
-	/**
-	 * Creates the "Example" widgets.
-	 */
-	void createExampleWidgets () {
-		/* Compute the widget style */
-		int style = SWT.NONE;
-		if (singleButton.getSelection()) style |= SWT.SINGLE;
-		if (multiButton.getSelection()) style |= SWT.MULTI;
-		if (checkButton.getSelection()) style |= SWT.CHECK;
-		if (borderButton.getSelection()) style |= SWT.BORDER;
-	
-		/* Create the text tree */
-		tree1 = new Tree (treeGroup, style);
-		TreeItem node1 = new TreeItem (tree1, SWT.NULL);
-		node1.setText (ControlExample.getResourceString("Node_1"));
-		TreeItem node2 = new TreeItem (tree1, SWT.NULL);
-		node2.setText (ControlExample.getResourceString("Node_2"));
-		TreeItem node3 = new TreeItem (tree1, SWT.NULL);
-		node3.setText (ControlExample.getResourceString("Node_3"));
-		TreeItem node4 = new TreeItem (tree1, SWT.NULL);
-		node4.setText (ControlExample.getResourceString("Node_4"));
-		TreeItem node1_1 = new TreeItem (node1, SWT.NULL);
-		node1_1.setText (ControlExample.getResourceString("Node_1_1"));
-		TreeItem node2_1 = new TreeItem (node2, SWT.NULL);
-		node2_1.setText (ControlExample.getResourceString("Node_2_1"));
-		TreeItem node3_1 = new TreeItem (node3, SWT.NULL);
-		node3_1.setText (ControlExample.getResourceString("Node_3_1"));
-		TreeItem node2_2 = new TreeItem (node2, SWT.NULL);
-		node2_2.setText (ControlExample.getResourceString("Node_2_2"));
-		TreeItem node2_2_1 = new TreeItem (node2_2, SWT.NULL);
-		node2_2_1.setText (ControlExample.getResourceString("Node_2_2_1"));
-	
-		/* Create the image tree */	
-		tree2 = new Tree (imageTreeGroup, style);
-		node1 = new TreeItem (tree2, SWT.NULL);
-		node1.setText (ControlExample.getResourceString("Node_1"));
-		node1.setImage (instance.images[ControlExample.ciClosedFolder]);
-		node2 = new TreeItem (tree2, SWT.NULL);
-		node2.setText (ControlExample.getResourceString("Node_2"));
-		node2.setImage (instance.images[ControlExample.ciClosedFolder]);
-		node3 = new TreeItem (tree2, SWT.NULL);
-		node3.setText (ControlExample.getResourceString("Node_3"));
-		node3.setImage (instance.images[ControlExample.ciClosedFolder]);
-		node4 = new TreeItem (tree2, SWT.NULL);
-		node4.setText (ControlExample.getResourceString("Node_4"));
-		node4.setImage (instance.images[ControlExample.ciClosedFolder]);
-		node1_1 = new TreeItem (node1, SWT.NULL);
-		node1_1.setText (ControlExample.getResourceString("Node_1_1"));
-		node1_1.setImage (instance.images[ControlExample.ciClosedFolder]);
-		node2_1 = new TreeItem (node2, SWT.NULL);
-		node2_1.setText (ControlExample.getResourceString("Node_2_1"));
-		node2_1.setImage (instance.images[ControlExample.ciClosedFolder]);
-		node3_1 = new TreeItem (node3, SWT.NULL);
-		node3_1.setText (ControlExample.getResourceString("Node_3_1"));
-		node3_1.setImage (instance.images[ControlExample.ciClosedFolder]);
-		node2_2 = new TreeItem(node2, SWT.NULL);
-		node2_2.setText (ControlExample.getResourceString("Node_2_2"));
-		node2_2.setImage (instance.images[ControlExample.ciClosedFolder]);
-		node2_2_1 = new TreeItem (node2_2, SWT.NULL);
-		node2_2_1.setText (ControlExample.getResourceString("Node_2_2_1"));
-		node2_2_1.setImage (instance.images[ControlExample.ciClosedFolder]);
-	}
-	
-	/**
-	 * Creates the "Style" group.
-	 */
-	void createStyleGroup() {
-		super.createStyleGroup();
-		
-		/* Create the extra widgets */
-		checkButton = new Button (styleGroup, SWT.CHECK);
-		checkButton.setText ("SWT.CHECK");
-	}
-	
-	/**
-	 * Gets the "Example" widget children.
-	 */
-	Control [] getExampleWidgets () {
-		return new Control [] {tree1, tree2};
-	}
-	
-	/**
-	 * Gets the text for the tab folder item.
-	 */
-	String getTabText () {
-		return "Tree";
-	}
-
-}
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/bold.bmp b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/bold.bmp
deleted file mode 100644
index a3184bb..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/bold.bmp
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/bold_mask.bmp b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/bold_mask.bmp
deleted file mode 100644
index 382751e..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/bold_mask.bmp
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/closedFolder.gif b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/closedFolder.gif
deleted file mode 100644
index 6660d0b..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/closedFolder.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/openFolder.gif b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/openFolder.gif
deleted file mode 100644
index fc9943f..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/openFolder.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/red.bmp b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/red.bmp
deleted file mode 100644
index 88c63be..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/red.bmp
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/red_mask.bmp b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/red_mask.bmp
deleted file mode 100644
index 6ce9264..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/red_mask.bmp
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/target.gif b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/target.gif
deleted file mode 100644
index 9807ae6..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/target.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/yellow.bmp b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/yellow.bmp
deleted file mode 100644
index 631d069..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/yellow.bmp
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/yellow_mask.bmp b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/yellow_mask.bmp
deleted file mode 100644
index 6ce9264..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/yellow_mask.bmp
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/FileViewer.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/FileViewer.java
deleted file mode 100755
index 110afa1..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/FileViewer.java
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/IconCache.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/IconCache.java
deleted file mode 100755
index ac1f2d9..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/IconCache.java
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/cmd_Copy.gif b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/cmd_Copy.gif
deleted file mode 100755
index 4274b07..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/cmd_Copy.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/cmd_Cut.gif b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/cmd_Cut.gif
deleted file mode 100755
index eb948b9..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/cmd_Cut.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/cmd_Delete.gif b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/cmd_Delete.gif
deleted file mode 100755
index 6f64766..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/cmd_Delete.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/cmd_Parent.gif b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/cmd_Parent.gif
deleted file mode 100755
index 9b278e6..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/cmd_Parent.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/cmd_Paste.gif b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/cmd_Paste.gif
deleted file mode 100755
index 75e0ab2..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/cmd_Paste.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/cmd_Print.gif b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/cmd_Print.gif
deleted file mode 100755
index 4dfa8cd..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/cmd_Print.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/cmd_Refresh.gif b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/cmd_Refresh.gif
deleted file mode 100755
index a063c23..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/cmd_Refresh.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/cmd_Rename.gif b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/cmd_Rename.gif
deleted file mode 100755
index 25b1325..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/cmd_Rename.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/cmd_Search.gif b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/cmd_Search.gif
deleted file mode 100755
index 6dc3ebe..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/cmd_Search.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/generic_example.gif b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/generic_example.gif
deleted file mode 100755
index f9fb6b0..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/generic_example.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/icon_ClosedDrive.gif b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/icon_ClosedDrive.gif
deleted file mode 100755
index 04e530e..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/icon_ClosedDrive.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/icon_ClosedFolder.gif b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/icon_ClosedFolder.gif
deleted file mode 100755
index beb6ed1..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/icon_ClosedFolder.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/icon_File.gif b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/icon_File.gif
deleted file mode 100755
index 6b86d07..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/icon_File.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/icon_OpenDrive.gif b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/icon_OpenDrive.gif
deleted file mode 100755
index 7b2b633..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/icon_OpenDrive.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/icon_OpenFolder.gif b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/icon_OpenFolder.gif
deleted file mode 100755
index a9c77734..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/fileviewer/icon_OpenFolder.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/helloworld/HelloWorld1.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/helloworld/HelloWorld1.java
deleted file mode 100755
index 98bcf32..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/helloworld/HelloWorld1.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.eclipse.swt.examples.helloworld;
-
-/*
- * Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.widgets.*;
-
-/*
- * This example demonstrates the minimum amount of code required
- * to open an SWT Shell and process the events.
- */
-public class HelloWorld1 {
-
-public static void main (String [] args) {
-	Display display = new Display ();
-	Shell shell = new HelloWorld1 ().open (display);
-	while (!shell.isDisposed ()) {
-		if (!display.readAndDispatch ()) display.sleep ();
-	}
-	display.dispose ();
-}
-	
-public Shell open (Display display) {
-	Shell shell = new Shell (display);
-	shell.open ();
-	return shell;
-}
-}
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/helloworld/HelloWorld2.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/helloworld/HelloWorld2.java
deleted file mode 100755
index 454c23e..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/helloworld/HelloWorld2.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.eclipse.swt.examples.helloworld;
-
-/*
- * Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import java.util.ResourceBundle;
-
-/*
- * This example builds on HelloWorld1 and demonstrates the minimum amount 
- * of code required to open an SWT Shell with a Label and process the events.
- */
-public class HelloWorld2 {
-	private static ResourceBundle resHello = ResourceBundle.getBundle("examples_helloworld");
-	
-public static void main (String [] args) {
-	Display display = new Display ();
-	Shell shell = new HelloWorld2 ().open (display);
-	while (!shell.isDisposed ()) {
-		if (!display.readAndDispatch ()) display.sleep ();
-	}
-	display.dispose ();
-}
-
-public Shell open (Display display) {
-	Shell shell = new Shell (display);
-	Label label = new Label (shell, SWT.CENTER);
-	label.setText (resHello.getString("Hello_world"));
-	label.setBounds (shell.getClientArea ());
-	shell.open ();
-	return shell;
-}
-}
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/helloworld/HelloWorld3.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/helloworld/HelloWorld3.java
deleted file mode 100755
index 59bd758..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/helloworld/HelloWorld3.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.eclipse.swt.examples.helloworld;
-
-/*
- * Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.events.*;
-import java.util.ResourceBundle;
-
-/*
- * This example builds on HelloWorld2 and demonstrates how to resize the 
- * Label when the Shell resizes using a Listener mechanism.
- */
-public class HelloWorld3 {
-	private static ResourceBundle resHello = ResourceBundle.getBundle("examples_helloworld");
-	
-public static void main (String [] args) {
-	Display display = new Display ();
-	Shell shell = new HelloWorld3 ().open (display);
-	while (!shell.isDisposed ()) {
-		if (!display.readAndDispatch ()) display.sleep ();
-	}
-	display.dispose ();
-}
-
-public Shell open (Display display) {
-	final Shell shell = new Shell (display);
-	final Label label = new Label (shell, SWT.CENTER);
-	label.setText (resHello.getString("Hello_world"));
-	label.pack();
-	shell.addControlListener(new ControlAdapter() {
-		public void controlResized(ControlEvent e) {
-			label.setBounds (shell.getClientArea ());
-		}
-	});
-	shell.pack();
-	shell.open ();
-	return shell;
-}
-}
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/helloworld/HelloWorld4.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/helloworld/HelloWorld4.java
deleted file mode 100755
index b8cdde8..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/helloworld/HelloWorld4.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.eclipse.swt.examples.helloworld;
-
-/*
- * Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.layout.*;
-import java.util.ResourceBundle;
-
-/*
- * This example builds on HelloWorld2 and demonstrates how to resize the 
- * Label when the Shell resizes using a Layout.
- */
-public class HelloWorld4 {
-	private static ResourceBundle resHello = ResourceBundle.getBundle("examples_helloworld");
-	
-public static void main (String [] args) {
-	Display display = new Display ();
-	Shell shell = new HelloWorld4 ().open (display);
-	while (!shell.isDisposed ()) {
-		if (!display.readAndDispatch ()) display.sleep ();
-	}
-	display.dispose ();
-}
-
-public Shell open (Display display) {
-	Shell shell = new Shell (display);
-	shell.setLayout(new FillLayout());
-	Label label = new Label (shell, SWT.CENTER);
-	label.setText (resHello.getString("Hello_world"));
-	shell.pack ();
-	shell.open ();
-	return shell;
-}
-}
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/helloworld/HelloWorld5.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/helloworld/HelloWorld5.java
deleted file mode 100755
index 9bcd445..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/helloworld/HelloWorld5.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package org.eclipse.swt.examples.helloworld;
-
-/*
- * Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.graphics.*;
-import java.util.ResourceBundle;
-
-/*
- * This example builds on HelloWorld1 and demonstrates how to draw directly
- * on an SWT Control.
- */
-public class HelloWorld5 {
-	private static ResourceBundle resHello = ResourceBundle.getBundle("examples_helloworld");
-
-public static void main (String [] args) {
-	Display display = new Display ();
-	Shell shell = new HelloWorld5 ().open (display);
-	while (!shell.isDisposed ()) {
-		if (!display.readAndDispatch ()) display.sleep ();
-	}
-	display.dispose ();
-}
-
-public Shell open (Display display) {
-	final Color red = new Color(display, 0xFF, 0, 0);
-	final Shell shell = new Shell (display);
-	shell.addPaintListener(new PaintListener () {
-		public void paintControl(PaintEvent event){
-			GC gc = event.gc;
-			gc.setForeground(red);
-			Rectangle rect = shell.getClientArea();
-			gc.drawRectangle(rect.x + 10, rect.y + 10, rect.width - 20, rect.height - 20);
-			gc.drawString(resHello.getString("Hello_world"), rect.x + 20, rect.y + 20);
-		}
-	});
-	shell.addDisposeListener (new DisposeListener () {
-		public void widgetDisposed (DisposeEvent e) {
-			red.dispose();
-		}
-	});
-	shell.open ();
-	return shell;
-}
-}
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/hoverhelp/HoverHelp.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/hoverhelp/HoverHelp.java
deleted file mode 100755
index 2d632e0..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/hoverhelp/HoverHelp.java
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/hoverhelp/information.gif b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/hoverhelp/information.gif
deleted file mode 100755
index 26c7477..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/hoverhelp/information.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/hoverhelp/warning.gif b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/hoverhelp/warning.gif
deleted file mode 100755
index cf4fdf9..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/hoverhelp/warning.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/imageanalyzer/ImageAnalyzer.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/imageanalyzer/ImageAnalyzer.java
deleted file mode 100755
index 5d35e6e..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/imageanalyzer/ImageAnalyzer.java
+++ /dev/null
@@ -1,2076 +0,0 @@
-package org.eclipse.swt.examples.imageanalyzer;
-
-/*
- * Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.printing.*;
-import org.eclipse.swt.custom.*;
-import java.util.*;
-import java.net.*;
-import java.io.*;
-import java.text.MessageFormat;
-
-public class ImageAnalyzer {
-	static ResourceBundle bundle = ResourceBundle.getBundle("examples_images");
-	Display display;
-	Shell shell;
-	Canvas imageCanvas, paletteCanvas;
-	Label typeLabel, sizeLabel, depthLabel, transparentPixelLabel,
-		timeToLoadLabel, screenSizeLabel, backgroundPixelLabel,
-		locationLabel, disposalMethodLabel, delayTimeLabel,
-		repeatCountLabel, paletteLabel, dataLabel, statusLabel;
-	Combo backgroundCombo, scaleXCombo, scaleYCombo, alphaCombo;
-	Button incrementalCheck, transparentCheck, maskCheck, backgroundCheck;
-	Button previousButton, nextButton, animateButton;
-	StyledText dataText;
-	Sash sash;
-	Color whiteColor, blackColor, redColor, greenColor, blueColor, canvasBackground;
-	Font fixedWidthFont;
-	Cursor crossCursor;
-	GC imageCanvasGC;
-	
-	int paletteWidth = 140; // recalculated and used as a width hint
-	int ix = 0, iy = 0, py = 0; // used to scroll the image and palette
-	float xscale = 1, yscale = 1; // used to scale the image
-	int alpha = 255; // used to modify the alpha value of the image
-	boolean incremental = false; // used to incrementally display an image
-	boolean transparent = true; // used to display an image with transparency
-	boolean showMask = false; // used to display an icon mask or transparent image mask
-	boolean showBackground = false; // used to display the background of an animated image
-	boolean animate = false; // used to animate a multi-image file
-	Thread animateThread; // draws animated images
-	Thread incrementalThread; // draws incremental images
-	String lastPath; // used to seed the file dialog
-	String currentName; // the current image file or URL name
-	String fileName; // the current image file
-	ImageLoader loader; // the loader for the current image file
-	ImageData[] imageDataArray; // all image data read from the current file
-	int imageDataIndex; // the index of the current image data
-	ImageData imageData; // the currently-displayed image data
-	Image image; // the currently-displayed image
-	Vector incrementalEvents; // incremental image events
-	long loadTime = 0; // the time it took to load the current image
-	
-	static final int INDEX_DIGITS = 4;
-	static final int ALPHA_CONSTANT = 0;
-	static final int ALPHA_X = 1;
-	static final int ALPHA_Y = 2;
-
-	class TextPrompter extends Dialog {
-		String message = "";
-		String result = null;
-		Shell dialog;
-		Text text;
-		public TextPrompter (Shell parent, int style) {
-			super (parent, style);
-		}
-		public TextPrompter (Shell parent) {
-			this (parent, SWT.APPLICATION_MODAL);
-		}
-		public String getMessage () {
-			return message;
-		}
-		public void setMessage (String string) {
-			message = string;
-		}
-		public String open () {
-			dialog = new Shell(getParent(), getStyle());
-			dialog.setText(getText());
-			dialog.setLayout(new GridLayout());
-			Label label = new Label(dialog, SWT.NULL);
-			label.setText(message);
-			label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-			text = new Text(dialog, SWT.SINGLE | SWT.BORDER);
-			GridData data = new GridData(GridData.FILL_HORIZONTAL);
-			data.widthHint = 300;
-			text.setLayoutData(data);
-			Composite buttons = new Composite(dialog, SWT.NONE);
-			GridLayout grid = new GridLayout();
-			grid.numColumns = 2;
-			buttons.setLayout(grid);
-			buttons.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
-			Button ok = new Button(buttons, SWT.PUSH);
-			ok.setText(bundle.getString("OK"));
-			data = new GridData();
-			data.widthHint = 75;
-			ok.setLayoutData(data);
-			ok.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					result = text.getText();
-					dialog.dispose();
-				}
-			});
-			Button cancel = new Button(buttons, SWT.PUSH);
-			cancel.setText(bundle.getString("Cancel"));
-			data = new GridData();
-			data.widthHint = 75;
-			cancel.setLayoutData(data);
-			cancel.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					dialog.dispose();
-				}
-			});
-			dialog.setDefaultButton(ok);
-			dialog.pack();
-			dialog.open();
-			while (!dialog.isDisposed()) {
-				if (!display.readAndDispatch()) display.sleep();
-			}
-			return result;
-		}
-	}
-
-	public static void main(String [] args) {
-		Display display = new Display();
-		ImageAnalyzer imageAnalyzer = new ImageAnalyzer();
-		Shell shell = imageAnalyzer.open(display);
-		
-		while (!shell.isDisposed())
-			if (!display.readAndDispatch()) display.sleep();
-		display.dispose();
-	}
-
-	public Shell open(Display dpy) {
-		// Create a window and set its title.
-		this.display = dpy;
-		shell = new Shell(display);
-		shell.setText(bundle.getString("Image_analyzer"));
-		
-		// Hook resize and dispose listeners.
-		shell.addControlListener(new ControlAdapter() {
-			public void controlResized(ControlEvent event) {
-				resizeShell(event);
-			}
-		});
-		shell.addShellListener(new ShellAdapter() {
-			public void shellClosed(ShellEvent e) {
-				animate = false; // stop any animation in progress
-				if (animateThread != null) {
-					// wait for the thread to die before disposing the shell.
-					while (animateThread.isAlive()) {
-						if (!display.readAndDispatch()) display.sleep();
-					}
-				}
-				e.doit = true;
-			}
-		});
-		shell.addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent e) {
-				// Clean up.
-				if (image != null)
-					image.dispose();
-				whiteColor.dispose();
-				blackColor.dispose();
-				redColor.dispose();
-				greenColor.dispose();
-				blueColor.dispose();
-				fixedWidthFont.dispose();
-				crossCursor.dispose();
-			}
-		});
-
-		// Create colors and fonts.
-		whiteColor = new Color(display, 255, 255, 255);
-		blackColor = new Color(display, 0, 0, 0);
-		redColor = new Color(display, 255, 0, 0);
-		greenColor = new Color(display, 0, 255, 0);
-		blueColor = new Color(display, 0, 0, 255);
-		fixedWidthFont = new Font(display, "courier", 10, 0);
-		crossCursor = new Cursor(display, SWT.CURSOR_CROSS);
-		
-		// Add a menu bar and widgets.
-		Menu menuBar = createMenuBar();
-		createWidgets();
-		shell.pack();
-		
-		// Create a GC for drawing, and hook the listener to dispose it.
-		imageCanvasGC = new GC(imageCanvas);
-		imageCanvas.addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent e) {
-				imageCanvasGC.dispose();
-			}
-		});
-		
-		// Open the window
-		shell.open();
-		return shell;
-	}
-
-	void createWidgets() {
-		// Add the widgets to the shell in a grid layout.
-		GridLayout layout = new GridLayout();
-		layout.marginHeight = 0;
-		layout.numColumns = 2;
-		shell.setLayout(layout);
-
-		// Separate the menu bar from the rest of the widgets.
-		Label separator = new Label(shell, SWT.SEPARATOR | SWT.HORIZONTAL);
-		GridData gridData = new GridData();
-		gridData.horizontalSpan = 2;
-		gridData.horizontalAlignment = GridData.FILL;
-		separator.setLayoutData(gridData);
-		
-		// Add a composite to contain some control widgets across the top.
-		Composite controls = new Composite(shell, SWT.NULL);
-		RowLayout rowLayout = new RowLayout();
-		rowLayout.marginTop = 0;
-		rowLayout.marginBottom = 5;
-		rowLayout.spacing = 8;
-		controls.setLayout(rowLayout);
-		gridData = new GridData();
-		gridData.horizontalSpan = 2;
-		controls.setLayoutData(gridData);
-		
-		// Combo to change the background.
-		Group group = new Group(controls, SWT.NULL);
-		group.setLayout(new RowLayout());
-		group.setText(bundle.getString("Background"));
-		backgroundCombo = new Combo(group, SWT.DROP_DOWN | SWT.READ_ONLY);
-		backgroundCombo.setItems(new String[] {
-			bundle.getString("None"),
-			bundle.getString("White"),
-			bundle.getString("Black"),
-			bundle.getString("Red"),
-			bundle.getString("Green"),
-			bundle.getString("Blue")});
-		backgroundCombo.select(backgroundCombo.indexOf(bundle.getString("White")));
-		backgroundCombo.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				changeBackground();
-			}
-		});
-		
-		// Combo to change the x scale.
-		String[] values = {
-			"0.1", "0.2", "0.3", "0.4", "0.5", "0.6", "0.7", "0.8", "0.9", "1",
-			"1.1", "1.2", "1.3", "1.4", "1.5", "1.6", "1.7", "1.8", "1.9", "2",
-			"3", "4", "5", "6", "7", "8", "9", "10",};
-		group = new Group(controls, SWT.NULL);
-		group.setLayout(new RowLayout());
-		group.setText(bundle.getString("X_scale"));
-		scaleXCombo = new Combo(group, SWT.DROP_DOWN);
-		for (int i = 0; i < values.length; i++) {
-			scaleXCombo.add(values[i]);
-		}
-		scaleXCombo.select(scaleXCombo.indexOf("1"));
-		scaleXCombo.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				scaleX();
-			}
-		});
-		
-		// Combo to change the y scale.
-		group = new Group(controls, SWT.NULL);
-		group.setLayout(new RowLayout());
-		group.setText(bundle.getString("Y_scale"));
-		scaleYCombo = new Combo(group, SWT.DROP_DOWN);
-		for (int i = 0; i < values.length; i++) {
-			scaleYCombo.add(values[i]);
-		}
-		scaleYCombo.select(scaleYCombo.indexOf("1"));
-		scaleYCombo.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				scaleY();
-			}
-		});
-		
-		// Combo to change the alpha value.
-		group = new Group(controls, SWT.NULL);
-		group.setLayout(new RowLayout());
-		group.setText(bundle.getString("Alpha_K"));
-		alphaCombo = new Combo(group, SWT.DROP_DOWN | SWT.READ_ONLY);
-		for (int i = 0; i <= 255; i += 5) {
-			alphaCombo.add(String.valueOf(i));
-		}
-		alphaCombo.select(alphaCombo.indexOf("255"));
-		alphaCombo.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				alpha();
-			}
-		});
-		
-		// Check box to request incremental display.
-		group = new Group(controls, SWT.NULL);
-		group.setLayout(new RowLayout());
-		group.setText(bundle.getString("Display"));
-		incrementalCheck = new Button(group, SWT.CHECK);
-		incrementalCheck.setText(bundle.getString("Incremental"));
-		incrementalCheck.setSelection(incremental);
-		incrementalCheck.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				incremental = ((Button)event.widget).getSelection();
-			}
-		});
-
-		// Check box to request transparent display.
-		transparentCheck = new Button(group, SWT.CHECK);
-		transparentCheck.setText(bundle.getString("Transparent"));
-		transparentCheck.setSelection(transparent);
-		transparentCheck.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				transparent = ((Button)event.widget).getSelection();
-				if (image != null) {
-					imageCanvas.redraw();
-				}
-			}
-		});
-
-		// Check box to request mask display.
-		maskCheck = new Button(group, SWT.CHECK);
-		maskCheck.setText(bundle.getString("Mask"));
-		maskCheck.setSelection(showMask);
-		maskCheck.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				showMask = ((Button)event.widget).getSelection();
-				if (image != null) {
-					imageCanvas.redraw();
-				}
-			}
-		});
-
-		// Check box to request background display.
-		backgroundCheck = new Button(group, SWT.CHECK);
-		backgroundCheck.setText(bundle.getString("Background"));
-		backgroundCheck.setSelection(showBackground);
-		backgroundCheck.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				showBackground = ((Button)event.widget).getSelection();
-			}
-		});
-
-		// Group the animation buttons.
-		group = new Group(controls, SWT.NULL);
-		group.setLayout(new RowLayout());
-		group.setText(bundle.getString("Animation"));
-
-		// Push button to display the previous image in a multi-image file.
-		previousButton = new Button(group, SWT.PUSH);
-		previousButton.setText(bundle.getString("Previous"));
-		previousButton.setEnabled(false);
-		previousButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				previous();
-			}
-		});
-
-		// Push button to display the next image in a multi-image file.
-		nextButton = new Button(group, SWT.PUSH);
-		nextButton.setText(bundle.getString("Next"));
-		nextButton.setEnabled(false);
-		nextButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				next();
-			}
-		});
-
-		// Push button to toggle animation of a multi-image file.
-		animateButton = new Button(group, SWT.PUSH);
-		animateButton.setText(bundle.getString("Animate"));
-		animateButton.setEnabled(false);
-		animateButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				animate();
-			}
-		});
-
-		// Label to show the image file type.
-		typeLabel = new Label(shell, SWT.NULL);
-		typeLabel.setText(bundle.getString("Type_initial"));
-		typeLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
-
-		// Canvas to show the image.
-		imageCanvas = new Canvas(shell, SWT.V_SCROLL | SWT.H_SCROLL | SWT.NO_REDRAW_RESIZE);
-		imageCanvas.setBackground(whiteColor);
-		imageCanvas.setCursor(crossCursor);
-		gridData = new GridData();
-		gridData.verticalSpan = 15;
-		gridData.horizontalAlignment = GridData.FILL;
-		gridData.verticalAlignment = GridData.FILL;
-		gridData.grabExcessHorizontalSpace = true;
-		gridData.grabExcessVerticalSpace = true;
-		imageCanvas.setLayoutData(gridData);
-		imageCanvas.addPaintListener(new PaintListener() {
-			public void paintControl(PaintEvent event) {
-				if (image != null)
-					paintImage(event);
-			}
-		});
-		imageCanvas.addMouseMoveListener(new MouseMoveListener() {
-			public void mouseMove(MouseEvent event) {
-				if (image != null) {
-					showColorAt(event.x, event.y);
-				}
-			}
-		});
-
-		// Set up the image canvas scroll bars.
-		ScrollBar horizontal = imageCanvas.getHorizontalBar();
-		horizontal.setVisible(true);
-		horizontal.setMinimum(0);
-		horizontal.setEnabled(false);
-		horizontal.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				scrollHorizontally((ScrollBar)event.widget);
-			}
-		});
-		ScrollBar vertical = imageCanvas.getVerticalBar();
-		vertical.setVisible(true);
-		vertical.setMinimum(0);
-		vertical.setEnabled(false);
-		vertical.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				scrollVertically((ScrollBar)event.widget);
-			}
-		});
-
-		// Label to show the image size.
-		sizeLabel = new Label(shell, SWT.NULL);
-		sizeLabel.setText(bundle.getString("Size_initial"));
-		sizeLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
-
-		// Label to show the image depth.
-		depthLabel = new Label(shell, SWT.NULL);
-		depthLabel.setText(bundle.getString("Depth_initial"));
-		depthLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
-
-		// Label to show the transparent pixel.
-		transparentPixelLabel = new Label(shell, SWT.NULL);
-		transparentPixelLabel.setText(bundle.getString("Transparent_pixel_initial"));
-		transparentPixelLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
-
-		// Label to show the time to load.
-		timeToLoadLabel = new Label(shell, SWT.NULL);
-		timeToLoadLabel.setText(bundle.getString("Time_to_load_initial"));
-		timeToLoadLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
-
-		// Separate the animation fields from the rest of the fields.
-		separator = new Label(shell, SWT.SEPARATOR | SWT.HORIZONTAL);
-		separator.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
-
-		// Label to show the logical screen size for animation.
-		screenSizeLabel = new Label(shell, SWT.NULL);
-		screenSizeLabel.setText(bundle.getString("Animation_size_initial"));
-		screenSizeLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
-
-		// Label to show the background pixel.
-		backgroundPixelLabel = new Label(shell, SWT.NULL);
-		backgroundPixelLabel.setText(bundle.getString("Background_pixel_initial"));
-		backgroundPixelLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
-
-		// Label to show the image location (x, y).
-		locationLabel = new Label(shell, SWT.NULL);
-		locationLabel.setText(bundle.getString("Image_location_initial"));
-		locationLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
-
-		// Label to show the image disposal method.
-		disposalMethodLabel = new Label(shell, SWT.NULL);
-		disposalMethodLabel.setText(bundle.getString("Disposal_initial"));
-		disposalMethodLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
-
-		// Label to show the image delay time.
-		delayTimeLabel = new Label(shell, SWT.NULL);
-		delayTimeLabel.setText(bundle.getString("Delay_initial"));
-		delayTimeLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
-
-		// Label to show the background pixel.
-		repeatCountLabel = new Label(shell, SWT.NULL);
-		repeatCountLabel.setText(bundle.getString("Repeats_initial"));
-		repeatCountLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
-
-		// Separate the animation fields from the palette.
-		separator = new Label(shell, SWT.SEPARATOR | SWT.HORIZONTAL);
-		separator.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
-
-		// Label to show if the image has a direct or indexed palette.
-		paletteLabel = new Label(shell, SWT.NULL);
-		paletteLabel.setText(bundle.getString("Palette_initial"));
-		paletteLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
-
-		// Canvas to show the image's palette.
-		paletteCanvas = new Canvas(shell, SWT.BORDER | SWT.V_SCROLL | SWT.NO_REDRAW_RESIZE);
-		paletteCanvas.setFont(fixedWidthFont);
-		paletteCanvas.getVerticalBar().setVisible(true);
-		gridData = new GridData();
-		gridData.horizontalAlignment = GridData.FILL;
-		gridData.verticalAlignment = GridData.FILL;
-		GC gc = new GC(paletteLabel);
-		paletteWidth = gc.stringExtent(bundle.getString("Max_length_string")).x;
-		gc.dispose();
-		gridData.widthHint = paletteWidth;
-		gridData.heightHint = 16 * 11; // show at least 16 colors
-		paletteCanvas.setLayoutData(gridData);
-		paletteCanvas.addPaintListener(new PaintListener() {
-			public void paintControl(PaintEvent event) {
-				if (image != null)
-					paintPalette(event);
-			}
-		});
-
-		// Set up the palette canvas scroll bar.
-		vertical = paletteCanvas.getVerticalBar();
-		vertical.setVisible(true);
-		vertical.setMinimum(0);
-		vertical.setIncrement(10);
-		vertical.setEnabled(false);
-		vertical.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				scrollPalette((ScrollBar)event.widget);
-			}
-		});
-
-		// Sash to see more of image or image data.
-		sash = new Sash(shell, SWT.HORIZONTAL);
-		gridData = new GridData();
-		gridData.horizontalSpan = 2;
-		gridData.horizontalAlignment = GridData.FILL;
-		sash.setLayoutData(gridData);
-		sash.addSelectionListener (new SelectionAdapter () {
-			public void widgetSelected (SelectionEvent event) {
-				if (event.detail != SWT.DRAG) {
-					((GridData)paletteCanvas.getLayoutData()).heightHint = SWT.DEFAULT;
-					Rectangle paletteCanvasBounds = paletteCanvas.getBounds();
-					int minY = paletteCanvasBounds.y + 20;
-					Rectangle dataLabelBounds = dataLabel.getBounds();
-					int maxY = statusLabel.getBounds().y - dataLabelBounds.height - 20;
-					if (event.y > minY && event.y < maxY) {
-						Rectangle oldSash = sash.getBounds();
-						sash.setBounds(event.x, event.y, event.width, event.height);
-						int diff = event.y - oldSash.y;
-						Rectangle bounds = imageCanvas.getBounds();
-						imageCanvas.setBounds(bounds.x, bounds.y, bounds.width, bounds.height + diff);
-						bounds = paletteCanvasBounds;
-						paletteCanvas.setBounds(bounds.x, bounds.y, bounds.width, bounds.height + diff);
-						bounds = dataLabelBounds;
-						dataLabel.setBounds(bounds.x, bounds.y + diff, bounds.width, bounds.height);
-						bounds = dataText.getBounds();
-						dataText.setBounds(bounds.x, bounds.y + diff, bounds.width, bounds.height - diff);
-						//shell.layout(true);
-					}
-				}
-			}
-		});
-
-		// Label to show data-specific fields.
-		dataLabel = new Label(shell, SWT.NULL);
-		dataLabel.setText(bundle.getString("Pixel_data_initial"));
-		gridData = new GridData();
-		gridData.horizontalSpan = 2;
-		gridData.horizontalAlignment = GridData.FILL;
-		dataLabel.setLayoutData(gridData);
-		
-		// Text to show a dump of the data.
-		dataText = new StyledText(shell, SWT.BORDER | SWT.MULTI | SWT.READ_ONLY | SWT.V_SCROLL | SWT.H_SCROLL);
-		dataText.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
-		dataText.setFont(fixedWidthFont);
-		gridData = new GridData();
-		gridData.horizontalSpan = 2;
-		gridData.horizontalAlignment = GridData.FILL;
-		gridData.verticalAlignment = GridData.FILL;
-		gridData.heightHint = 128;
-		gridData.grabExcessVerticalSpace = true;
-		dataText.setLayoutData(gridData);
-		dataText.addMouseListener(new MouseAdapter() {
-			public void mouseDown(MouseEvent event) {
-				if (image != null && event.button == 1) {
-					showColorForData();
-				}
-			}
-		});
-		dataText.addKeyListener(new KeyAdapter() {
-			public void keyPressed(KeyEvent event) {
-				if (image != null) {
-					showColorForData();
-				}
-			}
-		});
-		
-		// Label to show status and cursor location in image.
-		statusLabel = new Label(shell, SWT.NULL);
-		statusLabel.setText("");
-		gridData = new GridData();
-		gridData.horizontalSpan = 2;
-		gridData.horizontalAlignment = GridData.FILL;
-		statusLabel.setLayoutData(gridData);
-	}
-	
-	Menu createMenuBar() {
-		// Menu bar.
-		Menu menuBar = new Menu(shell, SWT.BAR);
-		shell.setMenuBar(menuBar);
-		createFileMenu(menuBar);
-		createAlphaMenu(menuBar);
-		return menuBar;
-	}
-	
-	void createFileMenu(Menu menuBar) {
-		// File menu
-		MenuItem item = new MenuItem(menuBar, SWT.CASCADE);
-		item.setText(bundle.getString("File"));
-		Menu fileMenu = new Menu(shell, SWT.DROP_DOWN);
-		item.setMenu(fileMenu);
-
-		// File -> Open File...
-		item = new MenuItem(fileMenu, SWT.NULL);
-		item.setText(bundle.getString("OpenFile"));
-		item.setAccelerator(SWT.CTRL + 'O');
-		item.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				menuOpenFile();
-			}
-		});
-		
-		// File -> Open URL...
-		item = new MenuItem(fileMenu, SWT.NULL);
-		item.setText(bundle.getString("OpenURL"));
-		item.setAccelerator(SWT.CTRL + 'U');
-		item.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				menuOpenURL();
-			}
-		});
-		
-		// File -> Reopen
-		item = new MenuItem(fileMenu, SWT.NULL);
-		item.setText(bundle.getString("Reopen"));
-		item.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				menuReopen();
-			}
-		});
-		
-		new MenuItem(fileMenu, SWT.SEPARATOR);
-		
-		// File -> Save
-		item = new MenuItem(fileMenu, SWT.NULL);
-		item.setText(bundle.getString("Save"));
-		item.setAccelerator(SWT.CTRL + 'S');
-		item.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				menuSave();
-			}
-		});
-		
-		// File -> Save As...
-		item = new MenuItem(fileMenu, SWT.NULL);
-		item.setText(bundle.getString("Save_as"));
-		item.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				menuSaveAs();
-			}
-		});
-		
-		// File -> Save Mask As...
-		item = new MenuItem(fileMenu, SWT.NULL);
-		item.setText(bundle.getString("Save_mask_as"));
-		item.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				menuSaveMaskAs();
-			}
-		});
-		
-		new MenuItem(fileMenu, SWT.SEPARATOR);
-		
-		// File -> Print
-		item = new MenuItem(fileMenu, SWT.NULL);
-		item.setText(bundle.getString("Print"));
-		item.setAccelerator(SWT.CTRL + 'P');
-		item.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				menuPrint();
-			}
-		});
-		
-		new MenuItem(fileMenu, SWT.SEPARATOR);
-
-		// File -> Exit
-		item = new MenuItem(fileMenu, SWT.NULL);
-		item.setText(bundle.getString("Exit"));
-		item.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				shell.close();
-			}
-		});
-	
-	}
-
-	void createAlphaMenu(Menu menuBar) {
-		// Alpha menu
-		MenuItem item = new MenuItem(menuBar, SWT.CASCADE);
-		item.setText(bundle.getString("Alpha"));
-		Menu alphaMenu = new Menu(shell, SWT.DROP_DOWN);
-		item.setMenu(alphaMenu);
-
-		// Alpha -> K
-		item = new MenuItem(alphaMenu, SWT.NULL);
-		item.setText("K");
-		item.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				menuComposeAlpha(ALPHA_CONSTANT);
-			}
-		});
-
-		// Alpha -> (K + x) % 256
-		item = new MenuItem(alphaMenu, SWT.NULL);
-		item.setText("(K + x) % 256");
-		item.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				menuComposeAlpha(ALPHA_X);
-			}
-		});
-
-		// Alpha -> (K + y) % 256
-		item = new MenuItem(alphaMenu, SWT.NULL);
-		item.setText("(K + y) % 256");
-		item.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				menuComposeAlpha(ALPHA_Y);
-			}
-		});
-	}
-
-	void menuComposeAlpha(int alpha_op) {
-		if (image == null) return;
-		animate = false; // stop any animation in progress
-		Cursor waitCursor = new Cursor(display, SWT.CURSOR_WAIT);
-		shell.setCursor(waitCursor);
-		imageCanvas.setCursor(waitCursor);
-		try {
-			if (alpha_op == ALPHA_CONSTANT) {
-				imageData.alpha = alpha;
-			} else {
-				imageData.alpha = -1;
-				switch (alpha_op) {
-					case ALPHA_X: 
-						for (int y = 0; y < imageData.height; y++) {
-						for (int x = 0; x < imageData.width; x++) {
-							imageData.setAlpha(x, y, (x + alpha) % 256);
-						}
-						}
-						break;
-					case ALPHA_Y: 
-						for (int y = 0; y < imageData.height; y++) {
-						for (int x = 0; x < imageData.width; x++) {
-							imageData.setAlpha(x, y, (y + alpha) % 256);
-						}
-						}
-						break;
-					default: break;
-				}					
-			}			
-			displayImage(imageData);
-		} finally {
-			shell.setCursor(null);
-			imageCanvas.setCursor(crossCursor);
-			waitCursor.dispose();
-		}
-	}
-
-	void menuOpenFile() {
-		animate = false; // stop any animation in progress
-		resetScaleCombos();
-		
-		// Get the user to choose an image file.
-		FileDialog fileChooser = new FileDialog(shell, SWT.OPEN);
-		if (lastPath != null)
-			fileChooser.setFilterPath(lastPath);
-		fileChooser.setFilterExtensions(new String[] { "*.bmp; *.gif; *.ico; *.jpg; *.pcx; *.png; *.tif", "*.bmp", "*.gif", "*.ico", "*.jpg", "*.pcx", "*.png", "*.tif" });
-		fileChooser.setFilterNames(new String[] { bundle.getString("All_images") + " (bmp, gif, ico, jpg, pcx, png, tif)",
-		                                          "BMP (*.bmp)", "GIF (*.gif)", "ICO (*.ico)", "JPEG (*.jpg)", "PCX (*.pcx)", "PNG (*.png)", "TIFF (*.tif)" });
-		String filename = fileChooser.open();
-		lastPath = fileChooser.getFilterPath();
-		if (filename == null)
-			return;
-
-		Cursor waitCursor = new Cursor(display, SWT.CURSOR_WAIT);
-		shell.setCursor(waitCursor);
-		imageCanvas.setCursor(waitCursor);
-		try {
-			loader = new ImageLoader();
-			if (incremental) {
-				// Prepare to handle incremental events.
-				loader.addImageLoaderListener(new ImageLoaderListener() {
-					public void imageDataLoaded(ImageLoaderEvent event) {
-						incrementalDataLoaded(event);
-					}
-				});
-				incrementalThreadStart();
-			}
-			// Read the new image(s) from the chosen file.
-			long startTime = System.currentTimeMillis();
-			imageDataArray = loader.load(filename);
-			loadTime = System.currentTimeMillis() - startTime;
-			if (imageDataArray.length > 0) {
-				// Cache the filename.
-				currentName = filename;
-				fileName = filename;
-				
-				// If there are multiple images in the file (typically GIF)
-				// then enable the Previous, Next and Animate buttons.
-				previousButton.setEnabled(imageDataArray.length > 1);
-				nextButton.setEnabled(imageDataArray.length > 1);
-				animateButton.setEnabled(imageDataArray.length > 1 && loader.logicalScreenWidth > 0 && loader.logicalScreenHeight > 0);
-	
-				// Display the first image in the file.
-				imageDataIndex = 0;
-				displayImage(imageDataArray[imageDataIndex]);
-				resetScrollBars();
-			}
-		} catch (SWTException e) {
-			showErrorDialog(bundle.getString("Loading_lc"), filename, e);
-		} finally {
-			shell.setCursor(null);
-			imageCanvas.setCursor(crossCursor);
-			waitCursor.dispose();
-		}
-	}
-	
-	void menuOpenURL() {
-		animate = false; // stop any animation in progress
-		resetScaleCombos();
-		
-		// Get the user to choose an image URL.
-		TextPrompter textPrompter = new TextPrompter(shell, SWT.APPLICATION_MODAL | SWT.DIALOG_TRIM);
-		textPrompter.setText(bundle.getString("OpenURLDialog"));
-		textPrompter.setMessage(bundle.getString("EnterURL"));
-		String urlname = textPrompter.open();
-		if (urlname == null) return;
-
-		Cursor waitCursor = new Cursor(display, SWT.CURSOR_WAIT);
-		shell.setCursor(waitCursor);
-		imageCanvas.setCursor(waitCursor);
-		try {
-			URL url = new URL(urlname);
-			InputStream stream = url.openStream();
-			loader = new ImageLoader();
-			if (incremental) {
-				// Prepare to handle incremental events.
-				loader.addImageLoaderListener(new ImageLoaderListener() {
-					public void imageDataLoaded(ImageLoaderEvent event) {
-						incrementalDataLoaded(event);
-					}
-				});
-				incrementalThreadStart();
-			}
-			// Read the new image(s) from the chosen file.
-			long startTime = System.currentTimeMillis();
-			imageDataArray = loader.load(stream);
-			loadTime = System.currentTimeMillis() - startTime;
-			if (imageDataArray.length > 0) {
-				currentName = urlname;
-				fileName = null;
-				
-				// If there are multiple images in the file (typically GIF)
-				// then enable the Previous, Next and Animate buttons.
-				previousButton.setEnabled(imageDataArray.length > 1);
-				nextButton.setEnabled(imageDataArray.length > 1);
-				animateButton.setEnabled(imageDataArray.length > 1 && loader.logicalScreenWidth > 0 && loader.logicalScreenHeight > 0);
-	
-				// Display the first image in the file.
-				imageDataIndex = 0;
-				displayImage(imageDataArray[imageDataIndex]);
-				resetScrollBars();
-			}
-		} catch (Exception e) {
-			showErrorDialog(bundle.getString("Loading_lc"), urlname, e);
-		} finally {
-			shell.setCursor(null);
-			imageCanvas.setCursor(crossCursor);
-			waitCursor.dispose();
-		}
-	}
-
-	/*
-	 * Called to start a thread that draws incremental images
-	 * as they are loaded.
-	 */
-	void incrementalThreadStart() {
-		incrementalEvents = new Vector();
-		incrementalThread = new Thread("Incremental") {
-			public void run() {
-				// Draw the first ImageData increment.
-				while (incrementalEvents != null) {
-					// Synchronize so we don't try to remove when the vector is null.
-					synchronized (ImageAnalyzer.this) {
-						if (incrementalEvents != null) {
-							if (incrementalEvents.size() > 0) {
-								ImageLoaderEvent event = (ImageLoaderEvent) incrementalEvents.remove(0);
-								if (image != null) image.dispose();
-								image = new Image(display, event.imageData);
-								imageData = event.imageData;
-								imageCanvasGC.drawImage(
-									image,
-									0,
-									0,
-									imageData.width,
-									imageData.height,
-									imageData.x,
-									imageData.y,
-									imageData.width,
-									imageData.height);
-							} else {
-								yield();
-							}
-						}
-					}
-				}
-				display.wake();
-			}
-		};
-		incrementalThread.setDaemon(true);
-		incrementalThread.start();
-	}
-	
-	/*
-	 * Called when incremental image data has been loaded,
-	 * for example, for interlaced GIF/PNG or progressive JPEG.
-	 */
-	void incrementalDataLoaded(ImageLoaderEvent event) {
-		// Synchronize so that we do not try to add while
-		// the incremental drawing thread is removing.
-		synchronized (this) {
-			incrementalEvents.addElement(event);
-		}
-	}
-	
-	void menuSave() {
-		if (image == null) return;
-		animate = false; // stop any animation in progress
-
-		// If the image file type is unknown, we can't 'Save',
-		// so we have to use 'Save As...'.
-		if (imageData.type == SWT.IMAGE_UNDEFINED || fileName == null) {
-			menuSaveAs();
-			return;
-		}
-
-		Cursor waitCursor = new Cursor(display, SWT.CURSOR_WAIT);
-		shell.setCursor(waitCursor);
-		imageCanvas.setCursor(waitCursor);
-		try {
-			// Save the current image to the current file.
-			loader.data = new ImageData[] {imageData};
-			loader.save(fileName, imageData.type);
-			
-		} catch (SWTException e) {
-			showErrorDialog(bundle.getString("Saving_lc"), fileName, e);
-		} finally {
-			shell.setCursor(null);
-			imageCanvas.setCursor(crossCursor);
-			waitCursor.dispose();
-		}
-	}
-
-	void menuSaveAs() {
-		if (image == null) return;
-		animate = false; // stop any animation in progress
-
-		// Get the user to choose a file name and type to save.
-		FileDialog fileChooser = new FileDialog(shell, SWT.SAVE);
-		fileChooser.setFilterPath(lastPath);
-		if (fileName != null) fileChooser.setFileName(fileName);
-		fileChooser.setFilterExtensions(new String[] { "*.bmp", "*.gif", "*.ico", "*.jpg", "*.png" });
-		fileChooser.setFilterNames(new String[] { "BMP (*.bmp)", "GIF (*.gif)", "ICO (*.ico)", "JPEG (*.jpg)", "PNG (*.png)" });
-		String filename = fileChooser.open();
-		lastPath = fileChooser.getFilterPath();
-		if (filename == null)
-			return;
-
-		// Figure out what file type the user wants saved.
-		// We need to rely on the file extension because FileDialog
-		// does not have API for asking what filter type was selected.
-		int filetype = determineFileType(filename);
-		if (filetype == SWT.IMAGE_UNDEFINED) {
-			MessageBox box = new MessageBox(shell, SWT.ICON_ERROR);
-			box.setMessage(createMsg(bundle.getString("Unknown_extension"), 
-			                         filename.substring(filename.lastIndexOf('.') + 1)));
-			box.open();
-			return;
-		}
-		
-		if (new java.io.File(filename).exists()) {
-			MessageBox box = new MessageBox(shell, SWT.ICON_QUESTION | SWT.OK | SWT.CANCEL);
-			box.setMessage(createMsg(bundle.getString("Overwrite"), filename));
-			if (box.open() == SWT.CANCEL)
-				return;
-		}
-		
-		Cursor waitCursor = new Cursor(display, SWT.CURSOR_WAIT);
-		shell.setCursor(waitCursor);
-		imageCanvas.setCursor(waitCursor);
-		try {
-			// Save the current image to the specified file.
-			loader.data = new ImageData[] {imageData};
-			loader.save(filename, filetype);
-			
-			// Update the shell title and file type label,
-			// and use the new file.
-			fileName = filename;
-			shell.setText(createMsg(bundle.getString("Analyzer_on"), filename));
-			typeLabel.setText(createMsg(bundle.getString("Type_string"), fileTypeString(filetype)));
-
-		} catch (SWTException e) {
-			showErrorDialog(bundle.getString("Saving_lc"), filename, e);
-		} finally {
-			shell.setCursor(null);
-			imageCanvas.setCursor(crossCursor);
-			waitCursor.dispose();
-		}
-	}
-
-	void menuSaveMaskAs() {
-		if (image == null || !showMask) return;
-		if (imageData.getTransparencyType() == SWT.TRANSPARENCY_NONE) return;
-		animate = false; // stop any animation in progress
-
-		// Get the user to choose a file name and type to save.
-		FileDialog fileChooser = new FileDialog(shell, SWT.SAVE);
-		fileChooser.setFilterPath(lastPath);
-		if (fileName != null) fileChooser.setFileName(fileName);
-		fileChooser.setFilterExtensions(new String[] { "*.bmp", "*.gif", "*.ico", "*.jpg", "*.png" });
-		fileChooser.setFilterNames(new String[] { "BMP (*.bmp)", "GIF (*.gif)", "ICO (*.ico)", "JPEG (*.jpg)", "PNG (*.png)" });
-		String filename = fileChooser.open();
-		lastPath = fileChooser.getFilterPath();
-		if (filename == null)
-			return;
-
-		// Figure out what file type the user wants saved.
-		// We need to rely on the file extension because FileDialog
-		// does not have API for asking what filter type was selected.
-		int filetype = determineFileType(filename);
-		if (filetype == SWT.IMAGE_UNDEFINED) {
-			MessageBox box = new MessageBox(shell, SWT.ICON_ERROR);
-			box.setMessage(createMsg(bundle.getString("Unknown_extension"), 
-			                         filename.substring(filename.lastIndexOf('.') + 1)));
-			box.open();
-			return;
-		}
-		
-		if (new java.io.File(filename).exists()) {
-			MessageBox box = new MessageBox(shell, SWT.ICON_QUESTION | SWT.OK | SWT.CANCEL);
-			box.setMessage(createMsg(bundle.getString("Overwrite"), filename));
-			if (box.open() == SWT.CANCEL)
-				return;
-		}
-		
-		Cursor waitCursor = new Cursor(display, SWT.CURSOR_WAIT);
-		shell.setCursor(waitCursor);
-		imageCanvas.setCursor(waitCursor);
-		try {
-			// Save the mask of the current image to the specified file.
-			ImageData maskImageData = imageData.getTransparencyMask();
-			loader.data = new ImageData[] {maskImageData};
-			loader.save(filename, filetype);
-			
-		} catch (SWTException e) {
-			showErrorDialog(bundle.getString("Saving_lc"), filename, e);
-		} finally {
-			shell.setCursor(null);
-			imageCanvas.setCursor(crossCursor);
-			waitCursor.dispose();
-		}
-	}
-
-	void menuPrint() {
-		if (image == null) return;
-
-		try {
-			// Ask the user to specify the printer.
-			PrintDialog dialog = new PrintDialog(shell, SWT.NULL);
-			PrinterData printerData = dialog.open();
-			if (printerData == null) return;
-			
-			Printer printer = new Printer(printerData);
-			Point screenDPI = display.getDPI();
-			Point printerDPI = printer.getDPI();
-			int scaleFactor = printerDPI.x / screenDPI.x;
-			Rectangle trim = printer.computeTrim(0, 0, 0, 0);
-			if (printer.startJob(currentName)) {
-				if (printer.startPage()) {
-					GC gc = new GC(printer);
-					int transparentPixel = imageData.transparentPixel;
-					if (transparentPixel != -1 && !transparent) {
-						imageData.transparentPixel = -1;
-					}
-					Image printerImage = new Image(printer, imageData);
-					gc.drawImage(
-						printerImage,
-						0,
-						0,
-						imageData.width,
-						imageData.height,
-						-trim.x,
-						-trim.y,
-						scaleFactor * imageData.width,
-						scaleFactor * imageData.height);
-					if (transparentPixel != -1 && !transparent) {
-						imageData.transparentPixel = transparentPixel;
-					}
-					printerImage.dispose();
-					gc.dispose();
-					printer.endPage();
-				}
-				printer.endJob();
-			}
-			printer.dispose();
-		} catch (SWTError e) {
-			MessageBox box = new MessageBox(shell, SWT.ICON_ERROR);
-			box.setMessage(bundle.getString("Printing_error") + e.getMessage());
-			box.open();
-		}
-	}
-
-	void menuReopen() {
-		if (currentName == null) return;
-		animate = false; // stop any animation in progress
-		resetScrollBars();
-		resetScaleCombos();
-		Cursor waitCursor = new Cursor(display, SWT.CURSOR_WAIT);
-		shell.setCursor(waitCursor);
-		imageCanvas.setCursor(waitCursor);
-		try {
-			loader = new ImageLoader();
-			long startTime = System.currentTimeMillis();
-			ImageData[] newImageData;
-			if (fileName == null) {
-				URL url = new URL(currentName);
-				InputStream stream = url.openStream();
-				newImageData = loader.load(stream);
-			} else {
-				newImageData = loader.load(fileName);
-			}
-			loadTime = System.currentTimeMillis() - startTime;
-			imageDataIndex = 0;
-			displayImage(newImageData[imageDataIndex]);
-
-		} catch (Exception e) {
-			showErrorDialog(bundle.getString("Reloading_lc"), currentName, e);
-		} finally {	
-			shell.setCursor(null);
-			imageCanvas.setCursor(crossCursor);
-			waitCursor.dispose();
-		}
-	}
-	
-	void changeBackground() {
-		String background = backgroundCombo.getText();
-		if (background.equals(bundle.getString("White"))) {
-			imageCanvas.setBackground(whiteColor);
-		} else if (background.equals(bundle.getString("Black"))) {
-			imageCanvas.setBackground(blackColor);
-		} else if (background.equals(bundle.getString("Red"))) {
-			imageCanvas.setBackground(redColor);
-		} else if (background.equals(bundle.getString("Green"))) {
-			imageCanvas.setBackground(greenColor);
-		} else if (background.equals(bundle.getString("Blue"))) {
-			imageCanvas.setBackground(blueColor);
-		} else {
-			imageCanvas.setBackground(null);
-		}
-	}
-	
-	/*
-	 * Called when the ScaleX combo selection changes.
-	 */
-	void scaleX() {
-		try {
-			xscale = Float.parseFloat(scaleXCombo.getText());
-		} catch (NumberFormatException e) {
-			xscale = 1;
-			scaleXCombo.select(scaleXCombo.indexOf("1"));
-		}
-		if (image != null) {
-			resizeScrollBars();
-			imageCanvas.redraw();
-		}
-	}
-	
-	/*
-	 * Called when the ScaleY combo selection changes.
-	 */
-	void scaleY() {
-		try {
-			yscale = Float.parseFloat(scaleYCombo.getText());
-		} catch (NumberFormatException e) {
-			yscale = 1;
-			scaleYCombo.select(scaleYCombo.indexOf("1"));
-		}
-		if (image != null) {
-			resizeScrollBars();
-			imageCanvas.redraw();
-		}
-	}
-	
-	/*
-	 * Called when the Alpha combo selection changes.
-	 */
-	void alpha() {
-		try {
-			alpha = Integer.parseInt(alphaCombo.getText());
-		} catch (NumberFormatException e) {
-			alphaCombo.select(alphaCombo.indexOf("255"));
-			alpha = 255;
-		}
-	}
-	
-	/*
-	 * Called when the mouse moves in the image canvas.
-	 * Show the color of the image at the point under the mouse.
-	 */
-	void showColorAt(int mx, int my) {
-		int x = mx - imageData.x - ix;
-		int y = my - imageData.y - iy;
-		showColorForPixel(x, y);
-	}
-	
-	/*
-	 * Called when a mouse down or key press is detected
-	 * in the data text. Show the color of the pixel at
-	 * the caret position in the data text.
-	 */
-	void showColorForData() {
-		int delimiterLength = dataText.getLineDelimiter().length();
-		int charactersPerLine = 6 + 3 * imageData.bytesPerLine + delimiterLength;
-		int position = dataText.getCaretOffset();
-		int y = position / charactersPerLine;
-		if ((position - y * charactersPerLine) < 6 || ((y + 1) * charactersPerLine - position) <= delimiterLength) {
-			statusLabel.setText("");
-			return;
-		}
-		int dataPosition = position - 6 * (y + 1) - delimiterLength * y;
-		int byteNumber = dataPosition / 3;
-		int where = dataPosition - byteNumber * 3;
-		int xByte = byteNumber % imageData.bytesPerLine;
-		int x = -1;
-		int depth = imageData.depth;
-		if (depth == 1) { // 8 pixels per byte (can only show 3 of 8)
-			if (where == 0) x = xByte * 8;
-			if (where == 1) x = xByte * 8 + 3;
-			if (where == 2) x = xByte * 8 + 7;
-		}
-		if (depth == 2) { // 4 pixels per byte (can only show 3 of 4)
-			if (where == 0) x = xByte * 4;
-			if (where == 1) x = xByte * 4 + 1;
-			if (where == 2) x = xByte * 4 + 3;
-		}
-		if (depth == 4) { // 2 pixels per byte
-			if (where == 0) x = xByte * 2;
-			if (where == 1) x = xByte * 2;
-			if (where == 2) x = xByte * 2 + 1;
-		}
-		if (depth == 8) { // 1 byte per pixel
-			x = xByte;
-		}
-		if (depth == 16) { // 2 bytes per pixel
-			x = xByte / 2;
-		}
-		if (depth == 24) { // 3 bytes per pixel
-			x = xByte / 3;
-		}
-		if (depth == 32) { // 4 bytes per pixel
-			x = xByte / 4;
-		}
-		if (x != -1) {
-			showColorForPixel(x, y);
-		} else {
-			statusLabel.setText("");
-		}
-	}
-	
-	/*
-	 * Set the status label to show color information
-	 * for the specified pixel in the image.
-	 */
-	void showColorForPixel(int x, int y) {
-		if (x >= 0 && x < imageData.width && y >= 0 && y < imageData.height) {
-			int pixel = imageData.getPixel(x, y);
-			RGB rgb = imageData.palette.getRGB(pixel);
-
-
-			Object[] args = {new Integer(x),
-					     new Integer(y),
-					     new Integer(pixel),
-					     Integer.toHexString(pixel),
-					     rgb};
-			if (pixel == imageData.transparentPixel) {
-				statusLabel.setText(createMsg(bundle.getString("Color_at_trans"), args));
-			} else {
-				statusLabel.setText(createMsg(bundle.getString("Color_at"), args));
-			}
-		} else {
-			statusLabel.setText("");
-		}
-	}
-	
-	/*
-	 * Called when the Animate button is pressed.
-	 */
-	void animate() {
-		animate = !animate;
-		if (animate && image != null && imageDataArray.length > 1) {
-			animateThread = new Thread(bundle.getString("Animation")) {
-				public void run() {
-					// Pre-animation widget setup.
-					preAnimation();
-					
-					// Animate.
-					try {
-						animateLoop();
-					} catch (final SWTException e) {
-						display.syncExec(new Runnable() {
-							public void run() {
-								showErrorDialog(createMsg(bundle.getString("Creating_image"), 
-										    new Integer(imageDataIndex+1)),
-										    currentName, e);
-							}
-						});
-					}
-					
-					// Post animation widget reset.
-					postAnimation();
-				}
-			};
-			animateThread.setDaemon(true);
-			animateThread.start();
-		}
-	}
-	
-	/*
-	 * Loop through all of the images in a multi-image file
-	 * and display them one after another.
-	 */
-	void animateLoop() {
-		// Create an off-screen image to draw on, and a GC to draw with.
-		// Both are disposed after the animation.
-		Image offScreenImage = new Image(display, loader.logicalScreenWidth, loader.logicalScreenHeight);
-		GC offScreenImageGC = new GC(offScreenImage);
-		
-		try {
-			// Use syncExec to get the background color of the imageCanvas.
-			display.syncExec(new Runnable() {
-				public void run() {
-					canvasBackground = imageCanvas.getBackground();
-				}
-			});
-
-			// Fill the off-screen image with the background color of the canvas.
-			offScreenImageGC.setBackground(canvasBackground);
-			offScreenImageGC.fillRectangle(
-				0,
-				0,
-				loader.logicalScreenWidth,
-				loader.logicalScreenHeight);
-					
-			// Draw the current image onto the off-screen image.
-			offScreenImageGC.drawImage(
-				image,
-				0,
-				0,
-				imageData.width,
-				imageData.height,
-				imageData.x,
-				imageData.y,
-				imageData.width,
-				imageData.height);
-
-			int repeatCount = loader.repeatCount;
-			while (animate && (loader.repeatCount == 0 || repeatCount > 0)) {
-				if (imageData.disposalMethod == SWT.DM_FILL_BACKGROUND) {
-					// Fill with the background color before drawing.
-					Color bgColor = null;
-					int backgroundPixel = loader.backgroundPixel;
-					if (showBackground && backgroundPixel != -1) {
-						// Fill with the background color.
-						RGB backgroundRGB = imageData.palette.getRGB(backgroundPixel);
-						bgColor = new Color(null, backgroundRGB);
-					}
-					try {
-						offScreenImageGC.setBackground(bgColor != null ? bgColor : canvasBackground);
-						offScreenImageGC.fillRectangle(
-							imageData.x,
-							imageData.y,
-							imageData.width,
-							imageData.height);
-					} finally {
-						if (bgColor != null) bgColor.dispose();
-					}
-				} else if (imageData.disposalMethod == SWT.DM_FILL_PREVIOUS) {
-					// Restore the previous image before drawing.
-					offScreenImageGC.drawImage(
-						image,
-						0,
-						0,
-						imageData.width,
-						imageData.height,
-						imageData.x,
-						imageData.y,
-						imageData.width,
-						imageData.height);
-				}
-									
-				// Get the next image data.
-				imageDataIndex = (imageDataIndex + 1) % imageDataArray.length;
-				imageData = imageDataArray[imageDataIndex];
-				image.dispose();
-				image = new Image(display, imageData);
-				
-				// Draw the new image data.
-				offScreenImageGC.drawImage(
-					image,
-					0,
-					0,
-					imageData.width,
-					imageData.height,
-					imageData.x,
-					imageData.y,
-					imageData.width,
-					imageData.height);
-				
-				// Draw the off-screen image to the screen.
-				imageCanvasGC.drawImage(offScreenImage, 0, 0);
-				
-				// Sleep for the specified delay time before drawing again.
-				try {
-					Thread.sleep(visibleDelay(imageData.delayTime * 10));
-				} catch (InterruptedException e) {
-				}
-				
-				// If we have just drawn the last image in the set,
-				// then decrement the repeat count.
-				if (imageDataIndex == imageDataArray.length - 1) repeatCount--;
-			}
-		} finally {
-			offScreenImage.dispose();
-			offScreenImageGC.dispose();
-		}
-	}
-
-	/*
-	 * Pre animation setup.
-	 */
-	void preAnimation() {
-		display.syncExec(new Runnable() {
-			public void run() {
-				// Change the label of the Animate button to 'Stop'.
-				animateButton.setText(bundle.getString("Stop"));
-				
-				// Disable anything we don't want the user
-				// to select during the animation.
-				previousButton.setEnabled(false);
-				nextButton.setEnabled(false);
-				backgroundCombo.setEnabled(false);
-				scaleXCombo.setEnabled(false);
-				scaleYCombo.setEnabled(false);
-				alphaCombo.setEnabled(false);
-				incrementalCheck.setEnabled(false);
-				transparentCheck.setEnabled(false);
-				maskCheck.setEnabled(false);
-				// leave backgroundCheck enabled
-			
-				// Reset the scale combos and scrollbars.
-				resetScaleCombos();
-				resetScrollBars();
-			}
-		});
-	}
-
-	/*
-	 * Post animation reset.
-	 */
-	void postAnimation() {
-		display.syncExec(new Runnable() {
-			public void run() {
-				// Enable anything we disabled before the animation.
-				previousButton.setEnabled(true);
-				nextButton.setEnabled(true);
-				backgroundCombo.setEnabled(true);
-				scaleXCombo.setEnabled(true);
-				scaleYCombo.setEnabled(true);
-				alphaCombo.setEnabled(true);
-				incrementalCheck.setEnabled(true);
-				transparentCheck.setEnabled(true);
-				maskCheck.setEnabled(true);
-			
-				// Reset the label of the Animate button.
-				animateButton.setText(bundle.getString("Animate"));
-			
-				if (animate) {
-					// If animate is still true, we finished the
-					// full number of repeats. Leave the image as-is.
-					animate = false;
-				} else {
-					// Redisplay the current image and its palette.
-					displayImage(imageDataArray[imageDataIndex]);
-				}
-			}
-		});
-	}
-
-	/*
-	 * Called when the Previous button is pressed.
-	 * Display the previous image in a multi-image file.
-	 */
-	void previous() {
-		if (image != null && imageDataArray.length > 1) {
-			if (imageDataIndex == 0) {
-				imageDataIndex = imageDataArray.length;
-			}
-			imageDataIndex = imageDataIndex - 1;
-			displayImage(imageDataArray[imageDataIndex]);
-		}	
-	}
-
-	/*
-	 * Called when the Next button is pressed.
-	 * Display the next image in a multi-image file.
-	 */
-	void next() {
-		if (image != null && imageDataArray.length > 1) {
-			imageDataIndex = (imageDataIndex + 1) % imageDataArray.length;
-			displayImage(imageDataArray[imageDataIndex]);
-		}	
-	}
-
-	void displayImage(ImageData newImageData) {
-		if (incremental && incrementalThread != null) {
-			// Tell the incremental thread to stop drawing.
-			synchronized (this) {
-				incrementalEvents = null;
-			}
-			
-			// Wait until the incremental thread is done.
-			while (incrementalThread.isAlive()) {
-				if (!display.readAndDispatch()) display.sleep();
-			}
-		}
-					
-		// Dispose of the old image, if there was one.
-		if (image != null) image.dispose();
-
-		try {
-			// Cache the new image and imageData.
-			image = new Image(display, newImageData);
-			imageData = newImageData;
-
-		} catch (SWTException e) {
-			showErrorDialog(bundle.getString("Creating_from") + " ", currentName, e);
-			image = null;
-			return;
-		}
-
-		// Update the widgets with the new image info.
-		String string = createMsg(bundle.getString("Analyzer_on"), currentName);
-		shell.setText(string);
-
-		if (imageDataArray.length > 1) {
-			string = createMsg(bundle.getString("Type_index"), 
-			                   new Object[] {fileTypeString(imageData.type),
-			                                 new Integer(imageDataIndex + 1),
-			                                 new Integer(imageDataArray.length)});
-		} else {
-			string = createMsg(bundle.getString("Type_string"), fileTypeString(imageData.type));
-		}
-		typeLabel.setText(string);
-
-		string = createMsg(bundle.getString("Size_value"), 
-					 new Object[] {new Integer(imageData.width),
-							   new Integer(imageData.height)});
-		sizeLabel.setText(string);
-
-		string = createMsg(bundle.getString("Depth_value"), new Integer(imageData.depth));
-		depthLabel.setText(string);
-
-		string = createMsg(bundle.getString("Transparent_pixel_value"), pixelInfo(imageData.transparentPixel));
-		transparentPixelLabel.setText(string);
-
-		string = createMsg(bundle.getString("Time_to_load_value"), new Long(loadTime));
-		timeToLoadLabel.setText(string);
-
-		string = createMsg(bundle.getString("Animation_size_value"), 
-		                      new Object[] {new Integer(loader.logicalScreenWidth),
-								new Integer(loader.logicalScreenHeight)});
-		screenSizeLabel.setText(string);
-
-		string = createMsg(bundle.getString("Background_pixel_value"), pixelInfo(loader.backgroundPixel));
-		backgroundPixelLabel.setText(string);
-
-		string = createMsg(bundle.getString("Image_location_value"), 
-		                      new Object[] {new Integer(imageData.x), new Integer(imageData.y)});
-		locationLabel.setText(string);
-
-		string = createMsg(bundle.getString("Disposal_value"),
-		                      new Object[] {new Integer(imageData.disposalMethod),
-							      disposalString(imageData.disposalMethod)});
-		disposalMethodLabel.setText(string);
-
-		int delay = imageData.delayTime * 10;
-		int delayUsed = visibleDelay(delay);
-		if (delay != delayUsed) {
-			string = createMsg(bundle.getString("Delay_value"), 
-			                   new Object[] {new Integer(delay), new Integer(delayUsed)});
-		} else {
-			string = createMsg(bundle.getString("Delay_used"), new Integer(delay));
-		}
-		delayTimeLabel.setText(string);
-
-		if (loader.repeatCount == 0) {
-			string = createMsg( bundle.getString("Repeats_forever"), new Integer(loader.repeatCount));
-		} else {
-			string = createMsg(bundle.getString("Repeats_value"), new Integer(loader.repeatCount));
-		}
-		repeatCountLabel.setText(string);
-
-
-		if (imageData.palette.isDirect) {
-			string = bundle.getString("Palette_direct");
-		} else {
-			string = createMsg(bundle.getString("Palette_value"), new Integer(imageData.palette.getRGBs().length));
-		}
-		paletteLabel.setText(string);
-
-		string = createMsg(bundle.getString("Pixel_data_value"), 
-					 new Object[] {new Integer(imageData.bytesPerLine),
-						         new Integer(imageData.scanlinePad),
-							   depthInfo(imageData.depth)});
-		dataLabel.setText(string);
-
-		String data = dataHexDump(dataText.getLineDelimiter());
-		dataText.setText(data);
-		
-		// bold the first column all the way down
-		int index = 0;
-		while((index = data.indexOf(':', index+1)) != -1) 
-			dataText.setStyleRange(new StyleRange(index - INDEX_DIGITS, INDEX_DIGITS, dataText.getForeground(), dataText.getBackground(), SWT.BOLD));
-
-		statusLabel.setText("");
-
-		// Redraw both canvases.
-		paletteCanvas.redraw();
-		imageCanvas.redraw();
-	}
-
-	void paintImage(PaintEvent event) {
-		Image paintImage = image;
-		int transparentPixel = imageData.transparentPixel;
-		if (transparentPixel != -1 && !transparent) {
-			imageData.transparentPixel = -1;
-			paintImage = new Image(display, imageData);
-		}
-		int w = Math.round(imageData.width * xscale);
-		int h = Math.round(imageData.height * yscale);
-		event.gc.drawImage(
-			paintImage,
-			0,
-			0,
-			imageData.width,
-			imageData.height,
-			ix + imageData.x,
-			iy + imageData.y,
-			w,
-			h);
-		if (showMask && (imageData.getTransparencyType() != SWT.TRANSPARENCY_NONE)) {
-			ImageData maskImageData = imageData.getTransparencyMask();
-			Image maskImage = new Image(display, maskImageData);
-			event.gc.drawImage(
-				maskImage,
-				0,
-				0,
-				imageData.width,
-				imageData.height,
-				w + 10 + ix + imageData.x,
-				iy + imageData.y,
-				w,
-				h);
-			maskImage.dispose();
-		}
-		if (transparentPixel != -1 && !transparent) {
-			imageData.transparentPixel = transparentPixel;
-			paintImage.dispose();
-		}
-	}
-
-	void paintPalette(PaintEvent event) {
-		GC gc = event.gc;
-		gc.fillRectangle(paletteCanvas.getClientArea());
-		if (imageData.palette.isDirect) {
-			// For a direct palette, display the masks.
-			int y = py + 10;
-			int xTab = 50;
-			gc.drawString("rMsk", 10, y, true);
-			gc.drawString(toHex4ByteString(imageData.palette.redMask), xTab, y, true);
-			gc.drawString("gMsk", 10, y+=12, true);
-			gc.drawString(toHex4ByteString(imageData.palette.greenMask), xTab, y, true);
-			gc.drawString("bMsk", 10, y+=12, true);
-			gc.drawString(toHex4ByteString(imageData.palette.blueMask), xTab, y, true);
-			gc.drawString("rShf", 10, y+=12, true);
-			gc.drawString(Integer.toString(imageData.palette.redShift), xTab, y, true);
-			gc.drawString("gShf", 10, y+=12, true);
-			gc.drawString(Integer.toString(imageData.palette.greenShift), xTab, y, true);
-			gc.drawString("bShf", 10, y+=12, true);
-			gc.drawString(Integer.toString(imageData.palette.blueShift), xTab, y, true);
-		} else {
-			// For an indexed palette, display the palette colors and indices.
-			RGB[] rgbs = imageData.palette.getRGBs();
-			if (rgbs != null) {
-				int xTab1 = 40, xTab2 = 100;
-				for (int i = 0; i < rgbs.length; i++) {
-					int y = (i+1) * 10 + py;
-					gc.drawString(String.valueOf(i), 10, y, true);
-					gc.drawString(toHexByteString(rgbs[i].red) + toHexByteString(rgbs[i].green) + toHexByteString(rgbs[i].blue), xTab1, y, true);
-					Color color = new Color(display, rgbs[i]);
-					gc.setBackground(color);
-					gc.fillRectangle(xTab2, y+2, 10, 10);
-					color.dispose();
-				}
-			}
-		}
-	}
-	
-	void resizeShell(ControlEvent event) {
-		if (image == null || shell.isDisposed())
-			return;
-		resizeScrollBars();
-	}
-
-	// Reset the scale combos to 1.
-	void resetScaleCombos() {
-		xscale = 1; yscale = 1;
-		scaleXCombo.select(scaleXCombo.indexOf("1"));
-		scaleYCombo.select(scaleYCombo.indexOf("1"));
-	}
-	
-	// Reset the scroll bars to 0.
-	void resetScrollBars() {
-		if (image == null) return;
-		ix = 0; iy = 0; py = 0;
-		resizeScrollBars();
-		imageCanvas.getHorizontalBar().setSelection(0);
-		imageCanvas.getVerticalBar().setSelection(0);
-		paletteCanvas.getVerticalBar().setSelection(0);
-	}
-	
-	void resizeScrollBars() {
-		// Set the max and thumb for the image canvas scroll bars.
-		ScrollBar horizontal = imageCanvas.getHorizontalBar();
-		ScrollBar vertical = imageCanvas.getVerticalBar();
-		Rectangle canvasBounds = imageCanvas.getClientArea();
-		int width = Math.round(imageData.width * xscale);
-		if (width > canvasBounds.width) {
-			// The image is wider than the canvas.
-			horizontal.setEnabled(true);
-			horizontal.setMaximum(width);
-			horizontal.setThumb(canvasBounds.width);
-			horizontal.setPageIncrement(canvasBounds.width);
-		} else {
-			// The canvas is wider than the image.
-			horizontal.setEnabled(false);
-			if (ix != 0) {
-				// Make sure the image is completely visible.
-				ix = 0;
-				imageCanvas.redraw();
-			}
-		}
-		int height = Math.round(imageData.height * yscale);
-		if (height > canvasBounds.height) {
-			// The image is taller than the canvas.
-			vertical.setEnabled(true);
-			vertical.setMaximum(height);
-			vertical.setThumb(canvasBounds.height);
-			vertical.setPageIncrement(canvasBounds.height);
-		} else {
-			// The canvas is taller than the image.
-			vertical.setEnabled(false);
-			if (iy != 0) {
-				// Make sure the image is completely visible.
-				iy = 0;
-				imageCanvas.redraw();
-			}
-		}
-
-		// Set the max and thumb for the palette canvas scroll bar.
-		vertical = paletteCanvas.getVerticalBar();
-		if (imageData.palette.isDirect) {
-			vertical.setEnabled(false);
-		} else { // indexed palette
-			canvasBounds = paletteCanvas.getClientArea();
-			int paletteHeight = imageData.palette.getRGBs().length * 10 + 20; // 10 pixels each index + 20 for margins.
-			vertical.setEnabled(true);
-			vertical.setMaximum(paletteHeight);
-			vertical.setThumb(canvasBounds.height);
-			vertical.setPageIncrement(canvasBounds.height);
-		}
-	}
-
-	/*
-	 * Called when the image canvas' horizontal scrollbar is selected.
-	 */
-	void scrollHorizontally(ScrollBar scrollBar) {
-		if (image == null) return;
-		Rectangle canvasBounds = imageCanvas.getClientArea();
-		int width = Math.round(imageData.width * xscale);
-		int height = Math.round(imageData.height * yscale);
-		if (width > canvasBounds.width) {
-			// Only scroll if the image is bigger than the canvas.
-			int x = -scrollBar.getSelection();
-			if (x + width < canvasBounds.width) {
-				// Don't scroll past the end of the image.
-				x = canvasBounds.width - width;
-			}
-			imageCanvas.scroll(x, iy, ix, iy, width, height, false);
-			ix = x;
-		}
-	}
-	
-	/*
-	 * Called when the image canvas' vertical scrollbar is selected.
-	 */
-	void scrollVertically(ScrollBar scrollBar) {
-		if (image == null) return;
-		Rectangle canvasBounds = imageCanvas.getClientArea();
-		int width = Math.round(imageData.width * xscale);
-		int height = Math.round(imageData.height * yscale);
-		if (height > canvasBounds.height) {
-			// Only scroll if the image is bigger than the canvas.
-			int y = -scrollBar.getSelection();
-			if (y + height < canvasBounds.height) {
-				// Don't scroll past the end of the image.
-				y = canvasBounds.height - height;
-			}
-			imageCanvas.scroll(ix, y, ix, iy, width, height, false);
-			iy = y;
-		}
-	}
-
-	/*
-	 * Called when the palette canvas' vertical scrollbar is selected.
-	 */
-	void scrollPalette(ScrollBar scrollBar) {
-		if (image == null) return;
-		Rectangle canvasBounds = paletteCanvas.getClientArea();
-		int paletteHeight = imageData.palette.getRGBs().length * 10 + 20;
-		if (paletteHeight > canvasBounds.height) {
-			// Only scroll if the palette is bigger than the canvas.
-			int y = -scrollBar.getSelection();
-			if (y + paletteHeight < canvasBounds.height) {
-				// Don't scroll past the end of the palette.
-				y = canvasBounds.height - paletteHeight;
-			}
-			paletteCanvas.scroll(0, y, 0, py, paletteWidth, paletteHeight, false);
-			py = y;
-		}
-	}
-
-	/*
-	 * Return a String containing a line-by-line dump of
-	 * the data in the current imageData. The lineDelimiter
-	 * parameter must be a string of length 1 or 2.
-	 */
-	String dataHexDump(String lineDelimiter) {
-		if (image == null) return "";
-		char[] dump = new char[imageData.height * (6 + 3 * imageData.bytesPerLine + lineDelimiter.length())];
-		int index = 0;
-		for (int i = 0; i < imageData.data.length; i++) {
-			if (i % imageData.bytesPerLine == 0) {
-				int line = i / imageData.bytesPerLine;
-				dump[index++] = Character.forDigit(line / 1000 % 10, 10);
-				dump[index++] = Character.forDigit(line / 100 % 10, 10);
-				dump[index++] = Character.forDigit(line / 10 % 10, 10);
-				dump[index++] = Character.forDigit(line % 10, 10);
-				dump[index++] = ':';
-				dump[index++] = ' ';
-			}
-			byte b = imageData.data[i];
-			dump[index++] = Character.forDigit((b & 0xF0) >> 4, 16);
-			dump[index++] = Character.forDigit(b & 0x0F, 16);
-			dump[index++] = ' ';
-			if ((i + 1) % imageData.bytesPerLine == 0) {
-				dump[index++] = lineDelimiter.charAt(0);
-				if (lineDelimiter.length() > 1)
-					dump[index++] = lineDelimiter.charAt(1);
-			}
-		}
-		return new String(dump);
-	}
-	
-	/*
-	 * Open an error dialog displaying the specified information.
-	 */
-	void showErrorDialog(String operation, String filename, Exception e) {
-		MessageBox box = new MessageBox(shell, SWT.ICON_ERROR);
-		String message = createMsg(bundle.getString("Error"), new String[] {operation, filename});
-		String errorMessage = "";
-		if (e != null) {
-			if (e instanceof SWTException) {
-				SWTException swte = (SWTException) e;
-				errorMessage = swte.getMessage();
-				if (swte.throwable != null) {
-					errorMessage += ":\n" + swte.throwable.toString();
-				}
-			} else {
-				errorMessage = e.toString();
-			}
-		}
-		box.setMessage(message + errorMessage);
-		box.open();
-	}
-	
-	/*
-	 * Return a String describing how to analyze the bytes
-	 * in the hex dump.
-	 */
-	static String depthInfo(int depth) {
-		Object[] args = {new Integer(depth), ""};
-		switch (depth) {
-			case 1:
-				args[1] = createMsg(bundle.getString("Multi_pixels"), 
-				                    new Object[] {new Integer(8), " [01234567]"});
-				break;
-			case 2:
-				args[1] = createMsg(bundle.getString("Multi_pixels"),
-				                    new Object[] {new Integer(4), "[00112233]"});
-				break;
-			case 4:
-				args[1] = createMsg(bundle.getString("Multi_pixels"),
-				                    new Object[] {new Integer(2), "[00001111]"});
-				break;
-			case 8:
-				args[1] = bundle.getString("One_byte");
-				break;
-			case 16:
-				args[1] = createMsg(bundle.getString("Multi_bytes"), new Integer(2));
-				break;
-			case 24:
-				args[1] = createMsg(bundle.getString("Multi_bytes"), new Integer(3));
-				break;
-			case 32:
-				args[1] = createMsg(bundle.getString("Multi_bytes"), new Integer(4));
-				break;
-			default:
-				args[1] = bundle.getString("Unsupported_lc");
-		}
-		return createMsg(bundle.getString("Depth_info"), args);
-	}
-	
-	/*
-	 * Return the specified number of milliseconds.
-	 * If the specified number of milliseconds is too small
-	 * to see a visual change, then return a higher number.
-	 */
-	static int visibleDelay(int ms) {
-		if (ms < 20) return ms + 30;
-		if (ms < 30) return ms + 10;
-		return ms;
-	}
-
-	/*
-	 * Return the specified byte value as a hex string,
-	 * preserving leading 0's.
-	 */
-	static String toHexByteString(int i) {
-		if (i <= 0x0f)
-			return "0" + Integer.toHexString(i);
-		return Integer.toHexString(i & 0xff);
-	}
-
-	/*
-	 * Return the specified 4-byte value as a hex string,
-	 * preserving leading 0's.
-	 * (a bit 'brute force'... should probably use a loop...)
-	 */
-	static String toHex4ByteString(int i) {
-		String hex = Integer.toHexString(i);
-		if (hex.length() == 1)
-			return "0000000" + hex;
-		if (hex.length() == 2)
-			return "000000" + hex;
-		if (hex.length() == 3)
-			return "00000" + hex;
-		if (hex.length() == 4)
-			return "0000" + hex;
-		if (hex.length() == 5)
-			return "000" + hex;
-		if (hex.length() == 6)
-			return "00" + hex;
-		if (hex.length() == 7)
-			return "0" + hex;
-		return hex;
-	}
-	
-	/*
-	 * Return a String describing the specified
-	 * transparent or background pixel.
-	 */
-	static String pixelInfo(int pixel) {
-		if (pixel == -1)
-			return pixel + " (" + bundle.getString("None_lc") + ")";
-		else
-			return pixel + " (0x" + Integer.toHexString(pixel) + ")";
-	}
-	
-	/*
-	 * Return a String describing the specified disposal method.
-	 */
-	static String disposalString(int disposalMethod) {
-		switch (disposalMethod) {
-			case SWT.DM_FILL_NONE: return bundle.getString("None_lc");
-			case SWT.DM_FILL_BACKGROUND: return bundle.getString("Background_lc");
-			case SWT.DM_FILL_PREVIOUS: return bundle.getString("Previous_lc");
-		}
-		return bundle.getString("Unspecified_lc");
-	}
-	
-	/*
-	 * Return a String describing the specified image file type.
-	 */
-	static String fileTypeString(int filetype) {
-		if (filetype == SWT.IMAGE_BMP)
-			return "BMP";
-		if (filetype == SWT.IMAGE_GIF)
-			return "GIF";
-		if (filetype == SWT.IMAGE_ICO)
-			return "ICO";
-		if (filetype == SWT.IMAGE_JPEG)
-			return "JPEG";
-		if (filetype == SWT.IMAGE_PNG)
-			return "PNG";
-		return bundle.getString("Unknown_ac");
-	}
-	
-	/*
-	 * Return the specified file's image type, based on its extension.
-	 * Note that this is not a very robust way to determine image type,
-	 * and it is only to be used in the absence of any better method.
-	 */
-	static int determineFileType(String filename) {
-		String ext = filename.substring(filename.lastIndexOf('.') + 1);
-		if (ext.equalsIgnoreCase("bmp"))
-			return SWT.IMAGE_BMP;
-		if (ext.equalsIgnoreCase("gif"))
-			return SWT.IMAGE_GIF;
-		if (ext.equalsIgnoreCase("ico"))
-			return SWT.IMAGE_ICO;
-		if (ext.equalsIgnoreCase("jpg") || ext.equalsIgnoreCase("jpeg"))
-			return SWT.IMAGE_JPEG;
-		if (ext.equalsIgnoreCase("png"))
-			return SWT.IMAGE_PNG;
-		return SWT.IMAGE_UNDEFINED;
-	}
-	
-	static String createMsg(String msg, Object[] args) {
-		MessageFormat formatter = new MessageFormat(msg);
-		return formatter.format(args);
-	}
-	
-	static String createMsg(String msg, Object arg) {
-		MessageFormat formatter = new MessageFormat(msg);
-		return formatter.format(new Object[]{arg});
-	}
-}
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/javaviewer/JavaLineStyler.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/javaviewer/JavaLineStyler.java
deleted file mode 100755
index 876789b..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/javaviewer/JavaLineStyler.java
+++ /dev/null
@@ -1,375 +0,0 @@
-package org.eclipse.swt.examples.javaviewer;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.custom.*;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.*;
-import java.util.*;
-import java.io.*;
-
-class JavaLineStyler implements LineStyleListener {
-	JavaScanner scanner = new JavaScanner();
-	int[] tokenColors;
-	Color[] colors;
-	Vector blockComments = new Vector();
-
-	public static final int EOF= -1;
-	public static final int EOL= 10;
-
-	public static final int WORD=		0;
-	public static final int WHITE=		1;
-	public static final int KEY=			2;
-	public static final int COMMENT=		3;	
-	public static final int STRING=		5;
-	public static final int OTHER=		6;
-	public static final int NUMBER=		7;
-
-	public static final int MAXIMUM_TOKEN= 8;
-
-public JavaLineStyler() {
-	initializeColors();
-	scanner = new JavaScanner();
-}
-
-Color getColor(int type) {
-	if (type < 0 || type >= tokenColors.length) {
-		return null;
-	}
-	return colors[tokenColors[type]];
-}
-
-boolean inBlockComment(int start, int end) {
-	for (int i=0; i<blockComments.size(); i++) {
-		int[] offsets = (int[])blockComments.elementAt(i);
-		// start of comment in the line
-		if ((offsets[0] >= start) && (offsets[0] <= end)) return true;
-		// end of comment in the line
-		if ((offsets[1] >= start) && (offsets[1] <= end)) return true;
-		if ((offsets[0] <= start) && (offsets[1] >= end)) return true;
-	}
-	return false;
-}
-
-void initializeColors() {
-	Display display = Display.getDefault();
-	colors= new Color[] {
-		new Color(display, new RGB(0, 0, 0)),		// black
-		new Color(display, new RGB(255, 0, 0)),	// red
-		new Color(display, new RGB(0, 255, 0)),	// green
-		new Color(display, new RGB(0,   0, 255))	// blue
-	};
-	tokenColors= new int[MAXIMUM_TOKEN];
-	tokenColors[WORD]=		0;
-	tokenColors[WHITE]=		0;
-	tokenColors[KEY]=		3; 
-	tokenColors[COMMENT]=	1; 
-	tokenColors[STRING]= 	2; 
-	tokenColors[OTHER]=		0;
-	tokenColors[NUMBER]=	0;
-}
-
-void disposeColors() {
-	for (int i=0;i<colors.length;i++) {
-		colors[i].dispose();
-	}
-}
-
-/**
- * Event.detail			line start offset (input)	
- * Event.text 			line text (input)
- * LineStyleEvent.styles 	Enumeration of StyleRanges, need to be in order. (output)
- * LineStyleEvent.background 	line background color (output)
- */
-public void lineGetStyle(LineStyleEvent event) {
-	Vector styles = new Vector();
-	int token;
-	StyleRange lastStyle;
-	// If the line is part of a block comment, create one style for the entire line.
-	if (inBlockComment(event.lineOffset, event.lineOffset + event.lineText.length())) {
-		styles.addElement(new StyleRange(event.lineOffset, event.lineText.length(), getColor(COMMENT), null));
-		event.styles = new StyleRange[styles.size()];
-		styles.copyInto(event.styles);
-		return;
-	}
-	Color defaultFgColor = ((Control)event.widget).getForeground();
-	scanner.setRange(event.lineText);
-	token = scanner.nextToken();
-	while (token != EOF) {
-		if (token == OTHER) {
-			// do nothing for non-colored tokens
-		} else if (token != WHITE) {
-			Color color = getColor(token);
-			// Only create a style if the token color is different than the 
-			// widget's default foreground color and the token's style is not 
-			// bold.  Keywords are bolded.
-			if ((!color.equals(defaultFgColor)) || (token == KEY)) {
-				StyleRange style = new StyleRange(scanner.getStartOffset() + event.lineOffset, scanner.getLength(), color, null);
-				if (token == KEY) {
-					style.fontStyle = SWT.BOLD;
-				}
-				if (styles.isEmpty()) {
-					styles.addElement(style);
-				} else {
-					// Merge similar styles.  Doing so will improve performance.
-					lastStyle = (StyleRange)styles.lastElement();
-					if (lastStyle.similarTo(style) && (lastStyle.start + lastStyle.length == style.start)) {
-						lastStyle.length += style.length;
-					} else {
-						styles.addElement(style); 
-					}
-				} 
-			} 
-		} else if ((!styles.isEmpty()) && ((lastStyle=(StyleRange)styles.lastElement()).fontStyle == SWT.BOLD)) {
-			int start = scanner.getStartOffset() + event.lineOffset;
-			lastStyle = (StyleRange)styles.lastElement();
-			// A font style of SWT.BOLD implies that the last style
-			// represents a java keyword.
-			if (lastStyle.start + lastStyle.length == start) {
-				// Have the white space take on the style before it to 
-				// minimize the number of style ranges created and the
-				// number of font style changes during rendering.
-				lastStyle.length += scanner.getLength();
-			}
-		} 
-		token= scanner.nextToken();
-	}
-	event.styles = new StyleRange[styles.size()];
-	styles.copyInto(event.styles);
-}
-public void parseBlockComments(String text) {
-	blockComments = new Vector();
-	StringReader buffer = new StringReader(text);
-	int ch;
-	boolean blkComment = false;
-	int cnt = 0;
-	int[] offsets = new int[2];
-	boolean done = false;
-	
-	try {
-	while (!done) {
-		switch (ch = buffer.read()) {
-			case -1 : {
-				if (blkComment) {
-					offsets[1] = cnt;
-					blockComments.addElement(offsets);
-				}
-				done = true;
-				break;
-			}
-			case '/' : {
-				ch = buffer.read();
-				if ((ch == '*') && (!blkComment)) {
-					offsets = new int[2];
-					offsets[0] = cnt;
-					blkComment = true;
-					cnt++;	
-				} else {
-					cnt++;
-				}						
-				cnt++;
-				break;
-			}
-			case '*' : {
-				if (blkComment) {
-					ch = buffer.read();
-					cnt++;
-					if (ch == '/') {
-						blkComment = false;	
-						offsets[1] = cnt;
-						blockComments.addElement(offsets);
-					}
-				}
-				cnt++;	
-				break;
-			}
-			default : {
-				cnt++;				
-				break;
-			}
-		}
-	}		
-	} catch(IOException e) {
-		// ignore errors
-	}
-}
-
-/**
- * A simple fuzzy scanner for Java
- */
-public class JavaScanner {
-
-	protected Hashtable fgKeys= null;
-	protected StringBuffer fBuffer= new StringBuffer();
-	protected String fDoc;
-	protected int fPos;
-	protected int fEnd;
-	protected int fStartToken;
-	protected boolean fEofSeen= false;
-
-	private String[] fgKeywords= { 
-		"abstract",
-		"boolean", "break", "byte",
-		"case", "catch", "char", "class", "continue",
-		"default", "do", "double",
-		"else", "extends",
-		"false", "final", "finally", "float", "for",
-		"if", "implements", "import", "instanceof", "int", "interface",
-		"long",
-		"native", "new", "null",
-		"package", "private", "protected", "public",
-		"return",
-		"short", "static", "super", "switch", "synchronized",
-		"this", "throw", "throws", "transient", "true", "try",
-		"void", "volatile",
-		"while"
-	};
-
-	public JavaScanner() {
-		initialize();
-	}
-
-	/**
-	 * Returns the ending location of the current token in the document.
-	 */
-	public final int getLength() {
-		return fPos - fStartToken;
-	}
-
-	/**
-	 * Initialize the lookup table.
-	 */
-	void initialize() {
-		fgKeys= new Hashtable();
-		Integer k= new Integer(KEY);
-		for (int i= 0; i < fgKeywords.length; i++)
-			fgKeys.put(fgKeywords[i], k);
-	}
-
-	/**
-	 * Returns the starting location of the current token in the document.
-	 */
-	public final int getStartOffset() {
-		return fStartToken;
-	}
-
-	/**
-	 * Returns the next lexical token in the document.
-	 */
-	public int nextToken() {
-		int c;
-		fStartToken= fPos;
-		while (true) {
-			switch (c= read()) {			
-			case EOF:
-				return EOF;				
-			case '/':	// comment
-				c= read();
-				if (c == '/') {
-					while (true) {
-						c= read();
-						if ((c == EOF) || (c == EOL)) {
-							unread(c);
-							return COMMENT;
-						}
-					}
-				} else {
-					unread(c);
-				}
-				return OTHER;
-			case '\'':	// char const
-				character: for(;;) {
-					c= read();
-					switch (c) {
-						case '\'':
-							return STRING;
-						case EOF:
-							unread(c);
-							return STRING;
-						case '\\':
-							c= read();
-							break;
-						}
-				}
-
-			case '"':	// string
-				string: for (;;) {
-					c= read();
-					switch (c) {
-						case '"':
-							return STRING;
-						case EOF:
-							unread(c);
-							return STRING;
-						case '\\':
-							c= read();
-							break;
-						}
-				}
-
-			case '0': case '1': case '2': case '3': case '4':
-			case '5': case '6': case '7': case '8': case '9':
-				do {
-					c= read();
-				} while(Character.isDigit((char)c));
-				unread(c);
-				return NUMBER;
-			default:
-				if (Character.isWhitespace((char)c)) {
-					do {
-						c= read();
-					} while(Character.isWhitespace((char)c));
-					unread(c);
-					return WHITE;
-				}
-				if (Character.isJavaIdentifierStart((char)c)) {
-					fBuffer.setLength(0);
-					do {
-						fBuffer.append((char)c);
-						c= read();
-					} while(Character.isJavaIdentifierPart((char)c));
-					unread(c);
-					Integer i= (Integer) fgKeys.get(fBuffer.toString());
-					if (i != null)
-						return i.intValue();
-						return WORD;
-				}
-				return OTHER;
-			}
-		}
-	}
-
-	/**
-	 * Returns next character.
-	 */
-	protected int read() {
-		if (fPos <= fEnd) {
-			return fDoc.charAt(fPos++);
-		}
-		return EOF;
-	}
-
-	public void setRange(String text) {
-		fDoc= text;
-		fPos= 0;
-		fEnd= fDoc.length() -1;
-	}
-
-	protected void unread(int c) {
-		if (c != EOF)
-	    	fPos--;
-	}
-}
-
-
-
-
-
-}
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/javaviewer/JavaViewer.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/javaviewer/JavaViewer.java
deleted file mode 100755
index 34a7cbe..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/javaviewer/JavaViewer.java
+++ /dev/null
@@ -1,175 +0,0 @@
-package org.eclipse.swt.examples.javaviewer;
-
-/*
- * Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.custom.*;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.widgets.*;
-import java.util.*;
-import java.io.*;
-import java.text.*;
-
-/**
- */
-public class JavaViewer {  
-	Shell shell;
-	StyledText text;
-	JavaLineStyler lineStyler = new JavaLineStyler();
-	FileDialog fileDialog;
-	static ResourceBundle resources = ResourceBundle.getBundle("examples_javaviewer");
-
-Menu createFileMenu() {
-	Menu bar = shell.getMenuBar ();
-	Menu menu = new Menu (bar);
-	MenuItem item;
-
-	// Open 
-	item = new MenuItem (menu, SWT.CASCADE);
-	item.setText (resources.getString("Open_menuitem"));
-	item.addSelectionListener(new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent event) {
-			openFile();
-		}
-	});
-
-	// Close
-	item = new MenuItem (menu, SWT.PUSH);
-	item.setText (resources.getString("Close_menuitem"));
-	item.addSelectionListener (new SelectionAdapter () {
-		public void widgetSelected (SelectionEvent e) {
-			menuFileExit ();
-		}
-	});
-	return menu;
-}
-
-void createMenuBar () {
-	Menu bar = new Menu (shell, SWT.BAR);
-	shell.setMenuBar (bar);
-
-	MenuItem fileItem = new MenuItem (bar, SWT.CASCADE);
-	fileItem.setText (resources.getString("File_menuitem"));
-	fileItem.setMenu (createFileMenu ());
-
-}
-
-void createShell (Display display) {
-	shell = new Shell (display);
-	shell.setText (resources.getString("Window_title"));	
-	GridLayout layout = new GridLayout();
-	layout.numColumns = 1;
-	shell.setSize(500, 400);
-	shell.setLayout(layout);
-	shell.addShellListener (new ShellAdapter () {
-		public void shellClosed (ShellEvent e) {
-			lineStyler.disposeColors();
-			text.removeLineStyleListener(lineStyler);
-		}
-	});
-}
-void createStyledText() {
-	text = new StyledText (shell, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL);
-	GridData spec = new GridData();
-	spec.horizontalAlignment = spec.FILL;
-	spec.grabExcessHorizontalSpace = true;
-	spec.verticalAlignment = spec.FILL;
-	spec.grabExcessVerticalSpace = true;
-	text.setLayoutData(spec);
-	text.addLineStyleListener(lineStyler);
-	text.setEditable(false);
-	Color bg = Display.getDefault().getSystemColor(SWT.COLOR_GRAY);
-	text.setBackground(bg);
-}
-
-void displayError(String msg) {
-	MessageBox box = new MessageBox(shell, SWT.ICON_ERROR);
-	box.setMessage(msg);
-	box.open();
-}
-
-public static void main (String [] args) {
-	Display display = new Display();
-	JavaViewer example = new JavaViewer ();
-	Shell shell = example.open (display);
-	while (!shell.isDisposed ())
-		if (!display.readAndDispatch ()) display.sleep ();
-	display.dispose ();
-}
-
-public Shell open (Display display) {
-	createShell (display);
-	createMenuBar ();
-	createStyledText ();
-	shell.open ();
-	return shell;
-}
-
-void openFile() {	
-	final String textString;
-	if (fileDialog == null) {
-		fileDialog = new FileDialog(shell, SWT.OPEN);
-	}
-
-	fileDialog.setFilterExtensions(new String[] {"*.java", "*.*"});
-	fileDialog.open();
-	String name = fileDialog.getFileName();
-	
-	if ((name == null) || (name.length() == 0)) return;
-
-	File file = new File(fileDialog.getFilterPath(), name);
-	if (!file.exists()) {
-		String message = MessageFormat.format(resources.getString("Err_file_no_exist"), new String[] {file.getName()});
-		displayError(message);
-		return;
-	}
-
-	try {
-		FileInputStream stream= new FileInputStream(file.getPath());
-		try {
-			Reader in = new BufferedReader(new InputStreamReader(stream));
-			char[] readBuffer= new char[2048];
-			StringBuffer buffer= new StringBuffer((int) file.length());
-			int n;
-			while ((n = in.read(readBuffer)) > 0) {
-				buffer.append(readBuffer, 0, n);
-			}
-			textString = buffer.toString();
-			stream.close();
-		}
-		catch (IOException e) {
-			// Err_file_io
-			String message = MessageFormat.format(resources.getString("Err_file_io"), new String[] {file.getName()});
-			displayError(message);
-			return;
-		}
-	}
-	catch (FileNotFoundException e) {
-		String message = MessageFormat.format(resources.getString("Err_not_found"), new String[] {file.getName()});
-		displayError(message);
-		return;
-	}
-	// Guard against superfluous mouse move events -- defer action until later
-	Display display = text.getDisplay();
-	display.asyncExec(new Runnable() {
-		public void run() {
-			text.setText(textString);
-		}
-	});	
-	
-	// parse the block comments up front since block comments can go across
-	// lines - inefficient way of doing this
-	lineStyler.parseBlockComments(textString);
-}
-
-void menuFileExit () {
-	shell.close ();
-}
-}
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/layoutexample/FillLayoutTab.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/layoutexample/FillLayoutTab.java
deleted file mode 100644
index 6653cf5..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/layoutexample/FillLayoutTab.java
+++ /dev/null
@@ -1,176 +0,0 @@
-package org.eclipse.swt.examples.layoutexample;
-
-/*
- * Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.custom.*;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.widgets.*;
-
-class FillLayoutTab extends Tab {
-	/* Controls for setting layout parameters */
-	Button horizontal, vertical;
-	/* The example layout instance */
-	FillLayout fillLayout;
-	/* TableEditors and related controls*/
-	TableEditor comboEditor;
-	CCombo combo;
-	
-	/**
-	 * Creates the Tab within a given instance of LayoutExample.
-	 */
-	FillLayoutTab(LayoutExample instance) {
-		super(instance);
-	}
-	
-	/**
-	 * Creates the widgets in the "child" group.
-	 */
-	void createChildWidgets () {
-		/* Add common controls */
-		super.createChildWidgets ();
-		
-		/* Add TableEditors */
-		comboEditor = new TableEditor (table);
-		table.addSelectionListener (new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				resetEditors ();
-				index = table.getSelectionIndex ();
-				if (index == -1) return;
-				TableItem oldItem = comboEditor.getItem ();
-				newItem = table.getItem (index);
-				if (newItem == oldItem || newItem != lastSelected) {
-					lastSelected = newItem;
-					return;
-				}
-				table.showSelection ();
-				
-				combo = new CCombo (table, SWT.READ_ONLY);
-				createComboEditor (combo, comboEditor);
-			}
-		});
-		
-		
-		/* Add listener to add an element to the table */
-		add.addSelectionListener(new SelectionAdapter () {
-			public void widgetSelected(SelectionEvent e) {
-				TableItem item = new TableItem (table, 0);
-				item.setText (0, String.valueOf (table.indexOf (item)));
-				item.setText (1, "Button");
-				data.addElement ("Button");
-				resetEditors ();
-			}
-		});
-	}
-	
-	/**
-	 * Creates the control widgets.
-	 */
-	void createControlWidgets () {
-		/* Controls the type of FillLayout */
-		Group typeGroup = new Group (controlGroup, SWT.NONE);
-		typeGroup.setText (LayoutExample.getResourceString ("Type"));
-		typeGroup.setLayout (new GridLayout ());
-		typeGroup.setLayoutData (new GridData (GridData.FILL_HORIZONTAL));
-		horizontal = new Button (typeGroup, SWT.RADIO);
-		horizontal.setText ("SWT.HORIZONTAL");
-		horizontal.setLayoutData(new GridData (GridData.FILL_HORIZONTAL));
-		horizontal.setSelection(true);
-		horizontal.addSelectionListener (selectionListener);
-		vertical = new Button (typeGroup, SWT.RADIO);
-		vertical.setText ("SWT.VERTICAL");
-		vertical.setLayoutData(new GridData (GridData.FILL_HORIZONTAL));
-		vertical.addSelectionListener (selectionListener); 
-		
-		/* Add common controls */
-		super.createControlWidgets ();
-		
-		/* Position the sash */
-		sash.setWeights (new int [] {4,1});
-	}
-	
-	/**
-	 * Creates the example layout.
-	 */
-	void createLayout () {
-		fillLayout = new FillLayout ();
-		layoutComposite.setLayout (fillLayout);
-	}
-	
-	/** 
-	 * Disposes the editors without placing their contents
-	 * into the table.
-	 */
-	void disposeEditors () {
-		comboEditor.setEditor (null, null, -1);
-		combo.dispose ();
-	}
-
-	
-	/**
-	 * Generates code for the example layout.
-	 */
-	StringBuffer generateLayoutCode () {
-		StringBuffer code = new StringBuffer ();
-		code.append ("\t\tFillLayout fillLayout = new FillLayout ();\n");
-		if (fillLayout.type == SWT.VERTICAL) {
-			code.append ("\t\tfillLayout.type = SWT.VERTICAL;\n");
-		}
-		code.append ("\t\tshell.setLayout (fillLayout);\n");
-		for (int i = 0; i < children.length; i++) {
-			Control control = children [i];
-			code.append (getChildCode (control, i));
-		}
-		return code;
-	}
-	
-	/**
-	 * Returns the layout data field names.
-	 */
-	String [] getLayoutDataFieldNames() {
-		return new String [] {"","Control"};
-	}
-	
-	/**
-	 * Gets the text for the tab folder item.
-	 */
-	String getTabText () {
-		return "FillLayout";
-	}
-	
-	/**
-	 * Takes information from TableEditors and stores it.
-	 */
-	void resetEditors () {
-		TableItem oldItem = comboEditor.getItem ();
-		comboEditor.setEditor (null, null, -1);
-		if (oldItem != null) {
-			int row = table.indexOf (oldItem);
-			data.insertElementAt (combo.getText (), row);
-			oldItem.setText (1, data.elementAt (row).toString ());
-			combo.dispose ();
-		}
-		setLayoutState ();
-		refreshLayoutComposite ();
-		layoutComposite.layout (true);
-		layoutGroup.layout (true);
-	}
-	
-	/**
-	 * Sets the state of the layout.
-	 */
-	void setLayoutState () {
-		if (vertical.getSelection()) {
-			fillLayout.type = SWT.VERTICAL;
-		} else {
-			fillLayout.type = SWT.HORIZONTAL;
-		}
-	}
-}
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/layoutexample/FormLayoutTab.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/layoutexample/FormLayoutTab.java
deleted file mode 100644
index a79a0be..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/layoutexample/FormLayoutTab.java
+++ /dev/null
@@ -1,758 +0,0 @@
-package org.eclipse.swt.examples.layoutexample;
-
-/*
- * Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.custom.*;
-
-class FormLayoutTab extends Tab {
-	/* Controls for setting layout parameters */
-	Combo marginHeight, marginWidth;
-	/* The example layout instance */
-	FormLayout formLayout;
-	/* TableEditors and related controls*/
-	TableEditor comboEditor, widthEditor, heightEditor;
-	TableEditor leftEditor, rightEditor, topEditor, bottomEditor;
-	CCombo combo;
-	Text widthText, heightText;
-	Button leftAttach, rightAttach, topAttach, bottomAttach;
-	
-	/* Constants */
-	final int COMBO_COL = 1;
-	final int WIDTH_COL = 2;
-	final int HEIGHT_COL = 3;
-	final int LEFT_COL = 4;
-	final int RIGHT_COL = 5;
-	final int TOP_COL = 6;
-	final int BOTTOM_COL = 7;
-	
-	final int MODIFY_COLS = 4;	// The number of columns with combo or text editors
-	final int TOTAL_COLS = 8;
-
-	/**
-	 * Creates the Tab within a given instance of LayoutExample.
-	 */
-	FormLayoutTab(LayoutExample instance) {
-		super(instance);
-	}
-	
-	/**
-	 * Returns the constant for the alignment for an
-	 * attachment given a string.
-	 */
-	int alignmentConstant (String align) {
-		if (align.equals("LEFT")) return SWT.LEFT;
-		if (align.equals("RIGHT")) return SWT.RIGHT;
-		if (align.equals("TOP")) return SWT.TOP;
-		if (align.equals("BOTTOM")) return SWT.BOTTOM;
-		if (align.equals("CENTER")) return SWT.CENTER;
-		return SWT.DEFAULT;
-	}
-	
-	/**
-	 * Returns a string representing the alignment for an
-	 * attachment given a constant.
-	 */
-	String alignmentString (int align) {
-		switch (align) {
-			case SWT.LEFT: return "LEFT";
-			case SWT.RIGHT: return "RIGHT";
-			case SWT.TOP: return "TOP";
-			case SWT.BOTTOM: return "BOTTOM";
-			case SWT.CENTER: return "CENTER";
-		}
-		return "DEFAULT";
-	}
-	
-	/**
-	 * Update the attachment field in case the type of control
-	 * has changed. 
-	 */
-	String checkAttachment (String oldAttach, FormAttachment newAttach) {
-		String controlClass = newAttach.control.getClass().toString ();
-		String controlType = controlClass.substring (controlClass.lastIndexOf ('.') + 1);
-		int i = 0;
-		while (i < oldAttach.length () && !Character.isDigit(oldAttach.charAt (i))) {
-			i++;
-		}
-		String index = oldAttach.substring (i, oldAttach.indexOf (','));
-		return controlType + index + "," + newAttach.offset + ":" + alignmentString (newAttach.alignment);
-	}
-	
-	/**
-	 * Creates the widgets in the "child" group.
-	 */
-	void createChildWidgets () {
-		/* Add common controls */
-		super.createChildWidgets ();
-		
-		/* Resize the columns */
-		table.getColumn (LEFT_COL).setWidth (100);
-		table.getColumn (RIGHT_COL).setWidth (100);
-		table.getColumn (TOP_COL).setWidth (100);
-		table.getColumn (BOTTOM_COL).setWidth (100);
-				
-		/* Add TableEditors */			
-		comboEditor = new TableEditor (table);
-		widthEditor = new TableEditor (table);
-		heightEditor = new TableEditor (table);
-		leftEditor = new TableEditor (table);
-		rightEditor = new TableEditor (table);
-		topEditor = new TableEditor (table);
-		bottomEditor = new TableEditor (table);
-		table.addMouseListener (new MouseAdapter () {
-			public void mouseDown(MouseEvent e) {
-				resetEditors();
-				index = table.getSelectionIndex ();
-				Point pt = new Point (e.x, e.y);
-                newItem = table.getItem (pt);
-                if (newItem == null) return;
-                TableItem oldItem = comboEditor.getItem ();
-                if (newItem == oldItem || newItem != lastSelected) {
-					lastSelected = newItem;
-					return;
-				}
-				table.showSelection ();
-				
-				combo = new CCombo (table, SWT.READ_ONLY);
-				createComboEditor (combo, comboEditor);
-				
-				widthText = new Text (table, SWT.SINGLE);
-				widthText.setText (((String [])data.elementAt (index)) [WIDTH_COL]);
-				createTextEditor (widthText, widthEditor, WIDTH_COL);
-				
-				heightText = new Text (table, SWT.SINGLE);
-				heightText.setText (((String [])data.elementAt (index)) [HEIGHT_COL]);
-				createTextEditor (heightText, heightEditor, HEIGHT_COL);
-				
-				leftAttach = new Button (table, SWT.PUSH);
-				leftAttach.setText (LayoutExample.getResourceString ("Attach_Edit"));
-				leftEditor.horizontalAlignment = SWT.LEFT;
-				leftEditor.grabHorizontal = true;
-				leftEditor.minimumWidth = leftAttach.computeSize (SWT.DEFAULT, SWT.DEFAULT).x;
-				leftEditor.setEditor (leftAttach, newItem, LEFT_COL);
-				leftAttach.addSelectionListener (new SelectionAdapter () {
-					public void widgetSelected (SelectionEvent e) {
-						Shell shell = tabFolderPage.getShell ();
-						AttachDialog dialog = new AttachDialog (shell);
-						dialog.setText (LayoutExample.getResourceString ("Left_Attachment"));
-						dialog.setColumn (LEFT_COL);
-						String attach = dialog.open ();
-						newItem.setText (LEFT_COL, attach);
-						resetEditors ();
-					}
-				});
-				
-				rightAttach = new Button (table, SWT.PUSH);
-				rightAttach.setText (LayoutExample.getResourceString ("Attach_Edit"));
-				rightEditor.horizontalAlignment = SWT.LEFT;
-				rightEditor.grabHorizontal = true;
-				rightEditor.minimumWidth = rightAttach.computeSize (SWT.DEFAULT, SWT.DEFAULT).x;
-				rightEditor.setEditor (rightAttach, newItem, RIGHT_COL);
-				rightAttach.addSelectionListener (new SelectionAdapter () {
-					public void widgetSelected (SelectionEvent e) {
-						Shell shell = tabFolderPage.getShell ();
-						AttachDialog dialog = new AttachDialog (shell);
-						dialog.setText (LayoutExample.getResourceString ("Right_Attachment"));
-						dialog.setColumn (RIGHT_COL);
-						String attach = dialog.open ();
-						newItem.setText (RIGHT_COL, attach);
-						if (newItem.getText (LEFT_COL).endsWith (")")) newItem.setText (LEFT_COL, "");
-						resetEditors ();
-					}
-				});
-				
-				topAttach = new Button (table, SWT.PUSH);
-				topAttach.setText (LayoutExample.getResourceString ("Attach_Edit"));
-				topEditor.horizontalAlignment = SWT.LEFT;
-				topEditor.grabHorizontal = true;
-				topEditor.minimumWidth = topAttach.computeSize (SWT.DEFAULT, SWT.DEFAULT).x;
-				topEditor.setEditor (topAttach, newItem, TOP_COL);
-				topAttach.addSelectionListener (new SelectionAdapter () {
-					public void widgetSelected (SelectionEvent e) {
-						Shell shell = tabFolderPage.getShell ();
-						AttachDialog dialog = new AttachDialog (shell);
-						dialog.setText (LayoutExample.getResourceString ("Top_Attachment"));
-						dialog.setColumn (TOP_COL);
-						String attach = dialog.open ();
-						newItem.setText (TOP_COL, attach);
-						resetEditors ();
-					}
-				});
-				bottomAttach = new Button (table, SWT.PUSH);
-				bottomAttach.setText (LayoutExample.getResourceString ("Attach_Edit"));
-				bottomEditor.horizontalAlignment = SWT.LEFT;
-				bottomEditor.grabHorizontal = true;
-				bottomEditor.minimumWidth = bottomAttach.computeSize (SWT.DEFAULT, SWT.DEFAULT).x;
-				bottomEditor.setEditor (bottomAttach, newItem, BOTTOM_COL);
-				bottomAttach.addSelectionListener (new SelectionAdapter () {
-					public void widgetSelected (SelectionEvent e) {
-						Shell shell = tabFolderPage.getShell ();
-						AttachDialog dialog = new AttachDialog (shell);
-						dialog.setText (LayoutExample.getResourceString ("Bottom_Attachment"));
-						dialog.setColumn (BOTTOM_COL);
-						String attach = dialog.open ();
-						newItem.setText (BOTTOM_COL, attach);
-						if (newItem.getText (TOP_COL).endsWith (")")) newItem.setText (TOP_COL, "");
-						resetEditors ();
-					}
-				});
-                
-                for (int i=0; i<table.getColumnCount (); i++) {
-                	Rectangle rect = newItem.getBounds (i);
-                    if (rect.contains (pt)) {
-                    	switch (i) {
-                    		case 0:
-                    			resetEditors ();
-                    			break;
-							case COMBO_COL :
-								combo.setFocus ();	
-								break;
-							case WIDTH_COL :	
-								widthText.setFocus ();
-								break;
-							case HEIGHT_COL :
-								heightText.setFocus ();
-								break;
-							default :
-								break;
-						}
-                    }
-                } 
-			}
-		});
-		
-		/* Add listener to add an element to the table */
-		add.addSelectionListener(new SelectionAdapter () {
-			public void widgetSelected(SelectionEvent e) {
-				TableItem item = new TableItem (table, 0);
-				String [] insert = new String [] {
-					String.valueOf (table.indexOf (item)), "Button", "-1", "-1",
-					"0,0 (" + LayoutExample.getResourceString ("Default") + ")", "", 
-					"0,0 (" + LayoutExample.getResourceString ("Default") + ")", ""};
-				item.setText (insert);
-				data.addElement (insert);
-				resetEditors ();
-			}
-		});
-	}
-
-	/**
-	 * Creates the control widgets.
-	 */
-	void createControlWidgets () {
-		/* Controls the margins and spacing of the FormLayout */
-		String [] marginValues = new String [] {"0","3","5","10"};
-		Group marginGroup = new Group (controlGroup, SWT.NONE);
-		marginGroup.setText (LayoutExample.getResourceString ("Margins"));
-		GridLayout layout = new GridLayout ();
-		layout.numColumns = 2;
-		marginGroup.setLayout (layout);
-		marginGroup.setLayoutData (new GridData (GridData.FILL_HORIZONTAL));
-		new Label (marginGroup, SWT.NONE).setText ("marginHeight");
-		marginHeight = new Combo (marginGroup, SWT.NONE);
-		marginHeight.setItems (marginValues);
-		marginHeight.select (0);
-		marginHeight.addSelectionListener (selectionListener);
-		marginHeight.addTraverseListener (traverseListener);
-		GridData data = new GridData (GridData.FILL_HORIZONTAL);
-		data.widthHint = 60;
-		marginHeight.setLayoutData (data);
-		new Label (marginGroup, SWT.NONE).setText ("marginWidth");
-		marginWidth = new Combo (marginGroup, SWT.NONE);
-		marginWidth.setItems (marginValues);
-		marginWidth.select (0);
-		marginWidth.addSelectionListener (selectionListener);
-		marginWidth.addTraverseListener (traverseListener);
-		data = new GridData (GridData.FILL_HORIZONTAL);
-		data.widthHint = 60;
-		marginWidth.setLayoutData (data);
-		
-		/* Add common controls */
-		super.createControlWidgets ();
-		
-		/* Position the sash */
-		sash.setWeights (new int [] {6,4});
-	}
-	
-	/**
-	 * Creates the example layout.
-	 */
-	void createLayout () {
-		formLayout = new FormLayout ();
-		layoutComposite.setLayout (formLayout);
-	}
-	
-	/** 
-	 * Disposes the editors without placing their contents
-	 * into the table.
-	 */
-	void disposeEditors () {
-		comboEditor.setEditor (null, null, -1);
-		combo.dispose ();
-		widthText.dispose ();
-		heightText.dispose ();
-		leftAttach.dispose ();
-		rightAttach.dispose ();
-		topAttach.dispose ();
-		bottomAttach.dispose ();
-	}
-
-	/**
-	 * Generates code for the example layout.
-	 */	
-	StringBuffer generateLayoutCode () {
-		StringBuffer code = new StringBuffer ();
-		code.append ("\t\tFormLayout formLayout = new FormLayout ();\n");
-		if (formLayout.marginHeight != 0) {
-			code.append ("\t\tformLayout.marginHeight = " + formLayout.marginHeight + ";\n");
-		}
-		if (formLayout.marginWidth != 0) {
-			code.append ("\t\tformLayout.marginWidth = " + formLayout.marginWidth + ";\n");
-		}
-		code.append ("\t\tshell.setLayout (formLayout);\n");
-		
-		boolean first = true;
-		for (int i = 0; i < children.length; i++) {
-			Control control = children [i];
-			code.append (getChildCode (control, i));
-			FormData data = (FormData) control.getLayoutData ();
-			if (data != null) {
-				code.append ("\t\t");
-				if (first) {
-					code.append ("FormData ");
-					first = false;
-				}
-				code.append ("data = new FormData ();\n");	
-				if (data.width != SWT.DEFAULT) {
-					code.append ("\t\tdata.width = " + data.width + ";\n");
-				}
-				if (data.height != SWT.DEFAULT) {
-					code.append ("\t\tdata.height = " + data.height + ";\n");
-				}
-				if (data.left != null) {
-					if (data.left.control != null) {
-						TableItem item = table.getItem (i);
-						String controlString = item.getText (LEFT_COL);
-						int index = new Integer (controlString.substring (controlString.indexOf (',') - 1, controlString.indexOf (','))).intValue ();
-						code.append ("\t\tdata.left = new FormAttachment (" + names [index] + ", " + data.left.offset + ", SWT." + alignmentString (data.left.alignment) + ");\n");
-					} else {
-						if (data.right != null || (data.left.numerator != 0 ||data.left.offset != 0)) {
-							code.append ("\t\tdata.left = new FormAttachment (" + data.left.numerator + ", " + data.left.offset + ");\n");
-						}
-					}
-				}
-				if (data.right != null) {
-					if (data.right.control != null) {
-						TableItem item = table.getItem (i);
-						String controlString = item.getText (RIGHT_COL);
-						int index = new Integer (controlString.substring (controlString.indexOf (',') - 1, controlString.indexOf (','))).intValue ();
-						code.append ("\t\tdata.right = new FormAttachment (" + names [index] + ", " + data.right.offset + ", SWT." + alignmentString (data.right.alignment) + ");\n");
-					} else {
-						code.append ("\t\tdata.right = new FormAttachment (" + data.right.numerator + ", " + data.right.offset + ");\n");
-					}
-				}
-				if (data.top != null) {
-					if (data.top.control != null) {
-						TableItem item = table.getItem (i);
-						String controlString = item.getText (TOP_COL);
-						int index = new Integer (controlString.substring (controlString.indexOf (',') - 1, controlString.indexOf (','))).intValue ();
-						code.append ("\t\tdata.top = new FormAttachment (" + names [index] + ", " + data.top.offset + ", SWT." + alignmentString (data.top.alignment) + ");\n");
-					} else {
-						if (data.bottom != null || (data.top.numerator != 0 ||data.top.offset != 0)) {
-							code.append ("\t\tdata.top = new FormAttachment (" + data.top.numerator + ", " + data.top.offset + ");\n");
-						}
-					}
-				}
-				if (data.bottom != null) {
-					if (data.bottom.control != null) {
-						TableItem item = table.getItem (i);
-						String controlString = item.getText (BOTTOM_COL);
-						int index = new Integer (controlString.substring (controlString.indexOf (',') - 1, controlString.indexOf (','))).intValue ();
-						code.append ("\t\tdata.bottom = new FormAttachment (" + names [index] + ", " + data.bottom.offset + ", SWT." + alignmentString (data.bottom.alignment) + ");\n");
-					} else {
-						code.append ("\t\tdata.bottom = new FormAttachment (" + data.bottom.numerator + ", " + data.bottom.offset + ");\n");
-					}
-				}
-				code.append ("\t\t" + names [i] + ".setLayoutData (data);\n");
-			}
-		}
-		return code;
-	}
-	
-	/**
-	 * Returns the layout data field names.
-	 */
-	String [] getLayoutDataFieldNames() {
-		return new String [] {
-			"",
-			"Control", 
-			"width", 
-			"height", 
-			"left", 
-			"right", 
-			"top", 
-			"bottom"
-		};
-	}
-	
-	/**
-	 * Gets the text for the tab folder item.
-	 */
-	String getTabText () {
-		return "FormLayout";
-	}
-	
-	/**
-	 * Takes information from TableEditors and stores it.
-	 */
-	void resetEditors () {
-		resetEditors (false);
-	}
-	
-	void resetEditors (boolean tab) {
-		TableItem oldItem = comboEditor.getItem ();
-		if (oldItem != null) {
-			int row = table.indexOf (oldItem);
-			try {
-				new Integer (widthText.getText ()).intValue ();
-			} catch (NumberFormatException e) {
-				widthText.setText (oldItem.getText (WIDTH_COL));
-			}
-			try {
-				new Integer (heightText.getText ()).intValue ();
-			} catch (NumberFormatException e) {
-				heightText.setText (oldItem.getText (HEIGHT_COL));
-			}
-			String [] insert = new String [] {String.valueOf (row), combo.getText (), widthText.getText (), heightText.getText ()};
-			data.setElementAt (insert, row);
-			for (int i = 0 ; i < MODIFY_COLS; i++) {
-				oldItem.setText (i, ((String [])data.elementAt (row)) [i]);
-			}
-			if (!tab) disposeEditors ();
-		}
-		setLayoutState ();
-		refreshLayoutComposite ();
-		setLayoutData ();
-		layoutComposite.layout (true);
-		layoutGroup.layout (true);
-	}
-	
-	/**
-	 * Sets an attachment to the edge of a widget using the
-	 * information in the table.
-	 */
-	FormAttachment setAttachment (String attachment) {
-		String control, align;
-		int position, offset;
-		int comma = attachment.indexOf (',');
-		char first = attachment.charAt (0);
-		if (Character.isLetter(first)) {
-			/* Case where there is a control */
-			control = attachment.substring (0, comma);
-			int i = 0;
-			while (i < control.length () && !Character.isDigit (control.charAt (i))) {
-				i++;
-			}
-			String end = control.substring (i);
-			int index = new Integer (end).intValue ();
-			Control attachControl = children [index];
-			int colon = attachment.indexOf (':');
-			try {
-				offset = new Integer (attachment.substring (comma + 1, colon)).intValue ();
-			} catch (NumberFormatException e) {
-				offset = 0;
-			}
-			align = attachment.substring (colon + 1);
-			return new FormAttachment (attachControl, offset, alignmentConstant (align));
-		} else {
-			/* Case where there is a position */
-			try {
-				position = new Integer (attachment.substring (0,comma)).intValue ();	
-			} catch (NumberFormatException e) {
-				position = 0;
-			}
-			try {
-				offset = new Integer (attachment.substring (comma + 1)).intValue ();
-			} catch (NumberFormatException e) {
-				offset = 0;
-			}
-			return new FormAttachment (position, offset);		
-		}
-	}
-	
-	/**
-	 * Sets the layout data for the children of the layout.
-	 */
-	void setLayoutData () {
-		Control [] children = layoutComposite.getChildren ();
-		TableItem [] items = table.getItems ();
-		FormData data;
-		int width, height;
-		String left, right, top, bottom;
-		for (int i = 0; i < children.length; i++) {
-			width = new Integer (items [i].getText (WIDTH_COL)).intValue ();
-			height = new Integer (items [i].getText (HEIGHT_COL)).intValue ();
-			data = new FormData ();
-			if (width > 0) data.width = width;
-			if (height > 0) data.height = height;
-			
-			left = items [i].getText (LEFT_COL);
-			if (left.length () > 0) {
-				data.left = setAttachment (left);
-				if (data.left.control != null) {
-					String attachment = checkAttachment (left, data.left);
-					items [i].setText (LEFT_COL, attachment);
-				}
-			}
-			right = items [i].getText (RIGHT_COL);
-			if (right.length () > 0) {
-				data.right = setAttachment (right);
-				if (data.right.control != null) {
-					String attachment = checkAttachment (right, data.right);
-					items [i].setText (RIGHT_COL, attachment);
-				}
-			}
-			top = items [i].getText (TOP_COL);
-			if (top.length () > 0 ) {
-				data.top = setAttachment (top);
-				if (data.top.control != null) {
-					String attachment = checkAttachment (top, data.top);
-					items [i].setText (TOP_COL, attachment);
-				}
-			}
-			bottom = items [i].getText (BOTTOM_COL);
-			if (bottom.length () > 0) {
-				data.bottom = setAttachment (bottom);
-				if (data.bottom.control != null) {
-					String attachment = checkAttachment (bottom, data.bottom);
-					items [i].setText (BOTTOM_COL, attachment);
-				}
-			}
-			children [i].setLayoutData (data);
-		}
-	}
-	
-	/**
-	 * Sets the state of the layout.
-	 */
-	void setLayoutState () {
-		/* Set the margins and spacing */
-		try {
-			formLayout.marginHeight = new Integer (marginHeight.getText ()).intValue ();
-		} catch (NumberFormatException e) {
-			formLayout.marginHeight = 0;
-			marginHeight.select (0);
-		}
-		try {
-			formLayout.marginWidth = new Integer (marginWidth.getText ()).intValue ();
-		} catch (NumberFormatException e) {
-			formLayout.marginWidth = 0;
-			marginWidth.select (0);
-		}
-	}
-	
-	
-	/**
-	 * <code>AttachDialog</code> is the class that creates a
-	 * dialog specific for this example. It creates a dialog
-	 * with controls to set the values in a FormAttachment.
-	 */
-	public class AttachDialog extends Dialog {
-		String result = "";
-		String controlInput, positionInput, alignmentInput, offsetInput;
-		int col = 0;
-		
-		public AttachDialog (Shell parent, int style) {
-			super (parent, style);
-		}
-		
-		public AttachDialog (Shell parent) {
-			this (parent, 0);
-		}
-		
-		public void setColumn (int col) {
-			this.col = col;
-		}
-	 
-		public String open () {
-			Shell parent = getParent ();
-			final Shell shell = new Shell (parent, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL);
-			shell.setText (getText ());
-			GridLayout layout = new GridLayout ();
-			layout.numColumns = 3;
-			layout.makeColumnsEqualWidth = true;
-			shell.setLayout (layout);
-			
-			/* Find out what was previously set as an attachment */
-			TableItem newItem = leftEditor.getItem ();
-			result = newItem.getText (col);
-			String oldAttach = result;
-			String oldPos = "0", oldControl = "", oldAlign = "DEFAULT", oldOffset = "0";
-			boolean isControl = false;
-			if (oldAttach.length () != 0) {
-				char first = oldAttach.charAt (0);
-				if (Character.isLetter(first)) {
-					/* We have a control */
-					isControl = true;
-					oldControl = oldAttach.substring (0, oldAttach.indexOf (','));
-					oldAlign = oldAttach.substring (oldAttach.indexOf (':') + 1);
-					oldOffset = oldAttach.substring (oldAttach.indexOf (',') + 1, oldAttach.indexOf (':'));
-				} else {
-					/* We have a position */
-					oldPos = oldAttach.substring (0, oldAttach.indexOf (','));
-					oldOffset = oldAttach.substring (oldAttach.indexOf (',') + 1);
-					if (oldOffset.endsWith (")")) { // i.e. (Default)
-						oldOffset = oldOffset.substring (0, oldOffset.indexOf (' '));
-					}
-				}
-			}
-			
-			/* Add position field */
-			final Button posButton = new Button (shell, SWT.RADIO);
-			posButton.setText (LayoutExample.getResourceString ("Position"));
-			posButton.setSelection (!isControl);			
-			final Combo position = new Combo (shell, SWT.NONE);
-			position.setItems (new String [] {"0","25","50","75","100"});
-			position.setText (oldPos);
-			position.setEnabled (!isControl);			
-			GridData data = new GridData (GridData.FILL_HORIZONTAL);
-			data.horizontalSpan = 2;
-			position.setLayoutData (data);
-			
-			/* Add control field */
-			final Button contButton = new Button (shell, SWT.RADIO);
-			contButton.setText (LayoutExample.getResourceString ("Control"));
-			contButton.setSelection (isControl);
-			final Combo control = new Combo (shell, SWT.READ_ONLY);
-			TableItem [] items = table.getItems ();
-			TableItem currentItem = leftEditor.getItem ();
-			for (int i = 0; i < table.getItemCount (); i++) {
-				if (items [i].getText (0).length() > 0) {
-					if (items [i] != currentItem) {
-						control.add (items [i].getText (COMBO_COL) + i);
-					}
-				}
-			}
-			if (oldControl.length () != 0) control.setText (oldControl);
-			else control.select (0);
-			control.setEnabled (isControl);
-			data = new GridData (GridData.FILL_HORIZONTAL);
-			data.horizontalSpan = 2;
-			control.setLayoutData (data);
-			
-			/* Add alignment field */
-			new Label (shell, SWT.NONE).setText (LayoutExample.getResourceString ("Alignment"));
-			final Combo alignment = new Combo (shell, SWT.NONE);
-			String[] alignmentValues;
-			if (col == LEFT_COL || col == RIGHT_COL) {
-				alignmentValues = new String [] {"SWT.LEFT", "SWT.RIGHT", "SWT.CENTER", "SWT.DEFAULT"};
-			} else {
-				// col == TOP_COL || col == BOTTOM_COL
-				alignmentValues = new String [] {"SWT.TOP", "SWT.BOTTOM", "SWT.CENTER", "SWT.DEFAULT"};
-			}
-			alignment.setItems (alignmentValues);
-			alignment.setText ("SWT." + oldAlign);
-			alignment.setEnabled (isControl);
-			data = new GridData (GridData.FILL_HORIZONTAL);
-			data.horizontalSpan = 2;
-			alignment.setLayoutData (data);
-			
-			/* Add offset field */
-			new Label (shell, SWT.NONE).setText (LayoutExample.getResourceString ("Offset"));
-			final Text offset = new Text (shell, SWT.SINGLE | SWT.BORDER);
-			offset.setText (oldOffset);
-			data = new GridData (GridData.FILL_HORIZONTAL);
-			data.horizontalSpan = 2;
-			offset.setLayoutData (data);
-			
-			/* Add listeners for choosing between position and control */
-			posButton.addSelectionListener (new SelectionAdapter () {
-				public void widgetSelected (SelectionEvent e) {
-					position.setEnabled (true);
-					control.setEnabled (false);
-					alignment.setEnabled(false);
-				}
-			});
-			contButton.addSelectionListener (new SelectionAdapter () {
-				public void widgetSelected (SelectionEvent e) {
-					position.setEnabled (false);
-					control.setEnabled (true);
-					alignment.setEnabled(true);
-				}
-			});
-			
-			Button clear = new Button (shell, SWT.PUSH);
-			clear.setText (LayoutExample.getResourceString ("Clear"));
-			clear.setLayoutData (new GridData (GridData.HORIZONTAL_ALIGN_END));
-			clear.addSelectionListener (new SelectionAdapter () {
-				public void widgetSelected (SelectionEvent e) {
-					result = "";
-					shell.close ();
-				}
-			});
-			/* OK button sets data into table */
-			Button ok = new Button (shell, SWT.PUSH);
-			ok.setText (LayoutExample.getResourceString ("OK"));
-			ok.setLayoutData (new GridData (GridData.HORIZONTAL_ALIGN_CENTER));
-			ok.addSelectionListener (new SelectionAdapter () {
-				public void widgetSelected (SelectionEvent e) {
-					controlInput = control.getText ();
-					alignmentInput = alignment.getText ().substring (4);
-					positionInput = position.getText ();
-					if (positionInput.length () == 0) positionInput = "0";
-					try {
-						new Integer (positionInput).intValue ();
-					} catch (NumberFormatException except) {
-						positionInput = "0";
-					}
-					offsetInput = offset.getText ();
-					if (offsetInput.length () == 0) offsetInput = "0";
-					try {
-						new Integer (offsetInput).intValue ();
-					} catch (NumberFormatException except) {
-						offsetInput = "0";
-					}
-					if (posButton.getSelection() || controlInput.length () == 0) {
-						result = positionInput + "," + offsetInput;
-					} else {
-						result = controlInput + "," + offsetInput + ":" + alignmentInput;
-					}
-					shell.close ();
-				}
-			});
-			Button cancel = new Button (shell, SWT.PUSH);
-			cancel.setText (LayoutExample.getResourceString ("Cancel"));
-			cancel.setLayoutData (new GridData (GridData.HORIZONTAL_ALIGN_BEGINNING));
-			cancel.addSelectionListener (new SelectionAdapter () {
-				public void widgetSelected (SelectionEvent e) {
-					shell.close ();
-				}
-			});
-			
-			shell.setDefaultButton (ok);
-			shell.pack ();
-			/* Center the dialog */
-			Point center = parent.getLocation ();
-			center.x = center.x + (parent.getBounds ().width / 2) - (shell.getBounds ().width / 2);
-			center.y = center.y + (parent.getBounds ().height / 2) - (shell.getBounds ().height / 2);
-			shell.setLocation (center);
-			shell.open ();
-			Display display = shell.getDisplay ();
-			while (!shell.isDisposed ()) {
-				if (display.readAndDispatch ()) display.sleep ();
-			}
-			
-			return result;
-		}
-	}
-}
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/layoutexample/GridLayoutTab.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/layoutexample/GridLayoutTab.java
deleted file mode 100644
index e45f67f..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/layoutexample/GridLayoutTab.java
+++ /dev/null
@@ -1,586 +0,0 @@
-package org.eclipse.swt.examples.layoutexample;
-
-/*
- * Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.custom.*;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.graphics.*;
-
-class GridLayoutTab extends Tab {
-	/* Controls for setting layout parameters */
-	Text numColumns;
-	Button makeColumnsEqualWidth;
-	Combo marginHeight, marginWidth, horizontalSpacing, verticalSpacing;
-	/* The example layout instance */
-	GridLayout gridLayout;
-	/* TableEditors and related controls*/
-	TableEditor comboEditor, widthEditor, heightEditor;
-	TableEditor vAlignEditor, hAlignEditor, hIndentEditor;
-	TableEditor hSpanEditor, vSpanEditor, hGrabEditor, vGrabEditor;
-	CCombo combo, vAlign, hAlign, hGrab, vGrab;
-	Text widthText, heightText, hIndent, hSpan, vSpan;
-	
-	/* Constants */
-	final int COMBO_COL = 1;
-	final int WIDTH_COL = 2;
-	final int HEIGHT_COL = 3;
-	final int HALIGN_COL = 4;
-	final int VALIGN_COL = 5;
-	final int HINDENT_COL = 6;
-	final int HSPAN_COL = 7;
-	final int VSPAN_COL = 8;
-	final int HGRAB_COL = 9;
-	final int VGRAB_COL = 10;
-	
-	final int TOTAL_COLS = 11;
-		
-	/**
-	 * Creates the Tab within a given instance of LayoutExample.
-	 */
-	GridLayoutTab(LayoutExample instance) {
-		super(instance);
-	}
-	
-	/**
-	 * Creates the widgets in the "child" group.
-	 */
-	void createChildWidgets () {
-		/* Create the TraverseListener */
-		final TraverseListener traverseListener = new TraverseListener () {
-			public void keyTraversed (TraverseEvent e) {
-				if (e.detail == SWT.TRAVERSE_RETURN || e.detail == SWT.TRAVERSE_TAB_NEXT)
-					resetEditors ();
-				if (e.detail == SWT.TRAVERSE_ESCAPE)
-					disposeEditors ();
-			};
-		};
-		
-		/* Add common controls */
-		super.createChildWidgets ();
-			
-		/* Add TableEditors */		
-		comboEditor = new TableEditor (table);
-		widthEditor = new TableEditor (table);
-		heightEditor = new TableEditor (table);
-		vAlignEditor = new TableEditor (table);
-		hAlignEditor = new TableEditor (table);
-		hIndentEditor = new TableEditor (table);
-		hSpanEditor = new TableEditor (table);
-		vSpanEditor = new TableEditor (table);
-		hGrabEditor = new TableEditor (table);
-		vGrabEditor = new TableEditor (table);
-		table.addMouseListener (new MouseAdapter () {
-			public void mouseDown(MouseEvent e) {
-				resetEditors();
-				index = table.getSelectionIndex ();
-				Point pt = new Point (e.x, e.y);
-                newItem = table.getItem (pt);
-                if (newItem == null) return;
-                TableItem oldItem = comboEditor.getItem ();
-                if (newItem == oldItem || newItem != lastSelected) {
-					lastSelected = newItem;
-					return;
-				}
-				table.showSelection ();
-				
-				combo = new CCombo (table, SWT.READ_ONLY);
-				createComboEditor (combo, comboEditor);
-				
-				widthText = new Text (table, SWT.SINGLE);
-				widthText.setText (((String [])data.elementAt (index)) [WIDTH_COL]);
-				createTextEditor (widthText, widthEditor, WIDTH_COL);
-				
-				heightText = new Text (table, SWT.SINGLE);
-				heightText.setText (((String [])data.elementAt (index)) [HEIGHT_COL]);
-				createTextEditor (heightText, heightEditor, HEIGHT_COL);
-				String [] alignValues = new String [] {"BEGINNING","CENTER","END","FILL"};
-				hAlign = new CCombo (table, SWT.NONE);
-				hAlign.setItems (alignValues);
-				hAlign.setText (newItem.getText (HALIGN_COL));
-				hAlignEditor.horizontalAlignment = SWT.LEFT;
-				hAlignEditor.grabHorizontal = true;
-				hAlignEditor.minimumWidth = 50;
-				hAlignEditor.setEditor (hAlign, newItem, HALIGN_COL);
-				hAlign.addTraverseListener (traverseListener);
-				
-				vAlign = new CCombo (table, SWT.NONE);
-				vAlign.setItems (alignValues);
-				vAlign.setText (newItem.getText (VALIGN_COL));
-				vAlignEditor.horizontalAlignment = SWT.LEFT;
-				vAlignEditor.grabHorizontal = true;
-				vAlignEditor.minimumWidth = 50;
-				vAlignEditor.setEditor (vAlign, newItem, VALIGN_COL);
-				vAlign.addTraverseListener (traverseListener);
-				
-				hIndent = new Text (table, SWT.SINGLE);
-				hIndent.setText (((String [])data.elementAt (index)) [HINDENT_COL]);
-				createTextEditor (hIndent, hIndentEditor, HINDENT_COL);
-				
-				hSpan = new Text (table, SWT.SINGLE);
-				hSpan.setText (((String [])data.elementAt (index)) [HSPAN_COL]);
-				createTextEditor (hSpan, hSpanEditor, HSPAN_COL);
-				
-				vSpan = new Text (table, SWT.SINGLE);
-				vSpan.setText (((String [])data.elementAt (index)) [VSPAN_COL]);
-				createTextEditor (vSpan, vSpanEditor, VSPAN_COL);
-				
-				String [] boolValues = new String [] {"false","true"};
-				hGrab = new CCombo (table, SWT.NONE);
-				hGrab.setItems (boolValues);
-				hGrab.setText (newItem.getText (HGRAB_COL));
-				hGrabEditor.horizontalAlignment = SWT.LEFT;
-				hGrabEditor.grabHorizontal = true;
-				hGrabEditor.minimumWidth = 50;
-				hGrabEditor.setEditor (hGrab, newItem, HGRAB_COL);
-				hGrab.addTraverseListener (traverseListener);;
-				
-				vGrab = new CCombo (table, SWT.NONE);
-				vGrab.setItems (boolValues);
-				vGrab.setText (newItem.getText (VGRAB_COL));
-				vGrabEditor.horizontalAlignment = SWT.LEFT;
-				vGrabEditor.grabHorizontal = true;
-				vGrabEditor.minimumWidth = 50;
-				vGrabEditor.setEditor (vGrab, newItem, VGRAB_COL);
-				vGrab.addTraverseListener (traverseListener);
-                
-                for (int i=0; i<table.getColumnCount (); i++) {
-                	Rectangle rect = newItem.getBounds (i);
-                    if (rect.contains (pt)) {
-                    	switch (i) {
-							case COMBO_COL :
-								combo.setFocus ();	
-								break;
-							case WIDTH_COL :	
-								widthText.setFocus ();
-								break;
-							case HEIGHT_COL :
-								heightText.setFocus ();
-								break;
-							case HALIGN_COL :
-								hAlign.setFocus ();
-								break;
-							case VALIGN_COL :
-								vAlign.setFocus ();
-								break;
-							case HINDENT_COL :
-								hIndent.setFocus ();
-								break;
-							case HSPAN_COL :
-								hSpan.setFocus ();
-								break;
-							case VSPAN_COL :
-								vSpan.setFocus ();
-								break;
-							case HGRAB_COL :
-								hGrab.setFocus ();
-								break;
-							case VGRAB_COL :
-								vGrab.setFocus ();
-								break;
-							default :
-								resetEditors ();
-								break;
-						}
-                    }
-                } 
-			}
-		});
-		
-		/* Add listener to add an element to the table */
-		add.addSelectionListener(new SelectionAdapter () {
-			public void widgetSelected(SelectionEvent e) {
-				TableItem item = new TableItem (table, 0);
-				String [] insert = new String [] { 
-					String.valueOf (table.indexOf (item)), "Button",
-					"-1","-1","BEGINNING","CENTER",
-					"0","1","1","false","false"};
-				item.setText (insert);
-				data.addElement (insert);
-				resetEditors ();
-			}
-		});
-	}
-
-	/**
-	 * Creates the control widgets.
-	 */
-	void createControlWidgets () {
-		/* Rearrange the layout of the control group */
-		size.setLayoutData (new GridData ());
-		
-		/* Controls the margins and spacing of the GridLayout */
-		String [] marginValues = new String [] {"0","3","5","10"};
-		Group marginGroup = new Group (controlGroup, SWT.NONE);
-		marginGroup.setText (LayoutExample.getResourceString ("Margins_Spacing"));
-		GridData data = new GridData (GridData.FILL_HORIZONTAL);
-		data.verticalSpan = 2;
-		marginGroup.setLayoutData (data);
-		GridLayout layout = new GridLayout ();
-		layout.numColumns = 2;
-		marginGroup.setLayout (layout);
-		new Label (marginGroup, SWT.NONE).setText ("marginHeight");
-		marginHeight = new Combo (marginGroup, SWT.NONE);
-		marginHeight.setItems (marginValues);
-		marginHeight.select (2);
-		data = new GridData (GridData.FILL_HORIZONTAL);
-		data.widthHint = 60;
-		marginHeight.setLayoutData (data);
-		marginHeight.addSelectionListener (selectionListener);
-		marginHeight.addTraverseListener (traverseListener);
-		new Label (marginGroup, SWT.NONE).setText ("marginWidth");
-		marginWidth = new Combo (marginGroup, SWT.NONE);
-		marginWidth.setItems (marginValues);
-		marginWidth.select (2);
-		data = new GridData (GridData.FILL_HORIZONTAL);
-		data.widthHint = 60;
-		marginWidth.setLayoutData (data);
-		marginWidth.addSelectionListener (selectionListener);
-		marginWidth.addTraverseListener (traverseListener);
-		new Label (marginGroup, SWT.NONE).setText ("horizontalSpacing");
-		horizontalSpacing = new Combo (marginGroup, SWT.NONE);
-		horizontalSpacing.setItems (marginValues);
-		horizontalSpacing.select (2);
-		data = new GridData (GridData.FILL_HORIZONTAL);
-		data.widthHint = 60;
-		horizontalSpacing.setLayoutData (data);
-		horizontalSpacing.addSelectionListener (selectionListener);
-		horizontalSpacing.addTraverseListener (traverseListener);
-		new Label (marginGroup, SWT.NONE).setText ("verticalSpacing");
-		verticalSpacing = new Combo (marginGroup, SWT.NONE);
-		verticalSpacing.setItems (marginValues);
-		verticalSpacing.select (2);
-		data = new GridData (GridData.FILL_HORIZONTAL);
-		data.widthHint = 60;
-		verticalSpacing.setLayoutData (data);
-		verticalSpacing.addSelectionListener (selectionListener);
-		verticalSpacing.addTraverseListener (traverseListener);
-        
-        /* Controls the columns in the GridLayout */
-		Group columnGroup = new Group (controlGroup, SWT.NONE);
-		columnGroup.setText (LayoutExample.getResourceString ("Columns"));
-		layout = new GridLayout ();
-		layout.numColumns = 2;
-		columnGroup.setLayout (layout);
-		data = new GridData (GridData.VERTICAL_ALIGN_FILL);
-		columnGroup.setLayoutData (data);
-		numColumns = new Text (columnGroup, SWT.BORDER);
-		numColumns.setText ("1");
-		numColumns.addSelectionListener (selectionListener);
-		numColumns.addTraverseListener (traverseListener);
-       	data = new GridData (GridData.FILL_HORIZONTAL);
-       	data.widthHint = 15;
-       	numColumns.setLayoutData (data);
-       	new Label (columnGroup, SWT.NONE).setText ("numColumns");
-		makeColumnsEqualWidth = new Button (columnGroup, SWT.CHECK);
-		makeColumnsEqualWidth.setText ("makeColumnsEqualWidth");
-		makeColumnsEqualWidth.addSelectionListener (selectionListener);
-		data = new GridData (GridData.FILL_HORIZONTAL);
-		data.horizontalSpan = 2;
-		data.horizontalIndent = 14;
-		makeColumnsEqualWidth.setLayoutData (data);
-
-		/* Add common controls */
-		super.createControlWidgets ();
-		controlGroup.pack();
-	}
-	
-	/**
-	 * Creates the example layout.
-	 */
-	void createLayout () {
-		gridLayout = new GridLayout ();
-		layoutComposite.setLayout (gridLayout);
-	}
-	
-	/** 
-	 * Disposes the editors without placing their contents
-	 * into the table.
-	 */
-	void disposeEditors () {
-		comboEditor.setEditor (null, null, -1);
-		combo.dispose ();
-		widthText.dispose ();
-		heightText.dispose ();
-		hAlign.dispose ();
-		vAlign.dispose ();
-		hIndent.dispose ();
-		hSpan.dispose ();
-		vSpan.dispose ();
-		hGrab.dispose ();
-		vGrab.dispose ();
-	}
-	
-	/**
-	 * Generates code for the example layout.
-	 */	
-	StringBuffer generateLayoutCode () {
-		StringBuffer code = new StringBuffer ();
-		code.append ("\t\tGridLayout gridLayout = new GridLayout ();\n");
-		if (gridLayout.numColumns != 1) {
-			code.append ("\t\tgridLayout.numColumns = " + gridLayout.numColumns + ";\n");
-		}
-		if (gridLayout.makeColumnsEqualWidth) {
-			code.append ("\t\tgridLayout.makeColumnsEqualWidth = true;\n");
-		}
-		if (gridLayout.marginHeight != 5) {
-			code.append ("\t\tgridLayout.marginHeight = " + gridLayout.marginHeight + ";\n");
-		}
-		if (gridLayout.marginWidth != 5) {
-			code.append ("\t\tgridLayout.marginWidth = " + gridLayout.marginWidth + ";\n");
-		}
-		if (gridLayout.horizontalSpacing != 5) {
-			code.append ("\t\tgridLayout.horizontalSpacing = " + gridLayout.horizontalSpacing + ";\n");
-		}
-		if (gridLayout.verticalSpacing != 5) {
-			code.append ("\t\tgridLayout.verticalSpacing = " + gridLayout.verticalSpacing + ";\n");
-		}
-		code.append ("\t\tshell.setLayout (gridLayout);\n");
-		
-		boolean first = true;
-		for (int i = 0; i < children.length; i++) {
-			Control control = children [i];
-			code.append (getChildCode (control, i));
-			GridData data = (GridData) control.getLayoutData ();
-			if (data != null) {
-				code.append ("\t\t");
-				if (first) {
-					code.append ("GridData ");
-					first = false;
-				}
-				code.append ("data = new GridData ();\n");	
-				if (data.widthHint != SWT.DEFAULT) {
-					code.append ("\t\tdata.widthHint = " + data.widthHint + ";\n");
-				}
-				if (data.heightHint != SWT.DEFAULT) {
-					code.append ("\t\tdata.heightHint = " + data.heightHint + ";\n");
-				}
-				if (data.horizontalAlignment != GridData.BEGINNING) {
-					String alignment;
-					int hAlignment = data.horizontalAlignment;
-					if (hAlignment == GridData.CENTER) alignment = "GridData.CENTER";
-					else if (hAlignment == GridData.END) alignment = "GridData.END";
-					else alignment = "GridData.FILL";
-					code.append ("\t\tdata.horizontalAlignment = " + alignment + ";\n");
-				}
-				if (data.verticalAlignment != GridData.CENTER) {
-					String alignment;
-					int vAlignment = data.verticalAlignment;
-					if (vAlignment == GridData.BEGINNING) alignment = "GridData.BEGINNING";
-					else if (vAlignment == GridData.END) alignment = "GridData.END";
-					else alignment = "GridData.FILL";
-					code.append ("\t\tdata.verticalAlignment = " + alignment + ";\n");
-				}	
-				if (data.horizontalIndent != 0) {
-					code.append ("\t\tdata.horizontalIndent = " + data.horizontalIndent + ";\n");
-				}
-				if (data.horizontalSpan != 1) {
-					code.append ("\t\tdata.horizontalSpan = " + data.horizontalSpan + ";\n");
-				}
-				if (data.verticalSpan != 1) {
-					code.append ("\t\tdata.verticalSpan = " + data.verticalSpan + ";\n");
-				}
-				if (data.grabExcessHorizontalSpace) {
-					code.append ("\t\tdata.grabExcessHorizontalSpace = true;\n");
-				}
-				if (data.grabExcessVerticalSpace) {
-					code.append ("\t\tdata.grabExcessVerticalSpace = true;\n");
-				}
-				if (code.substring (code.length () - 33).equals ("GridData data = new GridData ();\n")) {
-					code.delete (code.length () - 33, code.length ());
-					first = true;
-				} else if (code.substring (code.length () - 24).equals ("data = new GridData ();\n")) { 
-					code.delete (code.length () - 24, code.length ());
-				} else {	
-					code.append ("\t\t" + names [i] + ".setLayoutData (data);\n");
-				}
-			}
-		}
-		return code;
-	}
-	
-	/**
-	 * Returns the layout data field names.
-	 */
-	String [] getLayoutDataFieldNames() {
-		return new String [] {
-			"",
-			"Control", 
-			"width", 
-			"height", 
-			"horizontalAlignment", 
-			"verticalAlignment", 
-			"horizontalIndent", 
-			"horizontalSpan",
-			"verticalSpan", 
-			"grabExcessHorizontalSpace", 
-			"grabExcessVerticalSpace"
-		};
-	}
-	
-	/**
-	 * Gets the text for the tab folder item.
-	 */
-	String getTabText () {
-		return "GridLayout";
-	}
-	
-	/**
-	 * Takes information from TableEditors and stores it.
-	 */
-	void resetEditors () {
-		resetEditors (false);
-	}
-	
-	void resetEditors (boolean tab) {
-		TableItem oldItem = comboEditor.getItem ();
-		if (oldItem != null) {
-			int row = table.indexOf (oldItem);
-			try {
-				new Integer (widthText.getText ()).intValue ();
-			} catch (NumberFormatException e) {
-				widthText.setText (oldItem.getText (WIDTH_COL));
-			}
-			try {
-				new Integer (heightText.getText ()).intValue ();
-			} catch (NumberFormatException e) {
-				heightText.setText (oldItem.getText (HEIGHT_COL));
-			}
-			try {
-				new Integer (hIndent.getText ()).intValue ();
-			} catch (NumberFormatException e) {
-				hIndent.setText (oldItem.getText (HINDENT_COL));
-			}
-			try {
-				new Integer (hSpan.getText ()).intValue ();
-			} catch (NumberFormatException e) {
-				hSpan.setText (oldItem.getText (HSPAN_COL));
-			}
-			try {
-				new Integer (vSpan.getText ()).intValue ();
-			} catch (NumberFormatException e) {
-				vSpan.setText (oldItem.getText (VSPAN_COL));
-			}
-			String [] insert = new String [] {
-				String.valueOf (row), combo.getText (), widthText.getText (), heightText.getText (),
-				hAlign.getText (), vAlign.getText (), hIndent.getText (), 
-				hSpan.getText (), vSpan.getText (), hGrab.getText (), vGrab.getText ()
-			};
-			data.setElementAt (insert, row);
-			for (int i = 0; i < TOTAL_COLS; i++) {
-				oldItem.setText (i, ((String [])data.elementAt (row)) [i]);
-			}
-			if (!tab) disposeEditors ();
-		}
-		setLayoutState ();		
-		refreshLayoutComposite ();
-		setLayoutData ();
-		layoutComposite.layout (true);
-		layoutGroup.layout (true);
-	}	
-	
-	/**
-	 * Sets the layout data for the children of the layout.
-	 */
-	void setLayoutData () {
-		Control [] children = layoutComposite.getChildren ();
-		TableItem [] items = table.getItems ();
-		GridData data;
-		int width, height, hIndent, hSpan, vSpan;
-		String vAlign, hAlign, vGrab, hGrab;
-		for (int i = 0; i < children.length; i++) {
-			data = new GridData ();
-			/* Set widthHint and heightHint */
-			data.widthHint = new Integer (items [i].getText (WIDTH_COL)).intValue ();
-			data.heightHint = new Integer (items [i].getText (HEIGHT_COL)).intValue ();
-			/* Set vertical alignment and horizontal alignment */
-			hAlign = items [i].getText (HALIGN_COL);
-			if (hAlign.equals ("CENTER")) {
-				data.horizontalAlignment = GridData.CENTER;
-			} else if (hAlign.equals ("END")) {
-				data.horizontalAlignment = GridData.END;
-			} else if (hAlign.equals ("FILL")) {
-				data.horizontalAlignment = GridData.FILL;
-			} else {
-				data.horizontalAlignment = GridData.BEGINNING;
-			}
-			vAlign = items [i].getText (VALIGN_COL);
-			if (vAlign.equals ("BEGINNING")) {
-				data.verticalAlignment = GridData.BEGINNING;
-			} else if (vAlign.equals ("END")) {
-				data.verticalAlignment = GridData.END;
-			} else if (vAlign.equals ("FILL")) {
-				data.verticalAlignment = GridData.FILL;
-			} else {
-				data.verticalAlignment = GridData.CENTER;
-			}
-			/* Set indents and spans */
-			hIndent = new Integer (items [i].getText (HINDENT_COL)).intValue ();
-			data.horizontalIndent = hIndent;
-			hSpan = new Integer (items [i].getText (HSPAN_COL)).intValue ();
-			data.horizontalSpan = hSpan;
-			vSpan = new Integer (items [i].getText (VSPAN_COL)).intValue ();
-			data.verticalSpan = vSpan;
-			/* Set grabbers */
-			hGrab = items [i].getText (HGRAB_COL);
-			if (hGrab.equals ("true")) {
-				data.grabExcessHorizontalSpace = true;
-			} else {
-				data.grabExcessHorizontalSpace = false;
-			}
-			vGrab = items [i].getText (VGRAB_COL);
-			if (vGrab.equals ("true")) {
-				data.grabExcessVerticalSpace = true;
-			} else {
-				data.grabExcessVerticalSpace = false;
-			}
-			children [i].setLayoutData (data);
-		}
-	}
-	
-	/**
-	 * Sets the state of the layout.
-	 */
-	void setLayoutState () {
-		/* Set the columns for the layout */
-		try {
-			gridLayout.numColumns = new Integer (numColumns.getText ()).intValue ();
-		} catch (NumberFormatException e) {
-			gridLayout.numColumns = 1;
-		}
-		gridLayout.makeColumnsEqualWidth = makeColumnsEqualWidth.getSelection ();
-		
-		/* Set the margins and spacing */
-		try {
-			gridLayout.marginHeight = new Integer (marginHeight.getText ()).intValue ();
-		} catch (NumberFormatException e) {
-			gridLayout.marginHeight = 5;
-			marginHeight.select (2);
-		}
-		try {
-			gridLayout.marginWidth = new Integer (marginWidth.getText ()).intValue ();
-		} catch (NumberFormatException e) {
-			gridLayout.marginWidth = 5;
-			marginWidth.select (2);
-		}
-		try {
-			gridLayout.horizontalSpacing = new Integer (horizontalSpacing.getText ()).intValue ();
-		} catch (NumberFormatException e) {
-			gridLayout.horizontalSpacing = 5;
-			horizontalSpacing.select (2);
-		}
-		try {
-			gridLayout.verticalSpacing = new Integer (verticalSpacing.getText ()).intValue ();
-		} catch (NumberFormatException e) {
-			gridLayout.verticalSpacing = 5;
-			verticalSpacing.select (2);
-		}
-	}
-}
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/layoutexample/LayoutExample.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/layoutexample/LayoutExample.java
deleted file mode 100644
index 2081dec..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/layoutexample/LayoutExample.java
+++ /dev/null
@@ -1,111 +0,0 @@
-package org.eclipse.swt.examples.layoutexample;
-
-/*
- * Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.events.*;
-
-import java.text.*;
-import java.util.*;
-
-public class LayoutExample {
-	private static ResourceBundle resourceBundle = ResourceBundle.getBundle("examples_layout");
-	private TabFolder tabFolder;
-	
-	/**
-	 * Creates an instance of a LayoutExample embedded inside
-	 * the supplied parent Composite.
-	 * 
-	 * @param parent the container of the example
-	 */
-	public LayoutExample(Composite parent) {
-		tabFolder = new TabFolder (parent, SWT.NULL);
-		Tab [] tabs = new Tab [] {
-			new FillLayoutTab (this),
-			new RowLayoutTab (this),
-			new GridLayoutTab (this),
-			new FormLayoutTab (this),
-		};
-		for (int i=0; i<tabs.length; i++) {
-			TabItem item = new TabItem (tabFolder, SWT.NULL);
-		    item.setText (tabs [i].getTabText ());
-		    item.setControl (tabs [i].createTabFolderPage (tabFolder));
-		}
-	}
-	
-	/**
-	 * Grabs input focus.
-	 */
-	public void setFocus() {
-		tabFolder.setFocus();
-	}
-	
-	/**
-	 * Disposes of all resources associated with a particular
-	 * instance of the LayoutExample.
-	 */	
-	public void dispose() {
-		tabFolder = null;
-	}
-	
-	/**
-	 * Invokes as a standalone program.
-	 */
-	public static void main(String[] args) {
-		final Display display = new Display();
-		final Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new LayoutExample(shell);
-		shell.setText(getResourceString("window.title"));
-		shell.addShellListener (new ShellAdapter () {
-			public void shellClosed(ShellEvent e) {
-				Shell [] shells = display.getShells();
-				for (int i = 0; i < shells.length; i++) {
-					if (shells [i] != shell) shells [i].close ();
-				}
-			}
-		});
-		shell.open();
-		while (! shell.isDisposed()) {
-			if (! display.readAndDispatch()) display.sleep();
-		}
-	}
-
-	/**
-	 * Gets a string from the resource bundle.
-	 * We don't want to crash because of a missing String.
-	 * Returns the key if not found.
-	 */
-	static String getResourceString(String key) {
-		try {
-			return resourceBundle.getString(key);
-		} catch (MissingResourceException e) {
-			return key;
-		} catch (NullPointerException e) {
-			return "!" + key + "!";
-		}			
-	}
-
-	/**
-	 * Gets a string from the resource bundle and binds it
-	 * with the given arguments. If the key is not found,
-	 * return the key.
-	 */
-	static String getResourceString(String key, Object[] args) {
-		try {
-			return MessageFormat.format(getResourceString(key), args);
-		} catch (MissingResourceException e) {
-			return key;
-		} catch (NullPointerException e) {
-			return "!" + key + "!";
-		}
-	}
-}
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/layoutexample/RowLayoutTab.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/layoutexample/RowLayoutTab.java
deleted file mode 100644
index 32b54e9..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/layoutexample/RowLayoutTab.java
+++ /dev/null
@@ -1,409 +0,0 @@
-package org.eclipse.swt.examples.layoutexample;
-
-/*
- * Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.custom.*;
-
-class RowLayoutTab extends Tab {
-	/* Controls for setting layout parameters */
-	Button horizontal, vertical;
-	Button wrap, pack, justify;
-	Combo marginRight, marginLeft, marginTop, marginBottom, spacing;
-	/* The example layout instance */
-	RowLayout rowLayout;
-	/* TableEditors and related controls*/
-	TableEditor comboEditor, widthEditor, heightEditor;
-	CCombo combo;
-	Text widthText, heightText;
-	
-	/* Constants */
-	final int COMBO_COL = 1;
-	final int WIDTH_COL = 2;
-	final int HEIGHT_COL = 3;
-	
-	final int TOTAL_COLS = 4;
-	
-	/**
-	 * Creates the Tab within a given instance of LayoutExample.
-	 */
-	RowLayoutTab(LayoutExample instance) {
-		super(instance);
-	}
-	
-	/**
-	 * Creates the widgets in the "child" group.
-	 */
-	void createChildWidgets () {
-		/* Add common controls */
-		super.createChildWidgets ();
-		
-		/* Add TableEditors */			
-		comboEditor = new TableEditor (table);
-		widthEditor = new TableEditor (table);
-		heightEditor = new TableEditor (table);
-		table.addMouseListener (new MouseAdapter () {
-			public void mouseDown(MouseEvent e) {
-				resetEditors();
-				index = table.getSelectionIndex ();
-				Point pt = new Point (e.x, e.y);
-                newItem = table.getItem (pt);
-                if (newItem == null) return;
-                TableItem oldItem = comboEditor.getItem ();
-                if (newItem == oldItem || newItem != lastSelected) {
-					lastSelected = newItem;
-					return;
-				}
-				table.showSelection ();
-				
-				combo = new CCombo (table, SWT.READ_ONLY);
-				createComboEditor (combo, comboEditor);
-				
-				widthText = new Text (table, SWT.SINGLE);
-				widthText.setText (((String [])data.elementAt (index)) [WIDTH_COL]);
-				createTextEditor (widthText, widthEditor, WIDTH_COL);
-				
-				heightText = new Text (table, SWT.SINGLE);
-				heightText.setText (((String [])data.elementAt (index)) [HEIGHT_COL]);
-				createTextEditor (heightText, heightEditor, HEIGHT_COL);
-                
-                for (int i=0; i<table.getColumnCount (); i++) {
-                	Rectangle rect = newItem.getBounds (i);
-                    if (rect.contains (pt)) {
-                    	switch (i) {
-							case COMBO_COL :
-								combo.setFocus ();	
-								break;
-							case WIDTH_COL :	
-								widthText.setFocus ();
-								break;
-							case HEIGHT_COL :
-								heightText.setFocus ();
-								break;
-							default :
-								resetEditors ();
-								break;
-						}
-                    }
-                } 
-			}
-		});
-		
-		/* Add listener to add an element to the table */
-		add.addSelectionListener(new SelectionAdapter () {
-			public void widgetSelected(SelectionEvent e) {
-				TableItem item = new TableItem (table, 0);
-				String [] insert = new String [] { 
-					String.valueOf (table.indexOf (item)),
-					"Button", "-1", "-1"};
-				item.setText (insert);
-				data.addElement (insert);
-				resetEditors ();
-			}
-		});
-	}
-	
-	/**
-	 * Creates the control widgets.
-	 */
-	void createControlWidgets () {
-		/* Controls the type of RowLayout */
-		Group typeGroup = new Group (controlGroup, SWT.NONE);
-		typeGroup.setText (LayoutExample.getResourceString ("Type"));
-		typeGroup.setLayout (new GridLayout ());
-		GridData data = new GridData (GridData.FILL_HORIZONTAL);
-		typeGroup.setLayoutData (data);
-		horizontal = new Button (typeGroup, SWT.RADIO);
-		horizontal.setText ("SWT.HORIZONTAL");
-		horizontal.setLayoutData (new GridData (GridData.FILL_HORIZONTAL)); 
-		horizontal.setSelection(true);
-		horizontal.addSelectionListener (selectionListener);
-		vertical = new Button (typeGroup, SWT.RADIO);
-		vertical.setText ("SWT.VERTICAL");
-		vertical.setLayoutData (new GridData (GridData.FILL_HORIZONTAL)); 
-		vertical.addSelectionListener (selectionListener);
-		
-		/* Controls the margins and spacing of the RowLayout */
-		String [] marginValues = new String [] {"0","3","5","10"};
-		Group marginGroup = new Group (controlGroup, SWT.NONE);
-		marginGroup.setText (LayoutExample.getResourceString ("Margins_Spacing"));
-		data = new GridData (GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
-		data.verticalSpan = 2;
-		marginGroup.setLayoutData (data);
-		GridLayout layout = new GridLayout ();
-		layout.numColumns = 2;
-		marginGroup.setLayout (layout);
-		new Label (marginGroup, SWT.NONE).setText ("marginRight");
-		marginRight = new Combo (marginGroup, SWT.NONE);
-		marginRight.setItems (marginValues);
-		marginRight.select (1);
-		marginRight.setLayoutData (new GridData(GridData.FILL_HORIZONTAL));
-		marginRight.addSelectionListener (selectionListener);
-		marginRight.addTraverseListener (traverseListener);
-		new Label (marginGroup, SWT.NONE).setText ("marginLeft");
-		marginLeft = new Combo (marginGroup, SWT.NONE);
-		marginLeft.setItems (marginValues);
-		marginLeft.select (1);
-		marginLeft.setLayoutData (new GridData(GridData.FILL_HORIZONTAL));
-		marginLeft.addSelectionListener (selectionListener);
-		marginLeft.addTraverseListener(traverseListener);
-		new Label (marginGroup, SWT.NONE).setText ("marginTop");
-		marginTop = new Combo (marginGroup, SWT.NONE);
-		marginTop.setItems (marginValues);
-		marginTop.select (1);
-		marginTop.setLayoutData (new GridData(GridData.FILL_HORIZONTAL));
-		marginTop.addSelectionListener (selectionListener);
-		marginTop.addTraverseListener(traverseListener);
-		new Label (marginGroup, SWT.NONE).setText ("marginBottom");
-		marginBottom = new Combo (marginGroup, SWT.NONE);
-		marginBottom.setItems (marginValues);
-		marginBottom.select (1);
-		marginBottom.setLayoutData (new GridData(GridData.FILL_HORIZONTAL));
-		marginBottom.addSelectionListener (selectionListener);
-		marginBottom.addTraverseListener(traverseListener);
-		new Label (marginGroup, SWT.NONE).setText ("spacing");
-		spacing = new Combo (marginGroup, SWT.NONE);
-		spacing.setItems (marginValues);
-		spacing.select (1);
-		spacing.setLayoutData (new GridData(GridData.FILL_HORIZONTAL));
-		spacing.addSelectionListener (selectionListener);
-		spacing.addTraverseListener(traverseListener);
-		
-		/* Controls other parameters of the RowLayout */
-		Group specGroup = new Group (controlGroup, SWT.NONE);
-		specGroup.setText (LayoutExample.getResourceString ("Properties"));
-		specGroup.setLayoutData (new GridData (GridData.FILL_HORIZONTAL));
-		specGroup.setLayout (new GridLayout ());
-		wrap = new Button (specGroup, SWT.CHECK);
-		wrap.setText ("wrap");
-		wrap.setSelection (true);
-		wrap.setLayoutData (new GridData (GridData.FILL_HORIZONTAL)); 
-		wrap.addSelectionListener (selectionListener);
-		pack = new Button (specGroup, SWT.CHECK);
-		pack.setText ("pack");
-		pack.setLayoutData (new GridData (GridData.FILL_HORIZONTAL)); 
-		pack.setSelection (true);
-		pack.addSelectionListener (selectionListener);
-		justify = new Button (specGroup, SWT.CHECK);
-		justify.setText ("justify");
-		justify.setLayoutData (new GridData (GridData.FILL_HORIZONTAL)); 
-		justify.addSelectionListener (selectionListener);
-		
-		/* Add common controls */
-		super.createControlWidgets ();
-		
-		/* Position the sash */
-		sash.setWeights (new int [] {6,5});
-	}
-	
-	/**
-	 * Creates the example layout.
-	 */
-	void createLayout () {
-		rowLayout = new RowLayout ();
-		layoutComposite.setLayout (rowLayout);
-	}
-		
-	/** 
-	 * Disposes the editors without placing their contents
-	 * into the table.
-	 */
-	void disposeEditors () {
-		comboEditor.setEditor (null, null, -1);
-		combo.dispose ();
-		widthText.dispose ();
-		heightText.dispose ();
-	}
-	
-	/**
-	 * Generates code for the example layout.
-	 */	
-	StringBuffer generateLayoutCode () {
-		StringBuffer code = new StringBuffer ();
-		code.append ("\t\tRowLayout rowLayout = new RowLayout ();\n");
-		if (rowLayout.type == SWT.VERTICAL) {
-			code.append ("\t\trowLayout.type = SWT.VERTICAL;\n");
-		}
-		if (rowLayout.wrap == false) {
-			code.append ("\t\trowLayout.wrap = false;\n");
-		} 
-		if (rowLayout.pack == false) {
-			code.append ("\t\trowLayout.pack = false;\n");
-		}
-		if (rowLayout.justify == true) {
-			code.append ("\t\trowLayout.justify = true;\n");
-		}
-		if (rowLayout.marginLeft != 3) {
-			code.append ("\t\trowLayout.marginLeft = " + rowLayout.marginLeft + ";\n");
-		}
-		if (rowLayout.marginRight != 3) {
-			code.append ("\t\trowLayout.marginRight = " + rowLayout.marginRight + ";\n");
-		}
-		if (rowLayout.marginTop != 3) {
-			code.append ("\t\trowLayout.marginTop = " + rowLayout.marginTop + ";\n");
-		}
-		if (rowLayout.marginBottom != 3) {
-			code.append ("\t\trowLayout.marginBottom = " + rowLayout.marginBottom + ";\n");
-		}
-		if (rowLayout.spacing != 3) {
-			code.append ("\t\trowLayout.spacing = " + rowLayout.spacing + ";\n");
-		}
-		code.append ("\t\tshell.setLayout (rowLayout);\n");
-		
-		boolean first = true;
-		for (int i = 0; i < children.length; i++) {
-			Control control = children [i];
-			code.append (getChildCode (control,i));
-			RowData data = (RowData) control.getLayoutData ();
-			if (data != null) {
-				if (data.width != -1 || data.height != -1) {
-					code.append ("\t\t");
-					if (first) {
-						code.append ("RowData ");
-						first = false;
-					}
-					if (data.width == -1) {
-						code.append ("data = new RowData (SWT.DEFAULT, " + data.height + ");\n");
-					} else if (data.height == -1) {
-						code.append ("data = new RowData (" + data.width + ", SWT.DEFAULT);\n");
-					} else {
-						code.append ("data = new RowData (" + data.width + ", " + data.height + ");\n");				
-					}
-					code.append ("\t\t" + names [i] + ".setLayoutData (data);\n");
-				}
-			}
-		}
-		return code;
-	}
-	
-	/**
-	 * Returns the layout data field names.
-	 */
-	String [] getLayoutDataFieldNames() {
-		return new String [] { 
-			"",
-			"Control",
-			"width", 
-			"height"
-		};
-	}
-	
-	/**
-	 * Gets the text for the tab folder item.
-	 */
-	String getTabText () {
-		return "RowLayout";
-	}
-	
-	/**
-	 * Takes information from TableEditors and stores it.
-	 */
-	void resetEditors () {
-		resetEditors (false);
-	}
-	
-	void resetEditors (boolean tab) {
-		TableItem oldItem = comboEditor.getItem ();
-		if (oldItem != null) {
-			int row = table.indexOf (oldItem);
-			/* Make sure user has entered valid data */
-			try {
-				new Integer (widthText.getText ()).intValue ();
-			} catch (NumberFormatException e) {
-				widthText.setText (oldItem.getText (WIDTH_COL));
-			}
-			try {
-				new Integer (heightText.getText ()).intValue ();
-			} catch (NumberFormatException e) {
-				heightText.setText (oldItem.getText (HEIGHT_COL));
-			}
-			String [] insert = new String [] {
-				String.valueOf (row), combo.getText (), widthText.getText (), heightText.getText ()};
-			data.setElementAt (insert, row);
-			for (int i = 0 ; i < TOTAL_COLS; i++) {
-				oldItem.setText (i, ((String [])data.elementAt (row)) [i]);
-			}
-			if (!tab) disposeEditors ();
-		}
-		setLayoutState ();
-		refreshLayoutComposite ();
-		setLayoutData ();
-		layoutComposite.layout (true);
-		layoutGroup.layout (true);
-	}
-	
-	/**
-	 * Sets the layout data for the children of the layout.
-	 */
-	void setLayoutData () {
-		Control [] children = layoutComposite.getChildren ();
-		TableItem [] items = table.getItems ();
-		RowData data;
-		int width, height;
-		for (int i = 0; i < children.length; i++) {
-			width = new Integer (items [i].getText (WIDTH_COL)).intValue ();
-			height = new Integer (items [i].getText (HEIGHT_COL)).intValue ();
-			data = new RowData (width, height);
-			children [i].setLayoutData (data);
-		}
-		
-	}
-	
-	/**
-	 * Sets the state of the layout.
-	 */
-	void setLayoutState () {
-		/* Set the type of layout */
-		if (vertical.getSelection ()) {
-			rowLayout.type = SWT.VERTICAL;
-		} else {
-			rowLayout.type = SWT.HORIZONTAL;
-		}
-		
-		/* Set the margins and spacing */
-		try {
-			rowLayout.marginRight = new Integer (marginRight.getText ()).intValue ();
-		} catch (NumberFormatException e) {
-			rowLayout.marginRight = 3;
-			marginRight.select (1);
-		}
-		try {
-			rowLayout.marginLeft = new Integer (marginLeft.getText ()).intValue ();
-		} catch (NumberFormatException e) {
-			rowLayout.marginLeft = 3;
-			marginLeft.select (1);
-		}
-		try {
-			rowLayout.marginTop = new Integer (marginTop.getText ()).intValue ();
-		} catch (NumberFormatException e) {
-			rowLayout.marginTop = 3;
-			marginTop.select (1);
-		}
-		try {
-			rowLayout.marginBottom = new Integer (marginBottom.getText ()).intValue ();
-		} catch (NumberFormatException e) {
-			rowLayout.marginBottom = 3;
-			marginBottom.select (1);
-		}
-		try {
-			rowLayout.spacing = new Integer (spacing.getText ()).intValue ();
-		} catch (NumberFormatException e) {
-			rowLayout.spacing = 3;
-			spacing.select (1);
-		}
-		
-		/* Set the other layout properties */
-		rowLayout.wrap = wrap.getSelection ();
-		rowLayout.pack = pack.getSelection ();
-		rowLayout.justify = justify.getSelection ();
-	}
-}
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/layoutexample/Tab.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/layoutexample/Tab.java
deleted file mode 100644
index 668e4da..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/layoutexample/Tab.java
+++ /dev/null
@@ -1,641 +0,0 @@
-package org.eclipse.swt.examples.layoutexample;
-
-/*
- * Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
- 
-import java.util.Vector;
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.custom.*;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.widgets.*;
-
-/**
- * <code>Tab</code> is the abstract superclass of every page
- * in the example's tab folder.  Each page in the tab folder
- * displays a layout, and allows the user to manipulate the
- * layout.
- *
- * A typical page in a Tab contains a two column composite.
- * The left column contains the layout group, which contains
- * the "layout composite" (the one that has the example layout).
- * The right column contains the "control" group. The "control"
- * group allows the user to interact with the example. Typical
- * operations are modifying layout parameters, adding children
- * to the "layout composite", and modifying child layout data.
- * The "Code" button in the "control" group opens a new window
- * containing code that will regenerate the layout. This code
- * (or parts of it) can be selected and copied to the clipboard.
- */
-abstract class Tab {	
-	/* Common groups and composites */
-	Composite tabFolderPage;
-	SashForm sash;
-	Group layoutGroup, controlGroup, childGroup;
-	/* The composite that contains the example layout */
-	Composite layoutComposite;
-	/* Common controls for modifying the example layout */
-	String [] names;
-	Control [] children;
-	Button size, add, delete, clear, code;
-	/* Common values for working with TableEditors */
-	Table table;
-	int index;
-	TableItem newItem, lastSelected;
-	Vector data = new Vector ();
-	/* Controlling instance */
-	final LayoutExample instance;
-
-	/* Listeners */
-	SelectionListener selectionListener = new SelectionAdapter () {
-		public void widgetSelected (SelectionEvent e) {
-			resetEditors ();
-		};
-	};
-		
-	TraverseListener traverseListener = new TraverseListener () {
-		public void keyTraversed (TraverseEvent e) {
-			if (e.detail == SWT.TRAVERSE_RETURN) {
-				e.doit = false;
-				resetEditors ();
-			}
-		};
-	};
-
-	/**
-	 * Creates the Tab within a given instance of LayoutExample.
-	 */
-	Tab(LayoutExample instance) {
-		this.instance = instance;
-	}
-	
-	/**
-	 * Creates the "child" group. This is the group that allows
-	 * you to add children to the layout. It exists within the
-	 * controlGroup.
-	 */
-	void createChildGroup () {
-		childGroup = new Group (controlGroup, SWT.NONE);
-		childGroup.setText (LayoutExample.getResourceString("Children"));
-		GridLayout layout = new GridLayout ();
-		layout.numColumns = 3;
-		childGroup.setLayout (layout);
-		GridData data = new GridData (GridData.FILL_BOTH);
-		data.horizontalSpan = 2;
-		childGroup.setLayoutData (data); 
-		createChildWidgets ();
-	}
-	
-	/**
-	 * Creates the controls for modifying the "children" 
-	 * table, and the table itself.
-	 * Subclasses override this method to augment the
-	 * standard table.
-	 */
-	void createChildWidgets () {
-		/* Controls for adding and removing children */
-		add = new Button (childGroup, SWT.PUSH);
-		add.setText (LayoutExample.getResourceString ("Add"));
-		add.setLayoutData(new GridData (GridData.FILL_HORIZONTAL));
-		delete = new Button (childGroup, SWT.PUSH);
-		delete.setText (LayoutExample.getResourceString ("Delete"));
-		delete.setLayoutData(new GridData (GridData.FILL_HORIZONTAL));
-		delete.addSelectionListener (new SelectionAdapter () {
-			public void widgetSelected (SelectionEvent e) {
-				resetEditors ();
-				int [] selected = table.getSelectionIndices ();
-				table.remove (selected);
-				/* Refresh the control indices of the table */
-				for (int i = 0; i < table.getItemCount(); i++) {
-					table.getItem (i).setText (0, String.valueOf (i));
-				}
-				refreshLayoutComposite ();
-				layoutComposite.layout (true);
-				layoutGroup.layout (true);
-			}
-		});
-		clear = new Button (childGroup, SWT.PUSH);
-		clear.setText (LayoutExample.getResourceString ("Clear"));
-		clear.setLayoutData(new GridData (GridData.FILL_HORIZONTAL));
-		clear.addSelectionListener (new SelectionAdapter () {
-			public void widgetSelected (SelectionEvent e) {
-				resetEditors ();
-				children = layoutComposite.getChildren ();
-				for (int i = 0; i < children.length; i++) {
-					children [i].dispose ();
-				}
-				table.removeAll ();
-				data.clear ();
-				children = new Control [0];
-				layoutGroup.layout (true);
-			}
-		});
-		/* Create the "children" table */
-		table = new Table (childGroup, SWT.MULTI | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.HIDE_SELECTION);
-		table.setLinesVisible (true);
-		table.setHeaderVisible (true);
-		GridData gridData = new GridData (GridData.FILL_BOTH);
-		gridData.horizontalSpan = 3;
-		gridData.heightHint = 150;
-		table.setLayoutData (gridData);
-		table.addTraverseListener (traverseListener);
-		
-		/* Add columns to the table */
-		String [] columnHeaders = getLayoutDataFieldNames ();
-		for (int i = 0; i < columnHeaders.length; i++) {
-			TableColumn column = new TableColumn(table, SWT.NONE);
-			column.setText (columnHeaders [i]);
-			if (i == 0) column.setWidth (20);
-			else if (i == 1) column.setWidth (80);
-			else column.pack ();
-		}
-	}
-
-	/**
-	 * Creates the TableEditor with a CCombo in the first column
-	 * of the table. This CCombo lists all the controls that
-	 * the user can select to place on their layout.
-	 */
-	void createComboEditor (CCombo combo, TableEditor comboEditor) {
-		combo.setItems (new String [] {
-			"Button", "Canvas", "Combo", "Composite",
-			"CoolBar", "Group", "Label", "List",
-			"ProgressBar", "Scale", "Slider", "StyledText",
-			"Table", "Text", "ToolBar", "Tree"});
-		combo.setText (newItem.getText (1));
-		
-		/* Set up editor */
-		comboEditor.horizontalAlignment = SWT.LEFT;
-		comboEditor.grabHorizontal = true;
-		comboEditor.minimumWidth = 50;
-		comboEditor.setEditor (combo, newItem, 1);
-		
-		/* Add listener */
-		combo.addTraverseListener(new TraverseListener() {
-        	public void keyTraversed(TraverseEvent e) {
-            	if (e.detail == SWT.TRAVERSE_TAB_NEXT || e.detail == SWT.TRAVERSE_RETURN) {
-                    resetEditors ();
-                }
-                if (e.detail == SWT.TRAVERSE_ESCAPE) {
-                	disposeEditors ();
-                }
-            }
-        });
-	}
-	
-	/**
-	 * Creates the "control" group. This is the group on the
-	 * right half of each example tab. It contains controls
-	 * for adding new children to the layoutComposite, and
-	 * for modifying the children's layout data.
-	 */	
-	void createControlGroup () {
-		controlGroup = new Group (sash, SWT.NONE);
-		controlGroup.setText (LayoutExample.getResourceString("Parameters"));
-		GridLayout layout = new GridLayout ();
-		layout.numColumns = 2;
-		controlGroup.setLayout (layout);
-		size = new Button (controlGroup, SWT.CHECK);
-		size.setText (LayoutExample.getResourceString ("Preferred_Size"));
-		size.setSelection (false);
-		size.addSelectionListener (new SelectionAdapter () {
-			public void widgetSelected (SelectionEvent e) {
-				resetEditors ();
-				if (size.getSelection ()) {
-					layoutComposite.setLayoutData (new GridData ());
-					layoutGroup.layout (true);
-				} else {
-					layoutComposite.setLayoutData (new GridData (GridData.FILL_BOTH));
-					layoutGroup.layout (true);
-				}
-			}
-		});
-		GridData data = new GridData (GridData.FILL_HORIZONTAL);
-		data.horizontalSpan = 2;
-		size.setLayoutData (data);
-		createControlWidgets ();
-	}
-		
-	/**
-	 * Creates the "control" widget children.
-	 * Subclasses override this method to augment
-	 * the standard controls created.
-	 */
-	void createControlWidgets () {
-		createChildGroup ();
-		code = new Button (controlGroup, SWT.PUSH);
-		code.setText (LayoutExample.getResourceString ("Code"));
-		GridData gridData = new GridData (GridData.HORIZONTAL_ALIGN_CENTER | GridData.GRAB_HORIZONTAL);
-		gridData.horizontalSpan = 2;
-		code.setLayoutData (gridData);
-		code.addSelectionListener (new SelectionAdapter () {
-			public void widgetSelected (SelectionEvent e) {
-				final Shell shell = new Shell ();	
-				shell.setText (LayoutExample.getResourceString ("Generated_Code"));
-				shell.setLayout (new FillLayout ());
-				final StyledText text = new StyledText (shell, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL);
-				String layoutCode = generateCode ().toString ();
-				if (layoutCode.length () == 0) return;
-				text.setText (layoutCode);
-				
-				Menu bar = new Menu (shell, SWT.BAR);
-				shell.setMenuBar (bar);
-				MenuItem editItem = new MenuItem (bar, SWT.CASCADE);
-				editItem.setText (LayoutExample.getResourceString ("Edit"));
-				Menu menu = new Menu (bar);
-				MenuItem select = new MenuItem (menu, SWT.PUSH);
-				select.setText (LayoutExample.getResourceString ("Select_All"));
-				select.setAccelerator (SWT.CTRL + 'A');
-				select.addSelectionListener (new SelectionAdapter () {
-					public void widgetSelected (SelectionEvent e) {
-						text.selectAll ();
-					}
-				});
-				MenuItem copy = new MenuItem (menu, SWT.PUSH);
-				copy.setText (LayoutExample.getResourceString ("Copy"));
-				copy.setAccelerator (SWT.CTRL + 'C');
-				copy.addSelectionListener (new SelectionAdapter () {
-					public void widgetSelected (SelectionEvent e) {
-						text.copy ();
-					}
-				});
-				MenuItem exit = new MenuItem (menu, SWT.PUSH);
-				exit.setText (LayoutExample.getResourceString ("Exit"));
-				exit.addSelectionListener (new SelectionAdapter () {
-					public void widgetSelected (SelectionEvent e) {
-						shell.close ();
-					}
-				});
-				editItem.setMenu (menu);
-				
-				shell.pack ();
-				shell.setSize (400, 500);
-				shell.open ();
-				Display display = shell.getDisplay ();
-				while (!shell.isDisposed ())
-					if (!display.readAndDispatch ()) display.sleep ();
-			}
-		});
-	}
-	
-	/**
-	 * Creates the example layout.
-	 * Subclasses override this method.
-	 */
-	void createLayout () {
-	}
-	
-	/**
-	 * Creates the composite that contains the example layout.
-	 */
-	void createLayoutComposite () {
-		layoutComposite = new Composite (layoutGroup, SWT.BORDER);
-		layoutComposite.setLayoutData (new GridData (GridData.FILL_BOTH));
-		createLayout ();
-	}
-	
-	/**
-	 * Creates the layout group. This is the group on the
-	 * left half of each example tab.
-	 */
-	void createLayoutGroup () {
-		layoutGroup = new Group (sash, SWT.NONE);
-		layoutGroup.setText (LayoutExample.getResourceString("Layout"));
-		layoutGroup.setLayout (new GridLayout ());
-		createLayoutComposite ();
-	}
-	
-	/**
-	 * Creates the tab folder page.
-	 *
-	 * @param tabFolder org.eclipse.swt.widgets.TabFolder
-	 * @return the new page for the tab folder
-	 */
-	Composite createTabFolderPage (TabFolder tabFolder) {
-		/* Create a two column page with a SashForm*/
-		tabFolderPage = new Composite (tabFolder, SWT.NULL);
-		tabFolderPage.setLayout (new FillLayout ());
-		sash = new SashForm (tabFolderPage, SWT.HORIZONTAL);
-	
-		/* Create the "layout" and "control" columns */
-		createLayoutGroup ();
-		createControlGroup ();
-		
-		return tabFolderPage;
-	}
-	
-	/**
-	 * Creates the TableEditor with a Text in the given column
-	 * of the table.
-	 */
-	void createTextEditor (Text text, TableEditor textEditor, int column) {
-		text.setFont (table.getFont ());
-		text.selectAll ();
-		textEditor.horizontalAlignment = SWT.LEFT;
-		textEditor.grabHorizontal = true;
-		textEditor.setEditor (text, newItem, column);
-		
-		text.addTraverseListener(new TraverseListener() {
-        	public void keyTraversed(TraverseEvent e) {
-            	if (e.detail == SWT.TRAVERSE_TAB_NEXT) {
-                    resetEditors (true);
-                }
-                if (e.detail == SWT.TRAVERSE_ESCAPE) {
-                	disposeEditors ();
-                }
-            }
-        });
-	}
-	
-	/** 
-	 * Disposes the editors without placing their contents
-	 * into the table.
-	 * Subclasses override this method.
-	 */
-	void disposeEditors () {
-	}
-	
-	/**
-	 * Generates the code needed to produce the example layout.
-	 */	
-	StringBuffer generateCode () {
-		/* Make sure all information being entered is stored in the table */
-		resetEditors ();
-		
-		/* Get names for controls in the layout */
-		names = new String [children.length];
-		for (int i = 0; i < children.length; i++) {
-			Control control = children [i];
-			String controlClass = control.getClass ().toString ();
-			String controlType = controlClass.substring (controlClass.lastIndexOf ('.') + 1);
-			names [i] = controlType.toLowerCase () + i;
-		}
-	
-		/* Create StringBuffer containing the code */
-		StringBuffer code = new StringBuffer ();
-		code.append ("import org.eclipse.swt.*;\n");
-		code.append ("import org.eclipse.swt.custom.*;\n");
-		code.append ("import org.eclipse.swt.graphics.*;\n");
-		code.append ("import org.eclipse.swt.layout.*;\n");
-		code.append ("import org.eclipse.swt.widgets.*;\n\n");
-		code.append ("public class MyLayout {\n");
-		code.append ("\tpublic static void main (String [] args) {\n");
-		code.append ("\t\tDisplay display = new Display ();\n");
-		code.append ("\t\tShell shell = new Shell (display);\n");
-		
-		/* Get layout specific code */
-		code.append (generateLayoutCode ());
-		
-		code.append ("\n\t\tshell.pack ();\n\t\tshell.open ();\n\n");
-		code.append ("\t\twhile (!shell.isDisposed ()) {\n");
-		code.append ("\t\t\tif (!display.readAndDispatch ())\n");
-		code.append ("\t\t\t\tdisplay.sleep ();\n\t\t}\n\t\tdisplay.dispose ();\n\t}\n}");
-		
-		return code;
-	}
-	
-	/**
-	 * Generates layout specific code for the example layout.
-	 * Subclasses override this method.
-	 */
-	StringBuffer generateLayoutCode () {
-		return new StringBuffer ();
-	}
-	
-	/**
-	 * Returns the StringBuffer for the code which will 
-	 * create a child control.
-	 */
-	StringBuffer getChildCode (Control control, int i) {
-		StringBuffer code = new StringBuffer ();
-		/* Find the type of control */
-		String controlClass = control.getClass().toString ();
-		String controlType = controlClass.substring (controlClass.lastIndexOf ('.') + 1);
-		/* Find the style of the control */
-		String styleString;
-		if (controlType.equals ("Button")) {
-			styleString = "SWT.PUSH";
-		} else if (controlType.equals ("Text")) {
-			styleString = "SWT.BORDER";
-		} else if (controlType.equals ("StyledText")) {
-			styleString = "SWT.MULTI | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL";
-		} else if (controlType.equals ("Canvas") || controlType.equals ("Composite") || 
-					controlType.equals ("Table") || controlType.equals ("StyledText") ||
-					controlType.equals ("ToolBar") || controlType.equals ("Tree") ||
-					controlType.equals ("List")) {
-			styleString = "SWT.BORDER";
-		} else styleString = "SWT.NONE";
-		/* Write out the control being declared */
-		code.append ("\n\t\t" + controlType + " " + names [i] + 
-					 " = new " + controlType + " (shell, " + styleString + ");\n");
-		/* Add items to those controls that need items */
-		if (controlType.equals ("Combo") || controlType.equals ("List")) {
-			code.append ("\t\t" + names [i] + ".setItems (new String [] {\"Item 1\", \"Item 2\", \"Item 2\"});\n");
-		} else if (controlType.equals ("Table")) {
-			code.append ("\t\t" + names [i] + ".setLinesVisible (true);\n");
-			for (int j = 1; j < 3; j++) {
-				code.append ("\t\tTableItem tableItem" + j + " = new TableItem (" + names [i] + ", SWT.NONE);\n");
-				code.append ("\t\ttableItem" + j + ".setText (\"Item" + j + "\");\n");
-			}
-		} else if (controlType.equals ("Tree")) {
-			for (int j = 1; j < 3; j++) {
-				code.append ("\t\tTreeItem treeItem" + j + " = new TreeItem (" + names [i] + ", SWT.NONE);\n");
-				code.append ("\t\ttreeItem" + j + ".setText (\"Item" + j + "\");\n");
-			}
-		} else if (controlType.equals ("ToolBar")) {
-			for (int j = 1; j < 3; j++) {
-				code.append ("\t\tToolItem toolItem" + j + " = new ToolItem (" + names [i] + ", SWT.NONE);\n");
-				code.append ("\t\ttoolItem" + j + ".setText (\"Item" + j + "\");\n");
-			}
-		} else if (controlType.equals ("CoolBar")) {
-			code.append ("\t\tToolBar coolToolBar = new ToolBar (" + names [i] + ", SWT.BORDER);\n");
-			code.append ("\t\tToolItem coolToolItem = new ToolItem (coolToolBar, SWT.NONE);\n");
-			code.append ("\t\tcoolToolItem.setText (\"Item 1\");\n");
-			code.append ("\t\tcoolToolItem = new ToolItem (coolToolBar, SWT.NONE);\n");
-			code.append ("\t\tcoolToolItem.setText (\"Item 2\");\n");
-			code.append ("\t\tCoolItem coolItem1 = new CoolItem (" + names [i] + ", SWT.NONE);\n");
-			code.append ("\t\tcoolItem1.setControl (coolToolBar);\n");
-			code.append ("\t\tcoolToolBar = new ToolBar (" + names [i] + ", SWT.BORDER);\n");
-			code.append ("\t\tcoolToolItem = new ToolItem (coolToolBar, SWT.NONE);\n");
-			code.append ("\t\tcoolToolItem.setText (\"Item 3\");\n");
-			code.append ("\t\tcoolToolItem = new ToolItem (coolToolBar, SWT.NONE);\n");
-			code.append ("\t\tcoolToolItem.setText (\"Item 4\");\n");
-			code.append ("\t\tCoolItem coolItem2 = new CoolItem (" + names [i] + ", SWT.NONE);\n");
-			code.append ("\t\tcoolItem2.setControl (coolToolBar);\n");
-			code.append ("\t\tPoint size = coolToolBar.computeSize (SWT.DEFAULT, SWT.DEFAULT);\n");
-			code.append ("\t\tcoolItem1.setSize (coolItem1.computeSize (size.x, size.y));\n");
-			code.append ("\t\tcoolItem2.setSize (coolItem2.computeSize (size.x, size.y));\n");
-			code.append ("\t\t" + names [i] + ".setSize (" + names [i] + ".computeSize (SWT.DEFAULT, SWT.DEFAULT));\n");
-		} else if (controlType.equals ("ProgressBar")) {
-			code.append ("\t\t" + names [i] + ".setSelection (50);\n");
-		} 
-		/* Set text for those controls that support it */			 
-		if (controlType.equals ("Button") ||
-			controlType.equals ("Combo") ||
-			controlType.equals ("Group") ||
-			controlType.equals ("Label") ||
-			controlType.equals ("StyledText") ||
-			controlType.equals ("Text")) {
-			code.append ("\t\t" + names [i] + ".setText (\"" + names [i] + "\");\n");
-		}
-		return code;
-	}
-		
-	/**
-	 * Returns the layout data field names.
-	 * Subclasses override this method.
-	 */
-	String [] getLayoutDataFieldNames () {
-		return new String [] {};
-	}
-	
-	/**
-	 * Gets the text for the tab folder item.
-	 * Subclasses override this method.
-	 */
-	String getTabText () {
-		return "";
-	}
-	
-	/**
-	 * Refreshes the composite and draws all controls
-	 * in the layout example.
-	 */
-	void refreshLayoutComposite () {
-		/* Remove children that are already layed out */
-		children = layoutComposite.getChildren ();
-		for (int i = 0; i < children.length; i++) {
-			children [i].dispose ();
-		}
-		/* Add all children listed in the table */
-		TableItem [] items = table.getItems ();
-		children = new Control [items.length];
-		String [] itemValues = new String [] {
-			LayoutExample.getResourceString ("Item",new String [] {"1"}),
-			LayoutExample.getResourceString ("Item",new String [] {"2"}),
-			LayoutExample.getResourceString ("Item",new String [] {"3"})};
-		for (int i = 0; i < items.length; i++) {
-			String control = items [i].getText (1);
-			if (control.equals ("Button")) {
-				Button button = new Button (layoutComposite, SWT.PUSH);
-				button.setText (LayoutExample.getResourceString ("Button_Index", new String [] {new Integer (i).toString ()}));
-				children [i] = button;
-			} else if (control.equals ("Canvas")) {
-				Canvas canvas = new Canvas (layoutComposite, SWT.BORDER);
-				children [i] = canvas;
-			} else if (control.equals ("Combo")) {
-				Combo combo = new Combo (layoutComposite, SWT.NONE);
-				combo.setItems (itemValues);
-				combo.setText (LayoutExample.getResourceString ("Combo_Index", new String [] {new Integer (i).toString ()}));
-				children [i] = combo;
-			} else if (control.equals ("Composite")) { 
-				Composite composite = new Composite (layoutComposite, SWT.BORDER);
-				children [i] = composite;
-		    } else if (control.equals ("CoolBar")) { 
-		    	CoolBar coolBar = new CoolBar (layoutComposite, SWT.NONE);
-		    	ToolBar toolBar = new ToolBar (coolBar, SWT.BORDER);
-				ToolItem item = new ToolItem (toolBar, 0);
-				item.setText (LayoutExample.getResourceString ("Item",new String [] {"1"}));
-				item = new ToolItem (toolBar, 0);
-				item.setText (LayoutExample.getResourceString ("Item",new String [] {"2"}));
-		    	CoolItem coolItem1 = new CoolItem (coolBar, 0);
-		    	coolItem1.setControl (toolBar);
-				toolBar = new ToolBar (coolBar, SWT.BORDER);
-				item = new ToolItem (toolBar, 0);
-				item.setText (LayoutExample.getResourceString ("Item",new String [] {"3"}));
-				item = new ToolItem (toolBar, 0);
-				item.setText (LayoutExample.getResourceString ("Item",new String [] {"4"}));
-		    	CoolItem coolItem2 = new CoolItem (coolBar, 0);
-		    	coolItem2.setControl (toolBar);
-		    	Point size = toolBar.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-        		coolItem1.setSize(coolItem1.computeSize (size.x, size.y));
-        		coolItem2.setSize(coolItem2.computeSize (size.x, size.y));
-       			coolBar.setSize(coolBar.computeSize(SWT.DEFAULT, SWT.DEFAULT));
-				children [i] = coolBar;
-		    } else if (control.equals ("Group")) {
-				Group group = new Group (layoutComposite, SWT.NONE);
-				group.setText (LayoutExample.getResourceString ("Group_Index", new String [] {new Integer (i).toString ()}));
-				children [i] = group;
-			} else if (control.equals ("Label")) {
-				Label label = new Label (layoutComposite, SWT.NONE);
-				label.setText (LayoutExample.getResourceString ("Label_Index", new String [] {new Integer (i).toString ()}));
-				children [i] = label;
-			} else if (control.equals ("List")) {
-				List list = new List (layoutComposite, SWT.BORDER);
-				list.setItems (itemValues);
-				children [i] = list;
-			} else if (control.equals ("ProgressBar")) {
-				ProgressBar progress = new ProgressBar (layoutComposite, SWT.NONE);
-				progress.setSelection (50);
-				children [i] = progress;
-			} else if (control.equals ("Scale")) {
-				Scale scale = new Scale (layoutComposite, SWT.NONE);
-				children [i] = scale;
-			} else if (control.equals ("Slider")) {
-				Slider slider = new Slider (layoutComposite, SWT.NONE);
-				children [i] = slider;
-			} else if (control.equals ("StyledText")) {
-				StyledText styledText = new StyledText (layoutComposite, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
-				styledText.setText (LayoutExample.getResourceString ("StyledText_Index", new String [] {new Integer (i).toString ()}));
-				children [i] = styledText;			
-			} else if (control.equals ("Table")) {
-				Table table = new Table (layoutComposite, SWT.BORDER);
-				table.setLinesVisible (true);
-				TableItem item1 = new TableItem (table, 0);
-				item1.setText (LayoutExample.getResourceString ("Item",new String [] {"1"}));
-				TableItem item2 = new TableItem (table, 0);
-				item2.setText (LayoutExample.getResourceString ("Item",new String [] {"2"}));
-				children [i] = table;
-			} else if (control.equals ("Text")) {
-				Text text = new Text (layoutComposite, SWT.BORDER);
-				text.setText (LayoutExample.getResourceString ("Text_Index", new String [] {new Integer (i).toString ()}));
-				children [i] = text;
-			} else if (control.equals ("ToolBar")) {
-				ToolBar toolBar = new ToolBar (layoutComposite, SWT.BORDER);
-				ToolItem item1 = new ToolItem (toolBar, 0);
-				item1.setText (LayoutExample.getResourceString ("Item",new String [] {"1"}));
-				ToolItem item2 = new ToolItem (toolBar, 0);
-				item2.setText (LayoutExample.getResourceString ("Item",new String [] {"2"}));
-				children [i] = toolBar;
-			} else {
-				Tree tree = new Tree (layoutComposite, SWT.BORDER);
-				TreeItem item1 = new TreeItem (tree, 0);
-				item1.setText (LayoutExample.getResourceString ("Item",new String [] {"1"}));
-				TreeItem item2 = new TreeItem (tree, 0);
-				item2.setText (LayoutExample.getResourceString ("Item",new String [] {"2"}));
-				children [i] = tree;
-			} 
-		}
-	}	
-	
-	/**
-	 * Takes information from TableEditors and stores it.
-	 * Subclasses override this method.
-	 */
-	void resetEditors () {
-		resetEditors (false);
-	}
-	
-	void resetEditors (boolean tab) {
-	}
-	
-	/**
-	 * Sets the layout data for the children of the layout. 
-	 * Subclasses override this method.
-	 */
-	void setLayoutData () {
-	}
-	
-	/**
-	 * Sets the state of the layout.
-	 * Subclasses override this method.
-	 */
-	void setLayoutState () {
-	}
-}
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/texteditor/Images.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/texteditor/Images.java
deleted file mode 100755
index f24a177..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/texteditor/Images.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.eclipse.swt.examples.texteditor;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import java.io.*;
-import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.*;
-
-public class Images {
-
-	// Bitmap Images
-	public Image Bold;
-	public Image Red;
-	public Image Green;
-	public Image Blue;
-	public Image Erase;
-	
-	Image  [] AllBitmaps;
-
-Images () {
-}
-
-public void freeAll () {
-	for (int i=0; i<AllBitmaps.length; i++) AllBitmaps [i].dispose ();
-	AllBitmaps = null;
-}
-
-Image createBitmapImage(Display display, String fileName) {
-	ImageData source = new ImageData(Images.class.getResourceAsStream(fileName+".bmp"));
-	ImageData mask = new ImageData(Images.class.getResourceAsStream(fileName+"_mask"+".bmp"));
-	return new Image (display, source, mask);
-}
-
-public void loadAll (Display display) {
-	// Bitmap Images
-	Bold = createBitmapImage (display, "bold");
-	Red = createBitmapImage (display, "red");
-	Green = createBitmapImage (display, "green");
-	Blue = createBitmapImage (display, "blue");
-	Erase = createBitmapImage (display, "erase");
-	
-	AllBitmaps = new Image [] {
-		Bold,
-		Red,
-		Green,
-		Blue,
-		Erase,
-	};
-}
-}
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/texteditor/TextEditor.java b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/texteditor/TextEditor.java
deleted file mode 100755
index f8895d8..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/texteditor/TextEditor.java
+++ /dev/null
@@ -1,360 +0,0 @@
-package org.eclipse.swt.examples.texteditor;
-
-/*
- * Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.custom.*;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.widgets.*;
-import java.util.*;
-import java.io.*;
-
-/**
- */
-public class TextEditor {  
-	Shell shell;
-	ToolBar toolBar;
-	StyledText text;
-
-	Images images = new Images();
-	Vector cachedStyles = new Vector();
-	Color RED = null; 
-	Color BLUE = null; 
-	Color GREEN = null; 
-	Font font = null;
-	
-	boolean isBold = false;
-	
-	ExtendedModifyListener extendedModifyListener;
-	VerifyKeyListener verifyKeyListener;
-	static ResourceBundle resources = ResourceBundle.getBundle("examples_texteditor");
-
-Menu createEditMenu() {
-	Menu bar = shell.getMenuBar ();
-	Menu menu = new Menu (bar);
-	
-	MenuItem item = new MenuItem (menu, SWT.PUSH);
-	item.setText (resources.getString("Cut_menuitem"));
-	item.addSelectionListener(new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent event) {
-			text.cut();
-		}
-	});
-
-	item = new MenuItem (menu, SWT.PUSH);
-	item.setText (resources.getString("Copy_menuitem"));
-	item.addSelectionListener(new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent event) {
-			text.copy();
-		}
-	});
-
-	item = new MenuItem (menu, SWT.PUSH);
-	item.setText (resources.getString("Paste_menuitem"));
-	item.addSelectionListener(new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent event) {
-			text.paste();
-		}
-	});
-
-	new MenuItem (menu, SWT.SEPARATOR);
-	
-	item = new MenuItem (menu, SWT.PUSH);
-	item.setText (resources.getString("Font_menuitem"));
-	item.addSelectionListener(new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent event) {
-			setFont();
-		}
-	});
-	return menu;
-}
-
-
-/*
- * Set the text state to bold.
- */
-void bold(boolean bold) {
-	isBold = bold;
-	Point sel = text.getSelectionRange();
-	if ((sel != null) && (sel.y != 0)) {
-		StyleRange style;
-		int fontStyle = SWT.NORMAL;
-		if (isBold) fontStyle = SWT.BOLD;
-		style = new StyleRange(sel.x, sel.y, null, null, fontStyle);
-		text.setStyleRange(style);
-	}
-	text.setSelectionRange(sel.x + sel.y, 0);
-}
-/*
- * Clear all style data for the selected text.
- */
-void clear() {
-	Point sel = text.getSelectionRange();
-	if ((sel != null) && (sel.y != 0)) {
-		StyleRange style;
-		style = new StyleRange(sel.x, sel.y, null, null, SWT.NORMAL);
-		text.setStyleRange(style);
-	}
-	text.setSelectionRange(sel.x + sel.y, 0);
-}
-/*
- * Set the foreground color for the selected text.
- */
-void fgColor(int color) {
-	Point sel = text.getSelectionRange();
-	if ((sel == null) || (sel.y == 0)) return;
-	Color fg;
-	if (color == SWT.COLOR_RED) {
-		fg = RED;
-	} else if (color == SWT.COLOR_GREEN) {
-		fg = GREEN;
-	} else if (color == SWT.COLOR_BLUE) {
-		fg = BLUE;
-	} else {
-		fg = null;
-	}
-	StyleRange style;
-	for (int i = sel.x; i<sel.x+sel.y; i++) {
-		StyleRange range = text.getStyleRangeAtOffset(i);
-		if (range == null) {style = new StyleRange(i, 1, fg, null, SWT.NORMAL);}
-		else {style = new StyleRange(i, 1, fg, null, range.fontStyle);};
-		text.setStyleRange(style);
-	}
-	text.setSelectionRange(sel.x + sel.y, 0);
-}
-void createMenuBar () {
-	Menu bar = new Menu (shell, SWT.BAR);
-	shell.setMenuBar (bar);
-
-	MenuItem editItem = new MenuItem (bar, SWT.CASCADE);
-	editItem.setText (resources.getString("Edit_menuitem"));
-	editItem.setMenu (createEditMenu ());
-}
-
-void createShell (Display display) {
-	shell = new Shell (display);
-	shell.setText (resources.getString("Window_title"));	
-	images.loadAll (display);
-	GridLayout layout = new GridLayout();
-	layout.numColumns = 1;
-	shell.setSize(500, 300);
-	shell.setLayout(layout);
-	shell.addDisposeListener (new DisposeListener () {
-		public void widgetDisposed (DisposeEvent e) {
-			if (font != null) font.dispose();
-			images.freeAll ();
-			RED.dispose();
-			GREEN.dispose();
-			BLUE.dispose();
-		}
-	});
-}
-void createStyledText() {
-	initializeColors();
-	text = new StyledText (shell, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL);
-	GridData spec = new GridData();
-	spec.horizontalAlignment = spec.FILL;
-	spec.grabExcessHorizontalSpace = true;
-	spec.verticalAlignment = spec.FILL;
-	spec.grabExcessVerticalSpace = true;
-	text.setLayoutData(spec);
-	extendedModifyListener = new ExtendedModifyListener() {
-		public void modifyText(ExtendedModifyEvent e) {
-			handleExtendedModify(e);
-		}
-	};
-	text.addExtendedModifyListener(extendedModifyListener);
-	verifyKeyListener = new VerifyKeyListener() {
-		public void verifyKey(VerifyEvent e) {
-			handleVerifyKey(e);
-		}
-	};
-	text.addVerifyKeyListener(verifyKeyListener);
-}
-
-void createToolBar() {
-	toolBar = new ToolBar(shell, SWT.NULL);
-	
-	ToolItem item = new ToolItem(toolBar, SWT.CHECK);
-	item.setImage(images.Bold);
-	item.addSelectionListener(new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent event) {
-			bold(((ToolItem)event.widget).getSelection());
-		}
-	});
-	
-	item = new ToolItem(toolBar, SWT.SEPARATOR);
-
-	item = new ToolItem(toolBar, SWT.PUSH);
-	item.setImage(images.Red);
-	item.addSelectionListener(new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent event) {
-			fgColor(SWT.COLOR_RED);
-		}
-	});
-	item = new ToolItem(toolBar, SWT.PUSH);
-	item.setImage(images.Green);
-	item.addSelectionListener(new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent event) {
-			fgColor(SWT.COLOR_GREEN);
-		}
-	});
-	item = new ToolItem(toolBar, SWT.PUSH);
-	item.setImage(images.Blue);
-	item.addSelectionListener(new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent event) {
-			fgColor(SWT.COLOR_BLUE);
-		}
-	});
-	
-	item = new ToolItem(toolBar, SWT.SEPARATOR);
-
-	item = new ToolItem(toolBar, SWT.PUSH);
-	item.setImage(images.Erase);
-	item.addSelectionListener(new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent event) {
-			clear();
-		}
-	});
-}
-void displayError(String msg) {
-	MessageBox box = new MessageBox(shell, SWT.ICON_ERROR);
-	box.setMessage(msg);
-	box.open();
-}
-/*
- * Cache the style information for text that has been cut or copied.
- */
-void handleCutCopy() {
-	// Save the cut/copied style info so that during paste we will maintain
-	// the style information.  Cut/copied text is put in the clipboard in
-	// RTF format, but is not pasted in RTF format.  The other way to 
-	// handle the pasting of styles would be to access the Clipboard directly and 
-	// parse the RTF text.
-	cachedStyles = new Vector();
-	Point sel = text.getSelectionRange();
-	int startX = sel.x;
-	for (int i=sel.x; i<=sel.x+sel.y-1; i++) {
-		StyleRange style = text.getStyleRangeAtOffset(i);
-		if (style != null) {
-			style.start = style.start - startX;
-			if (!cachedStyles.isEmpty()) {
-				StyleRange lastStyle = (StyleRange)cachedStyles.lastElement();
-				if (lastStyle.similarTo(style) && lastStyle.start + lastStyle.length == style.start) {
-					lastStyle.length++;
-				} else {
-					cachedStyles.addElement(style);
-				}
-			} else {
-				cachedStyles.addElement(style);
-			}
-		}
-	}
-}
-void handleExtendedModify(ExtendedModifyEvent event) {
-	if (event.length == 0) return;
-	StyleRange style;
-	if (event.length == 1 || text.getTextRange(event.start, event.length).equals(text.getLineDelimiter())) {
-		// Have the new text take on the style of the text to its right (during
-		// typing) if no style information is active.
-		int caretOffset = text.getCaretOffset();
-		style = null;
-		if (caretOffset < text.getCharCount()) style = text.getStyleRangeAtOffset(caretOffset);
-		if (style != null) {
-			style.start = event.start;
-			style.length = event.length;
-			int fontStyle = SWT.NORMAL;
-			if (isBold) fontStyle = SWT.BOLD;
-			style.fontStyle = fontStyle;
-			text.setStyleRange(style);
-		} else if (isBold) {
-			StyleRange newStyle = new StyleRange(event.start, event.length, null, null, SWT.BOLD);
-			text.setStyleRange(newStyle);
-		}
-	} else {
-		// paste occurring
-		for (int i=0; i<cachedStyles.size(); i++) {
-			style = (StyleRange)cachedStyles.elementAt(i);
-			StyleRange newStyle = (StyleRange)style.clone();
-			newStyle.start = style.start + event.start;
-			text.setStyleRange(newStyle);
-		}
-	}
-} 
-/*
- * Intercept the cut and copy keys so that during paste we can maintain
- * style information.
- */
-void handleVerifyKey(VerifyEvent event) {
-	int input;
-	if (event.keyCode != 0) input = event.keyCode | event.stateMask;
-	else input = event.character | event.stateMask;
-	if (isCut(input) || isCopy(input)) {
-		handleCutCopy();
-	} 
-}
-
-public static void main (String [] args) {
-	Display display = new Display ();
-	TextEditor example = new TextEditor ();
-	Shell shell = example.open (display);
-	while (!shell.isDisposed ())
-		if (!display.readAndDispatch ()) display.sleep ();
-	display.dispose ();
-}
-
-public Shell open (Display display) {
-	createShell (display);
-	createMenuBar ();
-	createToolBar ();
-	createStyledText ();
-	shell.open ();
-	return shell;
-}
-
-void setFont() {
-	FontDialog fontDialog = new FontDialog(shell);
-	fontDialog.setFontData((text.getFont()).getFontData()[0]);
-	FontData fontData = fontDialog.open();
-	if(fontData != null) {
-		if(font != null)
-			font.dispose();
-		font = new Font(shell.getDisplay(), fontData);
-		text.setFont(font);
-	}
-}
-
-void initializeColors() {
-	Display display = Display.getDefault();
-	RED = new Color (display, new RGB(255,0,0));
-	BLUE = new Color (display, new RGB(0,0,255));
-	GREEN = new Color (display, new RGB(0,255,0));
-}
-boolean isCopy(int input) {
-
-	if (input == (SWT.INSERT | SWT.CTRL)) return true;
-
-	if (input == ('\u0003' | SWT.CTRL)) return true;
-
-	return false;
-
-}
-boolean isCut(int input) {
-
-	if (input == (SWT.DEL | SWT.SHIFT)) return true;
-
-	if (input == ('\u0018' | SWT.CTRL)) return true;
-
-	return false;
-
-}
-
-
-}
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/texteditor/blue.bmp b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/texteditor/blue.bmp
deleted file mode 100755
index 84c7ac9..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/texteditor/blue.bmp
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/texteditor/blue_mask.bmp b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/texteditor/blue_mask.bmp
deleted file mode 100755
index 6ce9264..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/texteditor/blue_mask.bmp
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/texteditor/bold.bmp b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/texteditor/bold.bmp
deleted file mode 100755
index a3184bb..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/texteditor/bold.bmp
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/texteditor/bold_mask.bmp b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/texteditor/bold_mask.bmp
deleted file mode 100755
index 382751e..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/texteditor/bold_mask.bmp
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/texteditor/erase.bmp b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/texteditor/erase.bmp
deleted file mode 100755
index 1d2ace7..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/texteditor/erase.bmp
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/texteditor/erase_mask.bmp b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/texteditor/erase_mask.bmp
deleted file mode 100755
index f6ab21e..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/texteditor/erase_mask.bmp
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/texteditor/green.bmp b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/texteditor/green.bmp
deleted file mode 100755
index cca023f..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/texteditor/green.bmp
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/texteditor/green_mask.bmp b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/texteditor/green_mask.bmp
deleted file mode 100755
index 6ce9264..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/texteditor/green_mask.bmp
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/texteditor/red.bmp b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/texteditor/red.bmp
deleted file mode 100755
index 88c63be..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/texteditor/red.bmp
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/texteditor/red_mask.bmp b/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/texteditor/red_mask.bmp
deleted file mode 100755
index 6ce9264..0000000
--- a/examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/texteditor/red_mask.bmp
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.swt.tests/.classpath b/tests/org.eclipse.swt.tests/.classpath
deleted file mode 100644
index d9fef03..0000000
--- a/tests/org.eclipse.swt.tests/.classpath
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-    <classpathentry kind="var" path="JRE_LIB" rootpath="JRE_SRCROOT" sourcepath="JRE_SRC"/>
-    <classpathentry kind="var"
-        path="ECLIPSE_HOME/plugins/org.junit_3.7.0/junit.jar" sourcepath="ECLIPSE_HOME/plugins/org.junit_3.7.0/src.jar"/>
-    <classpathentry kind="src" path="/org.eclipse.swt"/>
-    <classpathentry kind="src" path="JUnit Tests"/>
-    <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/tests/org.eclipse.swt.tests/.cvsignore b/tests/org.eclipse.swt.tests/.cvsignore
deleted file mode 100644
index c5e82d7..0000000
--- a/tests/org.eclipse.swt.tests/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
\ No newline at end of file
diff --git a/tests/org.eclipse.swt.tests/.project b/tests/org.eclipse.swt.tests/.project
deleted file mode 100644
index 1b33bcf..0000000
--- a/tests/org.eclipse.swt.tests/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.swt.tests</name>
-	<comment></comment>
-	<projects>
-		<project>org.eclipse.swt</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/AllGraphicsTests.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/AllGraphicsTests.java
deleted file mode 100644
index 5d8e47d..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/AllGraphicsTests.java
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/AllTests.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/AllTests.java
deleted file mode 100644
index e143bb9..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/AllTests.java
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/AllWidgetTests.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/AllWidgetTests.java
deleted file mode 100644
index 63b8b45..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/AllWidgetTests.java
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/EmulatedWidgetsTests.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/EmulatedWidgetsTests.java
deleted file mode 100644
index d3ff1ec..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/EmulatedWidgetsTests.java
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/StyledTextContentSpec.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/StyledTextContentSpec.java
deleted file mode 100644
index ec3f77b..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/StyledTextContentSpec.java
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/SwtJunit.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/SwtJunit.java
deleted file mode 100644
index e9bd49d..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/SwtJunit.java
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/SwtTestCase.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/SwtTestCase.java
deleted file mode 100644
index d46197d..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/SwtTestCase.java
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_SWT.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_SWT.java
deleted file mode 100644
index 55da8f7..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_SWT.java
+++ /dev/null
@@ -1,156 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.SWT
- *
- * @see org.eclipse.swt.SWT
- */
-public class Test_org_eclipse_swt_SWT extends SwtTestCase {
-
-public Test_org_eclipse_swt_SWT(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_Constructor() {
-	// Do nothing. Class SWT is not intended to be subclassed.
-}
-
-public void test_getMessageLjava_lang_String() {
-	boolean passed = false;
-	try {
-		passed = false;
-		SWT.getMessage(null);
-	} catch (IllegalArgumentException ex) {
-		passed = true;
-	}
-	assertTrue ("did not correctly throw exception with null argument", passed);
-	try {
-		SWT.getMessage("SWT_Yes");
-	} catch (Throwable t) {
-		fail ("exception " + t + " generated for SWT_Yes");
-	}
-	assertTrue (
-		"invalid key did not return as itself",
-		"_NOT_FOUND_IN_PROPERTIES_".equals(SWT.getMessage("_NOT_FOUND_IN_PROPERTIES_")));
-		
-}
-
-public void test_getPlatform() {
-	// Can't test the list of platforms, since this may change,
-	// so just test to see it returns something.
-	assertTrue ("returned null platform name", SWT.getPlatform() != null);
-}
-
-public void test_getVersion() {
-	// Test that the version number which is returned is reasonable.
-	int ver = SWT.getVersion();
-	assertTrue ("unreasonable value returned", ver > 0 && ver < 1000000);
-}
-
-public void test_errorI() {
-	// Test that we throw the expected kinds of errors for the given error types.
-	boolean passed = false;
-	try {
-		SWT.error(SWT.ERROR_NULL_ARGUMENT);
-	} catch (IllegalArgumentException ex) {
-		passed = true;
-	} catch (Throwable t) { }
-	assertTrue ("did not correctly throw exception for ERROR_NULL_ARGUMENT", passed);
-	passed = false;
-	try {
-		SWT.error(SWT.ERROR_FAILED_EXEC);
-	} catch (SWTException ex) {
-		passed = true;
-	} catch (Throwable t) { }
-	assertTrue ("did not correctly throw exception for ERROR_FAILED_EXEC", passed);
-	passed = false;
-	try {
-		SWT.error(SWT.ERROR_NO_HANDLES);
-	} catch (SWTError ex) {
-		passed = true;
-	} catch (Throwable t) { }
-	assertTrue ("did not correctly throw exception for ERROR_NO_HANDLES", passed);
-	passed = false;
-	try {
-		SWT.error(-1);
-	} catch (SWTError ex) {
-		passed = true;
-	} catch (Throwable t) { }
-	assertTrue ("did not correctly throw exception for error(-1)", passed);
-}
-
-public void test_errorILjava_lang_Throwable() {
-	// Test that the causing throwable is filled in.
-	Throwable cause = new RuntimeException("Just for testing");
-	boolean passed = false;
-	try {
-		SWT.error(SWT.ERROR_UNSUPPORTED_FORMAT, cause);
-	} catch (SWTException ex) {
-		passed = ex.throwable == cause;
-	} catch (Throwable t) { }
-	assertTrue ("did not correctly throw exception for ERROR_UNSUPPORTED_FORMAT", passed);
-	passed = false;
-	try {
-		SWT.error(SWT.ERROR_NOT_IMPLEMENTED, cause);
-	} catch (SWTError ex) {
-		passed = ex.throwable == cause;
-	} catch (Throwable t) { }
-	assertTrue ("did not correctly throw exception for ERROR_NOT_IMPLEMENTED", passed);
-	passed = false;
-	try {
-		SWT.error(-1, cause);
-	} catch (SWTError ex) {
-		passed = ex.throwable == cause;
-	} catch (Throwable t) { }
-	assertTrue ("did not correctly throw exception for error(-1)", passed);
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_SWT((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_Constructor");
-	methodNames.addElement("test_getMessageLjava_lang_String");
-	methodNames.addElement("test_getPlatform");
-	methodNames.addElement("test_getVersion");
-	methodNames.addElement("test_errorI");
-	methodNames.addElement("test_errorILjava_lang_Throwable");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_Constructor")) test_Constructor();
-	else if (getName().equals("test_getMessageLjava_lang_String")) test_getMessageLjava_lang_String();
-	else if (getName().equals("test_getPlatform")) test_getPlatform();
-	else if (getName().equals("test_getVersion")) test_getVersion();
-	else if (getName().equals("test_errorI")) test_errorI();
-	else if (getName().equals("test_errorILjava_lang_Throwable")) test_errorILjava_lang_Throwable();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_SWTError.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_SWTError.java
deleted file mode 100644
index eab01a1..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_SWTError.java
+++ /dev/null
@@ -1,104 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.SWTError
- *
- * @see org.eclipse.swt.SWTError
- */
-public class Test_org_eclipse_swt_SWTError extends SwtTestCase {
-
-public Test_org_eclipse_swt_SWTError(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_Constructor() {
-	assertTrue (
-		"did not fill in code properly",
-		new SWTError().code == SWT.ERROR_UNSPECIFIED);
-}
-
-public void test_ConstructorLjava_lang_String() {
-	assertTrue (
-		"did not fill in code properly",
-		new SWTError("An uninteresting message").code == SWT.ERROR_UNSPECIFIED);
-}
-
-public void test_ConstructorI() {
-	assertTrue (
-		"did not fill in code properly",
-		new SWTError(SWT.ERROR_CANNOT_BE_ZERO).code == SWT.ERROR_CANNOT_BE_ZERO);
-}
-
-public void test_ConstructorILjava_lang_String() {
-	assertTrue (
-		"did not fill in code properly",
-		new SWTError(SWT.ERROR_CANNOT_BE_ZERO, "An uninteresting message").code 
-			== SWT.ERROR_CANNOT_BE_ZERO);
-}
-
-public void test_getMessage() {
-	assertTrue (
-		"did not include creation string in result",
-		new SWTError(SWT.ERROR_CANNOT_BE_ZERO, "An interesting message").getMessage() 
-			.indexOf("An interesting message") >= 0);
-}
-
-public void test_printStackTraceLjava_io_PrintStream() {
-	// Should not test. Result varies by VM.
-}
-
-public void test_printStackTraceLjava_io_PrintWriter() {
-	// Should not test. Result varies by VM.
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_SWTError((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_Constructor");
-	methodNames.addElement("test_ConstructorLjava_lang_String");
-	methodNames.addElement("test_ConstructorI");
-	methodNames.addElement("test_ConstructorILjava_lang_String");
-	methodNames.addElement("test_getMessage");
-	methodNames.addElement("test_printStackTraceLjava_io_PrintStream");
-	methodNames.addElement("test_printStackTraceLjava_io_PrintWriter");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_Constructor")) test_Constructor();
-	else if (getName().equals("test_ConstructorLjava_lang_String")) test_ConstructorLjava_lang_String();
-	else if (getName().equals("test_ConstructorI")) test_ConstructorI();
-	else if (getName().equals("test_ConstructorILjava_lang_String")) test_ConstructorILjava_lang_String();
-	else if (getName().equals("test_getMessage")) test_getMessage();
-	else if (getName().equals("test_printStackTraceLjava_io_PrintStream")) test_printStackTraceLjava_io_PrintStream();
-	else if (getName().equals("test_printStackTraceLjava_io_PrintWriter")) test_printStackTraceLjava_io_PrintWriter();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_SWTException.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_SWTException.java
deleted file mode 100644
index 9b50c80..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_SWTException.java
+++ /dev/null
@@ -1,104 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.SWTException
- *
- * @see org.eclipse.swt.SWTException
- */
-public class Test_org_eclipse_swt_SWTException extends SwtTestCase {
-
-public Test_org_eclipse_swt_SWTException(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_Constructor() {
-	assertTrue (
-		"did not fill in code properly",
-		new SWTException().code == SWT.ERROR_UNSPECIFIED);
-}
-
-public void test_ConstructorLjava_lang_String() {
-	assertTrue (
-		"did not fill in code properly",
-		new SWTException("An uninteresting message").code == SWT.ERROR_UNSPECIFIED);
-}
-
-public void test_ConstructorI() {
-	assertTrue (
-		"did not fill in code properly",
-		new SWTException(SWT.ERROR_CANNOT_BE_ZERO).code == SWT.ERROR_CANNOT_BE_ZERO);
-}
-
-public void test_ConstructorILjava_lang_String() {
-	assertTrue (
-		"did not fill in code properly",
-		new SWTException(SWT.ERROR_CANNOT_BE_ZERO, "An uninteresting message").code 
-			== SWT.ERROR_CANNOT_BE_ZERO);
-}
-
-public void test_getMessage() {
-	assertTrue (
-		"did not include creation string in result",
-		new SWTException(SWT.ERROR_CANNOT_BE_ZERO, "An interesting message").getMessage() 
-			.indexOf("An interesting message") >= 0);
-}
-
-public void test_printStackTraceLjava_io_PrintStream() {
-	// Should not test. Result varies by VM.
-}
-
-public void test_printStackTraceLjava_io_PrintWriter() {
-	// Should not test. Result varies by VM.
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_SWTException((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_Constructor");
-	methodNames.addElement("test_ConstructorLjava_lang_String");
-	methodNames.addElement("test_ConstructorI");
-	methodNames.addElement("test_ConstructorILjava_lang_String");
-	methodNames.addElement("test_getMessage");
-	methodNames.addElement("test_printStackTraceLjava_io_PrintStream");
-	methodNames.addElement("test_printStackTraceLjava_io_PrintWriter");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_Constructor")) test_Constructor();
-	else if (getName().equals("test_ConstructorLjava_lang_String")) test_ConstructorLjava_lang_String();
-	else if (getName().equals("test_ConstructorI")) test_ConstructorI();
-	else if (getName().equals("test_ConstructorILjava_lang_String")) test_ConstructorILjava_lang_String();
-	else if (getName().equals("test_getMessage")) test_getMessage();
-	else if (getName().equals("test_printStackTraceLjava_io_PrintStream")) test_printStackTraceLjava_io_PrintStream();
-	else if (getName().equals("test_printStackTraceLjava_io_PrintWriter")) test_printStackTraceLjava_io_PrintWriter();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_AnimatedProgress.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_AnimatedProgress.java
deleted file mode 100644
index 5698911..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_AnimatedProgress.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.custom.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.custom.AnimatedProgress
- *
- * @see org.eclipse.swt.custom.AnimatedProgress
- */
-public class Test_org_eclipse_swt_custom_AnimatedProgress extends Test_org_eclipse_swt_widgets_Canvas {
-
-public Test_org_eclipse_swt_custom_AnimatedProgress(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_CompositeI() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_CompositeI not written");
-}
-
-public void test_clear() {
-	warnUnimpl("Test test_clear not written");
-}
-
-public void test_computeSizeIIZ() {
-	warnUnimpl("Test test_computeSizeIIZ not written");
-}
-
-public void test_start() {
-	warnUnimpl("Test test_start not written");
-}
-
-public void test_stop() {
-	warnUnimpl("Test test_stop not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_custom_AnimatedProgress((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_CompositeI");
-	methodNames.addElement("test_clear");
-	methodNames.addElement("test_computeSizeIIZ");
-	methodNames.addElement("test_start");
-	methodNames.addElement("test_stop");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Canvas.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_CompositeI")) test_ConstructorLorg_eclipse_swt_widgets_CompositeI();
-	else if (getName().equals("test_clear")) test_clear();
-	else if (getName().equals("test_computeSizeIIZ")) test_computeSizeIIZ();
-	else if (getName().equals("test_start")) test_start();
-	else if (getName().equals("test_stop")) test_stop();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_BidiSegmentEvent.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_BidiSegmentEvent.java
deleted file mode 100644
index 9d9d78d..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_BidiSegmentEvent.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.custom.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.custom.BidiSegmentEvent
- *
- * @see org.eclipse.swt.custom.BidiSegmentEvent
- */
-public class Test_org_eclipse_swt_custom_BidiSegmentEvent extends Test_org_eclipse_swt_events_TypedEvent {
-
-public Test_org_eclipse_swt_custom_BidiSegmentEvent(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_custom_BidiSegmentEvent((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addAll(Test_org_eclipse_swt_events_TypedEvent.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_BidiSegmentListener.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_BidiSegmentListener.java
deleted file mode 100644
index 3d73a90..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_BidiSegmentListener.java
+++ /dev/null
@@ -1,186 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-import junit.textui.TestRunner;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.BidiSegmentEvent;
-import org.eclipse.swt.custom.BidiSegmentListener;
-import org.eclipse.swt.custom.StyleRange;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.internal.BidiUtil;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.custom.BidiSegmentListener
- *
- * @see org.eclipse.swt.custom.BidiSegmentListener
- */
-public class Test_org_eclipse_swt_custom_BidiSegmentListener extends SwtTestCase {
-	Shell shell;
-	StyledText text;
-	boolean listenerCalled;	
-	String line = "Line1";
-			
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-public Test_org_eclipse_swt_custom_BidiSegmentListener(String name) {
-	super(name);
-}
-
-private boolean isBidi() {
-	return BidiUtil.isBidiPlatform();
-}
-protected void setUp() {
-	shell = new Shell();
-	text = new StyledText(shell, SWT.NULL);
-}
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_custom_BidiSegmentListener((String)e.nextElement()));
-	}
-	return suite;
-}
-protected void tearDown() {
-	shell.dispose();
-}
-private void testListener(final String message, final int[] segments, boolean exceptionExpected) {
-	boolean exceptionThrown = false;
-	BidiSegmentListener listener = new BidiSegmentListener() {
-		public void lineGetSegments(BidiSegmentEvent event) {
-			assertEquals(message + " incorrect BidiSegmentEvent", 0, event.lineOffset);
-			assertEquals(message + " incorrect BidiSegmentEvent", line, event.lineText);
-			
-			event.segments = segments;
-			listenerCalled = true;	
-		}
-	};
-
-	listenerCalled = false;		
-	try {
-		text.addBidiSegmentListener(listener);
-		text.getLocationAtOffset(0);
-	}
-	catch (IllegalArgumentException e) {
-		exceptionThrown = true;
-	}
-	finally {
-		text.removeBidiSegmentListener(listener);
-	}
-	if (exceptionExpected) {
-		assertTrue(message + " expected exception not thrown", exceptionThrown);
-	}
-	else {
-		assertTrue(message + " unexpected exception thrown", exceptionThrown == false);
-	}
-	if (isBidi()) {
-		assertTrue(message + " listener not called", listenerCalled);	
-	}
-	else {
-		assertTrue(message + " listener called when it shouldn't be", listenerCalled == false);
-	}
-}
-private void testStyleRangeSegmenting(final int[] segments, int[] boldRanges) {
-	boolean exceptionThrown = false;
-	BidiSegmentListener listener = new BidiSegmentListener() {
-		public void lineGetSegments(BidiSegmentEvent event) {
-			assertEquals(" incorrect BidiSegmentEvent", 0, event.lineOffset);
-			assertEquals(" incorrect BidiSegmentEvent", line, event.lineText);
-			
-			event.segments = segments;
-			listenerCalled = true;	
-		}
-	};
-
-	listenerCalled = false;		
-	try {
-		text.addBidiSegmentListener(listener);
-		text.setStyleRange(null);
-		for (int i=0; i<boldRanges.length; i+=2) {
-			StyleRange styleRange = new StyleRange(boldRanges[i], boldRanges[i+1], null, null, SWT.BOLD);
-			text.setStyleRange(styleRange);
-		};
-		text.getLocationAtOffset(0);
-	}
-	catch (IllegalArgumentException e) {
-		exceptionThrown = true;
-	}
-	finally {
-		text.removeBidiSegmentListener(listener);
-	}
-	assertTrue(" unexpected exception thrown", exceptionThrown == false);
-	if (isBidi()) {
-		assertTrue(" listener not called", listenerCalled);	
-	}
-	else {
-		assertTrue(" listener called when it shouldn't be", listenerCalled == false);
-	}
-}
-
-public void test_lineGetSegmentsLorg_eclipse_swt_custom_BidiSegmentEvent() {
-	int lineLength = line.length();
-
-	text.setText(line);	
-	// should not cause an exception
-	testListener(":a:", null, false);
-	testListener(":b:", new int[] {0, lineLength / 2, lineLength}, false);
-	testListener(":c:", new int[] {0, lineLength / 2}, false);
-			
-	// should all cause an exception on a bidi platform
-	if (isBidi()) {
-		testListener(":d:", new int[] {lineLength / 2}, true);
-		testListener(":e:", new int[] {0, 1, 1, lineLength / 2}, true);
-		testListener(":f:", new int[] {0, 1, 2, lineLength + 1}, true);
-		testListener(":g:", new int[] {0, 1, lineLength + 1, lineLength + 1}, true);
-		testListener(":h:", new int[] {0, 2, 1}, true);
-		testListener(":i:", new int[] {0, -1, 2}, true);
-		testListener(":j:", new int[] {0, -1, 2}, true);
-	}
-
-	// test bold segmenting
-	line = "this is a line with 50 chars - **** **** **** ****";
-	text.setText(line);
-	// should segment as int[] {0,5,5,2,12,3,20,5}
-	testStyleRangeSegmenting(new int[] {0,5,10,15,20,25}, new int[] {0,5,5,2,12,3,20,5});
-	// should segment as int[] {0,5,5,1,7,3,10,3,15,5,20,5}
-	testStyleRangeSegmenting(new int[] {0,5,10,15,20,25}, new int[] {0,6,7,6,15,10});
-	// should segment as int[] {0,5,5,5,10,5}
-	testStyleRangeSegmenting(new int[] {0,5,10,15}, new int[] {0,15});
-	// should segment as int[] {0,5}
-	testStyleRangeSegmenting(new int[] {0,5}, new int[] {0,5});
-	// should segment as int[] {2,3}
-	testStyleRangeSegmenting(new int[] {0,5}, new int[] {2,3});
-	// should segment as int[] {0,2}
-	testStyleRangeSegmenting(new int[] {0,5}, new int[] {0,2});
-	// should segment as int[] {10,5}
-	testStyleRangeSegmenting(new int[] {0,5,10,15}, new int[] {10,5});
-	// should segment as int[] {12,3}
-	testStyleRangeSegmenting(new int[] {0,5,10,15}, new int[] {12,3});
-	// should segment as int[] {3,2,5,5,10,3,21,4,25,3}
-	testStyleRangeSegmenting(new int[] {0,5,10,15,20,25,30}, new int[] {3,10,21,7});
-	// should segment as int[] {10,2}
-	line = "test1test2/r/n";
-	text.setText(line);
-	testStyleRangeSegmenting(new int[] {0,5}, new int[] {10,2});
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_lineGetSegmentsLorg_eclipse_swt_custom_BidiSegmentEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_lineGetSegmentsLorg_eclipse_swt_custom_BidiSegmentEvent")) test_lineGetSegmentsLorg_eclipse_swt_custom_BidiSegmentEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_BusyIndicator.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_BusyIndicator.java
deleted file mode 100644
index d7856c0..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_BusyIndicator.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.custom.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.custom.BusyIndicator
- *
- * @see org.eclipse.swt.custom.BusyIndicator
- */
-public class Test_org_eclipse_swt_custom_BusyIndicator extends SwtTestCase {
-
-public Test_org_eclipse_swt_custom_BusyIndicator(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_Constructor() {
-	warnUnimpl("Test test_Constructor not written");
-}
-
-public void test_showWhileLorg_eclipse_swt_widgets_DisplayLjava_lang_Runnable() {
-	warnUnimpl("Test test_showWhileLorg_eclipse_swt_widgets_DisplayLjava_lang_Runnable not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_custom_BusyIndicator((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_Constructor");
-	methodNames.addElement("test_showWhileLorg_eclipse_swt_widgets_DisplayLjava_lang_Runnable");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_Constructor")) test_Constructor();
-	else if (getName().equals("test_showWhileLorg_eclipse_swt_widgets_DisplayLjava_lang_Runnable")) test_showWhileLorg_eclipse_swt_widgets_DisplayLjava_lang_Runnable();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_CCombo.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_CCombo.java
deleted file mode 100644
index f0ef4be..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_CCombo.java
+++ /dev/null
@@ -1,294 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.custom.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.custom.CCombo
- *
- * @see org.eclipse.swt.custom.CCombo
- */
-public class Test_org_eclipse_swt_custom_CCombo extends Test_org_eclipse_swt_widgets_Composite {
-
-public Test_org_eclipse_swt_custom_CCombo(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_CompositeI() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_CompositeI not written");
-}
-
-public void test_addLjava_lang_String() {
-	warnUnimpl("Test test_addLjava_lang_String not written");
-}
-
-public void test_addLjava_lang_StringI() {
-	warnUnimpl("Test test_addLjava_lang_StringI not written");
-}
-
-public void test_addModifyListenerLorg_eclipse_swt_events_ModifyListener() {
-	warnUnimpl("Test test_addModifyListenerLorg_eclipse_swt_events_ModifyListener not written");
-}
-
-public void test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener() {
-	warnUnimpl("Test test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener not written");
-}
-
-public void test_clearSelection() {
-	warnUnimpl("Test test_clearSelection not written");
-}
-
-public void test_computeSizeIIZ() {
-	warnUnimpl("Test test_computeSizeIIZ not written");
-}
-
-public void test_deselectI() {
-	warnUnimpl("Test test_deselectI not written");
-}
-
-public void test_deselectAll() {
-	warnUnimpl("Test test_deselectAll not written");
-}
-
-public void test_getChildren() {
-	warnUnimpl("Test test_getChildren not written");
-}
-
-public void test_getItemI() {
-	warnUnimpl("Test test_getItemI not written");
-}
-
-public void test_getItemCount() {
-	warnUnimpl("Test test_getItemCount not written");
-}
-
-public void test_getItemHeight() {
-	warnUnimpl("Test test_getItemHeight not written");
-}
-
-public void test_getItems() {
-	warnUnimpl("Test test_getItems not written");
-}
-
-public void test_getSelection() {
-	warnUnimpl("Test test_getSelection not written");
-}
-
-public void test_getSelectionIndex() {
-	warnUnimpl("Test test_getSelectionIndex not written");
-}
-
-public void test_getText() {
-	warnUnimpl("Test test_getText not written");
-}
-
-public void test_getTextHeight() {
-	warnUnimpl("Test test_getTextHeight not written");
-}
-
-public void test_getTextLimit() {
-	warnUnimpl("Test test_getTextLimit not written");
-}
-
-public void test_indexOfLjava_lang_String() {
-	warnUnimpl("Test test_indexOfLjava_lang_String not written");
-}
-
-public void test_indexOfLjava_lang_StringI() {
-	warnUnimpl("Test test_indexOfLjava_lang_StringI not written");
-}
-
-public void test_isFocusControl() {
-	warnUnimpl("Test test_isFocusControl not written");
-}
-
-public void test_redrawIIIIZ() {
-	warnUnimpl("Test test_redrawIIIIZ not written");
-}
-
-public void test_removeI() {
-	warnUnimpl("Test test_removeI not written");
-}
-
-public void test_removeII() {
-	warnUnimpl("Test test_removeII not written");
-}
-
-public void test_removeLjava_lang_String() {
-	warnUnimpl("Test test_removeLjava_lang_String not written");
-}
-
-public void test_removeAll() {
-	warnUnimpl("Test test_removeAll not written");
-}
-
-public void test_removeModifyListenerLorg_eclipse_swt_events_ModifyListener() {
-	warnUnimpl("Test test_removeModifyListenerLorg_eclipse_swt_events_ModifyListener not written");
-}
-
-public void test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener() {
-	warnUnimpl("Test test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener not written");
-}
-
-public void test_selectI() {
-	warnUnimpl("Test test_selectI not written");
-}
-
-public void test_setBackgroundLorg_eclipse_swt_graphics_Color() {
-	warnUnimpl("Test test_setBackgroundLorg_eclipse_swt_graphics_Color not written");
-}
-
-public void test_setFocus() {
-	warnUnimpl("Test test_setFocus not written");
-}
-
-public void test_setFontLorg_eclipse_swt_graphics_Font() {
-	warnUnimpl("Test test_setFontLorg_eclipse_swt_graphics_Font not written");
-}
-
-public void test_setForegroundLorg_eclipse_swt_graphics_Color() {
-	warnUnimpl("Test test_setForegroundLorg_eclipse_swt_graphics_Color not written");
-}
-
-public void test_setItemILjava_lang_String() {
-	warnUnimpl("Test test_setItemILjava_lang_String not written");
-}
-
-public void test_setItems$Ljava_lang_String() {
-	warnUnimpl("Test test_setItems$Ljava_lang_String not written");
-}
-
-public void test_setSelectionLorg_eclipse_swt_graphics_Point() {
-	warnUnimpl("Test test_setSelectionLorg_eclipse_swt_graphics_Point not written");
-}
-
-public void test_setTextLjava_lang_String() {
-	warnUnimpl("Test test_setTextLjava_lang_String not written");
-}
-
-public void test_setTextLimitI() {
-	warnUnimpl("Test test_setTextLimitI not written");
-}
-
-public void test_setVisibleZ() {
-	warnUnimpl("Test test_setVisibleZ not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_custom_CCombo((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_CompositeI");
-	methodNames.addElement("test_addLjava_lang_String");
-	methodNames.addElement("test_addLjava_lang_StringI");
-	methodNames.addElement("test_addModifyListenerLorg_eclipse_swt_events_ModifyListener");
-	methodNames.addElement("test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener");
-	methodNames.addElement("test_clearSelection");
-	methodNames.addElement("test_computeSizeIIZ");
-	methodNames.addElement("test_deselectI");
-	methodNames.addElement("test_deselectAll");
-	methodNames.addElement("test_getChildren");
-	methodNames.addElement("test_getItemI");
-	methodNames.addElement("test_getItemCount");
-	methodNames.addElement("test_getItemHeight");
-	methodNames.addElement("test_getItems");
-	methodNames.addElement("test_getSelection");
-	methodNames.addElement("test_getSelectionIndex");
-	methodNames.addElement("test_getText");
-	methodNames.addElement("test_getTextHeight");
-	methodNames.addElement("test_getTextLimit");
-	methodNames.addElement("test_indexOfLjava_lang_String");
-	methodNames.addElement("test_indexOfLjava_lang_StringI");
-	methodNames.addElement("test_isFocusControl");
-	methodNames.addElement("test_redrawIIIIZ");
-	methodNames.addElement("test_removeI");
-	methodNames.addElement("test_removeII");
-	methodNames.addElement("test_removeLjava_lang_String");
-	methodNames.addElement("test_removeAll");
-	methodNames.addElement("test_removeModifyListenerLorg_eclipse_swt_events_ModifyListener");
-	methodNames.addElement("test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener");
-	methodNames.addElement("test_selectI");
-	methodNames.addElement("test_setBackgroundLorg_eclipse_swt_graphics_Color");
-	methodNames.addElement("test_setFocus");
-	methodNames.addElement("test_setFontLorg_eclipse_swt_graphics_Font");
-	methodNames.addElement("test_setForegroundLorg_eclipse_swt_graphics_Color");
-	methodNames.addElement("test_setItemILjava_lang_String");
-	methodNames.addElement("test_setItems$Ljava_lang_String");
-	methodNames.addElement("test_setSelectionLorg_eclipse_swt_graphics_Point");
-	methodNames.addElement("test_setTextLjava_lang_String");
-	methodNames.addElement("test_setTextLimitI");
-	methodNames.addElement("test_setVisibleZ");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Composite.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_CompositeI")) test_ConstructorLorg_eclipse_swt_widgets_CompositeI();
-	else if (getName().equals("test_addLjava_lang_String")) test_addLjava_lang_String();
-	else if (getName().equals("test_addLjava_lang_StringI")) test_addLjava_lang_StringI();
-	else if (getName().equals("test_addModifyListenerLorg_eclipse_swt_events_ModifyListener")) test_addModifyListenerLorg_eclipse_swt_events_ModifyListener();
-	else if (getName().equals("test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener")) test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener();
-	else if (getName().equals("test_clearSelection")) test_clearSelection();
-	else if (getName().equals("test_computeSizeIIZ")) test_computeSizeIIZ();
-	else if (getName().equals("test_deselectI")) test_deselectI();
-	else if (getName().equals("test_deselectAll")) test_deselectAll();
-	else if (getName().equals("test_getChildren")) test_getChildren();
-	else if (getName().equals("test_getItemI")) test_getItemI();
-	else if (getName().equals("test_getItemCount")) test_getItemCount();
-	else if (getName().equals("test_getItemHeight")) test_getItemHeight();
-	else if (getName().equals("test_getItems")) test_getItems();
-	else if (getName().equals("test_getSelection")) test_getSelection();
-	else if (getName().equals("test_getSelectionIndex")) test_getSelectionIndex();
-	else if (getName().equals("test_getText")) test_getText();
-	else if (getName().equals("test_getTextHeight")) test_getTextHeight();
-	else if (getName().equals("test_getTextLimit")) test_getTextLimit();
-	else if (getName().equals("test_indexOfLjava_lang_String")) test_indexOfLjava_lang_String();
-	else if (getName().equals("test_indexOfLjava_lang_StringI")) test_indexOfLjava_lang_StringI();
-	else if (getName().equals("test_isFocusControl")) test_isFocusControl();
-	else if (getName().equals("test_redrawIIIIZ")) test_redrawIIIIZ();
-	else if (getName().equals("test_removeI")) test_removeI();
-	else if (getName().equals("test_removeII")) test_removeII();
-	else if (getName().equals("test_removeLjava_lang_String")) test_removeLjava_lang_String();
-	else if (getName().equals("test_removeAll")) test_removeAll();
-	else if (getName().equals("test_removeModifyListenerLorg_eclipse_swt_events_ModifyListener")) test_removeModifyListenerLorg_eclipse_swt_events_ModifyListener();
-	else if (getName().equals("test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener")) test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener();
-	else if (getName().equals("test_selectI")) test_selectI();
-	else if (getName().equals("test_setBackgroundLorg_eclipse_swt_graphics_Color")) test_setBackgroundLorg_eclipse_swt_graphics_Color();
-	else if (getName().equals("test_setFocus")) test_setFocus();
-	else if (getName().equals("test_setFontLorg_eclipse_swt_graphics_Font")) test_setFontLorg_eclipse_swt_graphics_Font();
-	else if (getName().equals("test_setForegroundLorg_eclipse_swt_graphics_Color")) test_setForegroundLorg_eclipse_swt_graphics_Color();
-	else if (getName().equals("test_setItemILjava_lang_String")) test_setItemILjava_lang_String();
-	else if (getName().equals("test_setItems$Ljava_lang_String")) test_setItems$Ljava_lang_String();
-	else if (getName().equals("test_setSelectionLorg_eclipse_swt_graphics_Point")) test_setSelectionLorg_eclipse_swt_graphics_Point();
-	else if (getName().equals("test_setTextLjava_lang_String")) test_setTextLjava_lang_String();
-	else if (getName().equals("test_setTextLimitI")) test_setTextLimitI();
-	else if (getName().equals("test_setVisibleZ")) test_setVisibleZ();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_CLabel.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_CLabel.java
deleted file mode 100644
index e6da2a0..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_CLabel.java
+++ /dev/null
@@ -1,138 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.custom.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.custom.CLabel
- *
- * @see org.eclipse.swt.custom.CLabel
- */
-public class Test_org_eclipse_swt_custom_CLabel extends Test_org_eclipse_swt_widgets_Canvas {
-
-public Test_org_eclipse_swt_custom_CLabel(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_CompositeI() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_CompositeI not written");
-}
-
-public void test_computeSizeIIZ() {
-	warnUnimpl("Test test_computeSizeIIZ not written");
-}
-
-public void test_getAlignment() {
-	warnUnimpl("Test test_getAlignment not written");
-}
-
-public void test_getImage() {
-	warnUnimpl("Test test_getImage not written");
-}
-
-public void test_setToolTipTextLjava_lang_String() {
-	warnUnimpl("Test test_setToolTipTextLjava_lang_String not written");
-}
-
-public void test_getText() {
-	warnUnimpl("Test test_getText not written");
-}
-
-public void test_getToolTipText() {
-	warnUnimpl("Test test_getToolTipText not written");
-}
-
-public void test_setAlignmentI() {
-	warnUnimpl("Test test_setAlignmentI not written");
-}
-
-public void test_setBackground$Lorg_eclipse_swt_graphics_Color$I() {
-	warnUnimpl("Test test_setBackground$Lorg_eclipse_swt_graphics_Color$I not written");
-}
-
-public void test_setBackgroundLorg_eclipse_swt_graphics_Image() {
-	warnUnimpl("Test test_setBackgroundLorg_eclipse_swt_graphics_Image not written");
-}
-
-public void test_setFontLorg_eclipse_swt_graphics_Font() {
-	warnUnimpl("Test test_setFontLorg_eclipse_swt_graphics_Font not written");
-}
-
-public void test_setImageLorg_eclipse_swt_graphics_Image() {
-	warnUnimpl("Test test_setImageLorg_eclipse_swt_graphics_Image not written");
-}
-
-public void test_setTextLjava_lang_String() {
-	warnUnimpl("Test test_setTextLjava_lang_String not written");
-}
-
-public void test_shortenTextLorg_eclipse_swt_graphics_GCLjava_lang_StringI() {
-	warnUnimpl("Test test_shortenTextLorg_eclipse_swt_graphics_GCLjava_lang_StringI not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_custom_CLabel((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_CompositeI");
-	methodNames.addElement("test_computeSizeIIZ");
-	methodNames.addElement("test_getAlignment");
-	methodNames.addElement("test_getImage");
-	methodNames.addElement("test_setToolTipTextLjava_lang_String");
-	methodNames.addElement("test_getText");
-	methodNames.addElement("test_getToolTipText");
-	methodNames.addElement("test_setAlignmentI");
-	methodNames.addElement("test_setBackground$Lorg_eclipse_swt_graphics_Color$I");
-	methodNames.addElement("test_setBackgroundLorg_eclipse_swt_graphics_Image");
-	methodNames.addElement("test_setFontLorg_eclipse_swt_graphics_Font");
-	methodNames.addElement("test_setImageLorg_eclipse_swt_graphics_Image");
-	methodNames.addElement("test_setTextLjava_lang_String");
-	methodNames.addElement("test_shortenTextLorg_eclipse_swt_graphics_GCLjava_lang_StringI");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Canvas.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_CompositeI")) test_ConstructorLorg_eclipse_swt_widgets_CompositeI();
-	else if (getName().equals("test_computeSizeIIZ")) test_computeSizeIIZ();
-	else if (getName().equals("test_getAlignment")) test_getAlignment();
-	else if (getName().equals("test_getImage")) test_getImage();
-	else if (getName().equals("test_setToolTipTextLjava_lang_String")) test_setToolTipTextLjava_lang_String();
-	else if (getName().equals("test_getText")) test_getText();
-	else if (getName().equals("test_getToolTipText")) test_getToolTipText();
-	else if (getName().equals("test_setAlignmentI")) test_setAlignmentI();
-	else if (getName().equals("test_setBackground$Lorg_eclipse_swt_graphics_Color$I")) test_setBackground$Lorg_eclipse_swt_graphics_Color$I();
-	else if (getName().equals("test_setBackgroundLorg_eclipse_swt_graphics_Image")) test_setBackgroundLorg_eclipse_swt_graphics_Image();
-	else if (getName().equals("test_setFontLorg_eclipse_swt_graphics_Font")) test_setFontLorg_eclipse_swt_graphics_Font();
-	else if (getName().equals("test_setImageLorg_eclipse_swt_graphics_Image")) test_setImageLorg_eclipse_swt_graphics_Image();
-	else if (getName().equals("test_setTextLjava_lang_String")) test_setTextLjava_lang_String();
-	else if (getName().equals("test_shortenTextLorg_eclipse_swt_graphics_GCLjava_lang_StringI")) test_shortenTextLorg_eclipse_swt_graphics_GCLjava_lang_StringI();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_CTabFolder.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_CTabFolder.java
deleted file mode 100644
index 122fd9d..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_CTabFolder.java
+++ /dev/null
@@ -1,222 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.custom.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.custom.CTabFolder
- *
- * @see org.eclipse.swt.custom.CTabFolder
- */
-public class Test_org_eclipse_swt_custom_CTabFolder extends Test_org_eclipse_swt_widgets_Composite {
-
-public Test_org_eclipse_swt_custom_CTabFolder(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_CompositeI() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_CompositeI not written");
-}
-
-public void test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener() {
-	warnUnimpl("Test test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener not written");
-}
-
-public void test_addCTabFolderListenerLorg_eclipse_swt_custom_CTabFolderListener() {
-	warnUnimpl("Test test_addCTabFolderListenerLorg_eclipse_swt_custom_CTabFolderListener not written");
-}
-
-public void test_computeSizeIIZ() {
-	warnUnimpl("Test test_computeSizeIIZ not written");
-}
-
-public void test_computeTrimIIII() {
-	warnUnimpl("Test test_computeTrimIIII not written");
-}
-
-public void test_onFocusLorg_eclipse_swt_widgets_Event() {
-	warnUnimpl("Test test_onFocusLorg_eclipse_swt_widgets_Event not written");
-}
-
-public void test_getClientArea() {
-	warnUnimpl("Test test_getClientArea not written");
-}
-
-public void test_getTabHeight() {
-	warnUnimpl("Test test_getTabHeight not written");
-}
-
-public void test_getItemI() {
-	warnUnimpl("Test test_getItemI not written");
-}
-
-public void test_getItemLorg_eclipse_swt_graphics_Point() {
-	warnUnimpl("Test test_getItemLorg_eclipse_swt_graphics_Point not written");
-}
-
-public void test_getItemCount() {
-	warnUnimpl("Test test_getItemCount not written");
-}
-
-public void test_getItems() {
-	warnUnimpl("Test test_getItems not written");
-}
-
-public void test_getSelection() {
-	warnUnimpl("Test test_getSelection not written");
-}
-
-public void test_getSelectionIndex() {
-	warnUnimpl("Test test_getSelectionIndex not written");
-}
-
-public void test_indexOfLorg_eclipse_swt_custom_CTabItem() {
-	warnUnimpl("Test test_indexOfLorg_eclipse_swt_custom_CTabItem not written");
-}
-
-public void test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener() {
-	warnUnimpl("Test test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener not written");
-}
-
-public void test_removeCTabFolderListenerLorg_eclipse_swt_custom_CTabFolderListener() {
-	warnUnimpl("Test test_removeCTabFolderListenerLorg_eclipse_swt_custom_CTabFolderListener not written");
-}
-
-public void test_setBackgroundLorg_eclipse_swt_graphics_Color() {
-	warnUnimpl("Test test_setBackgroundLorg_eclipse_swt_graphics_Color not written");
-}
-
-public void test_setSelectionBackground$Lorg_eclipse_swt_graphics_Color$I() {
-	warnUnimpl("Test test_setSelectionBackground$Lorg_eclipse_swt_graphics_Color$I not written");
-}
-
-public void test_setSelectionBackgroundLorg_eclipse_swt_graphics_Image() {
-	warnUnimpl("Test test_setSelectionBackgroundLorg_eclipse_swt_graphics_Image not written");
-}
-
-public void test_setBorderVisibleZ() {
-	warnUnimpl("Test test_setBorderVisibleZ not written");
-}
-
-public void test_setFontLorg_eclipse_swt_graphics_Font() {
-	warnUnimpl("Test test_setFontLorg_eclipse_swt_graphics_Font not written");
-}
-
-public void test_setSelectionForegroundLorg_eclipse_swt_graphics_Color() {
-	warnUnimpl("Test test_setSelectionForegroundLorg_eclipse_swt_graphics_Color not written");
-}
-
-public void test_setInsertMarkLorg_eclipse_swt_custom_CTabItemZ() {
-	warnUnimpl("Test test_setInsertMarkLorg_eclipse_swt_custom_CTabItemZ not written");
-}
-
-public void test_setInsertMarkIZ() {
-	warnUnimpl("Test test_setInsertMarkIZ not written");
-}
-
-public void test_setSelectionI() {
-	warnUnimpl("Test test_setSelectionI not written");
-}
-
-public void test_setSelectionLorg_eclipse_swt_custom_CTabItem() {
-	warnUnimpl("Test test_setSelectionLorg_eclipse_swt_custom_CTabItem not written");
-}
-
-public void test_setTabHeightI() {
-	warnUnimpl("Test test_setTabHeightI not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_custom_CTabFolder((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_CompositeI");
-	methodNames.addElement("test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener");
-	methodNames.addElement("test_addCTabFolderListenerLorg_eclipse_swt_custom_CTabFolderListener");
-	methodNames.addElement("test_computeSizeIIZ");
-	methodNames.addElement("test_computeTrimIIII");
-	methodNames.addElement("test_onFocusLorg_eclipse_swt_widgets_Event");
-	methodNames.addElement("test_getClientArea");
-	methodNames.addElement("test_getTabHeight");
-	methodNames.addElement("test_getItemI");
-	methodNames.addElement("test_getItemLorg_eclipse_swt_graphics_Point");
-	methodNames.addElement("test_getItemCount");
-	methodNames.addElement("test_getItems");
-	methodNames.addElement("test_getSelection");
-	methodNames.addElement("test_getSelectionIndex");
-	methodNames.addElement("test_indexOfLorg_eclipse_swt_custom_CTabItem");
-	methodNames.addElement("test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener");
-	methodNames.addElement("test_removeCTabFolderListenerLorg_eclipse_swt_custom_CTabFolderListener");
-	methodNames.addElement("test_setBackgroundLorg_eclipse_swt_graphics_Color");
-	methodNames.addElement("test_setSelectionBackground$Lorg_eclipse_swt_graphics_Color$I");
-	methodNames.addElement("test_setSelectionBackgroundLorg_eclipse_swt_graphics_Image");
-	methodNames.addElement("test_setBorderVisibleZ");
-	methodNames.addElement("test_setFontLorg_eclipse_swt_graphics_Font");
-	methodNames.addElement("test_setSelectionForegroundLorg_eclipse_swt_graphics_Color");
-	methodNames.addElement("test_setInsertMarkLorg_eclipse_swt_custom_CTabItemZ");
-	methodNames.addElement("test_setInsertMarkIZ");
-	methodNames.addElement("test_setSelectionI");
-	methodNames.addElement("test_setSelectionLorg_eclipse_swt_custom_CTabItem");
-	methodNames.addElement("test_setTabHeightI");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Composite.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_CompositeI")) test_ConstructorLorg_eclipse_swt_widgets_CompositeI();
-	else if (getName().equals("test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener")) test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener();
-	else if (getName().equals("test_addCTabFolderListenerLorg_eclipse_swt_custom_CTabFolderListener")) test_addCTabFolderListenerLorg_eclipse_swt_custom_CTabFolderListener();
-	else if (getName().equals("test_computeSizeIIZ")) test_computeSizeIIZ();
-	else if (getName().equals("test_computeTrimIIII")) test_computeTrimIIII();
-	else if (getName().equals("test_onFocusLorg_eclipse_swt_widgets_Event")) test_onFocusLorg_eclipse_swt_widgets_Event();
-	else if (getName().equals("test_getClientArea")) test_getClientArea();
-	else if (getName().equals("test_getTabHeight")) test_getTabHeight();
-	else if (getName().equals("test_getItemI")) test_getItemI();
-	else if (getName().equals("test_getItemLorg_eclipse_swt_graphics_Point")) test_getItemLorg_eclipse_swt_graphics_Point();
-	else if (getName().equals("test_getItemCount")) test_getItemCount();
-	else if (getName().equals("test_getItems")) test_getItems();
-	else if (getName().equals("test_getSelection")) test_getSelection();
-	else if (getName().equals("test_getSelectionIndex")) test_getSelectionIndex();
-	else if (getName().equals("test_indexOfLorg_eclipse_swt_custom_CTabItem")) test_indexOfLorg_eclipse_swt_custom_CTabItem();
-	else if (getName().equals("test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener")) test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener();
-	else if (getName().equals("test_removeCTabFolderListenerLorg_eclipse_swt_custom_CTabFolderListener")) test_removeCTabFolderListenerLorg_eclipse_swt_custom_CTabFolderListener();
-	else if (getName().equals("test_setBackgroundLorg_eclipse_swt_graphics_Color")) test_setBackgroundLorg_eclipse_swt_graphics_Color();
-	else if (getName().equals("test_setSelectionBackground$Lorg_eclipse_swt_graphics_Color$I")) test_setSelectionBackground$Lorg_eclipse_swt_graphics_Color$I();
-	else if (getName().equals("test_setSelectionBackgroundLorg_eclipse_swt_graphics_Image")) test_setSelectionBackgroundLorg_eclipse_swt_graphics_Image();
-	else if (getName().equals("test_setBorderVisibleZ")) test_setBorderVisibleZ();
-	else if (getName().equals("test_setFontLorg_eclipse_swt_graphics_Font")) test_setFontLorg_eclipse_swt_graphics_Font();
-	else if (getName().equals("test_setSelectionForegroundLorg_eclipse_swt_graphics_Color")) test_setSelectionForegroundLorg_eclipse_swt_graphics_Color();
-	else if (getName().equals("test_setInsertMarkLorg_eclipse_swt_custom_CTabItemZ")) test_setInsertMarkLorg_eclipse_swt_custom_CTabItemZ();
-	else if (getName().equals("test_setInsertMarkIZ")) test_setInsertMarkIZ();
-	else if (getName().equals("test_setSelectionI")) test_setSelectionI();
-	else if (getName().equals("test_setSelectionLorg_eclipse_swt_custom_CTabItem")) test_setSelectionLorg_eclipse_swt_custom_CTabItem();
-	else if (getName().equals("test_setTabHeightI")) test_setTabHeightI();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_CTabFolderAdapter.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_CTabFolderAdapter.java
deleted file mode 100644
index 3d29112..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_CTabFolderAdapter.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.custom.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.custom.CTabFolderAdapter
- *
- * @see org.eclipse.swt.custom.CTabFolderAdapter
- */
-public class Test_org_eclipse_swt_custom_CTabFolderAdapter extends SwtTestCase {
-
-public Test_org_eclipse_swt_custom_CTabFolderAdapter(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_Constructor() {
-	warnUnimpl("Test test_Constructor not written");
-}
-
-public void test_itemClosedLorg_eclipse_swt_custom_CTabFolderEvent() {
-	warnUnimpl("Test test_itemClosedLorg_eclipse_swt_custom_CTabFolderEvent not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_custom_CTabFolderAdapter((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_Constructor");
-	methodNames.addElement("test_itemClosedLorg_eclipse_swt_custom_CTabFolderEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_Constructor")) test_Constructor();
-	else if (getName().equals("test_itemClosedLorg_eclipse_swt_custom_CTabFolderEvent")) test_itemClosedLorg_eclipse_swt_custom_CTabFolderEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_CTabFolderEvent.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_CTabFolderEvent.java
deleted file mode 100644
index ba4de07..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_CTabFolderEvent.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.custom.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.custom.CTabFolderEvent
- *
- * @see org.eclipse.swt.custom.CTabFolderEvent
- */
-public class Test_org_eclipse_swt_custom_CTabFolderEvent extends Test_org_eclipse_swt_events_TypedEvent {
-
-public Test_org_eclipse_swt_custom_CTabFolderEvent(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_custom_CTabFolderEvent((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addAll(Test_org_eclipse_swt_events_TypedEvent.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_CTabFolderListener.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_CTabFolderListener.java
deleted file mode 100644
index 4de5de6..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_CTabFolderListener.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.custom.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.custom.CTabFolderListener
- *
- * @see org.eclipse.swt.custom.CTabFolderListener
- */
-public class Test_org_eclipse_swt_custom_CTabFolderListener extends SwtTestCase {
-
-public Test_org_eclipse_swt_custom_CTabFolderListener(String name) {
-	super(name);
-}
-
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_itemClosedLorg_eclipse_swt_custom_CTabFolderEvent() {
-	warnUnimpl("Test test_itemClosedLorg_eclipse_swt_custom_CTabFolderEvent not written");
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_itemClosedLorg_eclipse_swt_custom_CTabFolderEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_itemClosedLorg_eclipse_swt_custom_CTabFolderEvent")) test_itemClosedLorg_eclipse_swt_custom_CTabFolderEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_CTabItem.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_CTabItem.java
deleted file mode 100644
index 35f8a51..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_CTabItem.java
+++ /dev/null
@@ -1,145 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.custom.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.custom.CTabItem
- *
- * @see org.eclipse.swt.custom.CTabItem
- */
-public class Test_org_eclipse_swt_custom_CTabItem extends Test_org_eclipse_swt_widgets_Item {
-
-	CTabFolder cTabFolder;
-	CTabItem cTabItem;
-
-public Test_org_eclipse_swt_custom_CTabItem(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-	cTabFolder = new CTabFolder(shell, SWT.NONE);
-	cTabItem = new CTabItem(cTabFolder, SWT.NONE);
-	setWidget(cTabItem);
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_custom_CTabFolderI() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_custom_CTabFolderI not written");
-}
-
-public void test_ConstructorLorg_eclipse_swt_custom_CTabFolderII() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_custom_CTabFolderII not written");
-}
-
-public void test_dispose() {
-	warnUnimpl("Test test_dispose not written");
-}
-
-public void test_getBounds() {
-	warnUnimpl("Test test_getBounds not written");
-}
-
-public void test_getControl() {
-	warnUnimpl("Test test_getControl not written");
-}
-
-public void test_getDisplay() {
-	warnUnimpl("Test test_getDisplay not written");
-}
-
-public void test_getDisabledImage() {
-	warnUnimpl("Test test_getDisabledImage not written");
-}
-
-public void test_getParent() {
-	warnUnimpl("Test test_getParent not written");
-}
-
-public void test_getToolTipText() {
-	warnUnimpl("Test test_getToolTipText not written");
-}
-
-public void test_setControlLorg_eclipse_swt_widgets_Control() {
-	warnUnimpl("Test test_setControlLorg_eclipse_swt_widgets_Control not written");
-}
-
-public void test_setImageLorg_eclipse_swt_graphics_Image() {
-	warnUnimpl("Test test_setImageLorg_eclipse_swt_graphics_Image not written");
-}
-
-public void test_setDisabledImageLorg_eclipse_swt_graphics_Image() {
-	warnUnimpl("Test test_setDisabledImageLorg_eclipse_swt_graphics_Image not written");
-}
-
-public void test_setTextLjava_lang_String() {
-	warnUnimpl("Test test_setTextLjava_lang_String not written");
-}
-
-public void test_setToolTipTextLjava_lang_String() {
-	warnUnimpl("Test test_setToolTipTextLjava_lang_String not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_custom_CTabItem((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_custom_CTabFolderI");
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_custom_CTabFolderII");
-	methodNames.addElement("test_dispose");
-	methodNames.addElement("test_getBounds");
-	methodNames.addElement("test_getControl");
-	methodNames.addElement("test_getDisplay");
-	methodNames.addElement("test_getDisabledImage");
-	methodNames.addElement("test_getParent");
-	methodNames.addElement("test_getToolTipText");
-	methodNames.addElement("test_setControlLorg_eclipse_swt_widgets_Control");
-	methodNames.addElement("test_setImageLorg_eclipse_swt_graphics_Image");
-	methodNames.addElement("test_setDisabledImageLorg_eclipse_swt_graphics_Image");
-	methodNames.addElement("test_setTextLjava_lang_String");
-	methodNames.addElement("test_setToolTipTextLjava_lang_String");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Item.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_custom_CTabFolderI")) test_ConstructorLorg_eclipse_swt_custom_CTabFolderI();
-	else if (getName().equals("test_ConstructorLorg_eclipse_swt_custom_CTabFolderII")) test_ConstructorLorg_eclipse_swt_custom_CTabFolderII();
-	else if (getName().equals("test_dispose")) test_dispose();
-	else if (getName().equals("test_getBounds")) test_getBounds();
-	else if (getName().equals("test_getControl")) test_getControl();
-	else if (getName().equals("test_getDisplay")) test_getDisplay();
-	else if (getName().equals("test_getDisabledImage")) test_getDisabledImage();
-	else if (getName().equals("test_getParent")) test_getParent();
-	else if (getName().equals("test_getToolTipText")) test_getToolTipText();
-	else if (getName().equals("test_setControlLorg_eclipse_swt_widgets_Control")) test_setControlLorg_eclipse_swt_widgets_Control();
-	else if (getName().equals("test_setImageLorg_eclipse_swt_graphics_Image")) test_setImageLorg_eclipse_swt_graphics_Image();
-	else if (getName().equals("test_setDisabledImageLorg_eclipse_swt_graphics_Image")) test_setDisabledImageLorg_eclipse_swt_graphics_Image();
-	else if (getName().equals("test_setTextLjava_lang_String")) test_setTextLjava_lang_String();
-	else if (getName().equals("test_setToolTipTextLjava_lang_String")) test_setToolTipTextLjava_lang_String();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_ControlEditor.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_ControlEditor.java
deleted file mode 100644
index d05aa3f..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_ControlEditor.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.custom.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.custom.ControlEditor
- *
- * @see org.eclipse.swt.custom.ControlEditor
- */
-public class Test_org_eclipse_swt_custom_ControlEditor extends SwtTestCase {
-
-public Test_org_eclipse_swt_custom_ControlEditor(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_Composite() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_Composite not written");
-}
-
-public void test_dispose() {
-	warnUnimpl("Test test_dispose not written");
-}
-
-public void test_getEditor() {
-	warnUnimpl("Test test_getEditor not written");
-}
-
-public void test_setEditorLorg_eclipse_swt_widgets_Control() {
-	warnUnimpl("Test test_setEditorLorg_eclipse_swt_widgets_Control not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_custom_ControlEditor((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_Composite");
-	methodNames.addElement("test_dispose");
-	methodNames.addElement("test_getEditor");
-	methodNames.addElement("test_setEditorLorg_eclipse_swt_widgets_Control");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_Composite")) test_ConstructorLorg_eclipse_swt_widgets_Composite();
-	else if (getName().equals("test_dispose")) test_dispose();
-	else if (getName().equals("test_getEditor")) test_getEditor();
-	else if (getName().equals("test_setEditorLorg_eclipse_swt_widgets_Control")) test_setEditorLorg_eclipse_swt_widgets_Control();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_ExtendedModifyEvent.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_ExtendedModifyEvent.java
deleted file mode 100644
index 9f23339..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_ExtendedModifyEvent.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.custom.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.custom.ExtendedModifyEvent
- *
- * @see org.eclipse.swt.custom.ExtendedModifyEvent
- */
-public class Test_org_eclipse_swt_custom_ExtendedModifyEvent extends Test_org_eclipse_swt_events_TypedEvent {
-
-public Test_org_eclipse_swt_custom_ExtendedModifyEvent(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_custom_StyledTextEvent() {
-	// this method tested by other test classes
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_custom_ExtendedModifyEvent((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_custom_StyledTextEvent");
-	methodNames.addAll(Test_org_eclipse_swt_events_TypedEvent.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_custom_StyledTextEvent")) test_ConstructorLorg_eclipse_swt_custom_StyledTextEvent();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_ExtendedModifyListener.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_ExtendedModifyListener.java
deleted file mode 100644
index 2d64f17..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_ExtendedModifyListener.java
+++ /dev/null
@@ -1,317 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.custom.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.custom.ExtendedModifyListener
- *
- * @see org.eclipse.swt.custom.ExtendedModifyListener
- */
-public class Test_org_eclipse_swt_custom_ExtendedModifyListener extends SwtTestCase {
-	Shell shell;
-	StyledText styledText;
-	int verify = -1;
-
-public Test_org_eclipse_swt_custom_ExtendedModifyListener(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-protected void setUp() {
-	shell = new Shell();
-	styledText = new StyledText(shell, SWT.NULL);
-	shell.open();
-}
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_custom_ExtendedModifyListener((String)e.nextElement()));
-	}
-	return suite;
-}
-public void test_modifyTextLorg_eclipse_swt_custom_ExtendedModifyEvent() {
-	ExtendedModifyListener listener = new ExtendedModifyListener() {
-		public void modifyText(ExtendedModifyEvent event) {
-			switch(verify) {
-				case 1 : {
-					assertTrue(":1a:", event.start == 0);
-					assertTrue(":1b:", event.length == 1);
-					assertTrue(":1c:", event.replacedText.equals(""));
-					break;
-				}
-				case 2 : {
-					assertTrue(":2a:", event.start == 0);
-					assertTrue(":2b:", event.length == 1);
-					assertTrue(":2c:", event.replacedText.equals("\n\n"));
-					break;
-				}
-				case 3 : {
-					assertTrue(":3a:", event.start == 0);
-					assertTrue(":3b:", event.length == 2);
-					assertTrue(":3c:", event.replacedText.equals("a"));
-					break;
-				}
-				case 4: {
-					assertTrue(":4:", false);
-					break;
-				}
-				case 5 : {
-					assertTrue(":5a:", event.start == 0);
-					assertTrue(":5b:", event.length == 1);
-					assertTrue(":5c:", event.replacedText.equals(""));
-					break;
-				}
-				case 6 : {
-					assertTrue(":6a:", event.start == 21);
-					assertTrue(":6b:", event.length == 0);
-					assertTrue(":6c:", event.replacedText.equals("\nline 4"));
-					break;
-				}
-				case 7 : {
-					assertTrue(":7a:", event.start == 5);
-					assertTrue(":7b:", event.length == 0);
-					assertTrue(":7c:", event.replacedText.equals("is a test"));
-					break;
-				}
-				case 8 : {
-					assertTrue(":8a:", event.start == 7);
-					assertTrue(":8b:", event.length == 0);
-					assertTrue(":8c:", event.replacedText.equals("\r\n"));
-					break;
-				}
-				case 9 : {
-					assertTrue(":9a:", event.start == 2);
-					assertTrue(":9b:", event.length == 4);
-					assertTrue(":9c:", event.replacedText.equals("\r\n"));
-					break;
-				}
-				case 10:{
-					assertTrue(":10:", false);
-					break;
-				}
-				case 11: {
-					assertTrue(":11:", false);
-					break;
-				}
-				case 12: {
-					assertTrue(":12a:", event.start == 3);
-					assertTrue(":12b:", event.length == 1);
-					assertTrue(":12c:", event.replacedText.equals(""));
-					break;
-				}
-				case 13: {
-					assertTrue(":13a:", event.start == 2);
-					assertTrue(":13b:", event.length == 1);
-					assertTrue(":13c:", event.replacedText.equals(""));
-					break;
-				}
-				case 14: {
-					assertTrue(":14:", false);
-					break;
-				}
-				case 15: {
-					assertTrue(":15a:", event.start == 2);
-					assertTrue(":15b:", event.length == 6);
-					assertTrue(":15c:", event.replacedText.equals("\r\n"));
-					break;
-				}
-				case 16:{
-					assertTrue(":16:", false);
-					break;
-				}
-				case 17: {
-					assertTrue(":17:", false);
-					break;
-				}
-				case 18: {
-					assertTrue(":18a:", event.start == 3);
-					assertTrue(":18b:", event.length == 7);
-					assertTrue(":18c:", event.replacedText.equals(""));
-					break;
-				}
-				case 19: {
-					assertTrue(":19a:", event.start == 2);
-					assertTrue(":19b:", event.length == 7);
-					assertTrue(":19c:", event.replacedText.equals(""));
-					break;
-				}
-				case 20: {
-					assertTrue(":20:", false);
-					break;
-				}
-				case 21: {
-					assertTrue(":21a:", event.start == 0);
-					assertTrue(":21b:", event.length == 16);
-					assertTrue(":21c:", event.replacedText.equals("L1\r\nL2\r\nL3\r\nL4\r\n"));
-					break;
-				}
-			}
-		}
-	};
-	styledText.addExtendedModifyListener(listener);
-	
-	boolean exceptionHandled = false;
-	verify = 0;
-	styledText.setText("testing");
-	verify = 1;
-	styledText.replaceTextRange(0, 0, "\n");
-
-	verify = 0;
-	styledText.setText("\n\n");
-	verify = 2;
-	styledText.replaceTextRange(0, 2, "a");
-
-	verify = 0;
-	styledText.setText("a");
-	verify = 3;
-	styledText.replaceTextRange(0, 1, "\n\n");
-
-	verify = 0;
-	styledText.setText("L1\r\nL2\r\nL3\r\nL4\r\n");
-	verify = 4;
-	try {styledText.replaceTextRange(3, 1, "test\n");}
-	catch (IllegalArgumentException ex) {
-		exceptionHandled = true;
-	}
-	assertTrue(":4: exception not thrown", exceptionHandled);
-	exceptionHandled = false;
-
-	verify = 0;
-	styledText.setText("Line 1\r\nLine 2");
-	verify = 5;
-	styledText.replaceTextRange(0, 0, "\r");
-
-	verify = 0;
-	styledText.setText("This\nis a test\nline 3\nline 4");
-	verify = 6;
-	styledText.replaceTextRange(21, 7, "");
-
-	verify = 0;
-	styledText.setText("This\nis a test\r");
-	verify = 7;
-	styledText.replaceTextRange(5, 9, "");
-
-	verify = 0;
-	styledText.setText("\nL1\r\nL2\r\n");
-	verify = 8;
-	styledText.replaceTextRange(7, 2, "");
-
-	verify = 0;
-	styledText.setText("L1\r\n");
-	verify = 9;
-	styledText.replaceTextRange(2, 2, "test");
-
-	verify = 0;
-	styledText.setText("L1\r\n");
-	verify = 10;
-	try {styledText.replaceTextRange(3, 1, "");} 
-	catch (IllegalArgumentException ex) {
-		exceptionHandled = true;
-	}
-	assertTrue(":10: exception not thrown", exceptionHandled);
-	exceptionHandled = false;
-
-	verify = 0;
-	styledText.setText("L1\r\nL2\r\nL3\r\nL4\r\n");
-	verify = 11;
-	try {styledText.replaceTextRange(1, 2, "");}
-	catch (IllegalArgumentException ex) {
-		exceptionHandled = true;
-	}
-	assertTrue(":11: exception not thrown", exceptionHandled);
-	exceptionHandled = false;
-
-	verify = 0;
-	styledText.setText("L1\r");
-	verify = 12;
-	styledText.replaceTextRange(3, 0, "\n");
-
-	verify = 0;
-	styledText.setText("L1\n");
-	verify = 13;
-	styledText.replaceTextRange(2, 0, "\r");
-
-	verify = 0;
-	styledText.setText("L1\r\n");
-	verify = 14;
-	try {styledText.replaceTextRange(3, 0, "test");}
-	catch (IllegalArgumentException ex) {
-		exceptionHandled = true;
-	}
-	assertTrue(":14: exception not thrown", exceptionHandled);
-	exceptionHandled = false;
-
-	verify = 0;
-	styledText.setText("L1\r\n");
-	verify = 15;
-	styledText.replaceTextRange(2, 2, "test\n\n");
-
-	verify = 0;
-	styledText.setText("L1\r\n");
-	verify = 16;
-	try {styledText.replaceTextRange(3, 1, "test\r\n");}
-	catch (IllegalArgumentException ex) {
-		exceptionHandled = true;
-	}
-	assertTrue(":16: exception not thrown", exceptionHandled);
-	exceptionHandled = false;
-
-	verify = 0;
-	styledText.setText("L1\r\nL2\r\nL3\r\nL4\r\n");
-	verify = 17;
-	try {styledText.replaceTextRange(1, 2, "test\n\n");}
-	catch (IllegalArgumentException ex) {
-		exceptionHandled = true;
-	}
-	assertTrue(":17: exception not thrown", exceptionHandled);
-	exceptionHandled = false;
-
-	verify = 0;
- 	styledText.setText("L1\r");
-	verify = 18;
-	styledText.replaceTextRange(3, 0, "\ntest\r\n");
-
-	verify = 0;
-	styledText.setText("L1\n");
-	verify = 19;
-	styledText.replaceTextRange(2, 0, "test\r\r\r");
-
-	verify = 0;
-	styledText.setText("L1\r\nL2\r\nL3\r\nL4\r\n");
-	verify = 20;
-	try {styledText.replaceTextRange(3, 1, "test\n");}
-	catch (IllegalArgumentException ex) {
-		exceptionHandled = true;
-	}
-	assertTrue(":20: exception not thrown", exceptionHandled);
-	exceptionHandled = false;
-
-	verify = 21;
-	styledText.setText("L1\r\nL2\r\nL3\r\nL4\r\n");
-	styledText.removeExtendedModifyListener(listener);
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_modifyTextLorg_eclipse_swt_custom_ExtendedModifyEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_modifyTextLorg_eclipse_swt_custom_ExtendedModifyEvent")) test_modifyTextLorg_eclipse_swt_custom_ExtendedModifyEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_LineBackgroundEvent.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_LineBackgroundEvent.java
deleted file mode 100644
index f69a0cf..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_LineBackgroundEvent.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.custom.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.custom.LineBackgroundEvent
- *
- * @see org.eclipse.swt.custom.LineBackgroundEvent
- */
-public class Test_org_eclipse_swt_custom_LineBackgroundEvent extends Test_org_eclipse_swt_events_TypedEvent {
-
-public Test_org_eclipse_swt_custom_LineBackgroundEvent(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_custom_StyledTextEvent() {
-	// this method tested by other test classes
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_custom_LineBackgroundEvent((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_custom_StyledTextEvent");
-	methodNames.addAll(Test_org_eclipse_swt_events_TypedEvent.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_custom_StyledTextEvent")) test_ConstructorLorg_eclipse_swt_custom_StyledTextEvent();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_LineBackgroundListener.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_LineBackgroundListener.java
deleted file mode 100644
index 86fb99e..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_LineBackgroundListener.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.custom.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.custom.LineBackgroundListener
- *
- * @see org.eclipse.swt.custom.LineBackgroundListener
- */
-public class Test_org_eclipse_swt_custom_LineBackgroundListener extends SwtTestCase {
-	Shell shell;
-	StyledText styledText;
-
-public Test_org_eclipse_swt_custom_LineBackgroundListener(String name) {
-	super(name);
-}
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-protected void setUp() {
-	shell = new Shell();
-	styledText = new StyledText(shell, SWT.NULL);
-	shell.open();
-}
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_custom_LineBackgroundListener((String)e.nextElement()));
-	}
-	return suite;
-}
-protected void tearDown() {
-}
-
-public void test_lineGetBackgroundLorg_eclipse_swt_custom_LineBackgroundEvent() {
-	LineBackgroundListener listener = new LineBackgroundListener() {
-		public void lineGetBackground(LineBackgroundEvent event) {
-			assertTrue(":1:", event.lineOffset==0);
-			assertTrue(":2:",event.lineText.equals("0123456789"));
-		}
-	};
-	styledText.addLineBackgroundListener(listener);
-	styledText.setText("0123456789");
-	// force get line bg callback
-	styledText.selectAll();
-	styledText.copy();
-	styledText.removeLineBackgroundListener(listener);
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_lineGetBackgroundLorg_eclipse_swt_custom_LineBackgroundEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_lineGetBackgroundLorg_eclipse_swt_custom_LineBackgroundEvent")) test_lineGetBackgroundLorg_eclipse_swt_custom_LineBackgroundEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_LineStyleEvent.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_LineStyleEvent.java
deleted file mode 100644
index 518ff4f..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_LineStyleEvent.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.custom.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.custom.LineStyleEvent
- *
- * @see org.eclipse.swt.custom.LineStyleEvent
- */
-public class Test_org_eclipse_swt_custom_LineStyleEvent extends Test_org_eclipse_swt_events_TypedEvent {
-
-public Test_org_eclipse_swt_custom_LineStyleEvent(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_custom_StyledTextEvent() {
-	// this method tested by other test classes
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_custom_LineStyleEvent((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_custom_StyledTextEvent");
-	methodNames.addAll(Test_org_eclipse_swt_events_TypedEvent.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_custom_StyledTextEvent")) test_ConstructorLorg_eclipse_swt_custom_StyledTextEvent();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_LineStyleListener.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_LineStyleListener.java
deleted file mode 100644
index 30f55fa..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_LineStyleListener.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.custom.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.custom.LineStyleListener
- *
- * @see org.eclipse.swt.custom.LineStyleListener
- */
-public class Test_org_eclipse_swt_custom_LineStyleListener extends SwtTestCase {
-	Shell shell;
-	StyledText styledText;
-
-public Test_org_eclipse_swt_custom_LineStyleListener(String name) {
-	super(name);
-}
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-protected void setUp() {
-	shell = new Shell();
-	styledText = new StyledText(shell, SWT.NULL);
-	shell.open();
-}
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_custom_LineStyleListener((String)e.nextElement()));
-	}
-	return suite;
-}
-protected void tearDown() {
-}
-
-public void test_lineGetStyleLorg_eclipse_swt_custom_LineStyleEvent() {
-	LineStyleListener listener = new LineStyleListener() {
-		public void lineGetStyle(LineStyleEvent event) {
-			assertTrue(":1:", event.lineOffset==0);
-			assertTrue(":2:",event.lineText.equals("0123456789"));
-		}
-	};
-	styledText.addLineStyleListener(listener);
-	styledText.setText("0123456789");
-	// force get line styles callback
-	styledText.getLocationAtOffset(5);
-	styledText.removeLineStyleListener(listener);
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_lineGetStyleLorg_eclipse_swt_custom_LineStyleEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_lineGetStyleLorg_eclipse_swt_custom_LineStyleEvent")) test_lineGetStyleLorg_eclipse_swt_custom_LineStyleEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_PopupList.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_PopupList.java
deleted file mode 100644
index 4cb67a5..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_PopupList.java
+++ /dev/null
@@ -1,104 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.custom.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.custom.PopupList
- *
- * @see org.eclipse.swt.custom.PopupList
- */
-public class Test_org_eclipse_swt_custom_PopupList extends SwtTestCase {
-
-public Test_org_eclipse_swt_custom_PopupList(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_Shell() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_Shell not written");
-}
-
-public void test_getFont() {
-	warnUnimpl("Test test_getFont not written");
-}
-
-public void test_getItems() {
-	warnUnimpl("Test test_getItems not written");
-}
-
-public void test_getMinimumWidth() {
-	warnUnimpl("Test test_getMinimumWidth not written");
-}
-
-public void test_openLorg_eclipse_swt_graphics_Rectangle() {
-	warnUnimpl("Test test_openLorg_eclipse_swt_graphics_Rectangle not written");
-}
-
-public void test_selectLjava_lang_String() {
-	warnUnimpl("Test test_selectLjava_lang_String not written");
-}
-
-public void test_setFontLorg_eclipse_swt_graphics_Font() {
-	warnUnimpl("Test test_setFontLorg_eclipse_swt_graphics_Font not written");
-}
-
-public void test_setItems$Ljava_lang_String() {
-	warnUnimpl("Test test_setItems$Ljava_lang_String not written");
-}
-
-public void test_setMinimumWidthI() {
-	warnUnimpl("Test test_setMinimumWidthI not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_custom_PopupList((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_Shell");
-	methodNames.addElement("test_getFont");
-	methodNames.addElement("test_getItems");
-	methodNames.addElement("test_getMinimumWidth");
-	methodNames.addElement("test_openLorg_eclipse_swt_graphics_Rectangle");
-	methodNames.addElement("test_selectLjava_lang_String");
-	methodNames.addElement("test_setFontLorg_eclipse_swt_graphics_Font");
-	methodNames.addElement("test_setItems$Ljava_lang_String");
-	methodNames.addElement("test_setMinimumWidthI");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_Shell")) test_ConstructorLorg_eclipse_swt_widgets_Shell();
-	else if (getName().equals("test_getFont")) test_getFont();
-	else if (getName().equals("test_getItems")) test_getItems();
-	else if (getName().equals("test_getMinimumWidth")) test_getMinimumWidth();
-	else if (getName().equals("test_openLorg_eclipse_swt_graphics_Rectangle")) test_openLorg_eclipse_swt_graphics_Rectangle();
-	else if (getName().equals("test_selectLjava_lang_String")) test_selectLjava_lang_String();
-	else if (getName().equals("test_setFontLorg_eclipse_swt_graphics_Font")) test_setFontLorg_eclipse_swt_graphics_Font();
-	else if (getName().equals("test_setItems$Ljava_lang_String")) test_setItems$Ljava_lang_String();
-	else if (getName().equals("test_setMinimumWidthI")) test_setMinimumWidthI();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_ST.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_ST.java
deleted file mode 100644
index 4b040d6..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_ST.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.custom.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.custom.ST
- *
- * @see org.eclipse.swt.custom.ST
- */
-public class Test_org_eclipse_swt_custom_ST extends SwtTestCase {
-
-public Test_org_eclipse_swt_custom_ST(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_Constructor() {
-	// doesn't make sense to test this, ST is constants class
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_custom_ST((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_Constructor");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_Constructor")) test_Constructor();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_SashForm.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_SashForm.java
deleted file mode 100644
index 05dbcbd..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_SashForm.java
+++ /dev/null
@@ -1,114 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.custom.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.custom.SashForm
- *
- * @see org.eclipse.swt.custom.SashForm
- */
-public class Test_org_eclipse_swt_custom_SashForm extends Test_org_eclipse_swt_widgets_Composite {
-
-public Test_org_eclipse_swt_custom_SashForm(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_CompositeI() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_CompositeI not written");
-}
-
-public void test_computeSizeIIZ() {
-	warnUnimpl("Test test_computeSizeIIZ not written");
-}
-
-public void test_getOrientation() {
-	warnUnimpl("Test test_getOrientation not written");
-}
-
-public void test_getMaximizedControl() {
-	warnUnimpl("Test test_getMaximizedControl not written");
-}
-
-public void test_getWeights() {
-	warnUnimpl("Test test_getWeights not written");
-}
-
-public void test_layoutZ() {
-	warnUnimpl("Test test_layoutZ not written");
-}
-
-public void test_setOrientationI() {
-	warnUnimpl("Test test_setOrientationI not written");
-}
-
-public void test_setLayoutLorg_eclipse_swt_widgets_Layout() {
-	warnUnimpl("Test test_setLayoutLorg_eclipse_swt_widgets_Layout not written");
-}
-
-public void test_setMaximizedControlLorg_eclipse_swt_widgets_Control() {
-	warnUnimpl("Test test_setMaximizedControlLorg_eclipse_swt_widgets_Control not written");
-}
-
-public void test_setWeights$I() {
-	warnUnimpl("Test test_setWeights$I not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_custom_SashForm((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_CompositeI");
-	methodNames.addElement("test_computeSizeIIZ");
-	methodNames.addElement("test_getOrientation");
-	methodNames.addElement("test_getMaximizedControl");
-	methodNames.addElement("test_getWeights");
-	methodNames.addElement("test_layoutZ");
-	methodNames.addElement("test_setOrientationI");
-	methodNames.addElement("test_setLayoutLorg_eclipse_swt_widgets_Layout");
-	methodNames.addElement("test_setMaximizedControlLorg_eclipse_swt_widgets_Control");
-	methodNames.addElement("test_setWeights$I");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Composite.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_CompositeI")) test_ConstructorLorg_eclipse_swt_widgets_CompositeI();
-	else if (getName().equals("test_computeSizeIIZ")) test_computeSizeIIZ();
-	else if (getName().equals("test_getOrientation")) test_getOrientation();
-	else if (getName().equals("test_getMaximizedControl")) test_getMaximizedControl();
-	else if (getName().equals("test_getWeights")) test_getWeights();
-	else if (getName().equals("test_layoutZ")) test_layoutZ();
-	else if (getName().equals("test_setOrientationI")) test_setOrientationI();
-	else if (getName().equals("test_setLayoutLorg_eclipse_swt_widgets_Layout")) test_setLayoutLorg_eclipse_swt_widgets_Layout();
-	else if (getName().equals("test_setMaximizedControlLorg_eclipse_swt_widgets_Control")) test_setMaximizedControlLorg_eclipse_swt_widgets_Control();
-	else if (getName().equals("test_setWeights$I")) test_setWeights$I();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_ScrolledComposite.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_ScrolledComposite.java
deleted file mode 100644
index 50f9a1f..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_ScrolledComposite.java
+++ /dev/null
@@ -1,132 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.custom.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.custom.ScrolledComposite
- *
- * @see org.eclipse.swt.custom.ScrolledComposite
- */
-public class Test_org_eclipse_swt_custom_ScrolledComposite extends Test_org_eclipse_swt_widgets_Composite {
-
-public Test_org_eclipse_swt_custom_ScrolledComposite(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_CompositeI() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_CompositeI not written");
-}
-
-public void test_getAlwaysShowScrollBars() {
-	warnUnimpl("Test test_getAlwaysShowScrollBars not written");
-}
-
-public void test_getContent() {
-	warnUnimpl("Test test_getContent not written");
-}
-
-public void test_layoutZ() {
-	warnUnimpl("Test test_layoutZ not written");
-}
-
-public void test_setAlwaysShowScrollBarsZ() {
-	warnUnimpl("Test test_setAlwaysShowScrollBarsZ not written");
-}
-
-public void test_setContentLorg_eclipse_swt_widgets_Control() {
-	warnUnimpl("Test test_setContentLorg_eclipse_swt_widgets_Control not written");
-}
-
-public void test_setExpandHorizontalZ() {
-	warnUnimpl("Test test_setExpandHorizontalZ not written");
-}
-
-public void test_setExpandVerticalZ() {
-	warnUnimpl("Test test_setExpandVerticalZ not written");
-}
-
-public void test_setLayoutLorg_eclipse_swt_widgets_Layout() {
-	warnUnimpl("Test test_setLayoutLorg_eclipse_swt_widgets_Layout not written");
-}
-
-public void test_setMinHeightI() {
-	warnUnimpl("Test test_setMinHeightI not written");
-}
-
-public void test_setMinSizeLorg_eclipse_swt_graphics_Point() {
-	warnUnimpl("Test test_setMinSizeLorg_eclipse_swt_graphics_Point not written");
-}
-
-public void test_setMinSizeII() {
-	warnUnimpl("Test test_setMinSizeII not written");
-}
-
-public void test_setMinWidthI() {
-	warnUnimpl("Test test_setMinWidthI not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_custom_ScrolledComposite((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_CompositeI");
-	methodNames.addElement("test_getAlwaysShowScrollBars");
-	methodNames.addElement("test_getContent");
-	methodNames.addElement("test_layoutZ");
-	methodNames.addElement("test_setAlwaysShowScrollBarsZ");
-	methodNames.addElement("test_setContentLorg_eclipse_swt_widgets_Control");
-	methodNames.addElement("test_setExpandHorizontalZ");
-	methodNames.addElement("test_setExpandVerticalZ");
-	methodNames.addElement("test_setLayoutLorg_eclipse_swt_widgets_Layout");
-	methodNames.addElement("test_setMinHeightI");
-	methodNames.addElement("test_setMinSizeLorg_eclipse_swt_graphics_Point");
-	methodNames.addElement("test_setMinSizeII");
-	methodNames.addElement("test_setMinWidthI");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Composite.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_CompositeI")) test_ConstructorLorg_eclipse_swt_widgets_CompositeI();
-	else if (getName().equals("test_getAlwaysShowScrollBars")) test_getAlwaysShowScrollBars();
-	else if (getName().equals("test_getContent")) test_getContent();
-	else if (getName().equals("test_layoutZ")) test_layoutZ();
-	else if (getName().equals("test_setAlwaysShowScrollBarsZ")) test_setAlwaysShowScrollBarsZ();
-	else if (getName().equals("test_setContentLorg_eclipse_swt_widgets_Control")) test_setContentLorg_eclipse_swt_widgets_Control();
-	else if (getName().equals("test_setExpandHorizontalZ")) test_setExpandHorizontalZ();
-	else if (getName().equals("test_setExpandVerticalZ")) test_setExpandVerticalZ();
-	else if (getName().equals("test_setLayoutLorg_eclipse_swt_widgets_Layout")) test_setLayoutLorg_eclipse_swt_widgets_Layout();
-	else if (getName().equals("test_setMinHeightI")) test_setMinHeightI();
-	else if (getName().equals("test_setMinSizeLorg_eclipse_swt_graphics_Point")) test_setMinSizeLorg_eclipse_swt_graphics_Point();
-	else if (getName().equals("test_setMinSizeII")) test_setMinSizeII();
-	else if (getName().equals("test_setMinWidthI")) test_setMinWidthI();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_StackLayout.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_StackLayout.java
deleted file mode 100644
index a0083c6..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_StackLayout.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.custom.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.custom.StackLayout
- *
- * @see org.eclipse.swt.custom.StackLayout
- */
-public class Test_org_eclipse_swt_custom_StackLayout extends Test_org_eclipse_swt_widgets_Layout {
-
-public Test_org_eclipse_swt_custom_StackLayout(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_Constructor() {
-	warnUnimpl("Test test_Constructor not written");
-}
-
-public void test_computeSizeLorg_eclipse_swt_widgets_CompositeIIZ() {
-	warnUnimpl("Test test_computeSizeLorg_eclipse_swt_widgets_CompositeIIZ not written");
-}
-
-public void test_layoutLorg_eclipse_swt_widgets_CompositeZ() {
-	warnUnimpl("Test test_layoutLorg_eclipse_swt_widgets_CompositeZ not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_custom_StackLayout((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_Constructor");
-	methodNames.addElement("test_computeSizeLorg_eclipse_swt_widgets_CompositeIIZ");
-	methodNames.addElement("test_layoutLorg_eclipse_swt_widgets_CompositeZ");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Layout.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_Constructor")) test_Constructor();
-	else if (getName().equals("test_computeSizeLorg_eclipse_swt_widgets_CompositeIIZ")) test_computeSizeLorg_eclipse_swt_widgets_CompositeIIZ();
-	else if (getName().equals("test_layoutLorg_eclipse_swt_widgets_CompositeZ")) test_layoutLorg_eclipse_swt_widgets_CompositeZ();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_StyleRange.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_StyleRange.java
deleted file mode 100644
index 9c9f49c..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_StyleRange.java
+++ /dev/null
@@ -1,175 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.custom.*;
-import org.eclipse.swt.widgets.*;
-import junit.framework.*;
-import junit.textui.*;
-import java.util.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.custom.StyleRange
- *
- * @see org.eclipse.swt.custom.StyleRange
- */
-public class Test_org_eclipse_swt_custom_StyleRange extends SwtTestCase {
-	final static RGB RED = new RGB(255,0,0);
-	final static RGB BLUE = new RGB(0,0,255);
-	final static RGB GREEN = new RGB(0,255,0);
-	Hashtable colors = new Hashtable();
-public Test_org_eclipse_swt_custom_StyleRange(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-private Color getColor(RGB rgb) {
-	return (Color)colors.get(rgb);
-}
-protected void initializeColors() {
-	Display display = Display.getDefault();
-	colors.put(RED, new Color (display, RED));
-	colors.put(GREEN, new Color (display, GREEN));
-	colors.put(BLUE, new Color (display, BLUE));
-}
-
-protected void setUp() {
-	initializeColors();
-}
-
-protected void tearDown() {
-	Enumeration enum = colors.keys();
-	while (enum.hasMoreElements()) {
-		Color color = (Color)colors.get((RGB)enum.nextElement());
-		color.dispose();
-	}
-}
-
-public void test_Constructor() {
-	StyleRange styleRange = new StyleRange();
-	assertTrue(":a:", styleRange.start == 0);
-	assertTrue(":a:", styleRange.length == 0);
-	assertTrue(":a:", styleRange.foreground == null);
-	assertTrue(":a:", styleRange.background == null);
-	assertTrue(":a:", styleRange.fontStyle == SWT.NORMAL);
-}
-
-public void test_ConstructorIILorg_eclipse_swt_graphics_ColorLorg_eclipse_swt_graphics_Color() {
-	StyleRange styleRange = new StyleRange(5, 10, getColor(RED), getColor(BLUE));
-	assertTrue(":b:", styleRange.start == 5);
-	assertTrue(":b:", styleRange.length == 10);
-	assertTrue(":b:", styleRange.foreground == getColor(RED));
-	assertTrue(":b:", styleRange.background == getColor(BLUE));
-	assertTrue(":b:", styleRange.fontStyle == SWT.NORMAL);
-}
-
-public void test_ConstructorIILorg_eclipse_swt_graphics_ColorLorg_eclipse_swt_graphics_ColorI() {
-	StyleRange styleRange = new StyleRange(5, 10, getColor(RED), getColor(BLUE), SWT.BOLD);
-	assertTrue(":c:", styleRange.start == 5);
-	assertTrue(":c:", styleRange.length == 10);
-	assertTrue(":c:", styleRange.foreground == getColor(RED));
-	assertTrue(":c:", styleRange.background == getColor(BLUE));
-	assertTrue(":c:", styleRange.fontStyle == SWT.BOLD);
-}
-
-public void test_equalsLjava_lang_Object() {
-	StyleRange styleRangeA = new StyleRange(5, 10, getColor(RED), getColor(BLUE), SWT.BOLD);
-	StyleRange styleRangeB = new StyleRange(5, 10, getColor(RED), getColor(BLUE), SWT.BOLD);
-	StyleRange styleRangeC = new StyleRange(5, 10, getColor(BLUE), getColor(BLUE), SWT.BOLD);
-	StyleRange styleRangeD = new StyleRange(6, 10, getColor(RED), getColor(BLUE), SWT.BOLD);
-	StyleRange styleRangeE = new StyleRange(5, 11, getColor(RED), getColor(BLUE), SWT.BOLD);
-	StyleRange styleRangeF = new StyleRange(5, 11, getColor(RED), getColor(RED), SWT.BOLD);
-	StyleRange styleRangeG = new StyleRange(5, 11, getColor(RED), getColor(BLUE), SWT.NORMAL);
-	assertTrue(":d:", styleRangeA.equals(styleRangeB));
-	assertTrue(":d:",!styleRangeA.equals(styleRangeC));
-	assertTrue(":d:",!styleRangeA.equals(styleRangeD));
-	assertTrue(":d:",!styleRangeA.equals(styleRangeE));
-	assertTrue(":d:",!styleRangeA.equals(styleRangeF));
-	assertTrue(":d:",!styleRangeA.equals(styleRangeG));
-}
-
-public void test_hashCode() {
-	// does not make sense to test
-}
-
-public void test_isUnstyled() {
-	StyleRange styleRangeA = new StyleRange(5, 10, null, null, SWT.NORMAL);
-	StyleRange styleRangeB = new StyleRange(5, 10, getColor(RED), null, SWT.NORMAL);
-	StyleRange styleRangeC = new StyleRange(5, 10, null, null, SWT.BOLD);
-	StyleRange styleRangeD = new StyleRange(6, 10, null, getColor(BLUE), SWT.NORMAL);
-	StyleRange styleRangeE = new StyleRange(5, 10, null, null);
-	assertTrue(":e:", styleRangeA.isUnstyled());
-	assertTrue(":e:",!styleRangeB.isUnstyled());
-	assertTrue(":e:",!styleRangeC.isUnstyled());
-	assertTrue(":e:",!styleRangeD.isUnstyled());
-	assertTrue(":e:", styleRangeE.isUnstyled());
-}
-
-public void test_similarToLorg_eclipse_swt_custom_StyleRange() {
-	StyleRange styleRangeA = new StyleRange(6, 10, getColor(RED), getColor(BLUE), SWT.NORMAL);
-	StyleRange styleRangeB = new StyleRange(5, 5, getColor(RED), getColor(BLUE), SWT.NORMAL);
-	StyleRange styleRangeC = new StyleRange(6, 10, getColor(RED), getColor(BLUE), SWT.NORMAL);
-	StyleRange styleRangeD = new StyleRange(6, 10, getColor(BLUE), getColor(BLUE), SWT.NORMAL);
-	StyleRange styleRangeE = new StyleRange(6, 10, getColor(RED), getColor(RED), SWT.NORMAL);
-	StyleRange styleRangeF = new StyleRange(6, 10, getColor(RED), getColor(BLUE), SWT.BOLD);
-	assertTrue(":f:", styleRangeA.similarTo(styleRangeB));
-	assertTrue(":f:", styleRangeA.similarTo(styleRangeC));
-	assertTrue(":f:", !styleRangeA.similarTo(styleRangeD));
-	assertTrue(":f:", !styleRangeA.similarTo(styleRangeE));
-	assertTrue(":f:", !styleRangeA.similarTo(styleRangeF));
-}
-
-public void test_clone() {
-	StyleRange styleRangeA = new StyleRange(6, 10, null, getColor(BLUE), SWT.NORMAL);
-	StyleRange styleRangeB = (StyleRange)styleRangeA.clone();
-	assertTrue(":g:", styleRangeA.equals(styleRangeB));
-}
-
-public void test_toString() {
-	StyleRange styleRange = new StyleRange(6, 10, null, getColor(BLUE), SWT.NORMAL);
-	styleRange.toString();
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_custom_StyleRange((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_Constructor");
-	methodNames.addElement("test_ConstructorIILorg_eclipse_swt_graphics_ColorLorg_eclipse_swt_graphics_Color");
-	methodNames.addElement("test_ConstructorIILorg_eclipse_swt_graphics_ColorLorg_eclipse_swt_graphics_ColorI");
-	methodNames.addElement("test_equalsLjava_lang_Object");
-	methodNames.addElement("test_hashCode");
-	methodNames.addElement("test_isUnstyled");
-	methodNames.addElement("test_similarToLorg_eclipse_swt_custom_StyleRange");
-	methodNames.addElement("test_clone");
-	methodNames.addElement("test_toString");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_Constructor")) test_Constructor();
-	else if (getName().equals("test_ConstructorIILorg_eclipse_swt_graphics_ColorLorg_eclipse_swt_graphics_Color")) test_ConstructorIILorg_eclipse_swt_graphics_ColorLorg_eclipse_swt_graphics_Color();
-	else if (getName().equals("test_ConstructorIILorg_eclipse_swt_graphics_ColorLorg_eclipse_swt_graphics_ColorI")) test_ConstructorIILorg_eclipse_swt_graphics_ColorLorg_eclipse_swt_graphics_ColorI();
-	else if (getName().equals("test_equalsLjava_lang_Object")) test_equalsLjava_lang_Object();
-	else if (getName().equals("test_hashCode")) test_hashCode();
-	else if (getName().equals("test_isUnstyled")) test_isUnstyled();
-	else if (getName().equals("test_similarToLorg_eclipse_swt_custom_StyleRange")) test_similarToLorg_eclipse_swt_custom_StyleRange();
-	else if (getName().equals("test_clone")) test_clone();
-	else if (getName().equals("test_toString")) test_toString();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_StyledText.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_StyledText.java
deleted file mode 100644
index 8635069..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_StyledText.java
+++ /dev/null
@@ -1,4281 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import java.util.*;
-
-import junit.framework.*;
-import junit.textui.*;
-import org.eclipse.swt.*;
-import org.eclipse.swt.custom.*;
-import org.eclipse.swt.dnd.*;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.printing.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.internal.BidiUtil;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.custom.StyledText
- *
- * @see org.eclipse.swt.custom.StyledText
- */
-public class Test_org_eclipse_swt_custom_StyledText extends Test_org_eclipse_swt_widgets_Canvas {
-
-StyledText text;
-final static RGB RED = new RGB(255,0,0);
-final static RGB BLUE = new RGB(0,0,255);
-final static RGB GREEN = new RGB(0,255,0);
-final static RGB YELLOW = new RGB(255,255,0);
-final static RGB CYAN = new RGB(0,255,255);
-final static RGB PURPLE = new RGB(255,0,255);
-Hashtable colors = new Hashtable();
-private boolean listenerCalled;	
-private boolean listener2Called;
-
-public Test_org_eclipse_swt_custom_StyledText(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-	initializeColors();
-	text = new StyledText(shell, SWT.NULL);
-	setWidget(text);
-}
-
-protected void tearDown() {
-	Enumeration enum = colors.keys();
-	while (enum.hasMoreElements()) {
-		Color color = (Color)colors.get((RGB)enum.nextElement());
-		color.dispose();
-	}
-	super.tearDown();
-	
-}
-
-// this method must not be public so that the auto-gen tool keeps it
-private StyleRange[] defaultStyles() {
-	return new StyleRange[] {
-		getStyle(0,48,RED,YELLOW), 
-		getStyle(58,10,BLUE,CYAN), 
-		getStyle(68,10,GREEN,PURPLE)};
-}
-// this method must not be public so that the auto-gen tool keeps it
-protected void getLineBackgrounds() {
-	for (int i=0; i<text.getLineCount(); i++) {
-		text.getLineBackground(i);
-	}
-}
-// this method must not be public so that the auto-gen tool keeps it
-private String textString() {
-	return "This is the text component in testing\nNew Line1\nNew Line2\nNew Line3\nNew Line4.";
-}
-private boolean isBidi() {
-	return BidiUtil.isBidiPlatform();
-}
-// this method must not be public so that the auto-gen tool keeps it
-private StyleRange getStyle(int start, int length, RGB fg, RGB bg) {
-	StyleRange style = new StyleRange();
-	style.start = start;
-	style.length = length;
-	if (fg != null) style.foreground = getColor(fg);
-	else style.foreground = null;
-	if (bg != null) style.background = getColor(bg);
-	else style.background = null;
-	return style;
-}
-// this method must not be public so that the auto-gen tool keeps it
-private Color getColor(RGB rgb) {
-	return (Color)colors.get(rgb);
-}
-// this method must not be public so that the auto-gen tool keeps it
-protected void initializeColors() {
-	Display display = Display.getDefault();
-	colors.put(RED, new Color (display, RED));
-	colors.put(BLUE, new Color (display, BLUE));
-	colors.put(GREEN, new Color (display, GREEN));
-	colors.put(YELLOW, new Color (display, YELLOW));
-	colors.put(CYAN, new Color (display, CYAN));
-	colors.put(PURPLE, new Color (display, PURPLE));
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_CompositeI(){
-	StyledText text = new StyledText(shell, SWT.READ_ONLY);
-	
-	assertTrue(":a:", text.getEditable() == false);
-	text.dispose();
-
-	text = new StyledText(shell, SWT.H_SCROLL | SWT.V_SCROLL | SWT.SINGLE);
-	assertTrue(":b:", text.getVerticalBar() == null);
-	assertTrue(":c:", text.getHorizontalBar() == null);
-	text.dispose();
-}
-
-public void test_addExtendedModifyListenerLorg_eclipse_swt_custom_ExtendedModifyListener() {
-	final String line = "Line1";
-	boolean exceptionThrown = false;
-	ExtendedModifyListener listener = new ExtendedModifyListener() {
-		public void modifyText(ExtendedModifyEvent event) {
-			listenerCalled = true;
-			assertEquals("ExtendedModify event data invalid", 0, event.start);
-			assertEquals("ExtendedModify event data invalid", line.length(), event.length);
-			assertEquals("ExtendedModify event data invalid", "", event.replacedText);
-		}
-	};
-	
-	try {
-		text.addExtendedModifyListener(null);
-	}
-	catch (IllegalArgumentException e) {
-		exceptionThrown = true;
-	}
-	assertTrue("Expected exception not thrown", exceptionThrown);
-		
-	// test whether all content modifying API methods send an ExtendedModify event
-	text.addExtendedModifyListener(listener);
-
-	listenerCalled = false;
-	text.append(line);	
-	assertTrue("append does not send event", listenerCalled);
-
-	listenerCalled = false;
-	text.insert(line);	
-	assertTrue("replaceTextRange does not send event", listenerCalled);
-
-	listenerCalled = false;
-	text.removeExtendedModifyListener(listener);
-	listener = new ExtendedModifyListener() {
-		public void modifyText(ExtendedModifyEvent event) {
-			listenerCalled = true;
-			assertEquals("ExtendedModify event data invalid", 0, event.start);
-			assertEquals("ExtendedModify event data invalid", line.length(), event.length);
-			assertEquals("ExtendedModify event data invalid", line.substring(0, 1), event.replacedText);
-		}
-	};
-	text.addExtendedModifyListener(listener);
-	text.replaceTextRange(0, 1, line);	
-	assertTrue("replaceTextRange does not send event", listenerCalled);
-
-	listenerCalled = false;
-	text.removeExtendedModifyListener(listener);
-	listener = new ExtendedModifyListener() {
-		public void modifyText(ExtendedModifyEvent event) {
-			listenerCalled = true;
-			assertEquals("ExtendedModify event data invalid", 0, event.start);
-			assertEquals("ExtendedModify event data invalid", line.length(), event.length);
-			assertEquals("ExtendedModify event data invalid", line + line.substring(1, line.length()) + line, event.replacedText);
-		}
-	};
-	text.addExtendedModifyListener(listener);
-	text.setText(line);	
-	assertTrue("setText does not send event", listenerCalled);
-
-	listenerCalled = false;	
-	text.removeExtendedModifyListener(listener);
-	// cause StyledText to call the listener. 
-	text.setText(line);	
-	assertTrue("Listener not removed", listenerCalled == false);
-}
-
-public void test_setKeyBindingII(){
-	text.setKeyBinding(SWT.DEL, SWT.NULL);
-	assertTrue(":a:", text.getKeyBinding(SWT.DEL) == SWT.NULL);
-	text.setKeyBinding(SWT.DEL, ST.LINE_UP);
-	assertTrue(":b:", text.getKeyBinding(SWT.DEL) == ST.LINE_UP);
-	text.setKeyBinding(SWT.DEL | SWT.SHIFT, ST.SELECT_PAGE_UP);
-	assertTrue(":c:", text.getKeyBinding(SWT.DEL | SWT.SHIFT) == ST.SELECT_PAGE_UP);
-	text.setKeyBinding(SWT.DEL | SWT.SHIFT, ST.PAGE_UP);
-	assertTrue(":d:", text.getKeyBinding(SWT.DEL | SWT.SHIFT) == ST.PAGE_UP);
-	text.setKeyBinding(-1, ST.PAGE_UP);
-	text.setKeyBinding(-1, -1);
-}
-
-public void test_addBidiSegmentListenerLorg_eclipse_swt_custom_BidiSegmentListener() {
-	String line = "Line1";
-	boolean exceptionThrown = false;
-	BidiSegmentListener listener = new BidiSegmentListener() {
-		public void lineGetSegments(BidiSegmentEvent event) {
-			listenerCalled = true;
-		}
-	};
-	
-	try {
-		text.addBidiSegmentListener(null);
-	}
-	catch (IllegalArgumentException e) {
-		exceptionThrown = true;
-	}
-	assertTrue("Expected exception not thrown", exceptionThrown);
-		
-	listenerCalled = false;
-	text.setText(line);	
-	text.addBidiSegmentListener(listener);
-	// cause StyledText to call the BidiSegmentListener. 
-	text.getLocationAtOffset(0);
-	if (isBidi()) {
-		assertTrue("Listener not called", listenerCalled);
-	}
-	else {
-		assertTrue("Listener called when it shouldn't be", listenerCalled == false);
-	}
-	listenerCalled = false;	
-	text.removeBidiSegmentListener(listener);
-	// cause StyledText to call the BidiSegmentListener. 
-	text.getLocationAtOffset(0);
-	assertTrue("Listener not removed", listenerCalled == false);
-}
-
-public void test_addLineBackgroundListenerLorg_eclipse_swt_custom_LineBackgroundListener() {
-	String line = "Line1";
-	boolean exceptionThrown = false;
-	LineBackgroundListener listener = new LineBackgroundListener() {
-		public void lineGetBackground(LineBackgroundEvent event) {
-			listenerCalled = true;
-		}
-	};
-	
-	try {
-		text.addLineBackgroundListener(null);
-	}
-	catch (IllegalArgumentException e) {
-		exceptionThrown = true;
-	}
-	assertTrue("Expected exception not thrown", exceptionThrown);
-		
-	listenerCalled = false;
-	text.setText(line);	
-	text.addLineBackgroundListener(listener);
-	// cause StyledText to call the listener. 
-	text.setSelection(0, text.getCharCount());
-	text.copy();
-	assertTrue("Listener not called", listenerCalled);
-
-	listenerCalled = false;	
-	text.removeLineBackgroundListener(listener);
-	// cause StyledText to call the listener. 
-	text.setText(line);	
-	text.setSelection(0, text.getCharCount());
-	text.copy();
-	assertTrue("Listener not removed", listenerCalled == false);
-}
-
-public void test_addLineStyleListenerLorg_eclipse_swt_custom_LineStyleListener() {
-	String line = "Line1";
-	boolean exceptionThrown = false;
-	LineStyleListener listener = new LineStyleListener() {
-		public void lineGetStyle(LineStyleEvent event) {
-			listenerCalled = true;
-		}
-	};
-	
-	try {
-		text.addLineStyleListener(null);
-	}
-	catch (IllegalArgumentException e) {
-		exceptionThrown = true;
-	}
-	assertTrue("Expected exception not thrown", exceptionThrown);
-		
-	listenerCalled = false;
-	text.setText(line);	
-	text.addLineStyleListener(listener);
-	// cause StyledText to call the listener. 
-	text.setSelection(0, text.getCharCount());
-	text.copy();
-	assertTrue("Listener not called", listenerCalled);
-
-	listenerCalled = false;	
-	text.removeLineStyleListener(listener);
-	// cause StyledText to call the listener. 
-	text.setText(line);	
-	text.setSelection(0, text.getCharCount());
-	text.copy();
-	assertTrue("Listener not removed", listenerCalled == false);
-}
-
-public void test_addModifyListenerLorg_eclipse_swt_events_ModifyListener() {
-	String line = "Line1";
-	boolean exceptionThrown = false;
-	ModifyListener listener = new ModifyListener() {
-		public void modifyText(ModifyEvent event) {
-			listenerCalled = true;
-		}
-	};
-	
-	try {
-		text.addModifyListener(null);
-	}
-	catch (IllegalArgumentException e) {
-		exceptionThrown = true;
-	}
-	assertTrue("Expected exception not thrown", exceptionThrown);
-	
-	// test whether all content modifying API methods send a Modify event	
-	text.addModifyListener(listener);
-
-	listenerCalled = false;
-	text.append(line);	
-	assertTrue("append does not send event", listenerCalled);
-
-	listenerCalled = false;
-	text.insert(line);	
-	assertTrue("replaceTextRange does not send event", listenerCalled);
-
-	listenerCalled = false;
-	text.replaceTextRange(0, 1, line);	
-	assertTrue("replaceTextRange does not send event", listenerCalled);
-
-	listenerCalled = false;
-	text.setText(line);	
-	assertTrue("setText does not send event", listenerCalled);
-
-	listenerCalled = false;	
-	text.removeModifyListener(listener);
-	// cause StyledText to call the listener. 
-	text.setText(line);	
-	assertTrue("Listener not removed", listenerCalled == false);
-}
-
-public void test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener() {
-	String line = "Line1";
-	boolean exceptionThrown = false;
-	SelectionListener listener = new SelectionListener() {
-		public void widgetSelected(SelectionEvent event) {
-			listenerCalled = true;
-		}
-		public void widgetDefaultSelected(SelectionEvent event) {
-			listener2Called = true;
-		}
-	};
-	
-	try {
-		text.addSelectionListener(null);
-	}
-	catch (IllegalArgumentException e) {
-		exceptionThrown = true;
-	}
-	assertTrue("Expected exception not thrown", exceptionThrown);
-		
-	text.setText(line);	
-	listenerCalled = false;
-	listener2Called = false;	
-	text.addSelectionListener(listener);
-	// cause StyledText to call the listener. 
-	text.invokeAction(ST.SELECT_LINE_END);
-	assertTrue("Listener not called", listenerCalled);
-	assertTrue("Listener called unexpectedly", listener2Called == false);
-
-	listenerCalled = false;	
-	listener2Called = false;	
-	text.removeSelectionListener(listener);
-	// cause StyledText to call the listener. 
-	text.invokeAction(ST.SELECT_LINE_END);
-	assertTrue("Listener not removed", listenerCalled == false);
-	assertTrue("Listener called unexpectedly", listener2Called == false);
-}
-
-public void test_addVerifyKeyListenerLorg_eclipse_swt_custom_VerifyKeyListener() {
-	String line = "Line1";
-	boolean exceptionThrown = false;
-	VerifyKeyListener listener = new VerifyKeyListener() {
-		public void verifyKey(VerifyEvent event) {
-		}
-	};
-	
-	try {
-		text.addVerifyKeyListener(null);
-	}
-	catch (IllegalArgumentException e) {
-		exceptionThrown = true;
-	}
-	assertTrue("Expected exception not thrown", exceptionThrown);
-
-	// only test whether listener can be added and removed.
-	// can't test listener because VerifyKey is user driven.
-	text.addVerifyKeyListener(listener);
-	text.removeVerifyKeyListener(listener);
-}
-
-public void test_addVerifyListenerLorg_eclipse_swt_events_VerifyListener() {
-	final String line = "Line1";
-	final String newLine = "NewLine1";
-	final int textLength;
-	boolean exceptionThrown = false;
-	VerifyListener listener = new VerifyListener() {
-		public void verifyText(VerifyEvent event) {
-			listenerCalled = true;
-			assertEquals("Verify event data invalid", 0, event.start);
-			assertEquals("Verify event data invalid", 0, event.end);
-			assertEquals("Verify event data invalid", line, event.text);
-			event.start = 2;
-			event.end = 5;
-			event.text = newLine;
-		}
-	};
-	
-	try {
-		text.addVerifyListener(null);
-	}
-	catch (IllegalArgumentException e) {
-		exceptionThrown = true;
-	}
-	assertTrue("Expected exception not thrown", exceptionThrown);
-
-	// test whether all content modifying API sends a Verify event
-	text.addVerifyListener(listener);
-
-	listenerCalled = false;
-	text.append(line);	
-	assertTrue("append does not send event", listenerCalled);
-	assertEquals("Listener failed", newLine, text.getText());
-
-	listenerCalled = false;
-	text.insert(line);	
-	assertTrue("replaceTextRange does not send event", listenerCalled);
-	assertEquals("Listener failed", newLine + newLine, text.getText());
-
-	listenerCalled = false;
-	text.removeVerifyListener(listener);
-	listener = new VerifyListener() {
-		public void verifyText(VerifyEvent event) {
-			listenerCalled = true;
-			assertEquals("Verify event data invalid", 0, event.start);
-			assertEquals("Verify event data invalid", 1, event.end);
-			assertEquals("Verify event data invalid", line, event.text);
-			event.start = 2;
-			event.end = 5;
-			event.text = newLine;
-		}
-	};
-	text.addVerifyListener(listener);
-	textLength = text.getCharCount() - 1 + newLine.length();
-	text.replaceTextRange(0, 1, line);	
-	assertTrue("replaceTextRange does not send event", listenerCalled);
-	assertEquals("Listener failed", newLine + newLine.substring(1, newLine.length()) + newLine, text.getText());
-
-	listenerCalled = false;
-	text.removeVerifyListener(listener);
-	listener = new VerifyListener() {
-		public void verifyText(VerifyEvent event) {
-			listenerCalled = true;
-			assertEquals("Verify event data invalid", 0, event.start);
-			assertEquals("Verify event data invalid", textLength, event.end);
-			assertEquals("Verify event data invalid", line, event.text);
-			event.start = 2;
-			event.end = 5;
-			event.text = newLine;
-		}
-	};
-	text.addVerifyListener(listener);
-	text.setText(line);	
-	assertTrue("setText does not send event", listenerCalled);
-	assertEquals("Listener failed", newLine, text.getText());
-
-	text.removeVerifyListener(listener);
-
-	listenerCalled = false;	
-	listener = new VerifyListener() {
-		public void verifyText(VerifyEvent event) {
-			listenerCalled = true;
-			assertEquals("Verify event data invalid", 2, event.start);
-			assertEquals("Verify event data invalid", newLine.length(), event.end);
-			assertEquals("Verify event data invalid", line, event.text);
-			event.doit = false;
-		}
-	};
-	text.addVerifyListener(listener);
-	// cause StyledText to call the listener. 
-	text.replaceTextRange(2, text.getCharCount() - 2, line);	
-	assertTrue("Listener not called", listenerCalled);
-	assertEquals("Listener failed", newLine, text.getText());
-
-	listenerCalled = false;	
-	text.removeVerifyListener(listener);
-	// cause StyledText to call the listener. 
-	text.setText(line);	
-	assertTrue("Listener not removed", listenerCalled == false);
-}
-
-public void test_appendLjava_lang_String() {
-	boolean exceptionThrown;	
-	String line = "Line1";
-	
-	text.append(line);
-	assertEquals("append to empty text", line, text.getText());
-	
-	exceptionThrown = false;
-	try {
-		text.append(null);
-	}
-	catch (IllegalArgumentException exception) {
-		exceptionThrown = true;
-	}
-	assertTrue("append null string", exceptionThrown);
-
-	text.append("");
-	assertEquals("append empty string", line, text.getText());
-	
-	text.append(line);
-	assertEquals("append non-empty string", line + line, text.getText());
-	
-	text.setText("");
-	String text2 = "line\r";
-	text.append(text2);
-	assertEquals("append string ending with line delimiter", text2, text.getText());
-	
-	String text3 = "line\r\nline3";
-	text.append(text3);
-	assertEquals("append multi line string", text2 + text3, text.getText());	
-}
-
-public void test_computeSizeIIZ() {
-	// inherited test is sufficient
-}
-
-public void test_copy() {
-	Clipboard clipboard = new Clipboard(text.getDisplay());
-	TextTransfer transfer = TextTransfer.getInstance();
-	String clipboardText;
-	String convertedText;
-
-	clipboard.setContents(new String[]{""}, new Transfer[]{transfer});
-	
-	text.setSelectionRange(0, 0);
-	text.copy();	
-	clipboardText = (String) clipboard.getContents(transfer);
-	assertTrue(":a:", clipboardText != null && clipboardText.length() == 0);
-	
-	text.setText("0123456789");
-	text.setSelectionRange(0, 0);
-	text.copy();	
-	clipboardText = (String) clipboard.getContents(transfer);
-	assertTrue(":c:", clipboardText != null && clipboardText.length() == 0);
-	
-
-	text.setSelectionRange(0, 1);
-	text.copy();	
-	clipboardText = (String) clipboard.getContents(transfer);
-	assertTrue(":d:", clipboardText != null && clipboardText.equals("0"));
-	
-	text.setSelectionRange(1, 2);	
-	text.copy();		
-	clipboardText = (String) clipboard.getContents(transfer);
-	assertTrue(":e:", clipboardText != null && clipboardText.equals("12"));
-	
-	// test line delimiter conversion
-	text.setText("\rLine1\nLine2\r\nLine3\n\rLine4\n");
-	text.setSelectionRange(0, text.getCharCount());
-	text.copy();		
-	clipboardText = (String) clipboard.getContents(transfer);
-	if (SwtJunit.isLinux) {
-		convertedText = "\nLine1\nLine2\nLine3\n\nLine4\n";
-	}
-	else {
-		convertedText = "\r\nLine1\r\nLine2\r\nLine3\r\n\r\nLine4\r\n";
-	}
-	assertTrue(":f:", clipboardText != null && clipboardText.equals(convertedText));
-	
-	// test line delimiter conversion
-	text.setText("Line1\r\nLine2");
-	text.setSelectionRange(0, text.getCharCount());
-	text.copy();		
-	clipboardText = (String) clipboard.getContents(transfer);
-	if (SwtJunit.isLinux) {
-		convertedText = "Line1\nLine2";
-	}
-	else {
-		convertedText = "Line1\r\nLine2";
-	}
-	assertTrue(":g:", clipboardText != null && clipboardText.equals(convertedText));
-
-	testRtfCopy();
-	clipboard.dispose();
-}
-
-public void test_cut() {
-	Clipboard clipboard = new Clipboard(text.getDisplay());
-	TextTransfer transfer = TextTransfer.getInstance();
-	String clipboardText;
-	String convertedText;
-
-	clipboard.setContents(new String[]{""}, new Transfer[]{transfer});
-		
-	text.setSelectionRange(0, 0);
-	text.cut();	
-	clipboardText = (String) clipboard.getContents(transfer);
-	assertTrue(":a:", clipboardText != null && clipboardText.length() == 0);
-	
-	text.setText("0123456789");
-	text.setSelectionRange(0, 0);
-	text.cut();	
-	clipboardText = (String) clipboard.getContents(transfer);
-	assertTrue(":c:", clipboardText != null && clipboardText.length() == 0);
-
-	text.setSelectionRange(0, 1);
-	text.cut();	
-	clipboardText = (String) clipboard.getContents(transfer);
-	assertTrue(":d:", clipboardText != null && clipboardText.equals("0"));
-	
-	text.setSelectionRange(1, 2);	
-	text.cut();		
-	clipboardText = (String) clipboard.getContents(transfer);
-	assertTrue(":e:", clipboardText != null && clipboardText.equals("23"));
-	
-	// test line delimiter conversion
-	text.setText("\rLine1\nLine2\r\nLine3\n\rLine4\n");
-	text.setSelectionRange(0, text.getCharCount());
-	text.cut();		
-	clipboardText = (String) clipboard.getContents(transfer);
-	if (SwtJunit.isLinux) {
-		convertedText = "\nLine1\nLine2\nLine3\n\nLine4\n";
-	}
-	else {
-		convertedText = "\r\nLine1\r\nLine2\r\nLine3\r\n\r\nLine4\r\n";
-	}
-	assertTrue(":f:", clipboardText != null && clipboardText.equals(convertedText));
-	
-	// test line delimiter conversion
-	text.setText("Line1\r\nLine2");
-	text.setSelectionRange(0, text.getCharCount());
-	text.cut();		
-	clipboardText = (String) clipboard.getContents(transfer);
-	if (SwtJunit.isLinux) {
-		convertedText = "Line1\nLine2";
-	}
-	else {
-		convertedText = "Line1\r\nLine2";
-	}
-	assertTrue(":g:", clipboardText != null && clipboardText.equals(convertedText));
-
-	clipboard.dispose();
-}
-
-public void test_getBidiColoring() {
-	/// getBidiColoring is deprecated and will be removed.
-	warnUnimpl("Test test_getBidiColoring not written");
-}
-
-public void test_getCaretOffset() {
-	assertTrue(":a:", text.getCaretOffset() == 0);
-	text.setText("Line0\r\n");
-	assertTrue(":b:", text.getCaretOffset() == 0);
-	text.setTopIndex(1);
-	assertTrue(":c:", text.getCaretOffset() == 0);
-
-	text.replaceTextRange(text.getCharCount(), 0, "Line1");
-	assertTrue(":d:", text.getCaretOffset() == 0);
-	String newText = "Line-1\r\n";
-	text.replaceTextRange(0, 0, newText);
-	assertTrue(":e:", text.getCaretOffset() == 0);
-
-	text.setCaretOffset(1);
-	assertTrue(":f:", text.getCaretOffset() == 1);
-	text.replaceTextRange(2, 0, newText);
-	assertTrue(":g:", text.getCaretOffset() == 1);
-	text.replaceTextRange(0, 0, newText);
-	assertTrue(":h:", text.getCaretOffset() == newText.length() + 1);
-}
-
-public void test_getContent() {
-	StyledTextContent content = text.getContent();
-	
-	assertTrue(content != null);
-	content = new StyledTextContent() {
-		public void addTextChangeListener(TextChangeListener listener) {
-		}
-		public int getCharCount() {
-			return 0;
-		}
-		public String getLine(int lineIndex) {
-			return "";
-		}
-		public int getLineAtOffset(int offset) {
-			return 0;
-		}
-		public int getLineCount() {
-			return 0;
-		}
-		public String getLineDelimiter() {
-			return "";
-		}
-		public int getOffsetAtLine(int lineIndex) {
-			return 0;
-		}		
-		public String getTextRange(int start, int length) {
-			return "";
-		}
-		public void removeTextChangeListener(TextChangeListener listener) {
-		}
-		public void replaceTextRange(int start, int replaceLength, String text) {
-		}
-		public void setText(String text) {
-		}
-	};
-	text.setContent(content);
-	assertEquals(content, text.getContent());
-}
-
-public void test_getDoubleClickEnabled() {
-	assertTrue(":a:", text.getDoubleClickEnabled() == true);
-	text.setDoubleClickEnabled(true);
-	assertTrue(":b:", text.getDoubleClickEnabled() == true);
-	text.setDoubleClickEnabled(false);
-	assertTrue(":c:", text.getDoubleClickEnabled() == false);
-	text.setDoubleClickEnabled(false);
-	assertTrue(":d:", text.getDoubleClickEnabled() == false);
-	text.setDoubleClickEnabled(true);
-	assertTrue(":e:", text.getDoubleClickEnabled() == true);
-}
-
-public void test_getEditable() {
-	assertTrue(":a:", text.getEditable() == true);
-	text.setEditable(true);
-	assertTrue(":b:", text.getEditable() == true);
-	text.setEditable(false);
-	assertTrue(":c:", text.getEditable() == false);
-	text.setEditable(false);
-	assertTrue(":d:", text.getEditable() == false);
-	text.setEditable(true);
-	assertTrue(":e:", text.getEditable() == true);
-}
-
-public void test_getHorizontalIndex() {
-	assertTrue(":a:", text.getHorizontalIndex() == 0);
-	text.setHorizontalIndex(-1);
-	assertTrue(":b:", text.getHorizontalIndex() == 0);
-	text.setHorizontalIndex(1);	
-	assertTrue(":c:", text.getHorizontalIndex() == 0);
-	
-	text.setText("Line0");
-	assertTrue(":d:", text.getHorizontalIndex() == 0);
-	text.setHorizontalIndex(-1);	
-	assertTrue(":e:", text.getHorizontalIndex() == 0);
-	text.setHorizontalIndex(1);	
-	assertTrue(":f:", text.getHorizontalIndex() == 1);
-	text.setHorizontalIndex(500);
-	assertTrue(":g:", text.getHorizontalIndex() > 0);
-	text.setHorizontalIndex(-1);
-	assertTrue(":h:", text.getHorizontalIndex() == 0);
-	text.setHorizontalIndex(1);	
-	assertTrue(":i:", text.getHorizontalIndex() == 1);
-	// make sure the widget can be scrolled
-	shell.open();
-	text.setSize(10, 50);
-	text.setText("Line0");
-	text.setHorizontalIndex(1);	
-	assertTrue(":j:", text.getHorizontalIndex() == 1);		
-}
-
-public void test_getHorizontalPixel() {	
-	assertTrue(":a:", text.getHorizontalPixel() == 0);
-	text.setHorizontalIndex(-1);
-	assertTrue(":b:", text.getHorizontalPixel() == 0);
-	text.setHorizontalIndex(1);	
-	assertTrue(":c:", text.getHorizontalPixel() == 0);
-	
-	text.setText("Line0");
-	assertTrue(":d:", text.getHorizontalPixel() == 0);
-	text.setHorizontalIndex(-1);	
-	assertTrue(":e:", text.getHorizontalPixel() == 0);
-	text.setHorizontalIndex(1);	
-	assertTrue(":f:", text.getHorizontalPixel() > 0);
-	text.setHorizontalIndex(-1);
-	assertTrue(":g:", text.getHorizontalPixel() == 0);
-	text.setHorizontalIndex(1);	
-	assertTrue(":h:", text.getHorizontalPixel() > 0);
-	// make sure the widget can be scrolled
-	shell.open();
-	text.setSize(10, 50);
-	text.setText("Line0");
-	text.setHorizontalIndex(1);	
-	assertTrue(":i:", text.getHorizontalPixel() > 0);
-}
-
-public void test_getKeyBindingI() {
-	assertTrue(":a:", text.getKeyBinding(SWT.DEL) == ST.DELETE_NEXT);
-	text.setKeyBinding(SWT.DEL, ST.LINE_UP);
-	assertTrue(":b:", text.getKeyBinding(SWT.DEL) == ST.LINE_UP);
-	text.setKeyBinding(SWT.DEL | SWT.SHIFT, ST.SELECT_PAGE_UP);
-	assertTrue(":c:", text.getKeyBinding(SWT.DEL | SWT.SHIFT) == ST.SELECT_PAGE_UP);
-	text.setKeyBinding(SWT.DEL | SWT.SHIFT, ST.PAGE_UP);
-	assertTrue(":d:", text.getKeyBinding(SWT.DEL | SWT.SHIFT) == ST.PAGE_UP);
-	assertTrue(":e:", text.getKeyBinding(-1) == SWT.NULL);
-	assertTrue(":f:", text.getKeyBinding(SWT.F2) == SWT.NULL);
-}
-
-public void test_getCharCount() {
-	assertTrue(":a:", text.getCharCount() == 0);
-	text.setText("Line0");
-	assertTrue(":b:", text.getCharCount() == 5);
-	text.setText("");
-	assertTrue(":c:", text.getCharCount() == 0);
-	text.setText("Line0\n");
-	assertTrue(":d:", text.getCharCount() == 6);
-}
-
-public void test_getLineBackgroundI() {
-	StyleRange[] styles;
-	
-	String textString = "L1\nL2\nL3\nL4";
-	text.setText(textString);
-	assertTrue(":1:", text.getLineBackground(0) == null);
-	text.setLineBackground(1,1,getColor(YELLOW));
-	text.setLineBackground(2,1,getColor(BLUE));
-	assertTrue(":1:", text.getLineBackground(1) == getColor(YELLOW));
-	assertTrue(":1:", text.getLineBackground(2) == getColor(BLUE));
-}
-
-public void test_getLineCount() {
-	String delimiterString = "\r\n";
-	assertTrue(":a:", text.getLineCount()==1);
-	text.append("dddasd" + delimiterString);
-	assertTrue(":b:", text.getLineCount()==2);
-	text.append("ddasdasdasdasd" + delimiterString);
-	assertTrue(":c:", text.getLineCount()==3);
-
-
-	text.setText("01234567890");
-	text.setSelection(4);
-	assertTrue(":a:", text.getLineCount()==1);
-	text.insert(delimiterString);
-	assertTrue(":b:", text.getLineCount()==2);
-}
-
-public void test_getLineAtOffsetI() {
-	boolean exceptionThrown = false;
-	
-	assertTrue(":a:", text.getLineAtOffset(0) == 0);
-	try {
-		text.getLineAtOffset(-1);
-	}
-	catch (IllegalArgumentException e) {
-		exceptionThrown = true;
-	}
-	assertTrue(":b:", exceptionThrown == true);
-	exceptionThrown = false;
-	
-	try {
-		text.getLineAtOffset(100);
-	}
-	catch (IllegalArgumentException e) {
-		exceptionThrown = true;
-	}
-	assertTrue(":c:", exceptionThrown == true);
-	exceptionThrown = false;
-	
-	text.setText("Line0\r\n");	
-	assertTrue(":d:", text.getLineAtOffset(4) == 0);
-	assertTrue(":e:", text.getLineAtOffset(5) == 0);
-	assertTrue(":f:", text.getLineAtOffset(6) == 0);
-	assertTrue(":g:", text.getLineAtOffset(7) == 1);
-	try {
-		text.getLineAtOffset(8);
-	}
-	catch (IllegalArgumentException e) {
-		exceptionThrown = true;
-	}
-	assertTrue(":h:", exceptionThrown == true);
-	exceptionThrown = false;
-}
-
-public void test_getLineDelimiter() {
-	final String lineDelimiter = "\n";
-	StyledTextContent content = text.getContent();
-	
-	assertEquals(content.getLineDelimiter(), text.getLineDelimiter());
-
-	content = new StyledTextContent() {
-		public void addTextChangeListener(TextChangeListener listener) {
-		}
-		public int getCharCount() {
-			return 0;
-		}
-		public String getLine(int lineIndex) {
-			return "";
-		}
-		public int getLineAtOffset(int offset) {
-			return 0;
-		}
-		public int getLineCount() {
-			return 0;
-		}
-		public String getLineDelimiter() {
-			return lineDelimiter;
-		}
-		public int getOffsetAtLine(int lineIndex) {
-			return 0;
-		}		
-		public String getTextRange(int start, int length) {
-			return "";
-		}
-		public void removeTextChangeListener(TextChangeListener listener) {
-		}
-		public void replaceTextRange(int start, int replaceLength, String text) {
-		}
-		public void setText(String text) {
-		}
-	};
-	text.setContent(content);
-	assertEquals(lineDelimiter, text.getLineDelimiter());
-}
-
-public void test_getLineHeight() {
-	assertTrue(":a:", text.getLineHeight() > 0);
-}
-
-public void test_getLocationAtOffsetI(){
-	// copy from StyledText, has to match value used by StyledText
-	final int XINSET;
-	if (isBidi()) XINSET = 3;
-	else XINSET = 0;
-	
-	assertTrue(":a:", text.getLocationAtOffset(0).equals(new Point(0, 0)));
-	try {
-		text.getLocationAtOffset(-1);
-		fail("No exception thrown for offset == -1");
-	}
-	catch (IllegalArgumentException e) {
-	}
-	
-	try {
-		text.getLocationAtOffset(100);
-		fail("No exception thrown for illegal offset argument");
-	}
-	catch (IllegalArgumentException e) {
-	}
-	
-	text.setText("Line0\r\nLine1");	
-	assertTrue(":d:", text.getLocationAtOffset(4).x > 0 && text.getLocationAtOffset(4).y == 0);
-	assertTrue(":e:", text.getLocationAtOffset(6).x > 0 && text.getLocationAtOffset(6).y == 0);
-	// x location will == StyledText x inset on bidi platforms
-	assertTrue(":f:", text.getLocationAtOffset(7).x == XINSET && text.getLocationAtOffset(7).y > 0);
-	try {
-		text.getLocationAtOffset(13);
-		fail("No exception thrown for illegal offset argument");
-	}
-	catch (IllegalArgumentException e) {
-	}
-
-	text.setTopIndex(1);
-	assertTrue(":h:", text.getLocationAtOffset(4).x > 0 && text.getLocationAtOffset(4).y < 0);
-	// x location will == StyledText x inset on bidi platforms	
-	assertTrue(":i:", text.getLocationAtOffset(7).x == XINSET && text.getLocationAtOffset(7).y == 0);
-	
-	text.setHorizontalIndex(1);
-	assertTrue(":j:", text.getLocationAtOffset(0).x < 0 && text.getLocationAtOffset(0).y < 0);
-	assertTrue(":k:", text.getLocationAtOffset(7).x < 0 && text.getLocationAtOffset(7).y == 0);
-}
-public void test_getOffsetAtLineI() {
-	boolean exceptionThrown = false;
-	
-	assertEquals(":a:", 0, text.getOffsetAtLine(0));
-	try {
-		text.getOffsetAtLine(-1);
-	}
-	catch (IllegalArgumentException e) {
-		exceptionThrown = true;
-	}
-	assertTrue(":b:", exceptionThrown);
-	exceptionThrown = false;
-	
-	try {
-		text.getOffsetAtLine(100);
-	}
-	catch (IllegalArgumentException e) {
-		exceptionThrown = true;
-	}
-	assertTrue(":c:", exceptionThrown);
-	exceptionThrown = false;
-	
-	text.setText("Line0\r\n");	
-	assertEquals(":d:", 0, text.getOffsetAtLine(0));
-	assertEquals(":e:", 7, text.getOffsetAtLine(1));
-
-	try {
-		text.getOffsetAtLine(2);
-	}
-	catch (IllegalArgumentException e) {
-		exceptionThrown = true;
-	}
-	assertTrue(":f:", exceptionThrown);
-	exceptionThrown = false;
-
-	text.setText("");	
-	assertEquals(":g:", 0, text.getOffsetAtLine(0));
-}
-public void test_getOffsetAtLocationLorg_eclipse_swt_graphics_Point() {
-	boolean exceptionThrown = false;
-	Point location;
-	
-	assertTrue(":a:", text.getOffsetAtLocation(new Point(0, 0)) == 0);
-	try {
-		text.getOffsetAtLocation(new Point(-1, 0));
-	}
-	catch (IllegalArgumentException e) {
-		exceptionThrown = true;
-	}
-	assertTrue(":b:", exceptionThrown == true);
-	exceptionThrown = false;
-	
-	try {
-		text.getOffsetAtLocation(new Point(0, -1));
-	}
-	catch (IllegalArgumentException e) {
-		exceptionThrown = true;
-	}
-	assertTrue(":c:", exceptionThrown == true);
-	exceptionThrown = false;
-	
-	text.setText("Line0\r\nLine1");	
-	location = text.getLocationAtOffset(5);
-	assertTrue(":d:", text.getOffsetAtLocation(new Point(10, 0)) > 0);
-	assertTrue(":e:", text.getOffsetAtLocation(new Point(location.x - 1, 0)) == 4);
-	location = text.getLocationAtOffset(7);	
-	assertTrue(":f:", text.getOffsetAtLocation(location) == 7);
-	try {
-		text.getOffsetAtLocation(new Point(100, 0));
-	}
-	catch (IllegalArgumentException e) {
-		exceptionThrown = true;
-	}
-	assertTrue(":g:", exceptionThrown == true);
-	exceptionThrown = false;
-
-	try {
-		text.getOffsetAtLocation(new Point(0, 50));
-	}
-	catch (IllegalArgumentException e) {
-		exceptionThrown = true;
-	}
-	assertTrue(":h:", exceptionThrown == true);
-	exceptionThrown = false;
-
-	text.setTopIndex(1);
-	assertTrue(":i:", text.getOffsetAtLocation(new Point(0, -5)) == 0);
-	assertTrue(":j:", text.getOffsetAtLocation(new Point(0, 0)) == 7);
-	
-	text.setHorizontalIndex(1);
-	assertTrue(":k:", text.getOffsetAtLocation(new Point(-5, -5)) == 0);
-	assertTrue(":l:", text.getOffsetAtLocation(new Point(-5, 0)) == 7);
-
-	// 1GL4ZVE
-	assertTrue(":m:", text.getOffsetAtLocation(text.getLocationAtOffset(2)) == 2);
-	text.setHorizontalIndex(0);
-	assertTrue(":n:", text.getOffsetAtLocation(text.getLocationAtOffset(2)) == 2);
-}
-
-public void test_getSelection(){
-	text.setText("01234567890");
-	text.setSelection(new Point(2, 2));
-	assertTrue(":b:", text.getSelection().equals(new Point(2, 2)));
-	text.setSelection(new Point(2, 3));
-	assertTrue(":c:", text.getSelection().equals(new Point(2, 3)));
-	text.setSelection(new Point(3, 11));
-	assertTrue(":d:", text.getSelection().equals(new Point(3, 11)));
-	text.setText("01234567890");
-	text.setSelection(4);
-	assertTrue(":a:", text.getSelection().equals(new Point(4, 4)));
-	text.setSelection(11);
-	assertTrue(":b:", text.getSelection().equals(new Point(11, 11)));
-	text.setSelection(new Point(3, 2));	
-	assertTrue(":c:", text.getSelection().equals(new Point(2, 3)));	
-}
-public void test_getSelectionBackground() {
-	assertTrue(":1:", text.getSelectionBackground() != null);
-	text.setSelectionBackground(getColor(YELLOW));
-	assertTrue(":1:", text.getSelectionBackground() ==  getColor(YELLOW));
-}
-public void test_getSelectionForeground() {
-	assertTrue(":1:", text.getSelectionForeground() != null);
-	text.setSelectionForeground(getColor(RED));
-	assertTrue(":1:", text.getSelectionForeground() ==  getColor(RED));
-}
-public void test_getSelectionRange() {
-	String testText = "Line1\r\nLine2";
-	int invalidRanges [][] = {{-1, 0}, {-1, -1}, {100, 1}, {100, -1}, {12, 1}, {11, 2}, {2, -3}, {50, -1}};
-	int selectionRanges [][] = {{0, 1}, {0, 0}, {2, 3}, {12, 0}, {2, -2}, {5, -1}};
-	int textLength;
-	boolean exceptionThrown;
-	
-	for (int i = 0; i < invalidRanges.length; i++) {
-		int start = invalidRanges[i][0];
-		int length = invalidRanges[i][1];
-	
-		exceptionThrown = false;
-		try {
-			text.setSelectionRange(start, length);
-		}
-		catch (IllegalArgumentException e) {
-			exceptionThrown = true;
-		}
-		assertTrue(":a:", exceptionThrown);
-	}	
-	
-	text.setSelectionRange(0, 0);
-	assertTrue(":b:", text.getSelectionRange().x == 0 && text.getSelectionRange().y == 0);
-	text.setText(testText);
-	textLength = text.getCharCount();
-	for (int i = 0; i < selectionRanges.length; i++) {
-		int start = selectionRanges[i][0];
-		int length = selectionRanges[i][1];
-		text.setSelectionRange(start, length);
-		if (length < 0) {
-			start += length;
-			length *= -1;
-			assertEquals(":c:a:" + i, start, text.getCaretOffset());			
-		}
-		else {
-			assertEquals(":c:a:" + i, start + length, text.getCaretOffset());			
-		}
-		assertTrue(":c:" + i, text.getSelectionRange().x == start && text.getSelectionRange().y == length);
-	}
-
-	for (int i = 0; i < invalidRanges.length; i++) {
-		int start = invalidRanges[i][0];
-		int length = invalidRanges[i][1];
-	
-		exceptionThrown = false;
-		try {
-			text.setSelectionRange(start, length);
-		}
-		catch (IllegalArgumentException e) {
-			exceptionThrown = true;
-		}
-		assertTrue(":a:", exceptionThrown);
-	}
-}
-
-public void test_getSelectionCount(){
-	text.setText("01234567890");
-	assertTrue(":a:", text.getSelectionCount()==0);
-	text.setSelection(2, 4);
-	assertTrue(":b:", text.getSelectionCount()==2);
-	text.setSelection(2, 11);
-	assertTrue(":c:", text.getSelectionCount()==9);
-	text.setText("0123\n4567890");
-	assertTrue(":d:", text.getSelectionCount()==0);
-	text.setSelection(2, 4);
-	assertTrue(":e:", text.getSelectionCount()==2);
-	text.setSelection(2, 12);
-	assertTrue(":f:", text.getSelectionCount()==10);
-}
-
-public void test_getSelectionText() {
-	String testText = "Line1\r\nLine2";
-	int selectionRanges [][] = {{0, 1}, {0, 0}, {2, 3}, {12, 0}};
-	int textLength;
-	
-	text.setSelectionRange(0, 0);
-	assertEquals(":b:", "", text.getSelectionText());
-	text.setText(testText);
-	textLength = text.getCharCount();
-	for (int i = 0; i < selectionRanges.length; i++) {
-		int start = selectionRanges[i][0];
-		int length = selectionRanges[i][1];
-		text.setSelectionRange(start, length);
-		assertEquals(":c:" + i, testText.substring(start, start + length), text.getSelectionText());
-	}
-}
-
-public void test_getStyleRangeAtOffsetI() {
-	String line = "Line1\r\nLine2";
-	int styleStart = 0;
-	int styleLength = 5;
-	int i;
-	boolean exceptionThrown = false;
-	StyleRange style = new StyleRange(styleStart, styleLength, getColor(BLUE), getColor(RED), SWT.BOLD);
-
-	try {
-		text.getStyleRangeAtOffset(0);
-	}
-	catch (IllegalArgumentException e) {
-		exceptionThrown = true;
-	}
-	assertTrue("offset out of range no text", exceptionThrown);
-
-	text.setText(line);
-	exceptionThrown = false;
-	try {
-		text.getStyleRangeAtOffset(-1);
-	}
-	catch (IllegalArgumentException e) {
-		exceptionThrown = true;
-	}
-	assertTrue("offset out of range negative", exceptionThrown);
-
-	exceptionThrown = false;
-	try {
-		text.getStyleRangeAtOffset(line.length());
-	}
-	catch (IllegalArgumentException e) {
-		exceptionThrown = true;
-	}
-	assertTrue("offset out of range positive", exceptionThrown);
-		
-	text.setStyleRange(style);
-	style.length = 1;
-	for (i = styleStart; i < styleStart + styleLength; i++) {
-		style.start = i;
-		assertEquals(style, text.getStyleRangeAtOffset(i));
-	}
-	assertEquals(null, text.getStyleRangeAtOffset(i));
-			
-	// test offset at line delimiter
-	style = new StyleRange(5, 2, null, getColor(BLUE), SWT.NORMAL);
-	text.setStyleRange(style);
-	style.length = 1;
-	assertEquals(style, text.getStyleRangeAtOffset(5));
-	style.start = 6;
-	assertEquals(style, text.getStyleRangeAtOffset(6));	
-	assertEquals(null, text.getStyleRangeAtOffset(10));
-}
-
-public void test_getStyleRanges() {
-	text.setText("package test;\n/* Line 1\n * Line 2\n */\npublic class SimpleClass {\n}");
-	text.setStyleRange(getStyle(0,7,BLUE,null));
-	text.setStyleRange(getStyle(14,23,RED,null));
-	text.setStyleRange(getStyle(38,6,BLUE,null));
-	text.setStyleRange(getStyle(45,5,BLUE,null));
- 	text.replaceTextRange(14, 23, "\t/*Line 1\n\t * Line 2\n\t */");
- 	String newText = text.getTextRange(0, text.getCharCount());
-	assertTrue(":1:", newText.equals("package test;\n\t/*Line 1\n\t * Line 2\n\t */\npublic class SimpleClass {\n}"));
-	StyleRange[] styles = text.getStyleRanges();
-	assertTrue(":1:", styles.length == 3);
-	assertTrue(":1:", styles[0].equals(getStyle(0,7,BLUE,null)));
-	assertTrue(":1:", styles[1].equals(getStyle(40,6,BLUE,null)));
-	assertTrue(":1:", styles[2].equals(getStyle(47,5,BLUE,null)));
-}
-
-public void test_getTabs() {
-	text.setTabs(1);
-	assertTrue(":a:", text.getTabs() == 1);
-	text.setTabs(8);
-	assertTrue(":b:", text.getTabs() == 8);
-	text.setText("Line\t1\r\n");
-	assertTrue(":c:", text.getTabs() == 8);
-	text.setTabs(7);
-	assertTrue(":d:", text.getTabs() == 7);
-}
-
-public void test_getText() {
-	String testText = "Line1\r\nLine2";
-	
-	assertTrue(":a:", text.getText().length() == 0);
-	text.setText(testText);
-	assertTrue(":b:", text.getText().equals(testText));
-	text.setText("");
-	assertTrue(":c:", text.getText().length() == 0);
-	
-	text.setText(testText);
-	assertTrue(":a:", text.getText().equals(testText));
-	text.setText(testText + "\r\n");
-	assertTrue(":b:", text.getText().equals(testText + "\r\n"));
-	text.setText("");
-	assertTrue(":c:", text.getText().length() == 0);
-}
-
-public void test_getTextII() {
-	boolean exceptionThrown;
-	String testText = "Line1\r\nLine2";
-	int invalidRanges[][] = {{-1, 0}, {0, -1}, {-1, -1}, {100, 1}, {100, -1}, {2, testText.length()}, {5, 2}};
-	int ranges[][] = {{0, 1}, {0, 0}, {2, 5}, {7, 11}};
-	
-	for (int i = 0; i < invalidRanges.length; i++) {
-		int start = invalidRanges[i][0];
-		int end = invalidRanges[i][1];
-	
-		exceptionThrown = false;
-		try {
-			text.getText(start, end);
-		}
-		catch (IllegalArgumentException e) {
-			exceptionThrown = true;
-		}
-		assertTrue(":a:", exceptionThrown);
-	}	
-	text.setText(testText);
-	for (int i = 0; i < ranges.length; i++) {
-		int start = ranges[i][0];
-		int end = ranges[i][1];
-		assertEquals(":b:" + i, testText.substring(start, end + 1), text.getText(start, end));
-	}
-	for (int i = 0; i < invalidRanges.length; i++) {
-		int start = invalidRanges[i][0];
-		int end = invalidRanges[i][1];
-	
-		exceptionThrown = false;
-		try {
-			text.getText(start, end);
-		}
-		catch (IllegalArgumentException e) {
-			exceptionThrown = true;
-		}
-		assertTrue(":a:", exceptionThrown);
-	}	
-	text.setText("testing");
-	assertTrue(":d:", text.getText(0,0).equals("t"));
-	assertTrue(":d:", text.getText(0,1).equals("te"));
-	assertTrue(":d:", text.getText(1,5).equals("estin"));
-}
-
-public void test_getTextRangeII() {
-	boolean exceptionThrown;
-	String testText = "Line1\r\nLine2";
-	int invalidRanges[][] = {{-1, 0}, {0, -1}, {-1, -1}, {100, 1}, {100, -1}, {1, testText.length()}, {5, -1}};
-	int ranges[][] = {{0, 1}, {0, 0}, {5, 1}, {7, 5}, {12, 0}};
-	
-	for (int i = 0; i < invalidRanges.length; i++) {
-		int start = invalidRanges[i][0];
-		int length = invalidRanges[i][1];
-	
-		exceptionThrown = false;
-		try {
-			text.getTextRange(start, length);
-		}
-		catch (IllegalArgumentException e) {
-			exceptionThrown = true;
-		}
-		assertTrue(":a:", exceptionThrown);
-	}	
-	text.setText(testText);
-	for (int i = 0; i < ranges.length; i++) {
-		int start = ranges[i][0];
-		int length = ranges[i][1];
-		assertEquals(":b:" + i, testText.substring(start, start + length), text.getTextRange(start, length));
-	}
-	for (int i = 0; i < invalidRanges.length; i++) {
-		int start = invalidRanges[i][0];
-		int length = invalidRanges[i][1];
-	
-		exceptionThrown = false;
-		try {
-			text.getTextRange(start, length);
-		}
-		catch (IllegalArgumentException e) {
-			exceptionThrown = true;
-		}
-		assertTrue(":a:", exceptionThrown);
-	}	
-	text.setText("testing");
-	assertTrue(":d:", text.getTextRange(0,0).equals(""));
-	assertTrue(":d:", text.getTextRange(0,1).equals("t"));	
-	assertTrue(":d:", text.getTextRange(0,2).equals("te"));
-	assertTrue(":d:", text.getTextRange(1,5).equals("estin"));
-}
-
-public void test_getTextLimit() {
-	assertTrue(":a:", text.getTextLimit() < 0);
-	text.setTextLimit(10);
-	assertTrue(":b:", text.getTextLimit() == 10);
-}
-
-public void test_getTopIndex() {
-	text.setText("Line0\r\n");
-
-	assertTrue(":a:", text.getTopIndex() == 0);
-	text.setTopIndex(-2);
-	assertTrue(":b:", text.getTopIndex() == 0);
-	text.setTopIndex(-1);
-	assertTrue(":c:", text.getTopIndex() == 0);
-	text.setTopIndex(1);
-	assertTrue(":d:", text.getTopIndex() == 1);
-	text.setTopIndex(2);
-	assertTrue(":e:", text.getTopIndex() == 2);
-	text.setTopIndex(0);
-	assertTrue(":f:", text.getTopIndex() == 0);
-	text.setTopIndex(3);
-	assertTrue(":g:", text.getTopIndex() == 2);
-	text.replaceTextRange(text.getCharCount(), 0, "Line1");
-	assertTrue(":h:", text.getTopIndex() == 2);
-	text.setText("");
-	assertTrue(":i:", text.getTopIndex() == 0);
-}
-
-public void test_getTopPixel() {
-	text.setText("Line0\r\n");
-
-	assertTrue(":a:", text.getTopPixel() == 0);
-	text.setTopIndex(-2);
-	assertTrue(":b:", text.getTopPixel() == 0);
-	text.setTopIndex(-1);
-	assertTrue(":c:", text.getTopPixel() == 0);
-	text.setTopIndex(1);
-	assertTrue(":d:", text.getTopPixel() == text.getLineHeight());
-	text.setTopIndex(2);
-	assertTrue(":e:", text.getTopPixel() == text.getLineHeight() * 2);
-	text.setTopIndex(0);
-	assertTrue(":f:", text.getTopPixel() == 0);
-	text.setTopIndex(3);
-	assertTrue(":g:", text.getTopPixel() == text.getLineHeight() * 2);
-	text.replaceTextRange(text.getCharCount(), 0, "Line1");
-	assertTrue(":h:", text.getTopPixel() == text.getLineHeight() * 2);
-	text.setText("");
-	assertTrue(":i:", text.getTopPixel() == 0);
-}
-public void test_getWordWrap() {
-	assertTrue(":a:", text.getWordWrap() == false);
-	text.setWordWrap(true);
-	assertTrue(":b:", text.getWordWrap());
-	text.setWordWrap(false);
-	assertTrue(":c:", text.getWordWrap() == false);
-	text.setWordWrap(false);
-	assertTrue(":d:", text.getWordWrap() == false);
-	text.setWordWrap(true);
-	assertTrue(":e:", text.getWordWrap());
-}
-public void test_insertLjava_lang_String(){
-	String delimiterString = "\n";
-	try {
-		text.insert(null);
-		fail("No exception thrown for string == null");
-	}
-	catch (IllegalArgumentException e) {
-	}
-	assertTrue(":a:", text.getText().equals(""));
-	text.insert("");
-	assertTrue(":b:", text.getText().equals(""));
-	text.insert("fred");
-	assertTrue(":c:", text.getText().equals("fred"));
-	text.setSelection(2);
-	text.insert("helmut");
-	assertTrue(":d:", text.getText().equals("frhelmuted"));
-	text.setText("01234567890");
-	text.setSelection(4);
-	assertTrue(":e:", text.getLineCount()==1);
-	text.insert(delimiterString);
-	assertTrue(":f:", text.getLineCount()==2);
-}
-
-public void test_invokeActionI() {
-	// invoking actions on an empty text should not crash
-	text.invokeAction(ST.LINE_DOWN);
-	text.invokeAction(ST.LINE_UP);
-	text.invokeAction(ST.LINE_END);
-	text.invokeAction(ST.LINE_START);
-	text.invokeAction(ST.COLUMN_NEXT);
-	text.invokeAction(ST.PAGE_DOWN);
-	text.invokeAction(ST.PAGE_UP);
-	text.invokeAction(ST.WORD_NEXT);
-	text.invokeAction(ST.WORD_PREVIOUS);	
-	text.invokeAction(ST.TEXT_END);	
-	text.invokeAction(ST.TEXT_START);	
-	text.invokeAction(ST.WINDOW_END);	
-	text.invokeAction(ST.WINDOW_START);	
-	text.invokeAction(ST.SELECT_LINE_DOWN);	
-	text.invokeAction(ST.SELECT_LINE_UP);
-	text.invokeAction(ST.SELECT_LINE_START);
-	text.invokeAction(ST.SELECT_LINE_END);
-	text.invokeAction(ST.SELECT_COLUMN_PREVIOUS);
-	text.invokeAction(ST.SELECT_COLUMN_NEXT);
-	text.invokeAction(ST.SELECT_PAGE_UP);
-	text.invokeAction(ST.SELECT_PAGE_DOWN);
-	text.invokeAction(ST.SELECT_WORD_PREVIOUS);
-	text.invokeAction(ST.SELECT_WORD_NEXT);
-	text.invokeAction(ST.SELECT_TEXT_END);
-	text.invokeAction(ST.SELECT_TEXT_START);
-	text.invokeAction(ST.SELECT_WINDOW_START);
-	text.invokeAction(ST.SELECT_WINDOW_END);
-	text.invokeAction(ST.CUT);
-	text.invokeAction(ST.COPY);
-	text.invokeAction(ST.PASTE);
-	text.invokeAction(ST.DELETE_PREVIOUS);
-	text.invokeAction(ST.DELETE_NEXT);
-	text.invokeAction(ST.TOGGLE_OVERWRITE);
-	
-	text.setText("Line1\r\nLine2");		
-	text.invokeAction(ST.LINE_DOWN);
-	assertEquals(7, text.getCaretOffset());
-	
-	text.invokeAction(ST.LINE_UP);
-	assertEquals(0, text.getCaretOffset());
-	
-	text.invokeAction(ST.LINE_END);
-	assertEquals(5, text.getCaretOffset());
-	
-	text.invokeAction(ST.LINE_START);
-	assertEquals(0, text.getCaretOffset());
-
-	text.invokeAction(ST.COLUMN_NEXT);
-	assertEquals(1, text.getCaretOffset());
-
-	text.invokeAction(ST.PAGE_DOWN);
-	assertEquals(8, text.getCaretOffset());
-
-	text.invokeAction(ST.PAGE_UP);
-	assertEquals(1, text.getCaretOffset());
-
-	text.invokeAction(ST.TEXT_START);	
-	text.invokeAction(ST.WORD_NEXT);
-	text.invokeAction(ST.WORD_NEXT);	
-	assertEquals(7, text.getCaretOffset());
-
-	text.invokeAction(ST.WORD_PREVIOUS);	
-	assertEquals(5, text.getCaretOffset());
-
-	text.invokeAction(ST.TEXT_END);	
-	assertEquals(text.getCharCount(), text.getCaretOffset());
-
-	text.invokeAction(ST.TEXT_START);	
-	assertEquals(0, text.getCaretOffset());
-
-	text.invokeAction(ST.WINDOW_END);	
-	assertEquals(5, text.getCaretOffset());
-
-	text.invokeAction(ST.WINDOW_START);	
-	assertEquals(0, text.getCaretOffset());
-	
-	text.invokeAction(ST.SELECT_LINE_DOWN);	
-	assertEquals("Line1\r\n", text.getSelectionText());
-
-	text.invokeAction(ST.LINE_END);
-	text.invokeAction(ST.SELECT_LINE_UP);
-	assertEquals("\r\nLine2", text.getSelectionText());
-
-	text.invokeAction(ST.SELECT_LINE_START);
-	assertEquals("Line1\r\nLine2", text.getSelectionText());
-
-	text.invokeAction(ST.LINE_START);
-	text.invokeAction(ST.SELECT_LINE_END);
-	assertEquals("Line1", text.getSelectionText());
-
-	text.invokeAction(ST.LINE_END);
-	text.invokeAction(ST.SELECT_COLUMN_PREVIOUS);
-	assertEquals("1", text.getSelectionText());
-
-	text.invokeAction(ST.SELECT_COLUMN_NEXT);
-	assertEquals("", text.getSelectionText());
-
-	text.invokeAction(ST.SELECT_PAGE_UP);
-	assertEquals("", text.getSelectionText());
-
-	text.invokeAction(ST.SELECT_PAGE_DOWN);
-	assertEquals("\r\nLine2", text.getSelectionText());
-
-	text.invokeAction(ST.LINE_END);
-	text.invokeAction(ST.SELECT_WORD_PREVIOUS);
-	assertEquals("Line2", text.getSelectionText());
-
-	text.invokeAction(ST.LINE_START);
-	text.invokeAction(ST.SELECT_WORD_NEXT);
-	assertEquals("Line2", text.getSelectionText());
-
-	text.invokeAction(ST.LINE_START);
-	text.invokeAction(ST.SELECT_TEXT_END);
-	assertEquals("Line2", text.getSelectionText());
-
-	text.invokeAction(ST.SELECT_TEXT_START);
-	assertEquals("Line1\r\n", text.getSelectionText());
-
-	text.invokeAction(ST.LINE_START);
-	text.invokeAction(ST.SELECT_WINDOW_START);
-	assertEquals("", text.getSelectionText());
-
-	text.invokeAction(ST.SELECT_WINDOW_END);
-	assertEquals("Line1", text.getSelectionText());
-
-	text.invokeAction(ST.SELECT_LINE_END);
-	text.invokeAction(ST.CUT);
-	assertEquals("\r\nLine2", text.getText());
-
-	text.invokeAction(ST.SELECT_LINE_DOWN);
-	text.invokeAction(ST.COPY);
-	assertEquals("\r\nLine2", text.getText());
-
-	text.invokeAction(ST.LINE_END);
-	text.invokeAction(ST.PASTE);
-	assertEquals("\r\nLine2\r\n", text.getText());
-
-	text.invokeAction(ST.DELETE_PREVIOUS);
-	assertEquals("\r\nLine2", text.getText());
-
-	text.invokeAction(ST.TEXT_START);
-	text.invokeAction(ST.DELETE_NEXT);
-	assertEquals("Line2", text.getText());
-
-	text.invokeAction(ST.TOGGLE_OVERWRITE);
-}
-
-public void test_paste(){
-	Clipboard clipboard = new Clipboard(text.getDisplay());
-	TextTransfer transfer = TextTransfer.getInstance();
-	String convertedText;
-
-	clipboard.setContents(new String[]{""}, new Transfer[]{transfer});
-	
-	text.copy();	
-	text.paste();	
-	assertTrue(":a:", text.getCharCount() == 0);
-	
-	text.setSelectionRange(0, 0);
-	text.copy();	
-	text.paste();	
-	assertTrue(":b:", text.getCharCount() == 0);
-
-	text.setText("0123456789");
-	text.setSelectionRange(0, 1);
-	text.copy();	
-	text.setCaretOffset(0);
-	text.paste();	
-	assertTrue(":c:", text.getText().equals("00123456789"));
-	text.setSelectionRange(1, 2);	
-	text.copy();	
-	text.setText("");
-	text.paste();
-	assertTrue(":d:", text.getText().equals("01"));
-	text.setText("");
-
-	// test line delimiter conversion
-	clipboard.setContents(new String[]{"\rLine1\nLine2\r\nLine3\n\rLine4\n"}, new Transfer[]{transfer});
-	text.paste();
-	if (SwtJunit.isLinux) {
-		convertedText = "\nLine1\nLine2\nLine3\n\nLine4\n";
-	}
-	else {
-		convertedText = "\r\nLine1\r\nLine2\r\nLine3\r\n\r\nLine4\r\n";
-	}
-	assertTrue(":f:", text.getText() != null && text.getText().equals(convertedText));
-	text.setText("");
-
-	// test line delimiter conversion
-	clipboard.setContents(new String[]{"Line1\r\nLine2"}, new Transfer[]{transfer});
-	text.paste();
-	if (SwtJunit.isLinux) {
-		convertedText = "Line1\nLine2";
-	}
-	else {
-		convertedText = "Line1\r\nLine2";
-	}
-	assertTrue(":g:", text.getText() != null && text.getText().equals(convertedText));
-	text.setText("");
-
-	// test line delimiter conversion
-	clipboard.setContents(new String[]{"Line1\rLine2"}, new Transfer[]{transfer});
-	text.paste();
-	if (SwtJunit.isLinux) {
-		convertedText = "Line1\nLine2";
-	}
-	else {
-		convertedText = "Line1\r\nLine2";
-	}
-	assertTrue(":h:", text.getText() != null && text.getText().equals(convertedText));
-	text.setText("");
-
-
-	// test line delimiter conversion
-	clipboard.setContents(new String[]{"Line1\nLine2"}, new Transfer[]{transfer});
-	text.paste();
-	if (SwtJunit.isLinux) {
-		convertedText = "Line1\nLine2";
-	}
-	else {
-		convertedText = "Line1\r\nLine2";
-	}
-	assertTrue(":i:", text.getText() != null && text.getText().equals(convertedText));
-	text.setText("");
-
-
-	clipboard.dispose();
-}
-
-public void test_print() {
-	Printer printer = new Printer();
-	
-	text.print();
-	printer.cancelJob();
-	text.setText("Line1");
-	text.print();
-	printer.cancelJob();
-	printer.dispose();
-}
-
-public void test_printLorg_eclipse_swt_printing_Printer() {
-	Printer printer = new Printer();
-	boolean exceptionThrown = false;
-	
-	try {
-		text.print(null);
-	}
-	catch (IllegalArgumentException e) {
-		exceptionThrown = true;
-	}	
-	assertTrue(exceptionThrown);
-	
-	text.print(printer);
-	printer.cancelJob();
-	text.setText("Line1");
-	text.print(printer);
-	printer.cancelJob();
-	
-	printer.dispose();
-}
-
-public void test_redraw() {
-	// inherited test is sufficient
-}
-
-public void test_redrawIIIIZ() {
-	// inherited test is sufficient
-}
-
-public void test_redrawRangeIIZ() {
-	boolean exceptionThrown = false;
-
-	text.redrawRange(0, 0, true);
-	text.redrawRange(0, 0, false);
-	
-	try {
-		text.redrawRange(0, 1, true);
-	}
-	catch (IllegalArgumentException e) {
-		if (e.getMessage().equals("Index out of bounds")) {
-			exceptionThrown = true;
-		}
-	}
-	assertTrue(exceptionThrown);
-
-	exceptionThrown = false;
-	try {
-		text.redrawRange(0, 1, false);
-	}
-	catch (IllegalArgumentException e) {
-		if (e.getMessage().equals("Index out of bounds")) {
-			exceptionThrown = true;
-		}
-	}
-	assertTrue(exceptionThrown);
-		
-	exceptionThrown = false;
-	try {
-		text.redrawRange(-1, 2, true);
-	}
-	catch (IllegalArgumentException e) {
-		if (e.getMessage().equals("Index out of bounds")) {
-			exceptionThrown = true;
-		}
-	}
-	assertTrue(exceptionThrown);
-
-	exceptionThrown = false;
-	try {
-		text.redrawRange(-1, 2, false);
-	}
-	catch (IllegalArgumentException e) {
-		if (e.getMessage().equals("Index out of bounds")) {
-			exceptionThrown = true;
-		}
-	}
-	assertTrue(exceptionThrown);
-
-	text.setText("0123456789");
-	text.redrawRange(0, 0, true);
-	text.redrawRange(0, 0, false);	
-	text.redrawRange(0, 1, true);
-	text.redrawRange(0, 1, false);	
-	text.redrawRange(8, 2, true);
-	text.redrawRange(8, 2, false);	
-	text.redrawRange(10, 0, true);	
-	text.redrawRange(10, 0, false);	
-
-	exceptionThrown = false;
-	try {
-		text.redrawRange(10, 1, true);
-	}
-	catch (IllegalArgumentException e) {
-		if (e.getMessage().equals("Index out of bounds")) {
-			exceptionThrown = true;
-		}
-	}
-	assertTrue(exceptionThrown);
-	
-	exceptionThrown = false;
-	try {
-		text.redrawRange(10, 1, false);
-	}
-	catch (IllegalArgumentException e) {
-		if (e.getMessage().equals("Index out of bounds")) {
-			exceptionThrown = true;
-		}
-	}
-	assertTrue(exceptionThrown);
-}
-
-public void test_removeBidiSegmentListenerLorg_eclipse_swt_custom_BidiSegmentListener() {
-	// tested in test_addBidiSegmentListenerLorg_eclipse_swt_custom_BidiSegmentListener
-}
-
-public void test_removeExtendedModifyListenerLorg_eclipse_swt_custom_ExtendedModifyListener() {
-	// tested in test_addExtendedModifyListenerLorg_eclipse_swt_custom_ExtendedModifyListener
-}
-
-public void test_removeLineBackgroundListenerLorg_eclipse_swt_custom_LineBackgroundListener() {
-	// tested in test_addLineBackgroundListenerLorg_eclipse_swt_custom_LineBackgroundListener
-}
-
-public void test_removeLineStyleListenerLorg_eclipse_swt_custom_LineStyleListener() {
-	// tested in test_addLineStyleListenerLorg_eclipse_swt_custom_LineStyleListener
-}
-
-public void test_removeModifyListenerLorg_eclipse_swt_events_ModifyListener() {
-	// tested in test_addModifyListenerLorg_eclipse_swt_events_ModifyListener
-}
-
-public void test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener() {
-	// tested in test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener
-}
-
-public void test_removeVerifyListenerLorg_eclipse_swt_events_VerifyListener() {
-	// tested in test_addVerifyListenerLorg_eclipse_swt_events_VerifyListener
-}
-
-public void test_removeVerifyKeyListenerLorg_eclipse_swt_custom_VerifyKeyListener() {
-	// tested in test_addVerifyKeyListenerLorg_eclipse_swt_custom_VerifyKeyListener
-}
-
-public void test_replaceStyleRanges(){
-	StyleRange[] styles;
-	String textString = textString();
-
-	/* 
-		defaultStyles
-		
-			(0,48,RED,YELLOW), 
-			(58,10,BLUE,CYAN), 
-			(68,10,GREEN,PURPLE)
-	*/
-
-
-	text.setText(textString);
-	
-	text.replaceStyleRanges(0, text.getCharCount(), defaultStyles());
-	text.replaceStyleRanges(0, 78, new StyleRange[] {});
-	styles = text.getStyleRanges();
-	assertTrue(":0:", styles.length == 0);
-	text.setText(textString);
-	styles = text.getStyleRanges();
-	assertTrue(":0:", styles.length == 0);
-	text.replaceStyleRanges(0, 78, new StyleRange[] {});
-	styles = text.getStyleRanges();
-	assertTrue(":0:", styles.length == 0);
-	text.replaceStyleRanges(0, text.getCharCount(), defaultStyles());
-	styles = text.getStyleRanges();
-	assertTrue(":0:", styles.length == 3);
-	assertTrue(":0:", styles[0].equals(getStyle(0,48,RED,YELLOW)));
-	assertTrue(":0:", styles[1].equals(getStyle(58,10,BLUE,CYAN)));
-	assertTrue(":0:", styles[2].equals(getStyle(68,10,GREEN,PURPLE)));
-	
-	// No overlap with existing styles
-	text.replaceStyleRanges(0, text.getCharCount(), defaultStyles());
-	text.replaceStyleRanges(48, 5, new StyleRange[] {getStyle(48,5,YELLOW,RED)});
-	styles = text.getStyleRanges();
-	assertTrue(":1:", styles.length == 4);
-	assertTrue(":1:", styles[0].equals(getStyle(0,48,RED,YELLOW)));
-	assertTrue(":1:", styles[1].equals(getStyle(48,5,YELLOW,RED)));
-	assertTrue(":1:", styles[2].equals(getStyle(58,10,BLUE,CYAN)));
-	assertTrue(":1:", styles[3].equals(getStyle(68,10,GREEN,PURPLE)));
-
-	// Overlap middle of one style - partial
-	text.replaceStyleRanges(0, text.getCharCount(), defaultStyles());
-	text.replaceStyleRanges(10, 10, new StyleRange[] {getStyle(10,10,YELLOW,RED)});
-	styles = text.getStyleRanges();
-	assertTrue(":2:", styles.length == 5);
-	assertTrue(":2:", styles[0].equals(getStyle(0,10,RED,YELLOW)));
-	assertTrue(":2:", styles[1].equals(getStyle(10,10,YELLOW,RED)));
-	assertTrue(":2:", styles[2].equals(getStyle(20,28,RED,YELLOW)));
-	assertTrue(":2:", styles[3].equals(getStyle(58,10,BLUE,CYAN)));
-	assertTrue(":2:", styles[4].equals(getStyle(68,10,GREEN,PURPLE)));
-	text.replaceStyleRanges(0, text.getCharCount(), new StyleRange[] {});
-	styles = text.getStyleRanges();
-	assertTrue(":2:", styles.length == 0);
-	
-	// Overlap middle of one style - full
-	text.replaceStyleRanges(0, text.getCharCount(), defaultStyles());
-	text.replaceStyleRanges(58, 10, new StyleRange[] {getStyle(58,10,YELLOW,RED)});
-	styles = text.getStyleRanges();
-	assertTrue(":3:", styles.length == 3);
-	assertTrue(":3:", styles[0].equals(getStyle(0,48,RED,YELLOW)));
-	assertTrue(":3:", styles[1].equals(getStyle(58,10,YELLOW,RED)));
-	assertTrue(":3:", styles[2].equals(getStyle(68,10,GREEN,PURPLE)));
-	
-	// Overlap end of one style
-	text.replaceStyleRanges(0, text.getCharCount(), defaultStyles());
-	text.replaceStyleRanges(38, 15, new StyleRange[] {getStyle(38,15,YELLOW,RED)});
-	styles = text.getStyleRanges();
-	assertTrue(":4:", styles.length == 4);
-	assertTrue(":4:", styles[0].equals(getStyle(0,38,RED,YELLOW)));
-	assertTrue(":4:", styles[1].equals(getStyle(38,15,YELLOW,RED)));
-	assertTrue(":4:", styles[2].equals(getStyle(58,10,BLUE,CYAN)));
-	assertTrue(":4:", styles[3].equals(getStyle(68,10,GREEN,PURPLE)));
-	
-	// Overlap beginning of one style
-	text.replaceStyleRanges(0, text.getCharCount(), defaultStyles());
-	text.replaceStyleRanges(50, 10, new StyleRange[] {getStyle(50,10,YELLOW,RED)});
-	styles = text.getStyleRanges();
-	assertTrue(":5:", styles.length == 4);
-	assertTrue(":5:", styles[0].equals(getStyle(0,48,RED,YELLOW)));
-	assertTrue(":5:", styles[1].equals(getStyle(50,10,YELLOW,RED)));
-	assertTrue(":5:", styles[2].equals(getStyle(60,8,BLUE,CYAN)));
-	assertTrue(":5:", styles[3].equals(getStyle(68,10,GREEN,PURPLE)));
-
-	// Overlap complete style
-	text.replaceStyleRanges(0, text.getCharCount(), defaultStyles());
-	text.replaceStyleRanges(48, 20, new StyleRange[] {getStyle(48,20,YELLOW,RED)});
-	styles = text.getStyleRanges();
-	assertTrue(":6:", styles.length == 3);
-	assertTrue(":6:", styles[0].equals(getStyle(0,48,RED,YELLOW)));
-	assertTrue(":6:", styles[1].equals(getStyle(48,20,YELLOW,RED)));
-	assertTrue(":6:", styles[2].equals(getStyle(68,10,GREEN,PURPLE)));
-
-	// reset the environment
-	text.dispose();
-	text = new StyledText(shell, SWT.NULL);
-	setWidget(text);
-
-	text.setText(textString);
-	StyleRange ranges[] = new StyleRange[3];
-	ranges[0] = getStyle(0,48,RED,YELLOW);
-	ranges[1] = getStyle(48,20,BLUE,CYAN);
-	ranges[2] = getStyle(68,10,GREEN,PURPLE);
-	text.replaceStyleRanges(0, 78, ranges);
-	styles = text.getStyleRanges();
-	assertTrue(":7:", styles.length == 3);
-	assertTrue(":7:", styles[0].equals(getStyle(0,48,RED,YELLOW)));
-	assertTrue(":7:", styles[1].equals(getStyle(48,20,BLUE,CYAN)));
-	assertTrue(":7:", styles[2].equals(getStyle(68,10,GREEN,PURPLE)));
-
-	text.setText("012345678901234");
-	ranges = new StyleRange[2];
-	ranges[0] = getStyle(0,5,RED,YELLOW);
-	ranges[1] = getStyle(10,5,BLUE,CYAN);
-	text.replaceStyleRanges(0, 15, ranges);
-	styles = text.getStyleRanges();
-	assertTrue(":8:", styles.length == 2);
-	assertTrue(":8:", styles[0].equals(getStyle(0,5,RED,YELLOW)));
-	assertTrue(":8:", styles[1].equals(getStyle(10,5,BLUE,CYAN)));
-	
-	text.setText("redgreenblueyellowcyanpurple");
-	ranges = new StyleRange[4];
-	ranges[0] = getStyle(0,3,RED,null);
-	ranges[1] = getStyle(3,5,GREEN,null);
-	ranges[2] = getStyle(8,4,BLUE,null);
-	ranges[3] = getStyle(12,6,YELLOW,null);
-	text.replaceStyleRanges(0, 18, ranges);
-	styles = text.getStyleRanges();
-	assertTrue(":9:", styles.length == 4);
-	assertTrue(":9:", styles[0].equals(getStyle(0,3,RED,null)));
-	assertTrue(":9:", styles[1].equals(getStyle(3,5,GREEN,null)));
-	assertTrue(":9:", styles[2].equals(getStyle(8,4,BLUE, null)));
-	assertTrue(":9:", styles[3].equals(getStyle(12,6,YELLOW,null)));
-	ranges = new StyleRange[2];
-	ranges[0] = getStyle(18,4,CYAN,null);
-	ranges[1] = getStyle(22,6,PURPLE,null);
-	text.replaceStyleRanges(18, 10, ranges);
-	styles = text.getStyleRanges();
-	assertTrue(":9:", styles.length == 6);
-	assertTrue(":9:", styles[4].equals(getStyle(18,4,CYAN,null)));
-	assertTrue(":9:", styles[5].equals(getStyle(22,6,PURPLE,null)));
-
-	// reset the environment
-	text.dispose();
-	text = new StyledText(shell, SWT.NULL);
-	setWidget(text);
-
-	textString = textString();
-			
-	text.setText(textString);
-	ranges = new StyleRange[2];
-	ranges[0] = getStyle(0,10,RED,YELLOW);
-	ranges[1] = getStyle(25,10,GREEN,PURPLE);
-	text.replaceStyleRanges(0, 35, ranges);
-	ranges = new StyleRange[2];
-	ranges[0] = getStyle(5,15,BLUE,CYAN);
-	ranges[1] = getStyle(20,10,GREEN,PURPLE);
-	text.replaceStyleRanges(5, 25, ranges);
-	styles = text.getStyleRanges();
-	assertTrue(":10:", styles.length == 4);
-	assertTrue(":10:", styles[0].equals(getStyle(0,5,RED,YELLOW)));
-	assertTrue(":10:", styles[1].equals(getStyle(5,15,BLUE,CYAN)));
-	assertTrue(":10:", styles[2].equals(getStyle(20,10,GREEN,PURPLE)));
-	assertTrue(":10:", styles[3].equals(getStyle(30,5,GREEN,PURPLE)));
-
-	text.setText("01234567890123456789");
-	ranges = new StyleRange[2];
-	ranges[0] = getStyle(0,10,RED,YELLOW);
-	ranges[1] = getStyle(10,10,BLUE,CYAN);
-	text.replaceStyleRanges(0, 20, ranges);
-	ranges = new StyleRange[2];
-	ranges[0] = getStyle(5,3,RED,YELLOW);
-	ranges[1] = getStyle(12,5,BLUE,CYAN);
-	text.replaceStyleRanges(5, 12, ranges);
-	styles = text.getStyleRanges();
-	assertTrue(":11:", styles.length == 4);
-	assertTrue(":11:", styles[0].equals(getStyle(0,5,RED,YELLOW)));
-	assertTrue(":11:", styles[1].equals(getStyle(5,3,RED,YELLOW)));
-	assertTrue(":11:", styles[2].equals(getStyle(12,5,BLUE,CYAN)));
-	assertTrue(":11:", styles[3].equals(getStyle(17,3,BLUE,CYAN)));
-	
-	text.setText("0123456789012345");
-	ranges = new StyleRange[3];
-	ranges[0] = getStyle(0,5,RED,YELLOW);
-	ranges[1] = getStyle(5,5,BLUE,CYAN);
-	ranges[2] = getStyle(10,5,GREEN,PURPLE);
-	text.replaceStyleRanges(0, 15, ranges);
-	ranges = new StyleRange[2];
-	ranges[0] = getStyle(5,5,RED,YELLOW);
-	ranges[1] = getStyle(10,5,RED,YELLOW);
-	text.replaceStyleRanges(5, 10, ranges);
-	styles = text.getStyleRanges();
-	assertTrue(":12:", styles.length == 3);
-	assertTrue(":12:", styles[0].equals(getStyle(0,5,RED,YELLOW)));
-	assertTrue(":12:", styles[1].equals(getStyle(5,5,RED,YELLOW)));
-	assertTrue(":12:", styles[2].equals(getStyle(10,5,RED,YELLOW)));
-	
-	text.setText("0123456789012345");
-	ranges = new StyleRange[1];
-	ranges[0] = getStyle(10,5,GREEN,PURPLE);
-	text.replaceStyleRanges(0, 15, ranges);
-	ranges = new StyleRange[2];
-	ranges[0] = getStyle(0,5,RED,YELLOW);
-	ranges[1] = getStyle(5,5,BLUE,CYAN);
-	text.replaceStyleRanges(0, 10, ranges);
-	styles = text.getStyleRanges();
-	assertTrue(":13:", styles.length == 3);
-	assertTrue(":13:", styles[0].equals(getStyle(0,5,RED,YELLOW)));
-	assertTrue(":13:", styles[1].equals(getStyle(5,5,BLUE,CYAN)));
-	assertTrue(":13:", styles[2].equals(getStyle(10,5,GREEN,PURPLE)));
-
-	text.setText("012345678901234");
-	ranges = new StyleRange[2];
-	ranges[0] = getStyle(0,5,RED,YELLOW);
-	ranges[1] = getStyle(10,5,BLUE,CYAN);
-	text.replaceStyleRanges(0, 15, ranges);
-	ranges = new StyleRange[1];
-	ranges[0] = getStyle(5,7,BLUE,CYAN);
-	text.replaceStyleRanges(5, 7, ranges);
-	styles = text.getStyleRanges();
-	assertTrue(":14:", styles.length == 3);
-	assertTrue(":14:", styles[0].equals(getStyle(0,5,RED,YELLOW)));
-	assertTrue(":14:", styles[1].equals(getStyle(5,7,BLUE,CYAN)));
-	assertTrue(":14:", styles[2].equals(getStyle(12,3,BLUE,CYAN)));
-
-
-	// reset the environment
-	text.dispose();
-	text = new StyledText(shell, SWT.NULL);
-	setWidget(text);
-
-	textString = textString();
-
-
-	/* 
-		defaultStyles
-		
-			(0,48,RED,YELLOW), 
-			(58,10,BLUE,CYAN), 
-			(68,10,GREEN,PURPLE)
-	*/
-
-
-	// End/Beginning overlap
-	text.setText(textString);
-	text.setStyleRanges(defaultStyles());
-	ranges = new StyleRange[1];
-	ranges[0] = getStyle(38,25,YELLOW,RED);
-	text.replaceStyleRanges(38, 25, ranges);
-	styles = text.getStyleRanges();
-	assertTrue(":1a:", styles.length == 4);
-	assertTrue(":1a:", styles[0].equals(getStyle(0,38,RED,YELLOW)));
-	assertTrue(":1a:", styles[1].equals(getStyle(38,25,YELLOW,RED)));
-	assertTrue(":1a:", styles[2].equals(getStyle(63,5,BLUE,CYAN)));
-	assertTrue(":1a:", styles[3].equals(getStyle(68,10,GREEN,PURPLE)));
-	text.setStyleRanges(defaultStyles());
-	ranges = new StyleRange[1];
-	ranges[0] = getStyle(63,10,YELLOW,RED);
-	text.replaceStyleRanges(63, 10, ranges);
-	styles = text.getStyleRanges();
-	assertTrue(":1a:", styles.length == 4);
-	assertTrue(":1a:", styles[0].equals(getStyle(0,48,RED,YELLOW)));
-	assertTrue(":1a:", styles[1].equals(getStyle(58,5,BLUE,CYAN)));
-	assertTrue(":1a:", styles[2].equals(getStyle(63,10,YELLOW,RED)));
-	assertTrue(":1a:", styles[3].equals(getStyle(73,5,GREEN,PURPLE)));
-
-	// Complete overlap
-	text.setStyleRanges(defaultStyles());
-	ranges = new StyleRange[1];
-	ranges[0] = getStyle(0,78,YELLOW,RED);
-	text.replaceStyleRanges(0, 78, ranges);
-	styles = text.getStyleRanges();
-	styles = text.getStyleRanges();
-	assertTrue(":2a:", styles.length == 1);
-	assertTrue(":2a:", styles[0].equals(getStyle(0,78,YELLOW,RED)));
-
-	text.setStyleRanges(defaultStyles());
-	ranges = new StyleRange[1];
-	ranges[0] = getStyle(0,68,YELLOW,RED);
-	text.replaceStyleRanges(0, 68, ranges);
-	styles = text.getStyleRanges();
-	assertTrue(":2a:", styles.length == 2);
-	assertTrue(":2a:", styles[0].equals(getStyle(0,68,YELLOW,RED)));
-	assertTrue(":2a:", styles[1].equals(getStyle(68,10,GREEN,PURPLE)));
-	text.setStyleRanges(defaultStyles());
-	ranges = new StyleRange[1];
-	ranges[0] = getStyle(58,20,YELLOW,RED);
-	text.replaceStyleRanges(58, 20, ranges);
-	styles = text.getStyleRanges();
-	assertTrue(":2a:", styles.length == 2);
-	assertTrue(":2a:", styles[0].equals(getStyle(0,48,RED,YELLOW)));
-	assertTrue(":2a:", styles[1].equals(getStyle(58,20,YELLOW,RED)));
-
-	// 1-N complete, beginning
-	text.setText("012345678901234567890123456789");
-	text.setStyleRanges( 
-		new StyleRange[] {getStyle(0,5,RED,RED), getStyle(5,5,YELLOW,YELLOW),
-			getStyle(10,5,CYAN,CYAN), getStyle(15,5,BLUE,BLUE),
-			getStyle(20,5,GREEN,GREEN), getStyle(25,5,PURPLE,PURPLE)}
-	);
-	ranges = new StyleRange[1];
-	ranges[0] = getStyle(5,23,YELLOW,RED);
-	text.replaceStyleRanges(5, 23, ranges);
-	styles = text.getStyleRanges();
-	assertTrue(":3a:", styles.length == 3);
-	assertTrue(":3a:", styles[0].equals(getStyle(0,5,RED,RED)));
-	assertTrue(":3a:", styles[1].equals(getStyle(5,23,YELLOW,RED)));
-	assertTrue(":3a:", styles[2].equals(getStyle(28,2,PURPLE,PURPLE)));
-	
-	// end, 1-N complete, beginning
-	text.setStyleRanges( 
-		new StyleRange[] {getStyle(0,5,RED,RED), getStyle(5,5,YELLOW,YELLOW),
-			getStyle(10,5,CYAN,CYAN), getStyle(15,5,BLUE,BLUE),
-			getStyle(20,5,GREEN,GREEN), getStyle(25,5,PURPLE,PURPLE)}
-	);
-	ranges = new StyleRange[1];
-	ranges[0] = getStyle(13,12,YELLOW,RED);
-	text.replaceStyleRanges(13, 12, ranges);
-	styles = text.getStyleRanges();
-	assertTrue(":3a:", styles.length == 5);
-	assertTrue(":3a:", styles[0].equals(getStyle(0,5,RED,RED)));
-	assertTrue(":3a:", styles[1].equals(getStyle(5,5,YELLOW,YELLOW)));
-	assertTrue(":3a:", styles[2].equals(getStyle(10,3,CYAN,CYAN)));
-	assertTrue(":3a:", styles[3].equals(getStyle(13,12,YELLOW,RED)));
-	assertTrue(":3a:", styles[4].equals(getStyle(25,5,PURPLE,PURPLE)));
-
-	// reset the environment
-	text.dispose();
-	text = new StyledText(shell, SWT.NULL);
-	setWidget(text);
-
-	// insert with no styles
-	text.setText("01234567890123456789");
-	ranges = new StyleRange[1];
-	ranges[0] = getStyle(0,5,RED,YELLOW);
-	text.replaceStyleRanges(0, 10, ranges);
-	styles = text.getStyleRanges();
-	assertTrue(":1xa:", styles.length == 1);
-	assertTrue(":1xa:", styles[0].equals(getStyle(0,5,RED,YELLOW)));
-
-	// insert before 1 style
-	text.setText("01234567890123456789");
-	ranges = new StyleRange[1];
-	ranges[0] = getStyle(5,3,RED,YELLOW);
-	text.replaceStyleRanges(0, 10, ranges);
-	ranges = new StyleRange[1];
-	ranges[0] = getStyle(0,3,PURPLE,PURPLE);
-	text.replaceStyleRanges(0, 3, ranges);
-	styles = text.getStyleRanges();
-	assertTrue(":1xb:", styles.length == 2);
-	assertTrue(":1xb:", styles[0].equals(getStyle(0,3,PURPLE,PURPLE)));
-	assertTrue(":1xb:", styles[1].equals(getStyle(5,3,RED,YELLOW)));
-
-	// insert after 1 style
-	text.setText("01234567890123456789");
-	ranges = new StyleRange[1];
-	ranges[0] = getStyle(5,3,RED,YELLOW);
-	text.replaceStyleRanges(0, 10, ranges);
-	ranges = new StyleRange[1];
-	ranges[0] = getStyle(8,1,PURPLE,PURPLE);
-	text.replaceStyleRanges(8, 1, ranges);
-	styles = text.getStyleRanges();
-	assertTrue(":1xc:", styles.length == 2);
-	assertTrue(":1xc:", styles[0].equals(getStyle(5,3,RED,YELLOW)));
-	assertTrue(":1xc:", styles[1].equals(getStyle(8,1,PURPLE,PURPLE)));
-
-	// insert before 2 styles
-	text.setText("01234567890123456789");
-	ranges = new StyleRange[2];
-	ranges[0] = getStyle(5,2,RED,YELLOW);
-	ranges[1] = getStyle(10,2,RED,YELLOW);
-	text.replaceStyleRanges(0, 20, ranges);
-	ranges = new StyleRange[1];
-	ranges[0] = getStyle(2,1,PURPLE,PURPLE);
-	text.replaceStyleRanges(2, 1, ranges);
-	styles = text.getStyleRanges();
-	assertTrue(":1xe:", styles.length == 3);
-	assertTrue(":1xe:", styles[0].equals(getStyle(2,1,PURPLE,PURPLE)));
-	assertTrue(":1xe:", styles[1].equals(getStyle(5,2,RED,YELLOW)));
-	assertTrue(":1xe:", styles[2].equals(getStyle(10,2,RED,YELLOW)));
-
-	// insert after 2 styles
-	text.setText("01234567890123456789");
-	ranges = new StyleRange[2];
-	ranges[0] = getStyle(5,2,RED,YELLOW);
-	ranges[1] = getStyle(10,2,RED,YELLOW);
-	text.replaceStyleRanges(0, 20, ranges);
-	ranges = new StyleRange[1];
-	ranges[0] = getStyle(12,1,PURPLE,PURPLE);
-	text.replaceStyleRanges(12, 1, ranges);
-	styles = text.getStyleRanges();
-	assertTrue(":1xf:", styles.length == 3);
-	assertTrue(":1xf:", styles[0].equals(getStyle(5,2,RED,YELLOW)));
-	assertTrue(":1xf:", styles[1].equals(getStyle(10,2,RED,YELLOW)));
-	assertTrue(":1xf:", styles[2].equals(getStyle(12,1,PURPLE,PURPLE)));
-
-	// insert middle 2 styles
-	text.setText("01234567890123456789");
-	ranges = new StyleRange[2];
-	ranges[0] = getStyle(1,2,RED,YELLOW);
-	ranges[1] = getStyle(12,2,RED,YELLOW);
-	text.replaceStyleRanges(0, 20, ranges);
-	ranges = new StyleRange[1];
-	ranges[0] = getStyle(5,3,PURPLE,PURPLE);
-	text.replaceStyleRanges(5, 3, ranges);
-	styles = text.getStyleRanges();
-	assertTrue(":1xg:", styles.length == 3);
-	assertTrue(":1xg:", styles[0].equals(getStyle(1,2,RED,YELLOW)));
-	assertTrue(":1xg:", styles[1].equals(getStyle(5,3,PURPLE,PURPLE)));
-	assertTrue(":1xg:", styles[2].equals(getStyle(12,2,RED,YELLOW)));
-	
-	// insert middle 3 styles
-	text.setText("01234567890123456789");
-	ranges = new StyleRange[3];
-	ranges[0] = getStyle(1,3,RED,PURPLE);
-	ranges[1] = getStyle(6,3,PURPLE,YELLOW);
-	ranges[2] = getStyle(12,3,RED,YELLOW);
-	text.replaceStyleRanges(0, 20, ranges);
-	ranges = new StyleRange[1];
-	ranges[0] = getStyle(4,2,PURPLE,PURPLE);
-	text.replaceStyleRanges(4, 2, ranges);
-	styles = text.getStyleRanges();
-	assertTrue(":1xh:", styles.length == 4);
-	assertTrue(":1xh:", styles[0].equals(getStyle(1,3,RED,PURPLE)));
-	assertTrue(":1xh:", styles[1].equals(getStyle(4,2,PURPLE,PURPLE)));
-	assertTrue(":1xh:", styles[2].equals(getStyle(6,3,PURPLE,YELLOW)));
-	assertTrue(":1xh:", styles[3].equals(getStyle(12,3,RED,YELLOW)));	
-
-	// reset the environment
-	text.dispose();
-	text = new StyledText(shell, SWT.NULL);
-	setWidget(text);
-
-	text.setText("0");
-	ranges = new StyleRange[1];
-	ranges[0] = getStyle(0,1,PURPLE,PURPLE);
-	text.replaceStyleRanges(0, 1, ranges);
-	styles = text.getStyleRanges();
-	assertTrue(":2xa:", styles.length == 1);
-
-	text.setText("01");
-	ranges = new StyleRange[2];
-	ranges[0] = getStyle(0,1,PURPLE,PURPLE);
-	ranges[1] = getStyle(1,1,RED,RED);
-	text.replaceStyleRanges(0, 2, ranges);
-	ranges = new StyleRange[1];
-	ranges[0] = getStyle(0,1,YELLOW,YELLOW);
-	text.replaceStyleRanges(0, 1, ranges);
-	styles = text.getStyleRanges();
-	assertTrue(":2xb:", styles.length == 2);
-	assertTrue(":2xb:", styles[0].equals(getStyle(0,1,YELLOW,YELLOW)));
-	assertTrue(":2xb:", styles[1].equals(getStyle(1,1,RED,RED)));
-
-	text.setText("01");
-	ranges = new StyleRange[2];
-	ranges[0] = getStyle(0,1,PURPLE,PURPLE);
-	ranges[1] = getStyle(1,1,RED,RED);
-	text.replaceStyleRanges(0, 2, ranges);
-	ranges = new StyleRange[1];
-	ranges[0] = getStyle(1,1,YELLOW,YELLOW);
-	text.replaceStyleRanges(1, 1, ranges);
-	styles = text.getStyleRanges();
-	assertTrue(":2xc:", styles.length == 2);
-	assertTrue(":2xc:", styles[0].equals(getStyle(0,1,PURPLE,PURPLE)));
-	assertTrue(":2xc:", styles[1].equals(getStyle(1,1,YELLOW,YELLOW)));
-
-	text.setText("012");
-	ranges = new StyleRange[2];
-	ranges[0] = getStyle(0,1,PURPLE,PURPLE);
-	ranges[1] = getStyle(1,1,RED,RED);
-	text.replaceStyleRanges(0, 2, ranges);
-	ranges = new StyleRange[1];
-	ranges[0] = getStyle(2,1,YELLOW,YELLOW);
-	text.replaceStyleRanges(2, 1, ranges);
-	styles = text.getStyleRanges();
-	assertTrue(":2xd:", styles.length == 3);
-	assertTrue(":2xd:", styles[0].equals(getStyle(0,1,PURPLE,PURPLE)));
-	assertTrue(":2xd:", styles[1].equals(getStyle(1,1,RED,RED)));
-	assertTrue(":2xd:", styles[2].equals(getStyle(2,1,YELLOW,YELLOW)));
-
-	text.setText("01234");
-	ranges = new StyleRange[3];
-	ranges[0] = getStyle(1,1,PURPLE,PURPLE);
-	ranges[1] = getStyle(2,1,RED,RED);
-	ranges[2] = getStyle(3,1,PURPLE,PURPLE);
-	text.setStyleRanges(ranges);
-	ranges = new StyleRange[1];
-	ranges[0] = getStyle(4,1,YELLOW,YELLOW);
-	text.replaceStyleRanges(4, 1, ranges);
-	styles = text.getStyleRanges();
-	assertTrue(":2xe:", styles.length == 4);
-	assertTrue(":2xe:", styles[3].equals(getStyle(4,1,YELLOW,YELLOW)));
-
-	text.setText("01234");
-	ranges = new StyleRange[1];
-	ranges[0] = getStyle(4,1,YELLOW,YELLOW);
-	text.replaceStyleRanges(4, 1, ranges);
-	styles = text.getStyleRanges();
-	assertTrue(":2xf:", styles.length == 1);
-	assertTrue(":2xf:", styles[0].equals(getStyle(4,1,YELLOW,YELLOW)));
-
-	text.setText("01234");
-	ranges = new StyleRange[1];
-	ranges[0] = getStyle(4,1,YELLOW,YELLOW);
-	text.replaceStyleRanges(4, 1, ranges);
-	ranges = new StyleRange[0];
-	text.replaceStyleRanges(4, 1, ranges);
-	styles = text.getStyleRanges();
-	assertTrue(":2xg:", styles.length == 0);
-
-}
-
-public void test_replaceTextRangeIILjava_lang_String(){
-	String defaultText = "line0\n\rline1\n\rline2\n\r";
-	int defaultTextLength = defaultText.length();
-	int selectionStart = 7;
-	int selectionLength = 7;
-	int replaceStart = selectionStart + selectionLength + 1;
-	int replaceLength = 5;
-	boolean exceptionThrown = false;
-	String newText = "newline0\n\rnewline1";
-	int newTextLength = newText.length();
-			
-	// insert text
-	// within range
-	// after selection
-	text.setText(defaultText);
-	// select 2nd line including line break
-	text.setSelectionRange(selectionStart, selectionLength);	
-	text.replaceTextRange(replaceStart, 0, newText);
-	assertTrue(":a:", text.getCharCount() == defaultTextLength + newTextLength);
-	assertTrue(":b:", text.getSelectionRange().x == selectionStart && text.getSelectionRange().y == selectionLength);
-		
-	// before selection
-	text.setText(defaultText);
-	// select 2nd line including line break
-	text.setSelectionRange(selectionStart, selectionLength);	
-	text.replaceTextRange(0, 0, newText);
-	assertTrue(":c:", text.getCharCount() == defaultTextLength + newTextLength);
-	assertTrue(":d:", text.getSelectionRange().x == selectionStart + newTextLength && text.getSelectionRange().y == selectionLength);
-
-
-	// intersecting selection
-	text.setText(defaultText);
-	// select 2nd line including line break
-	text.setSelectionRange(selectionStart, selectionLength);	
-	text.replaceTextRange(selectionStart + 1, 0, newText);
-	assertTrue(":e:", text.getCharCount() == defaultTextLength + newTextLength);
-	assertTrue(":f:", text.getSelectionRange().x == selectionStart + 1 + newTextLength && text.getSelectionRange().y == 0);
-				
-	// out of range
-	text.setText(defaultText);
-	// select 2nd line including line break
-	text.setSelectionRange(selectionStart, selectionLength);	
-	try {
-		text.replaceTextRange(-1, 0, newText);
-	}
-	catch (IllegalArgumentException e) {
-		exceptionThrown = true;
-	}
-	assertTrue(":g:", exceptionThrown);
-	exceptionThrown = false;
-	try {
-		text.replaceTextRange(text.getCharCount() + 1, 0, newText);
-	}
-	catch (IllegalArgumentException e) {
-		exceptionThrown = true;
-	}
-
-	exceptionThrown = false;
-	try {
-		text.replaceTextRange(0, 0, null);
-	}
-	catch (IllegalArgumentException e) {
-		exceptionThrown = true;
-	}	
-	assertTrue(exceptionThrown);
-
-	assertTrue(":h:", exceptionThrown);
-	assertTrue(":i:", text.getSelectionRange().x == selectionStart && text.getSelectionRange().y == selectionLength);
-	exceptionThrown = false;
-		
-	// append text
-	// append in empty widget
-	text.setText("");
-	text.replaceTextRange(text.getCharCount(), 0, newText);
-	assertTrue(":j:", text.getCharCount() == newTextLength);
-	assertTrue(":k:", text.getSelectionRange().x == 0 && text.getSelectionRange().y == 0);
-			
-	// append in non-empty widget (selection should always be preserved)
-	text.setText(defaultText);
-	// select 2nd line including line break
-	text.setSelectionRange(selectionStart, selectionLength);	
-	text.replaceTextRange(text.getCharCount(), 0, newText);
-	assertTrue(":l:", text.getCharCount() == defaultTextLength + newTextLength);
-	assertTrue(":m:", text.getSelectionRange().x == selectionStart && text.getSelectionRange().y == selectionLength);
-
-	// place caret at end of text
-	text.setText(defaultText);
-	text.setSelectionRange(text.getCharCount(), 0);	
-	text.replaceTextRange(text.getCharCount(), 0, newText);
-	assertTrue(":n:", text.getCharCount() == defaultTextLength + newTextLength);
-	assertTrue(":o:", text.getSelectionRange().x == text.getCharCount() - newTextLength && text.getSelectionRange().y == 0);
-
-	// replace text
-	// within range
-	// after selection
-	text.setText(defaultText);
-	// select 2nd line including line break
-	text.setSelectionRange(selectionStart, selectionLength);	
-	text.replaceTextRange(replaceStart, replaceLength, newText);
-	assertTrue(":p:", text.getCharCount() == defaultTextLength + newTextLength - replaceLength);
-	assertTrue(":q:", text.getSelectionRange().x == selectionStart && text.getSelectionRange().y == selectionLength);
-		
-	// before selection
-	text.setText(defaultText);
-	// select 2nd line including line break
-	text.setSelectionRange(selectionStart, selectionLength);	
-	text.replaceTextRange(0, replaceLength, newText);
-	assertTrue(":r:", text.getCharCount() == defaultTextLength + newTextLength - replaceLength);
-	assertTrue(":s:", text.getSelectionRange().x == selectionStart + newTextLength - replaceLength && text.getSelectionRange().y == selectionLength);
-	
-	// intersecting selection
-	text.setText(defaultText);
-	// select 2nd line including line break
-	text.setSelectionRange(selectionStart, selectionLength);	
-	text.replaceTextRange(selectionStart + 1, replaceLength, newText);
-	assertTrue(":t:", text.getCharCount() == defaultTextLength + newTextLength - replaceLength);
-	assertTrue(":u:", text.getSelectionRange().x == selectionStart + 1 + newTextLength && text.getSelectionRange().y == 0);
-			
-	// out of range
-	text.setText(defaultText);
-	// select 2nd line including line break
-	text.setSelectionRange(selectionStart, selectionLength);	
-	try {
-		text.replaceTextRange(-1, replaceLength, newText);
-	}
-	catch (IllegalArgumentException e) {
-		exceptionThrown = true;
-	}
-	assertTrue(":v:", exceptionThrown);
-	exceptionThrown = false;
-	try {
-		text.replaceTextRange(text.getCharCount() + 1, replaceLength, newText);
-	}
-	catch (IllegalArgumentException e) {
-		exceptionThrown = true;
-	}
-	assertTrue(":w:", exceptionThrown);
-	assertTrue(":x:", text.getSelectionRange().x == selectionStart && text.getSelectionRange().y == selectionLength);
-}
-
-public void test_selectAll() {
-	String line = "Line1\rLine2";
-	
-	text.selectAll();
-	assertEquals("", text.getSelectionText());
-	
-	text.setText(line);
-	text.selectAll();
-	assertEquals(line, text.getSelectionText());
-	
-	text.setText("");
-	text.selectAll();
-	assertEquals("", text.getSelectionText());
-}
-
-public void test_setCaretLorg_eclipse_swt_widgets_Caret() {
-	Caret caret = new Caret(text, SWT.NONE);
-	final int XINSET;
-	
-	if (isBidi()) {
-		XINSET = 3;
-	}
-	else {
-		XINSET = 0;
-	}
-
-	text.setCaret(caret);
-	assertEquals(XINSET, text.getCaret().getLocation().x);
-	assertEquals(0, text.getCaret().getLocation().y);
-
-	text.setCaret(null);		
-	text.setText("\rLine2");
-	text.setSelection(2);
-
-	text.setTopIndex(0);
-	text.setCaret(caret);
-	assertTrue(text.getCaret().getLocation().x > 0);
-	assertEquals(text.getLineHeight(), text.getCaret().getLocation().y);
-}
-
-public void test_setBidiColoringZ() {
-	/// setBidiColoring is deprecated and will be removed.
-	warnUnimpl("Test test_setBidiColoringZ not written");
-}
-
-public void test_setCaretOffsetI(){
-	text.setCaretOffset(-2);
-	assertTrue(":a:", text.getCaretOffset() == 0);
-	text.setCaretOffset(1);
-	assertTrue(":b:", text.getCaretOffset() == 0);
-	text.setCaretOffset(0);
-	assertTrue(":c:", text.getCaretOffset() == 0);
-
-	text.setText("Line0\r\n");
-	text.setCaretOffset(-2);
-	assertTrue(":d:", text.getCaretOffset() == 0);
-	text.setCaretOffset(1);
-	assertTrue(":e:", text.getCaretOffset() == 1);
-	text.setCaretOffset(0);
-	assertTrue(":f:", text.getCaretOffset() == 0);
-
-	text.setCaretOffset(text.getCharCount());
-	assertTrue(":g:", text.getCaretOffset() == text.getCharCount());
-	text.setCaretOffset(text.getCharCount() + 1);
-	assertTrue(":h:", text.getCaretOffset() == text.getCharCount());
-	text.setCaretOffset(5);
-	assertTrue(":i:", text.getCaretOffset() == 5);
-
-	text.setText("");
-	text.setCaretOffset(-2);
-	assertTrue(":j:", text.getCaretOffset() == 0);
-	text.setCaretOffset(1);
-	assertTrue(":k:", text.getCaretOffset() == 0);
-	text.setCaretOffset(0);
-	assertTrue(":l:", text.getCaretOffset() == 0);
-}
-
-public void test_setContentLorg_eclipse_swt_custom_StyledTextContent() {
-	boolean exceptionThrown;
-	StyledTextContent content = new StyledTextContent() {
-		public void addTextChangeListener(TextChangeListener listener) {
-		}
-		public int getCharCount() {
-			return 0;
-		}
-		public String getLine(int lineIndex) {
-			return "";
-		}
-		public int getLineAtOffset(int offset) {
-			return 0;
-		}
-		public int getLineCount() {
-			return 0;
-		}
-		public String getLineDelimiter() {
-			return "";
-		}
-		public int getOffsetAtLine(int lineIndex) {
-			return 0;
-		}		
-		public String getTextRange(int start, int length) {
-			return "";
-		}
-		public void removeTextChangeListener(TextChangeListener listener) {
-		}
-		public void replaceTextRange(int start, int replaceLength, String text) {
-		}
-		public void setText(String text) {
-		}
-	};
-	text.setContent(content);
-	assertEquals(content, text.getContent());
-	
-	exceptionThrown = false;
-	try {
-		text.setContent(null);
-	}
-	catch (IllegalArgumentException e) {
-		exceptionThrown = true;
-	}
-	assertTrue(exceptionThrown);
-}
-
-public void test_setDoubleClickEnabledZ(){
-	text.setDoubleClickEnabled(true);
-	assertTrue(":a:", text.getDoubleClickEnabled() == true);
-	text.setDoubleClickEnabled(false);
-	assertTrue(":b:", text.getDoubleClickEnabled() == false);
-	text.setDoubleClickEnabled(false);
-	assertTrue(":c:", text.getDoubleClickEnabled() == false);
-	text.setDoubleClickEnabled(true);
-	assertTrue(":d:", text.getDoubleClickEnabled() == true);
-}
-
-public void test_setEditableZ(){
-	text.setEditable(true);
-	assertTrue(":a:", text.getEditable() == true);
-	text.setEditable(false);
-	assertTrue(":b:", text.getEditable() == false);
-	text.setEditable(false);
-	assertTrue(":c:", text.getEditable() == false);
-	text.setEditable(true);
-	assertTrue(":d:", text.getEditable() == true);
-}
-
-public void test_setFontLorg_eclipse_swt_graphics_Font(){
-	FontData fontData = text.getFont().getFontData()[0];
-	int lineHeight;
-	Font font;
-	
-	font = new Font(text.getDisplay(), fontData.getName(), 8, fontData.getStyle());
-	text.setFont(font);
-	font.dispose();
-	lineHeight = text.getLineHeight();
-	font = new Font(text.getDisplay(), fontData.getName(), 12, fontData.getStyle());
-	text.setFont(font);
-	assertTrue(":a:", text.getLineHeight() > lineHeight && font.equals(text.getFont()));
-	font.dispose();
-}
-
-public void test_setHorizontalIndexI(){
-	text.setHorizontalIndex(-1);
-	assertTrue(":a:", text.getHorizontalIndex() == 0);
-	text.setHorizontalIndex(1);	
-	assertTrue(":b:", text.getHorizontalIndex() == 0);
-	
-	text.setText("Line0");
-	text.setHorizontalIndex(-1);
-	assertTrue(":c:", text.getHorizontalIndex() == 0);
-	text.setHorizontalIndex(1);	
-	assertTrue(":d:", text.getHorizontalIndex() == 1);
-	text.setHorizontalIndex(500);
-	assertTrue(":e:", text.getHorizontalIndex() > 0);
-	text.setHorizontalIndex(-1);	
-	assertTrue(":f:", text.getHorizontalIndex() == 0);
-	text.setHorizontalIndex(1);	
-	assertTrue(":g:", text.getHorizontalIndex() == 1);	
-
-	text.setText("");
-	text.setHorizontalIndex(2);
-	assertTrue(":h:", text.getHorizontalIndex() == 0);
-
-	// make sure the widget can be scrolled
-	shell.open();
-	text.setSize(10, 50);	
-	text.setText("Line0");
-	text.setHorizontalIndex(1);	
-	assertTrue(":i:", text.getHorizontalIndex() == 1);
-}
-
-public void test_setHorizontalPixelI(){
-	text.setHorizontalPixel(-1);
-	assertTrue(":a:", text.getHorizontalPixel() == 0);
-	text.setHorizontalPixel(1);	
-	assertTrue(":b:", text.getHorizontalPixel() == 0);
-	
-	text.setText("Line0");
-	text.setHorizontalPixel(-1);
-	assertTrue(":c:", text.getHorizontalPixel() == 0);
-	text.setHorizontalPixel(1);	
-	assertTrue(":d:", text.getHorizontalPixel() == 1);
-	text.setHorizontalPixel(500);
-	assertTrue(":e:", text.getHorizontalPixel() > 0);
-	text.setHorizontalPixel(-1);	
-	assertTrue(":f:", text.getHorizontalPixel() == 0);
-	text.setHorizontalPixel(25);	
-	assertTrue(":g:", text.getHorizontalPixel() == 25);	
-
-	text.setText("");
-	text.setHorizontalPixel(2);
-	assertTrue(":h:", text.getHorizontalPixel() == 0);
-
-	// make sure the widget can be scrolled
-	shell.open();
-	text.setSize(10, 50);	
-	text.setText("Line0");
-	text.setHorizontalPixel(5);	
-	assertTrue(":i:", text.getHorizontalPixel() == 5);
-}
-
-public void test_setLineBackgroundIILorg_eclipse_swt_graphics_Color(){
-	StyleRange[] styles;
-	String textString = "";
-
-	textString = "L1\nL2\nL3\nL4";
-	text.setText(textString);
-	text.setLineBackground(0,1,getColor(RED));
-	text.setLineBackground(1,1,getColor(YELLOW));
-	text.setLineBackground(2,1,getColor(BLUE));
-	text.setLineBackground(3,1,getColor(GREEN));
-	text.replaceTextRange(1,5,"");
-	assertTrue(":0a:", text.getLineBackground(0) == getColor(RED));
-	assertTrue(":0a:", text.getLineBackground(1) == getColor(GREEN));
-	text.setText(textString);
-	text.setLineBackground(0,1,getColor(RED));
-	text.setLineBackground(1,1,getColor(YELLOW));
-	text.setLineBackground(2,1,getColor(BLUE));
-	text.setLineBackground(3,1,getColor(GREEN));
-	text.replaceTextRange(0,4,"");
-	assertTrue(":0b:", text.getLineBackground(0) == getColor(YELLOW));
-	assertTrue(":0b:", text.getLineBackground(1) == getColor(BLUE));
-	assertTrue(":0b:", text.getLineBackground(2) == getColor(GREEN));
-	text.setText(textString);
-	text.setLineBackground(0,1,getColor(RED));
-	text.setLineBackground(1,1,getColor(YELLOW));
-	text.setLineBackground(2,1,getColor(BLUE));
-	text.setLineBackground(3,1,getColor(GREEN));
-	text.replaceTextRange(1,1,"");
-	assertTrue(":0c:", text.getLineBackground(0) == getColor(RED));
-	assertTrue(":0c:", text.getLineBackground(1) == getColor(YELLOW));
-	assertTrue(":0c:", text.getLineBackground(2) == getColor(BLUE));
-	assertTrue(":0c:", text.getLineBackground(3) == getColor(GREEN));
-	text.setText(textString);
-	text.setLineBackground(0,1,getColor(RED));
-	text.setLineBackground(1,1,getColor(YELLOW));
-	text.setLineBackground(2,1,getColor(BLUE));
-	text.setLineBackground(3,1,getColor(GREEN));
-	text.replaceTextRange(0,6,"");
-	assertTrue(":0d:", text.getLineBackground(0) == getColor(BLUE));
-	assertTrue(":0d:", text.getLineBackground(1) == getColor(GREEN));
-	text.setText(textString);
-	text.setLineBackground(0,1,getColor(RED));
-	text.setLineBackground(1,1,getColor(YELLOW));
-	text.setLineBackground(2,1,getColor(BLUE));
-	text.setLineBackground(3,1,getColor(GREEN));
-	text.replaceTextRange(1,3,"");
-	assertTrue(":0e:", text.getLineBackground(0) == getColor(RED));
-	assertTrue(":0e:", text.getLineBackground(1) == getColor(BLUE));
-	assertTrue(":0e:", text.getLineBackground(2) == getColor(GREEN));
-
-	textString = "L1\nL2";
-	text.setText(textString);
-	text.setLineBackground(0,1,getColor(RED));
-	text.setLineBackground(1,1,getColor(YELLOW));
-	text.replaceTextRange(1,4,"");
-	assertTrue(":0a1:", text.getLineBackground(0) == getColor(RED));
-	text.setText(textString);
-	text.setLineBackground(0,1,getColor(RED));
-	text.setLineBackground(1,1,getColor(YELLOW));
-	text.replaceTextRange(0,4,"");
-	assertTrue(":0b1:", text.getLineBackground(0) == getColor(YELLOW));
-	text.setText(textString);
-	text.setLineBackground(0,1,getColor(RED));
-	text.setLineBackground(1,1,getColor(YELLOW));
-	text.replaceTextRange(1,1,"");
-	assertTrue(":0c1:", text.getLineBackground(0) == getColor(RED));
-	assertTrue(":0c1:", text.getLineBackground(1) == getColor(YELLOW));
-	text.setText(textString);
-	text.setLineBackground(0,1,getColor(RED));
-	text.setLineBackground(1,1,getColor(YELLOW));
-	text.replaceTextRange(0,5,"");
-	assertTrue(":0d1:", text.getLineBackground(0) == null);
-	text.setText(textString);
-	text.setLineBackground(0,1,getColor(RED));
-	text.setLineBackground(1,1,getColor(YELLOW));
-	text.replaceTextRange(1,3,"");
-	assertTrue(":0e1:", text.getLineBackground(0) == getColor(RED));
-	assertTrue(":0e1:", text.getLineBackground(1) == getColor(YELLOW));
-	textString = "L1\nL2";
-	text.setText(textString);
-	text.setLineBackground(1,1,getColor(YELLOW));
-	text.replaceTextRange(1,4,"");
-	assertTrue(":0f1:", text.getLineBackground(0) == null);
-	text.setText(textString+"\n");
-	text.setLineBackground(0,1,getColor(RED));
-	text.setLineBackground(1,1,getColor(YELLOW));
-	text.replaceTextRange(0,6,"");
-	assertTrue(":0g1:", text.getLineBackground(0) == null);
-				
-	text.setText(textString);
-	text.setLineBackground(0,0,getColor(RED));
-	assertTrue(":1:", text.getLineBackground(0) == null);
-	text.setLineBackground(0,1,getColor(RED));
-	assertTrue(":1:", text.getLineBackground(0) == getColor(RED));
-	
-	textString = "New Line1\nNew Line2\nNew Line3\nNew Line4";
-	text.setText(textString);
-	text.setLineBackground(0,2,getColor(RED));
-	text.setLineBackground(2,2,getColor(YELLOW));
-	text.replaceTextRange(0,0,"\n");
-	assertTrue(":2:", text.getLineBackground(0) == null);
-	assertTrue(":2:", text.getLineBackground(1) == getColor(RED));
-	assertTrue(":2:", text.getLineBackground(2) == getColor(RED));
-	assertTrue(":2:", text.getLineBackground(3) == getColor(YELLOW));
-	assertTrue(":2:", text.getLineBackground(4) == getColor(YELLOW));
-	
-	textString = "New Line1\nNew Line2\nNew Line3\nNew Line4";
-	text.setText(textString);
-	text.setLineBackground(0,2,getColor(RED));
-	text.setLineBackground(2,2,getColor(YELLOW));
-	text.replaceTextRange(0,20,"");
-	assertTrue(":3:", text.getLineBackground(0) == getColor(YELLOW));
-	assertTrue(":3:", text.getLineBackground(1) == getColor(YELLOW));
-
-	textString = "Line1\nLine2\nLine3\nLine4";
-	text.setText(textString);
-	text.setLineBackground(0,1,getColor(RED));
-	text.setLineBackground(2,1,getColor(YELLOW));
-	text.replaceTextRange(0,18,"");
-	assertTrue(":4:", text.getLineBackground(0) == null);
-
-	textString = "Line1\nLine2\nLine3\nLine4";
-	text.setText(textString);
-	text.setLineBackground(0,1,getColor(RED));
-	text.setLineBackground(2,1,getColor(YELLOW));
-	text.replaceTextRange(0,18,"L1\nL2\nL3\n");
-	assertTrue(":5:", text.getLineBackground(0) == null);
-	assertTrue(":5:", text.getLineBackground(1) == null);
-	assertTrue(":5:", text.getLineBackground(2) == null);
-	assertTrue(":5:", text.getLineBackground(3) == null);
-
-	textString = "Line1\nLine2\nLine3\nLine4";
-	text.setText(textString);
-	text.setLineBackground(0,1,getColor(RED));
-	text.setLineBackground(1,1,getColor(YELLOW));
-	text.setLineBackground(2,1,getColor(BLUE));
-	text.setLineBackground(3,1,getColor(GREEN));
-	text.replaceTextRange(3,9,"L1\nL2\n");
-	assertTrue(":6a:", text.getLineBackground(0) == getColor(RED));
-	assertTrue(":6a:", text.getLineBackground(1) == null);
-	textString = "Line1\nLine2\nLine3\nLine4";
-	text.setText(textString);
-	text.setLineBackground(0,1,getColor(RED));
-	text.setLineBackground(1,1,getColor(YELLOW));
-	text.setLineBackground(2,1,getColor(BLUE));
-	text.setLineBackground(3,1,getColor(GREEN));
-	text.replaceTextRange(11,11,"L3\nL4");
-	assertTrue(":6b:", text.getLineBackground(2) == null);
-	assertTrue(":6b:", text.getLineBackground(3) == getColor(GREEN));
-		
-	textString = "Line1\nLine2\nLine3\nLine4";
-	text.setText(textString);
-	text.setLineBackground(0,1,getColor(RED));
-	text.setLineBackground(1,1,getColor(YELLOW));
-	text.setLineBackground(2,1,getColor(BLUE));
-	text.setLineBackground(3,1,getColor(GREEN));
-	text.replaceTextRange(0,18,"L1\n");
-	assertTrue(":7:", text.getLineBackground(0) == null);
-	assertTrue(":7:", text.getLineBackground(1) == getColor(GREEN));
-}
-
-public void test_setSelectionI() {
-	int[] invalid = {-1, 100, 12};
-	boolean exceptionThrown;
-
-	for (int i = 0; i < invalid.length; i++) {
-		exceptionThrown = false;
-		try {
-			text.setSelection(invalid[i]);
-		}
-		catch (IllegalArgumentException e) {
-			exceptionThrown = true;
-		}
-		assertTrue(exceptionThrown);
-	}	
-	text.setText("01234567890");
-	assertEquals(0, text.getCaretOffset());
-	text.setSelection(1);
-	assertEquals(1, text.getCaretOffset());
-	text.setSelection(11);
-	assertEquals(11, text.getCaretOffset());
-
-	for (int i = 0; i < invalid.length; i++) {
-		exceptionThrown = false;
-		try {
-			text.setSelection(invalid[i]);
-		}
-		catch (IllegalArgumentException e) {
-			exceptionThrown = true;
-		}
-		assertTrue(exceptionThrown);
-	}	
-}
-
-public void test_setSelectionLorg_eclipse_swt_graphics_Point() {
-	Point[] invalidRanges = {new Point(-1, 0), new Point(-1, -1), new Point(100, 1), 
-		new Point(100, -1), new Point(11, 12), new Point(10, 12)};
-	boolean exceptionThrown;
-
-	for (int i = 0; i < invalidRanges.length; i++) {
-		exceptionThrown = false;
-		try {
-			text.setSelection(invalidRanges[i]);
-		}
-		catch (IllegalArgumentException e) {
-			exceptionThrown = true;
-		}
-		assertTrue(exceptionThrown);
-	}	
-	text.setText("01234567890");
-	assertEquals("", text.getSelectionText());
-	text.setSelection(3, 7);
-	assertEquals("3456", text.getSelectionText());
-
-	for (int i = 0; i < invalidRanges.length; i++) {
-		exceptionThrown = false;
-		try {
-			text.setSelection(invalidRanges[i]);
-		}
-		catch (IllegalArgumentException e) {
-			exceptionThrown = true;
-		}
-		assertTrue(exceptionThrown);
-	}	
-}
-
-public void test_setSelectionII(){
-	int[][] invalidRanges = {{-1, 0}, {-1, -1}, {100, 1}, {100, -1}, {11, 12}, {10, 12}, {2, -3}, {50, -1}};
-	boolean exceptionThrown;
-
-	for (int i = 0; i < invalidRanges.length; i++) {
-		int start = invalidRanges[i][0];
-		int end = invalidRanges[i][1];
-	
-		exceptionThrown = false;
-		try {
-			text.setSelection(start, end);
-		}
-		catch (IllegalArgumentException e) {
-			exceptionThrown = true;
-		}
-		assertTrue(exceptionThrown);
-	}	
-	text.setText("01234567890");
-	assertEquals("", text.getSelectionText());
-	text.setSelection(3, 7);
-	assertEquals("3456", text.getSelectionText());
-	text.setSelection(3, 0);
-	assertEquals("012", text.getSelectionText());
-	assertEquals(0, text.getCaretOffset());	
-
-	for (int i = 0; i < invalidRanges.length; i++) {
-		int start = invalidRanges[i][0];
-		int end = invalidRanges[i][1];
-	
-		exceptionThrown = false;
-		try {
-			text.setSelection(start, end);
-		}
-		catch (IllegalArgumentException e) {
-			exceptionThrown = true;
-		}
-		assertTrue(exceptionThrown);
-	}	
-}
-public void test_setSelectionBackgroundLorg_eclipse_swt_graphics_Color(){
-	text.setSelectionBackground(getColor(YELLOW));
-	assertTrue(":1a:", text.getSelectionBackground() ==  getColor(YELLOW));
-	text.setSelectionBackground(null);
-	assertTrue(":1b:", text.getSelectionBackground().equals(text.getDisplay().getSystemColor(SWT.COLOR_LIST_SELECTION)));
-}
-public void test_setSelectionForegroundLorg_eclipse_swt_graphics_Color(){
-	text.setSelectionForeground(getColor(RED));
-	assertTrue(":1a:", text.getSelectionForeground() ==  getColor(RED));
-	text.setSelectionForeground(null);
-	assertTrue(":1b:", text.getSelectionForeground().equals(text.getDisplay().getSystemColor(SWT.COLOR_LIST_SELECTION_TEXT)));
-}
-
-public void test_setSelectionRangeII(){
-	// setSelectionRange already tested in test_getSelectionRange
-}
-
-public void test_setStyleRangeLorg_eclipse_swt_custom_StyleRange(){
-	StyleRange[] styles;
-	String textString = textString();
-
-	/* 
-		defaultStyles
-		
-			(0,48,RED,YELLOW), 
-			(58,10,BLUE,CYAN), 
-			(68,10,GREEN,PURPLE)
-	*/
-
-
-	text.setText(textString);
-	
-	// No overlap with existing styles
-	text.setStyleRanges(defaultStyles());
-	text.setStyleRange(getStyle(48,5,YELLOW,RED));
-	styles = text.getStyleRanges();
-	assertTrue(":1:", styles.length == 4);
-	assertTrue(":1:", styles[0].equals(getStyle(0,48,RED,YELLOW)));
-	assertTrue(":1:", styles[1].equals(getStyle(48,5,YELLOW,RED)));
-	assertTrue(":1:", styles[2].equals(getStyle(58,10,BLUE,CYAN)));
-	assertTrue(":1:", styles[3].equals(getStyle(68,10,GREEN,PURPLE)));
-
-	// Overlap middle of one style - partial
-	text.setStyleRanges(defaultStyles());
-	text.setStyleRange(getStyle(10,10,YELLOW,RED));
-	styles = text.getStyleRanges();
-	assertTrue(":2:", styles.length == 5);
-	assertTrue(":2:", styles[0].equals(getStyle(0,10,RED,YELLOW)));
-	assertTrue(":2:", styles[1].equals(getStyle(10,10,YELLOW,RED)));
-	assertTrue(":2:", styles[2].equals(getStyle(20,28,RED,YELLOW)));
-	assertTrue(":2:", styles[3].equals(getStyle(58,10,BLUE,CYAN)));
-	assertTrue(":2:", styles[4].equals(getStyle(68,10,GREEN,PURPLE)));
-	text.setStyleRange(null);
-	styles = text.getStyleRanges();
-	assertTrue(":2:", styles.length == 0);
-	
-	// Overlap middle of one style - full
-	text.setStyleRanges(defaultStyles());
-	text.setStyleRange(getStyle(58,10,YELLOW,RED));
-	styles = text.getStyleRanges();
-	assertTrue(":3:", styles.length == 3);
-	assertTrue(":3:", styles[0].equals(getStyle(0,48,RED,YELLOW)));
-	assertTrue(":3:", styles[1].equals(getStyle(58,10,YELLOW,RED)));
-	assertTrue(":3:", styles[2].equals(getStyle(68,10,GREEN,PURPLE)));
-	
-	// Overlap end of one style
-	text.setStyleRanges(defaultStyles());
-	text.setStyleRange(getStyle(38,15,YELLOW,RED));
-	styles = text.getStyleRanges();
-	assertTrue(":4:", styles.length == 4);
-	assertTrue(":4:", styles[0].equals(getStyle(0,38,RED,YELLOW)));
-	assertTrue(":4:", styles[1].equals(getStyle(38,15,YELLOW,RED)));
-	assertTrue(":4:", styles[2].equals(getStyle(58,10,BLUE,CYAN)));
-	assertTrue(":4:", styles[3].equals(getStyle(68,10,GREEN,PURPLE)));
-	
-	// Overlap beginning of one style
-	text.setStyleRanges(defaultStyles());
-	text.setStyleRange(getStyle(50,10,YELLOW,RED));
-	styles = text.getStyleRanges();
-	assertTrue(":5:", styles.length == 4);
-	assertTrue(":5:", styles[0].equals(getStyle(0,48,RED,YELLOW)));
-	assertTrue(":5:", styles[1].equals(getStyle(50,10,YELLOW,RED)));
-	assertTrue(":5:", styles[2].equals(getStyle(60,8,BLUE,CYAN)));
-	assertTrue(":5:", styles[3].equals(getStyle(68,10,GREEN,PURPLE)));
-
-	// Overlap complete style
-	text.setStyleRanges(defaultStyles());
-	text.setStyleRange(getStyle(48,20,YELLOW,RED));
-	styles = text.getStyleRanges();
-	assertTrue(":6:", styles.length == 3);
-	assertTrue(":6:", styles[0].equals(getStyle(0,48,RED,YELLOW)));
-	assertTrue(":6:", styles[1].equals(getStyle(48,20,YELLOW,RED)));
-	assertTrue(":6:", styles[2].equals(getStyle(68,10,GREEN,PURPLE)));
-
-	// reset the environment
-	text.dispose();
-	text = new StyledText(shell, SWT.NULL);
-	setWidget(text);
-			
-	text.setText(textString);
-	text.setStyleRange(getStyle(0,48,RED,YELLOW));
-	text.setStyleRange(getStyle(48,20,BLUE,CYAN));
-	text.setStyleRange(getStyle(68,10,GREEN,PURPLE));
-	// should be merged with style before it
-	text.setStyleRange(getStyle(48,10,RED,YELLOW));
-	styles = text.getStyleRanges();
-	assertTrue(":1:", styles.length == 3);
-	assertTrue(":1:", styles[0].equals(getStyle(0,58,RED,YELLOW)));
-	assertTrue(":1:", styles[1].equals(getStyle(58,10,BLUE,CYAN)));
-	assertTrue(":1:", styles[2].equals(getStyle(68,10,GREEN,PURPLE)));
-
-	text.setText(textString);
-	text.setStyleRange(getStyle(0,10,RED,YELLOW));
-	text.setStyleRange(getStyle(15,10,BLUE,CYAN));
-	text.setStyleRange(getStyle(25,10,GREEN,PURPLE));
-	// should be merged with style after it
-	text.setStyleRange(getStyle(11,4,BLUE,CYAN));
-	styles = text.getStyleRanges();
-	assertTrue(":2:", styles.length == 3);
-	assertTrue(":2:", styles[0].equals(getStyle(0,10,RED,YELLOW)));
-	assertTrue(":2:", styles[1].equals(getStyle(11,14,BLUE,CYAN)));
-	assertTrue(":2:", styles[2].equals(getStyle(25,10,GREEN,PURPLE)));
-	
-	text.setText(textString);
-	text.setStyleRange(getStyle(0,10,RED,YELLOW));
-	text.setStyleRange(getStyle(15,10,BLUE,CYAN));
-	text.setStyleRange(getStyle(25,10,GREEN,PURPLE));
-	// should be merged with style after it
-	text.setStyleRange(getStyle(5,15,BLUE,CYAN));
-	styles = text.getStyleRanges();
-	assertTrue(":3:", styles.length == 3);
-	assertTrue(":3:", styles[0].equals(getStyle(0,5,RED,YELLOW)));
-	assertTrue(":3:", styles[1].equals(getStyle(5,20,BLUE,CYAN)));
-	assertTrue(":3:", styles[2].equals(getStyle(25,10,GREEN,PURPLE)));
-
-	text.setText("01234567890123456789");
-	text.setStyleRange(getStyle(0,10,RED,YELLOW));
-	text.setStyleRange(getStyle(10,10,BLUE,CYAN));
-	text.setStyleRange(getStyle(5,3,RED,YELLOW));
-	text.setStyleRange(getStyle(12,5,BLUE,CYAN));
-	styles = text.getStyleRanges();
-	assertTrue(":4:", styles.length == 2);
-	assertTrue(":4:", styles[0].equals(getStyle(0,10,RED,YELLOW)));
-	assertTrue(":4:", styles[1].equals(getStyle(10,10,BLUE,CYAN)));
-	
-	text.setText("0123456789012345");
-	text.setStyleRange(getStyle(0,5,RED,YELLOW));
-	text.setStyleRange(getStyle(5,5,BLUE,CYAN));
-	text.setStyleRange(getStyle(10,5,GREEN,PURPLE));
-	// no merging since styles are completely overlapping existing
-	// styles
-	text.setStyleRange(getStyle(5,5,RED,YELLOW));
-	text.setStyleRange(getStyle(10,5,RED,YELLOW));
-	styles = text.getStyleRanges();
-	assertTrue(":5:", styles.length == 3);
-	assertTrue(":5:", styles[0].equals(getStyle(0,5,RED,YELLOW)));
-	assertTrue(":5:", styles[1].equals(getStyle(5,5,RED,YELLOW)));
-	assertTrue(":5:", styles[2].equals(getStyle(10,5,RED,YELLOW)));
-	
-	text.setText("012345678901234");
-	text.setStyleRange(getStyle(0,5,RED,YELLOW));
-	text.setStyleRange(getStyle(10,5,BLUE,CYAN));
-	// should be merged
-	text.setStyleRange(getStyle(5,7,BLUE,CYAN));
-	styles = text.getStyleRanges();
-	assertTrue(":6:", styles.length == 2);
-	assertTrue(":6:", styles[0].equals(getStyle(0,5,RED,YELLOW)));
-	assertTrue(":6:", styles[1].equals(getStyle(5,10,BLUE,CYAN)));
-
-	text.setText("123 456 789");
-	text.setStyleRange(getStyle(4,3,BLUE,null));
-	text.setStyleRange(getStyle(8,3,RED,null));
-	text.setStyleRange(getStyle(5,2,BLUE,null));
-	styles = text.getStyleRanges();
-	assertTrue(":7:", styles.length == 2);
-	assertTrue(":7:", styles[0].equals(getStyle(4,3,BLUE,null)));
-	assertTrue(":7:", styles[1].equals(getStyle(8,3,RED,null)));
-	
-	text.setText("123 456 789");
-	text.setStyleRange(getStyle(4,3,BLUE,null));
-	text.setStyleRange(getStyle(8,3,RED,null));
-	text.setStyleRange(getStyle(7,4,BLUE,null));
-	styles = text.getStyleRanges();
-	assertTrue(":8:", styles.length == 2);
-	assertTrue(":8:", styles[0].equals(getStyle(4,3,BLUE,null)));
-	assertTrue(":8:", styles[1].equals(getStyle(7,4,BLUE,null)));
-	
-	text.setText("123 456 789 ABC DEF");
-	text.setStyleRange(getStyle(0,4,BLUE,null));
-	text.setStyleRange(getStyle(4,4,RED,null));
-	text.setStyleRange(getStyle(8,4,BLUE,null));
-	text.setStyleRange(getStyle(12,4,RED,null));
-	text.setStyleRange(getStyle(16,3,BLUE,null));
-	text.setStyleRange(getStyle(5,14,RED,null));
-	styles = text.getStyleRanges();
-	assertTrue(":9:", styles.length == 2);
-	assertTrue(":9:", styles[0].equals(getStyle(0,4,BLUE,null)));
-	assertTrue(":9:", styles[1].equals(getStyle(4,15,RED,null)));
-
-	// reset the environment
-	text.dispose();
-	text = new StyledText(shell, SWT.NULL);
-	setWidget(text);
-
-	text.setText(textString);
-	text.setStyleRange(getStyle(0,48,RED,YELLOW));
-	text.setStyleRange(getStyle(48,20,BLUE,CYAN));
-	text.setStyleRange(getStyle(68,10,GREEN,PURPLE));
-	text.setStyleRange(getStyle(38,20,null,null));
-	styles = text.getStyleRanges();
-	assertTrue(":1:", styles.length == 3);
-	assertTrue(":1:", styles[0].equals(getStyle(0,38,RED,YELLOW)));
-	assertTrue(":1:", styles[1].equals(getStyle(58,10,BLUE,CYAN)));
-	assertTrue(":1:", styles[2].equals(getStyle(68,10,GREEN,PURPLE)));
-
-	text.setText(textString);
-	int length = textString.length();
-	text.setStyleRange(getStyle(0,48,RED,YELLOW));
-	text.setStyleRange(getStyle(48,20,BLUE,CYAN));
-	text.setStyleRange(getStyle(68,10,GREEN,PURPLE));
-	text.setStyleRange(getStyle(0,length,null,null));
-	styles = text.getStyleRanges();
-	assertTrue(":2:", styles.length == 0);
-	
-	text.setText("01234567890123456789");
-	text.setStyleRange(getStyle(0,3,RED,YELLOW));
-	text.setStyleRange(getStyle(5,3,BLUE,CYAN));
-	text.setStyleRange(getStyle(9,8,GREEN,PURPLE));
-	text.setStyleRange(getStyle(0,10,GREEN,PURPLE));
-	styles = text.getStyleRanges();
-	assertTrue(":3:", styles.length == 2);
-	assertTrue(":3:", styles[0].equals(getStyle(0,10,GREEN,PURPLE)));
-	assertTrue(":3:", styles[1].equals(getStyle(10,7,GREEN,PURPLE)));
-	
-	text.setText("0123456789012345");
-	text.setStyleRange(getStyle(0,5,RED,YELLOW));
-	text.setStyleRange(getStyle(5,5,BLUE,CYAN));
-	text.setStyleRange(getStyle(10,5,GREEN,PURPLE));
-	text.setStyleRange(getStyle(7,9,RED,YELLOW));
-	styles = text.getStyleRanges();
-	assertTrue(":4:", styles.length == 3);
-	assertTrue(":4:", styles[0].equals(getStyle(0,5,RED,YELLOW)));
-	assertTrue(":4:", styles[1].equals(getStyle(5,2,BLUE,CYAN)));
-	assertTrue(":4:", styles[2].equals(getStyle(7,9,RED,YELLOW)));
-	
-	text.setText("012345678901234");
-	text.setStyleRange(getStyle(0,5,RED,YELLOW));
-	text.setStyleRange(getStyle(10,5,BLUE,CYAN));
-	text.setStyleRange(getStyle(3,10,GREEN,PURPLE));
-	styles = text.getStyleRanges();
-	assertTrue(":5:", styles.length == 3);
-	assertTrue(":5:", styles[0].equals(getStyle(0,3,RED,YELLOW)));
-	assertTrue(":5:", styles[1].equals(getStyle(3,10,GREEN,PURPLE)));
-	assertTrue(":5:", styles[2].equals(getStyle(13,2,BLUE,CYAN)));
-	
-	text.setText("redgreenblueyellowcyanpurple");
-	text.setStyleRange(getStyle(0,3,RED,null));
-	text.setStyleRange(getStyle(3,5,GREEN,null));
-	text.setStyleRange(getStyle(8,4,BLUE,null));
-	text.setStyleRange(getStyle(12,6,YELLOW,null));
-	text.setStyleRange(getStyle(18,4,CYAN,null));
-	text.setStyleRange(getStyle(22,6,PURPLE,null));
-	text.setStyleRange(getStyle(8,14,null,RED));
-	styles = text.getStyleRanges();
-	assertTrue(":6:", styles.length == 4);
-	assertTrue(":6:", styles[0].equals(getStyle(0,3,RED,null)));
-	assertTrue(":6:", styles[1].equals(getStyle(3,5,GREEN,null)));
-	assertTrue(":6:", styles[2].equals(getStyle(8,14,null,RED)));
-	assertTrue(":6:", styles[3].equals(getStyle(22,6,PURPLE,null)));
-
-
-	text.setText("redgreenblueyellowcyanpurple");
-	text.setStyleRange(getStyle(0,3,RED,null));
-	text.setStyleRange(getStyle(3,5,GREEN,null));
-	text.setStyleRange(getStyle(8,4,BLUE,null));
-	text.setStyleRange(getStyle(12,6,YELLOW,null));
-	text.setStyleRange(getStyle(18,4,CYAN,null));
-	text.setStyleRange(getStyle(22,6,PURPLE,null));
-	text.setStyleRange(getStyle(0,28,null,null));
-	styles = text.getStyleRanges();
-	assertTrue(":7:", styles.length == 0);
-
-
-/*
-	text.setText("This\r\na\tAnother line.");
-	text.setStyleRange(getStyle(3,3,BLUE,null));
-	text.setStyleRange(getStyle(7,8,BLUE,null));
-	text.setStyleRange(getStyle(6,1,BLUE,null));
-	StyledTextEvent event = new StyledTextEvent();
-	event.detail = 6;
-	event.text = "a\tAnother line.";
-	text.notifyListener(ST.LineGetStyle, event);
-	assertTrue(":8:", event.styles[0].equals(getStyle(3,4,BLUE,null)));
-*/
-
-
-	text.setText("123 456 789");
-	text.setStyleRange(getStyle(4,3,BLUE,null));
-	text.setStyleRange(getStyle(8,3,RED,null));
-	text.setStyleRange(getStyle(5,5,BLUE,null));
-	styles = text.getStyleRanges();
-	assertTrue(":9:", styles.length == 2);
-	assertTrue(":9:", styles[0].equals(getStyle(4,6,BLUE,null)));
-	assertTrue(":9:", styles[1].equals(getStyle(10,1,RED,null)));
-
-
-	// reset the environment
-	text.dispose();
-	text = new StyledText(shell, SWT.NULL);
-	setWidget(text);
-
-	textString = textString();
-			
-	text.setText(textString);
-	text.setStyleRange(getStyle(0,48,RED,YELLOW));
-	text.setStyleRange(getStyle(48,20,BLUE,CYAN));
-	text.setStyleRange(getStyle(68,10,GREEN,PURPLE));
-	// should be merged with style before it
-	text.setStyleRange(getStyle(48,10,RED,YELLOW));
-	styles = text.getStyleRanges();
-	assertTrue(":1:", styles.length == 3);
-	assertTrue(":1:", styles[0].equals(getStyle(0,58,RED,YELLOW)));
-	assertTrue(":1:", styles[1].equals(getStyle(58,10,BLUE,CYAN)));
-	assertTrue(":1:", styles[2].equals(getStyle(68,10,GREEN,PURPLE)));
-
-
-	text.setText(textString);
-	text.setStyleRange(getStyle(0,10,RED,YELLOW));
-	text.setStyleRange(getStyle(15,10,BLUE,CYAN));
-	text.setStyleRange(getStyle(25,10,GREEN,PURPLE));
-	// should be merged with style after it
-	text.setStyleRange(getStyle(11,4,BLUE,CYAN));
-	styles = text.getStyleRanges();
-	assertTrue(":2:", styles.length == 3);
-	assertTrue(":2:", styles[0].equals(getStyle(0,10,RED,YELLOW)));
-	assertTrue(":2:", styles[1].equals(getStyle(11,14,BLUE,CYAN)));
-	assertTrue(":2:", styles[2].equals(getStyle(25,10,GREEN,PURPLE)));
-	
-	text.setText(textString);
-	text.setStyleRange(getStyle(0,10,RED,YELLOW));
-	text.setStyleRange(getStyle(15,10,BLUE,CYAN));
-	text.setStyleRange(getStyle(25,10,GREEN,PURPLE));
-	// should be merged with style after it
-	text.setStyleRange(getStyle(5,15,BLUE,CYAN));
-	styles = text.getStyleRanges();
-	assertTrue(":3:", styles.length == 3);
-	assertTrue(":3:", styles[0].equals(getStyle(0,5,RED,YELLOW)));
-	assertTrue(":3:", styles[1].equals(getStyle(5,20,BLUE,CYAN)));
-	assertTrue(":3:", styles[2].equals(getStyle(25,10,GREEN,PURPLE)));
-
-
-
-	text.setText("01234567890123456789");
-	text.setStyleRange(getStyle(0,10,RED,YELLOW));
-	text.setStyleRange(getStyle(10,10,BLUE,CYAN));
-	text.setStyleRange(getStyle(5,3,RED,YELLOW));
-	text.setStyleRange(getStyle(12,5,BLUE,CYAN));
-	styles = text.getStyleRanges();
-	assertTrue(":4:", styles.length == 2);
-	assertTrue(":4:", styles[0].equals(getStyle(0,10,RED,YELLOW)));
-	assertTrue(":4:", styles[1].equals(getStyle(10,10,BLUE,CYAN)));
-	
-	text.setText("0123456789012345");
-	text.setStyleRange(getStyle(0,5,RED,YELLOW));
-	text.setStyleRange(getStyle(5,5,BLUE,CYAN));
-	text.setStyleRange(getStyle(10,5,GREEN,PURPLE));
-	// no merging since styles are completely overlapping existing
-	// styles
-	text.setStyleRange(getStyle(5,5,RED,YELLOW));
-	text.setStyleRange(getStyle(10,5,RED,YELLOW));
-	styles = text.getStyleRanges();
-	assertTrue(":5:", styles.length == 3);
-	assertTrue(":5:", styles[0].equals(getStyle(0,5,RED,YELLOW)));
-	assertTrue(":5:", styles[1].equals(getStyle(5,5,RED,YELLOW)));
-	assertTrue(":5:", styles[2].equals(getStyle(10,5,RED,YELLOW)));
-	
-	text.setText("012345678901234");
-	text.setStyleRange(getStyle(0,5,RED,YELLOW));
-	text.setStyleRange(getStyle(10,5,BLUE,CYAN));
-	// should be merged
-	text.setStyleRange(getStyle(5,7,BLUE,CYAN));
-	styles = text.getStyleRanges();
-	assertTrue(":6:", styles.length == 2);
-	assertTrue(":6:", styles[0].equals(getStyle(0,5,RED,YELLOW)));
-	assertTrue(":6:", styles[1].equals(getStyle(5,10,BLUE,CYAN)));
-
-
-	// reset the environment
-	text.dispose();
-	text = new StyledText(shell, SWT.NULL);
-	setWidget(text);
-
-	textString = textString();
-
-
-	/* 
-		defaultStyles
-		
-			(0,48,RED,YELLOW), 
-			(58,10,BLUE,CYAN), 
-			(68,10,GREEN,PURPLE)
-	*/
-
-
-	text.setText(textString);
-	
-	// End/Beginning overlap
-	text.setStyleRanges(defaultStyles());
-	text.setStyleRange(getStyle(38,25,YELLOW,RED));
-	styles = text.getStyleRanges();
-	assertTrue(":1:", styles.length == 4);
-	assertTrue(":1:", styles[0].equals(getStyle(0,38,RED,YELLOW)));
-	assertTrue(":1:", styles[1].equals(getStyle(38,25,YELLOW,RED)));
-	assertTrue(":1:", styles[2].equals(getStyle(63,5,BLUE,CYAN)));
-	assertTrue(":1:", styles[3].equals(getStyle(68,10,GREEN,PURPLE)));
-	text.setStyleRanges(defaultStyles());
-	text.setStyleRange(getStyle(63,10,YELLOW,RED));
-	styles = text.getStyleRanges();
-	assertTrue(":1:", styles.length == 4);
-	assertTrue(":1:", styles[0].equals(getStyle(0,48,RED,YELLOW)));
-	assertTrue(":1:", styles[1].equals(getStyle(58,5,BLUE,CYAN)));
-	assertTrue(":1:", styles[2].equals(getStyle(63,10,YELLOW,RED)));
-	assertTrue(":1:", styles[3].equals(getStyle(73,5,GREEN,PURPLE)));
-
-
-	// Complete overlap
-	text.setStyleRanges(defaultStyles());
-	text.setStyleRange(getStyle(0,78,YELLOW,RED));
-	styles = text.getStyleRanges();
-	assertTrue(":2:", styles.length == 1);
-	assertTrue(":2:", styles[0].equals(getStyle(0,78,YELLOW,RED)));
-	text.setStyleRanges(defaultStyles());
-	text.setStyleRange(getStyle(0,68,YELLOW,RED));
-	styles = text.getStyleRanges();
-	assertTrue(":2:", styles.length == 2);
-	assertTrue(":2:", styles[0].equals(getStyle(0,68,YELLOW,RED)));
-	assertTrue(":2:", styles[1].equals(getStyle(68,10,GREEN,PURPLE)));
-	text.setStyleRanges(defaultStyles());
-	text.setStyleRange(getStyle(58,20,YELLOW,RED));
-	styles = text.getStyleRanges();
-	assertTrue(":2:", styles.length == 2);
-	assertTrue(":2:", styles[0].equals(getStyle(0,48,RED,YELLOW)));
-	assertTrue(":2:", styles[1].equals(getStyle(58,20,YELLOW,RED)));
-
-
-	// 1-N complete, beginning
-	text.setText("012345678901234567890123456789");
-	text.setStyleRanges( 
-		new StyleRange[] {getStyle(0,5,RED,RED), getStyle(5,5,YELLOW,YELLOW),
-			getStyle(10,5,CYAN,CYAN), getStyle(15,5,BLUE,BLUE),
-			getStyle(20,5,GREEN,GREEN), getStyle(25,5,PURPLE,PURPLE)}
-	);
-	text.setStyleRange(getStyle(5,23,YELLOW,RED));
-	styles = text.getStyleRanges();
-	assertTrue(":3:", styles.length == 3);
-	assertTrue(":3:", styles[0].equals(getStyle(0,5,RED,RED)));
-	assertTrue(":3:", styles[1].equals(getStyle(5,23,YELLOW,RED)));
-	assertTrue(":3:", styles[2].equals(getStyle(28,2,PURPLE,PURPLE)));
-	
-	// end, 1-N complete, beginning
-	text.setStyleRanges( 
-		new StyleRange[] {getStyle(0,5,RED,RED), getStyle(5,5,YELLOW,YELLOW),
-			getStyle(10,5,CYAN,CYAN), getStyle(15,5,BLUE,BLUE),
-			getStyle(20,5,GREEN,GREEN), getStyle(25,5,PURPLE,PURPLE)}
-	);
-	text.setStyleRange(getStyle(13,12,YELLOW,RED));
-	styles = text.getStyleRanges();
-	assertTrue(":3:", styles.length == 5);
-	assertTrue(":3:", styles[0].equals(getStyle(0,5,RED,RED)));
-	assertTrue(":3:", styles[1].equals(getStyle(5,5,YELLOW,YELLOW)));
-	assertTrue(":3:", styles[2].equals(getStyle(10,3,CYAN,CYAN)));
-	assertTrue(":3:", styles[3].equals(getStyle(13,12,YELLOW,RED)));
-	assertTrue(":3:", styles[4].equals(getStyle(25,5,PURPLE,PURPLE)));
-
-
-	text.setText("x/");	
-	text.setStyleRange(getStyle(0,2,YELLOW,null));
-	styles = text.getStyleRanges();
-	assertTrue(":4:", styles.length == 1);
-	assertTrue(":4:", styles[0].equals(getStyle(0,2,YELLOW,null)));
-	text.replaceTextRange(2,0,"/");
-	styles = text.getStyleRanges();
-	assertTrue(":4:", styles.length == 1);
-	assertTrue(":4:", styles[0].equals(getStyle(0,2,YELLOW,null)));
-	text.setStyleRange(getStyle(0,1,YELLOW,null));
-	assertTrue(":4:", styles.length == 1);
-	assertTrue(":4:", styles[0].equals(getStyle(0,2,YELLOW,null)));
-	text.setStyleRange(getStyle(1,2,RED,null));
-	styles = text.getStyleRanges();
-	assertTrue(":4:", styles.length == 2);
-	assertTrue(":4:", styles[0].equals(getStyle(0,1,YELLOW,null)));
-	assertTrue(":4:", styles[1].equals(getStyle(1,2,RED,null)));
-
-
-	text.setText("xxx/");	
-	text.setStyleRange(getStyle(0,2,RED,null));
-	text.setStyleRange(getStyle(2,2,YELLOW,null));
-	styles = text.getStyleRanges();
-	assertTrue(":4a:", styles.length == 2);
-	assertTrue(":4a:", styles[0].equals(getStyle(0,2,RED,null)));
-	assertTrue(":4a:", styles[1].equals(getStyle(2,2,YELLOW,null)));
-	text.replaceTextRange(4,0,"/");
-	styles = text.getStyleRanges();
-	assertTrue(":4a:", styles.length == 2);
-	assertTrue(":4a:", styles[0].equals(getStyle(0,2,RED,null)));
-	assertTrue(":4a:", styles[1].equals(getStyle(2,2,YELLOW,null)));
-	text.setStyleRange(getStyle(2,1,YELLOW,null));
-	assertTrue(":4a:", styles.length == 2);
-	assertTrue(":4a:", styles[0].equals(getStyle(0,2,RED,null)));
-	assertTrue(":4a:", styles[1].equals(getStyle(2,2,YELLOW,null)));
-	text.setStyleRange(getStyle(3,2,RED,null));
-	styles = text.getStyleRanges();
-	assertTrue(":4a:", styles.length == 3);
-	assertTrue(":4a:", styles[0].equals(getStyle(0,2,RED,null)));
-	assertTrue(":4a:", styles[1].equals(getStyle(2,1,YELLOW,null)));
-	assertTrue(":4a:", styles[2].equals(getStyle(3,2,RED,null)));
-
-
-	text.setText("xxx/");	
-	text.setStyleRange(getStyle(0,2,RED,null));
-	text.setStyleRange(getStyle(2,2,YELLOW,null));
-	text.replaceTextRange(4,0,"/");
-	styles = text.getStyleRanges();
-	text.setStyleRange(getStyle(2,1,YELLOW,null));
-	text.setStyleRange(getStyle(2,3,RED,null));
-	styles = text.getStyleRanges();
-	assertTrue(":4b:", styles.length == 2);
-	assertTrue(":4b:", styles[0].equals(getStyle(0,2,RED,null)));
-	assertTrue(":4b:", styles[1].equals(getStyle(2,3,RED,null)));
-
-
-	text.setText("xxx/");	
-	text.setStyleRange(getStyle(0,2,RED,null));
-	text.setStyleRange(getStyle(2,2,YELLOW,null));
-	text.replaceTextRange(4,0,"/");
-	styles = text.getStyleRanges();
-	text.setStyleRange(getStyle(2,1,YELLOW,null));
-	text.setStyleRange(getStyle(1,4,YELLOW,null));
-	styles = text.getStyleRanges();
-	assertTrue(":4c:", styles.length == 2);
-	assertTrue(":4c:", styles[0].equals(getStyle(0,1,RED,null)));
-	assertTrue(":4c:", styles[1].equals(getStyle(1,4,YELLOW,null)));
-
-
-	text.setText("New\r\n");
-	StyleRange style = getStyle(0,5,null,null);
-	style.fontStyle = SWT.BOLD;	
-	text.setStyleRange(style);
-	// styles (0,5,BOLD)
-	text.replaceTextRange(3,0,"a"); // "Newa\r\n"
-	// styles (0,3,BOLD), (4,2,BOLD)
-	style = text.getStyleRangeAtOffset(4);
-	style.start = 3;
-	style.length = 1;
-	text.setStyleRange(style);
-	// styles (0,6,BOLD)
-	text.replaceTextRange(0,0,"a"); // "aNewa\r\n"
-	// styles (1,6,BOLD)
-	style = text.getStyleRangeAtOffset(1);
-	style.start = 0;
-	style.length = 1;
-	text.setStyleRange(style);
-	// styles (0,7,BOLD)
-	text.replaceTextRange(0,1,""); // "Newa\r\n"
-	// styles (0,6,BOLD)
-	for (int i=0; i<6; i++) {
-		style = text.getStyleRangeAtOffset(i);
-		assertTrue(":5:", style.fontStyle == SWT.BOLD);
-	}
-
-
-	text.setText("New L 1\r\nNew L 2\r\n");
-	style = getStyle(0,9,null,null);
-	style.fontStyle = SWT.BOLD;	
-	text.setStyleRange(style);
-	// styles (0,9,BOLD)
-	text.replaceTextRange(7,0,"a");
-	// styles (0,7,BOLD), (8,2,BOLD)
-	style = text.getStyleRangeAtOffset(8);
-	if (style != null) {
-		style.start = 7;
-		style.length = 1;
-		text.setStyleRange(style);
-	}
-	// styles (0,10,BOLD)
-	text.replaceTextRange(4,0,"a");
-	// styles (0,4,BOLD), (5,6,BOLD)
-	style = text.getStyleRangeAtOffset(5);
-	if (style != null) {
-		style.start = 4;
-		style.length = 1;
-		text.setStyleRange(style);
-	}
-	// styles (0,11,BOLD)
-	text.replaceTextRange(2,3,"");
-	// styles (0,8,BOLD)
-	for (int i=0; i<8; i++) {
-		style = text.getStyleRangeAtOffset(i);
-		assertTrue(":5a:", style.fontStyle == SWT.BOLD);
-	}
-
-
-	// reset the environment
-	text.dispose();
-	text = new StyledText(shell, SWT.NULL);
-	setWidget(text);
-
-	
-	//					"01234567890123"
-	textString = 		"1234 1234 1234";
-
-
-	text.setText("1234 1234 1234");
-	text.setStyleRange(getStyle(5,4,YELLOW,RED));
-	text.setStyleRange(getStyle(5,2,YELLOW,RED));
-	styles = text.getStyleRanges();
-	assertTrue(":1a:", styles.length == 1);
-	assertTrue(":1a:", styles[0].equals(getStyle(5,4,YELLOW,RED)));
-	text.setText("1234 1234 1234");
-	text.setStyleRange(getStyle(5,4,YELLOW,RED));
-	text.setStyleRange(getStyle(7,2,YELLOW,RED));
-	styles = text.getStyleRanges();
-	assertTrue(":2a:", styles.length == 1);
-	assertTrue(":2a:", styles[0].equals(getStyle(5,4,YELLOW,RED)));
-	text.setText("1234 1234 1234");
-	text.setStyleRange(getStyle(5,4,YELLOW,RED));
-	text.setStyleRange(getStyle(6,2,YELLOW,RED));
-	styles = text.getStyleRanges();
-	assertTrue(":3a:", styles.length == 1);
-	assertTrue(":3a:", styles[0].equals(getStyle(5,4,YELLOW,RED)));
-	text.setText("1234 1234 1234");
-	text.setStyleRange(getStyle(5,4,YELLOW,RED));
-	text.setStyleRange(getStyle(3,4,YELLOW,RED));
-	styles = text.getStyleRanges();
-	assertTrue(":4a:", styles.length == 1);
-	assertTrue(":4a:", styles[0].equals(getStyle(3,6,YELLOW,RED)));
-	text.setText("1234 1234 1234");
-	text.setStyleRange(getStyle(5,4,YELLOW,RED));
-	text.setStyleRange(getStyle(7,4,YELLOW,RED));
-	styles = text.getStyleRanges();
-	assertTrue(":5a:", styles.length == 1);
-	assertTrue(":5a:", styles[0].equals(getStyle(5,6,YELLOW,RED)));
-	text.setText("1234 1234 1234");
-	text.setStyleRange(getStyle(5,4,YELLOW,RED));
-	text.setStyleRange(getStyle(5,4,YELLOW,RED));
-	styles = text.getStyleRanges();
-	assertTrue(":6a:", styles.length == 1);
-	assertTrue(":6a:", styles[0].equals(getStyle(5,4,YELLOW,RED)));
-	text.setText("1234 1234 1234");
-	text.setStyleRange(getStyle(5,4,YELLOW,RED));
-	text.setStyleRange(getStyle(3,10,YELLOW,RED));
-	styles = text.getStyleRanges();
-	assertTrue(":7a:", styles.length == 1);
-	assertTrue(":7a:", styles[0].equals(getStyle(3,10,YELLOW,RED)));
-
-
-	text.setText("1234 1234 1234");
-	text.setStyleRange(getStyle(5,4,YELLOW,RED));
-	text.setStyleRange(getStyle(5,2,BLUE,CYAN));
-	styles = text.getStyleRanges();
-	assertTrue(":1b:", styles.length == 2);
-	assertTrue(":1b:", styles[0].equals(getStyle(5,2,BLUE,CYAN)));
-	assertTrue(":1b:", styles[1].equals(getStyle(7,2,YELLOW,RED)));
-	text.setText("1234 1234 1234");
-	text.setStyleRange(getStyle(5,4,YELLOW,RED));
-	text.setStyleRange(getStyle(7,2,BLUE,CYAN));
-	styles = text.getStyleRanges();
-	assertTrue(":2b:", styles.length == 2);
-	assertTrue(":2b:", styles[0].equals(getStyle(5,2,YELLOW,RED)));
-	assertTrue(":2b:", styles[1].equals(getStyle(7,2,BLUE,CYAN)));
-	text.setText("1234 1234 1234");
-	text.setStyleRange(getStyle(5,4,YELLOW,RED));
-	text.setStyleRange(getStyle(6,2,BLUE,CYAN));
-	styles = text.getStyleRanges();
-	assertTrue(":3b:", styles.length == 3);
-	assertTrue(":3b:", styles[0].equals(getStyle(5,1,YELLOW,RED)));
-	assertTrue(":3b:", styles[1].equals(getStyle(6,2,BLUE,CYAN)));
-	assertTrue(":3b:", styles[2].equals(getStyle(8,1,YELLOW,RED)));
-	text.setText("1234 1234 1234");
-	text.setStyleRange(getStyle(5,4,YELLOW,RED));
-	text.setStyleRange(getStyle(3,4,BLUE,CYAN));
-	styles = text.getStyleRanges();
-	assertTrue(":4b:", styles.length == 2);
-	assertTrue(":4b:", styles[0].equals(getStyle(3,4,BLUE,CYAN)));
-	assertTrue(":4b:", styles[1].equals(getStyle(7,2,YELLOW,RED)));
-	text.setText("1234 1234 1234");
-	text.setStyleRange(getStyle(5,4,YELLOW,RED));
-	text.setStyleRange(getStyle(7,4,BLUE,CYAN));
-	styles = text.getStyleRanges();
-	assertTrue(":5b:", styles.length == 2);
-	assertTrue(":5b:", styles[0].equals(getStyle(5,2,YELLOW,RED)));
-	assertTrue(":5b:", styles[1].equals(getStyle(7,4,BLUE,CYAN)));
-	text.setText("1234 1234 1234");
-	text.setStyleRange(getStyle(5,4,YELLOW,RED));
-	text.setStyleRange(getStyle(5,4,BLUE,CYAN));
-	styles = text.getStyleRanges();
-	assertTrue(":6b:", styles.length == 1);
-	assertTrue(":6b:", styles[0].equals(getStyle(5,4,BLUE,CYAN)));
-	text.setText("1234 1234 1234");
-	text.setStyleRange(getStyle(5,4,YELLOW,RED));
-	text.setStyleRange(getStyle(3,10,BLUE,CYAN));
-	styles = text.getStyleRanges();
-	assertTrue(":7b:", styles.length == 1);
-	assertTrue(":7b:", styles[0].equals(getStyle(3,10,BLUE,CYAN)));
-
-
-	// reset the environment
-	text.dispose();
-	text = new StyledText(shell, SWT.NULL);
-	setWidget(text);
-
-	//			 		"012345678901234567890123"
-	String testString=	"1234 1234 1234 1234 1234";
-	
-	text.setText(testString);
-	text.setStyleRange(getStyle(10,4,YELLOW,RED));
-	text.replaceTextRange(12,2,"");
-	styles = text.getStyleRanges();
-	assertTrue(":1:", styles.length == 1);
-	assertTrue(":1:", styles[0].equals(getStyle(10,2,YELLOW,RED)));
-	text.setText(testString);
-	text.setStyleRange(getStyle(10,4,YELLOW,RED));
-	text.replaceTextRange(10,2,"");
-	styles = text.getStyleRanges();
-	assertTrue(":2:", styles.length == 1);
-	assertTrue(":2:", styles[0].equals(getStyle(10,2,YELLOW,RED)));
-
-
-	text.setText(testString);
-	text.setStyleRange(getStyle(10,4,YELLOW,RED));
-	text.replaceTextRange(12,4,"");
-	styles = text.getStyleRanges();
-	assertTrue(":3:", styles.length == 1);
-	assertTrue(":3:", styles[0].equals(getStyle(10,2,YELLOW,RED)));
-	text.setText(testString);
-	text.setStyleRange(getStyle(10,4,YELLOW,RED));
-	text.replaceTextRange(8,4,"");
-	styles = text.getStyleRanges();
-	assertTrue(":4:", styles.length == 1);
-	assertTrue(":4:", styles[0].equals(getStyle(8,2,YELLOW,RED)));
-
-
-	text.setText(testString);
-	text.setStyleRange(getStyle(10,4,YELLOW,RED));
-	text.replaceTextRange(8,6,"");
-	styles = text.getStyleRanges();
-	assertTrue(":5:", styles.length == 0);
-	text.setText(testString);
-	text.setStyleRange(getStyle(10,4,YELLOW,RED));
-	text.replaceTextRange(10,6,"");
-	styles = text.getStyleRanges();
-	assertTrue(":6:", styles.length == 0);
-	text.setText(testString);
-	text.setStyleRange(getStyle(10,4,YELLOW,RED));
-	text.replaceTextRange(8,12,"");
-	styles = text.getStyleRanges();
-	assertTrue(":7:", styles.length == 0);
-	
-	//			 			"012345678901234567890123"
-	//	String testString=	"1234 1234 1234 1234 1234";
-	
-	text.setText(testString);
-	text.setStyleRange(getStyle(5,4,BLUE,CYAN));
-	text.setStyleRange(getStyle(10,4,YELLOW,RED));
-	text.replaceTextRange(5,7,"");
-	styles = text.getStyleRanges();
-	assertTrue(":8:", styles.length == 1);
-	assertTrue(":8:", styles[0].equals(getStyle(5,2,YELLOW,RED)));
-	text.setText(testString);
-	text.setStyleRange(getStyle(5,4,BLUE,CYAN));
-	text.setStyleRange(getStyle(10,4,YELLOW,RED));
-	text.replaceTextRange(7,7,"");
-	styles = text.getStyleRanges();
-	assertTrue(":9:", styles.length == 1);
-	assertTrue(":9:", styles[0].equals(getStyle(5,2,BLUE,CYAN)));
-
-
-	text.setText(testString);
-	text.setStyleRange(getStyle(5,4,BLUE,CYAN));
-	text.setStyleRange(getStyle(10,4,YELLOW,RED));
-	text.replaceTextRange(2,10,"");
-	styles = text.getStyleRanges();
-	assertTrue(":10:", styles.length == 1);
-	assertTrue(":10:", styles[0].equals(getStyle(2,2,YELLOW,RED)));
-	text.setText(testString);
-	text.setStyleRange(getStyle(5,4,BLUE,CYAN));
-	text.setStyleRange(getStyle(10,4,YELLOW,RED));
-	text.replaceTextRange(7,9,"");
-	styles = text.getStyleRanges();
-	assertTrue(":11:", styles.length == 1);
-	assertTrue(":11:", styles[0].equals(getStyle(5,2,BLUE,CYAN)));
-
-
-	text.setText(testString);
-	text.setStyleRange(getStyle(5,4,BLUE,CYAN));
-	text.setStyleRange(getStyle(10,4,YELLOW,RED));
-	text.replaceTextRange(5,9,"");
-	styles = text.getStyleRanges();
-	assertTrue(":12:", styles.length == 0);
-	text.setText(testString);
-	text.setStyleRange(getStyle(5,4,BLUE,CYAN));
-	text.setStyleRange(getStyle(10,4,YELLOW,RED));
-	text.replaceTextRange(3,13,"");
-	styles = text.getStyleRanges();
-	assertTrue(":11:", styles.length == 0);
-
-
-	//			 			"012345678901234567890123"
-	//	String testString=	"1234 1234 1234 1234 1234";
-	
-	text.setText(testString);
-	text.setStyleRange(getStyle(5,4,BLUE,CYAN));
-	text.setStyleRange(getStyle(10,4,YELLOW,RED));
-	text.setStyleRange(getStyle(15,4,GREEN,PURPLE));
-	text.replaceTextRange(7,12,"");
-	styles = text.getStyleRanges();
-	assertTrue(":14:", styles.length == 1);
-	assertTrue(":14:", styles[0].equals(getStyle(5,2,BLUE,CYAN)));
-	text.setText(testString);
-	text.setStyleRange(getStyle(5,4,BLUE,CYAN));
-	text.setStyleRange(getStyle(10,4,YELLOW,RED));
-	text.setStyleRange(getStyle(15,4,GREEN,PURPLE));
-	text.replaceTextRange(5,12,"");
-	styles = text.getStyleRanges();
-	assertTrue(":15:", styles.length == 1);
-	assertTrue(":15:", styles[0].equals(getStyle(5,2,GREEN,PURPLE)));
-
-
-	text.setText(testString);
-	text.setStyleRange(getStyle(5,4,BLUE,CYAN));
-	text.setStyleRange(getStyle(10,4,YELLOW,RED));
-	text.setStyleRange(getStyle(15,4,GREEN,PURPLE));
-	text.replaceTextRange(9,10,"");
-	styles = text.getStyleRanges();
-	assertTrue(":16:", styles.length == 1);
-	assertTrue(":16:", styles[0].equals(getStyle(5,4,BLUE,CYAN)));
-
-
-	// reset the environment
-	text.dispose();
-	text = new StyledText(shell, SWT.NULL);
-	setWidget(text);
-
-	StyleRange style1 = getStyle(0,0,null,null);
-
-
-	StyleRange style2 = getStyle(0,0,RED,YELLOW);
-
-
-	assertTrue(":1:", !style1.equals(style2));
-	assertTrue(":1:", !style1.similarTo(style2));
-
-
-	assertTrue(":1:", !style2.equals(style1));
-
-
-	assertTrue(":1:", !style2.similarTo(style1));
-
-
-
-	style1 = getStyle(0,10,RED,YELLOW);
-	style2 = getStyle(11,5,RED,YELLOW);
-
-
-	assertTrue(":2:", !style1.equals(style2));
-
-
-	assertTrue(":2:", !style2.equals(style1));
-	assertTrue(":2:", style1.similarTo(style2));
-
-
-	assertTrue(":2:", style2.similarTo(style1));
-
-
-}
-
-public void test_setStyleRanges$Lorg_eclipse_swt_custom_StyleRange() {
-	boolean exceptionThrown = false;
-	StyleRange[] ranges = new StyleRange[] {
-		new StyleRange(0, 1, getColor(RED), null), 
-		new StyleRange(2, 1, getColor(RED), null)};
-	
-	text.setText("Line0\r\n");
-	try {
-		text.setStyleRanges(null);
-	}
-	catch (IllegalArgumentException e) {
-		exceptionThrown = true;
-	}
-	assertTrue(exceptionThrown);
-
-	text.setStyleRanges(ranges);
-	StyleRange[] currentRanges = text.getStyleRanges();
-	assertEquals(ranges.length, currentRanges.length);
-	for (int i = 0; i < currentRanges.length; i++) {
-		assertEquals(ranges[i], currentRanges[i]);
-	}
-	text.setStyleRanges(new StyleRange[] {});
-	assertEquals(0, text.getStyleRanges().length);
-}
-
-public void test_setTabsI(){
-	text.setTabs(1);
-	assertTrue(":a:", text.getTabs() == 1);
-	
-	text.setTabs(8);
-	assertTrue(":b:", text.getTabs() == 8);
-	text.setText("Line\t1\r\n");
-	text.setTabs(7);
-	assertTrue(":c:", text.getTabs() == 7);
-}
-
-public void test_setTextLjava_lang_String(){
-	boolean exceptionThrown = false;
-	
-	text.setText("");
-	assertEquals("", text.getText());
-	text.setText("01234567890");
-	assertEquals("01234567890", text.getText());
-	
-	try {
-		text.setText(null);
-	}
-	catch (IllegalArgumentException e) {
-		exceptionThrown = true;
-	}	
-	assertTrue(exceptionThrown);
-
-	assertEquals("01234567890", text.getText());
-	text.setText("");
-	assertEquals("", text.getText());
-}
-
-public void test_setTextLimitI(){
-	boolean exceptionThrown = false;
-	
-	text.setTextLimit(10);
-	assertTrue(":a:", text.getTextLimit() == 10);
-
-	text.setTextLimit(-1);
-	assertTrue(":b:", text.getTextLimit() == -1);
-
-	try {
-		text.setTextLimit(0);
-	}
-	catch (IllegalArgumentException e) {
-		exceptionThrown = true;
-	}
-	assertTrue(":c:", exceptionThrown == true);
-	exceptionThrown = false;
-}
-
-public void test_setTopIndexI(){
-	text.setTopIndex(-1);
-	assertTrue(":a:", text.getTopIndex() == 0);
-	text.setTopIndex(1);
-	assertTrue(":b:", text.getTopIndex() == 0);
-
-	text.setText("Line0\r\n");
-
-	text.setTopIndex(-2);
-	assertTrue(":c:", text.getTopIndex() == 0);
-	text.setTopIndex(-1);
-	assertTrue(":d:", text.getTopIndex() == 0);
-	text.setTopIndex(1);
-	assertTrue(":e:", text.getTopIndex() == 1);
-	text.setTopIndex(2);
-	assertTrue(":f:", text.getTopIndex() == 2);
-	text.setTopIndex(0);
-	assertTrue(":g:", text.getTopIndex() == 0);
-	text.setTopIndex(3);
-	assertTrue(":h:", text.getTopIndex() == 2);
-
-	text.setText("");
-	text.setTopIndex(2);
-	assertTrue(":i:", text.getTopIndex() == 0);
-}
-public void test_setTopPixelI(){
-	int lineHeight = text.getLineHeight();
-	
-	text.setTopPixel(-1);
-	assertTrue(":a:", text.getTopPixel() == 0);
-	text.setTopPixel(1);
-	assertTrue(":b:", text.getTopPixel() == 0);
-
-	text.setText("Line0\r\n");
-	
-	text.setTopPixel(-2);
-	assertTrue(":c:", text.getTopPixel() == 0);
-	text.setTopPixel(-1);
-	assertTrue(":d:", text.getTopPixel() == 0);
-	text.setTopPixel(1);
-	assertTrue(":e:", text.getTopPixel() == 1);
-	text.setTopPixel(2 * lineHeight);
-	assertTrue(":f:", text.getTopPixel() == 2 * lineHeight);
-	text.setTopPixel(0);
-	assertTrue(":g:", text.getTopPixel() == 0);
-	text.setTopPixel(3 * lineHeight);
-	assertTrue(":h:", text.getTopPixel() == 2 * lineHeight);
-
-	text.setText("");
-	text.setTopPixel(2 * lineHeight);
-	assertTrue(":i:", text.getTopPixel() == 0);
-}
-public void test_setWordWrapZ(){
-	String testString = "Line1\nLine2";
-	
-	text.setWordWrap(true);
-	assertTrue(":a:", text.getWordWrap());
-	text.setWordWrap(false);
-	assertTrue(":b:", text.getWordWrap() == false);
-	text.setWordWrap(false);
-	assertTrue(":c:", text.getWordWrap() == false);
-	text.setWordWrap(true);
-	assertTrue(":d:", text.getWordWrap());
-	
-	text.setText(testString);
-	assertEquals(":e:", testString, text.getText());
-	assertEquals(":f:", 2, text.getLineCount());	
-}
-
-public void test_showSelection() {
-	text.showSelection();
-	text.setSelectionRange(0, 0);
-	text.showSelection();
-	text.setText("Line0\r\n");
-	text.showSelection();
-	text.setSelectionRange(5, 2);
-	text.showSelection();
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_custom_StyledText((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_CompositeI");
-	methodNames.addElement("test_addExtendedModifyListenerLorg_eclipse_swt_custom_ExtendedModifyListener");
-	methodNames.addElement("test_setKeyBindingII");
-	methodNames.addElement("test_addBidiSegmentListenerLorg_eclipse_swt_custom_BidiSegmentListener");
-	methodNames.addElement("test_addLineBackgroundListenerLorg_eclipse_swt_custom_LineBackgroundListener");
-	methodNames.addElement("test_addLineStyleListenerLorg_eclipse_swt_custom_LineStyleListener");
-	methodNames.addElement("test_addModifyListenerLorg_eclipse_swt_events_ModifyListener");
-	methodNames.addElement("test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener");
-	methodNames.addElement("test_addVerifyKeyListenerLorg_eclipse_swt_custom_VerifyKeyListener");
-	methodNames.addElement("test_addVerifyListenerLorg_eclipse_swt_events_VerifyListener");
-	methodNames.addElement("test_appendLjava_lang_String");
-	methodNames.addElement("test_computeSizeIIZ");
-	methodNames.addElement("test_copy");
-	methodNames.addElement("test_cut");
-	methodNames.addElement("test_getBidiColoring");
-	methodNames.addElement("test_getCaretOffset");
-	methodNames.addElement("test_getContent");
-	methodNames.addElement("test_getDoubleClickEnabled");
-	methodNames.addElement("test_getEditable");
-	methodNames.addElement("test_getHorizontalIndex");
-	methodNames.addElement("test_getHorizontalPixel");
-	methodNames.addElement("test_getKeyBindingI");
-	methodNames.addElement("test_getCharCount");
-	methodNames.addElement("test_getLineBackgroundI");
-	methodNames.addElement("test_getLineCount");
-	methodNames.addElement("test_getLineAtOffsetI");
-	methodNames.addElement("test_getLineDelimiter");
-	methodNames.addElement("test_getLineHeight");
-	methodNames.addElement("test_getLocationAtOffsetI");
-	methodNames.addElement("test_getOffsetAtLineI");	
-	methodNames.addElement("test_getOffsetAtLocationLorg_eclipse_swt_graphics_Point");
-	methodNames.addElement("test_getSelection");
-	methodNames.addElement("test_getSelectionBackground");
-	methodNames.addElement("test_getSelectionForeground");
-	methodNames.addElement("test_getSelectionRange");
-	methodNames.addElement("test_getSelectionCount");
-	methodNames.addElement("test_getSelectionText");
-	methodNames.addElement("test_getStyleRangeAtOffsetI");
-	methodNames.addElement("test_getStyleRanges");
-	methodNames.addElement("test_getTabs");
-	methodNames.addElement("test_getText");
-	methodNames.addElement("test_getTextII");
-	methodNames.addElement("test_getTextRangeII");
-	methodNames.addElement("test_getTextLimit");
-	methodNames.addElement("test_getTopIndex");
-	methodNames.addElement("test_getTopPixel");
-	methodNames.addElement("test_getWordWrap");	
-	methodNames.addElement("test_insertLjava_lang_String");
-	methodNames.addElement("test_invokeActionI");
-	methodNames.addElement("test_paste");
-	methodNames.addElement("test_print");
-	methodNames.addElement("test_printLorg_eclipse_swt_printing_Printer");
-	methodNames.addElement("test_redraw");
-	methodNames.addElement("test_redrawIIIIZ");
-	methodNames.addElement("test_redrawRangeIIZ");
-	methodNames.addElement("test_removeBidiSegmentListenerLorg_eclipse_swt_custom_BidiSegmentListener");
-	methodNames.addElement("test_removeExtendedModifyListenerLorg_eclipse_swt_custom_ExtendedModifyListener");
-	methodNames.addElement("test_removeLineBackgroundListenerLorg_eclipse_swt_custom_LineBackgroundListener");
-	methodNames.addElement("test_removeLineStyleListenerLorg_eclipse_swt_custom_LineStyleListener");
-	methodNames.addElement("test_removeModifyListenerLorg_eclipse_swt_events_ModifyListener");
-	methodNames.addElement("test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener");
-	methodNames.addElement("test_removeVerifyListenerLorg_eclipse_swt_events_VerifyListener");
-	methodNames.addElement("test_removeVerifyKeyListenerLorg_eclipse_swt_custom_VerifyKeyListener");
-	methodNames.addElement("test_replaceStyleRanges");
-	methodNames.addElement("test_replaceTextRangeIILjava_lang_String");
-	methodNames.addElement("test_selectAll");
-	methodNames.addElement("test_setCaretLorg_eclipse_swt_widgets_Caret");
-	methodNames.addElement("test_setBidiColoringZ");
-	methodNames.addElement("test_setCaretOffsetI");
-	methodNames.addElement("test_setContentLorg_eclipse_swt_custom_StyledTextContent");
-	methodNames.addElement("test_setDoubleClickEnabledZ");
-	methodNames.addElement("test_setEditableZ");
-	methodNames.addElement("test_setFontLorg_eclipse_swt_graphics_Font");
-	methodNames.addElement("test_setHorizontalIndexI");
-	methodNames.addElement("test_setHorizontalPixelI");	
-	methodNames.addElement("test_setLineBackgroundIILorg_eclipse_swt_graphics_Color");
-	methodNames.addElement("test_setSelectionI");
-	methodNames.addElement("test_setSelectionLorg_eclipse_swt_graphics_Point");
-	methodNames.addElement("test_setSelectionII");
-	methodNames.addElement("test_setSelectionBackgroundLorg_eclipse_swt_graphics_Color");
-	methodNames.addElement("test_setSelectionForegroundLorg_eclipse_swt_graphics_Color");
-	methodNames.addElement("test_setSelectionRangeII");
-	methodNames.addElement("test_setStyleRangeLorg_eclipse_swt_custom_StyleRange");
-	methodNames.addElement("test_setStyleRanges$Lorg_eclipse_swt_custom_StyleRange");
-	methodNames.addElement("test_setTabsI");
-	methodNames.addElement("test_setTextLjava_lang_String");
-	methodNames.addElement("test_setTextLimitI");
-	methodNames.addElement("test_setTopIndexI");
-	methodNames.addElement("test_setTopPixelI");	
-	methodNames.addElement("test_setWordWrapZ");
-	methodNames.addElement("test_showSelection");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Canvas.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_CompositeI")) test_ConstructorLorg_eclipse_swt_widgets_CompositeI();
-	else if (getName().equals("test_addExtendedModifyListenerLorg_eclipse_swt_custom_ExtendedModifyListener")) test_addExtendedModifyListenerLorg_eclipse_swt_custom_ExtendedModifyListener();
-	else if (getName().equals("test_setKeyBindingII")) test_setKeyBindingII();
-	else if (getName().equals("test_addBidiSegmentListenerLorg_eclipse_swt_custom_BidiSegmentListener")) test_addBidiSegmentListenerLorg_eclipse_swt_custom_BidiSegmentListener();
-	else if (getName().equals("test_addLineBackgroundListenerLorg_eclipse_swt_custom_LineBackgroundListener")) test_addLineBackgroundListenerLorg_eclipse_swt_custom_LineBackgroundListener();
-	else if (getName().equals("test_addLineStyleListenerLorg_eclipse_swt_custom_LineStyleListener")) test_addLineStyleListenerLorg_eclipse_swt_custom_LineStyleListener();
-	else if (getName().equals("test_addModifyListenerLorg_eclipse_swt_events_ModifyListener")) test_addModifyListenerLorg_eclipse_swt_events_ModifyListener();
-	else if (getName().equals("test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener")) test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener();
-	else if (getName().equals("test_addVerifyKeyListenerLorg_eclipse_swt_custom_VerifyKeyListener")) test_addVerifyKeyListenerLorg_eclipse_swt_custom_VerifyKeyListener();
-	else if (getName().equals("test_addVerifyListenerLorg_eclipse_swt_events_VerifyListener")) test_addVerifyListenerLorg_eclipse_swt_events_VerifyListener();
-	else if (getName().equals("test_appendLjava_lang_String")) test_appendLjava_lang_String();
-	else if (getName().equals("test_computeSizeIIZ")) test_computeSizeIIZ();
-	else if (getName().equals("test_copy")) test_copy();
-	else if (getName().equals("test_cut")) test_cut();
-	else if (getName().equals("test_getBidiColoring")) test_getBidiColoring();
-	else if (getName().equals("test_getCaretOffset")) test_getCaretOffset();
-	else if (getName().equals("test_getContent")) test_getContent();
-	else if (getName().equals("test_getDoubleClickEnabled")) test_getDoubleClickEnabled();
-	else if (getName().equals("test_getEditable")) test_getEditable();
-	else if (getName().equals("test_getHorizontalIndex")) test_getHorizontalIndex();
-	else if (getName().equals("test_getHorizontalPixel")) test_getHorizontalPixel();
-	else if (getName().equals("test_getKeyBindingI")) test_getKeyBindingI();
-	else if (getName().equals("test_getCharCount")) test_getCharCount();
-	else if (getName().equals("test_getLineBackgroundI")) test_getLineBackgroundI();
-	else if (getName().equals("test_getLineCount")) test_getLineCount();
-	else if (getName().equals("test_getLineAtOffsetI")) test_getLineAtOffsetI();
-	else if (getName().equals("test_getLineDelimiter")) test_getLineDelimiter();
-	else if (getName().equals("test_getLineHeight")) test_getLineHeight();
-	else if (getName().equals("test_getLocationAtOffsetI")) test_getLocationAtOffsetI();
-	else if (getName().equals("test_getOffsetAtLineI")) test_getOffsetAtLineI();	
-	else if (getName().equals("test_getOffsetAtLocationLorg_eclipse_swt_graphics_Point")) test_getOffsetAtLocationLorg_eclipse_swt_graphics_Point();
-	else if (getName().equals("test_getSelection")) test_getSelection();
-	else if (getName().equals("test_getSelectionBackground")) test_getSelectionBackground();
-	else if (getName().equals("test_getSelectionForeground")) test_getSelectionForeground();
-	else if (getName().equals("test_getSelectionRange")) test_getSelectionRange();
-	else if (getName().equals("test_getSelectionCount")) test_getSelectionCount();
-	else if (getName().equals("test_getSelectionText")) test_getSelectionText();
-	else if (getName().equals("test_getStyleRangeAtOffsetI")) test_getStyleRangeAtOffsetI();
-	else if (getName().equals("test_getStyleRanges")) test_getStyleRanges();
-	else if (getName().equals("test_getTabs")) test_getTabs();
-	else if (getName().equals("test_getText")) test_getText();
-	else if (getName().equals("test_getTextII")) test_getTextII();
-	else if (getName().equals("test_getTextRangeII")) test_getTextRangeII();
-	else if (getName().equals("test_getTextLimit")) test_getTextLimit();
-	else if (getName().equals("test_getTopIndex")) test_getTopIndex();
-	else if (getName().equals("test_getTopPixel")) test_getTopPixel();
-	else if (getName().equals("test_getWordWrap")) test_getWordWrap();	
-	else if (getName().equals("test_insertLjava_lang_String")) test_insertLjava_lang_String();
-	else if (getName().equals("test_invokeActionI")) test_invokeActionI();
-	else if (getName().equals("test_paste")) test_paste();
-	else if (getName().equals("test_print")) test_print();
-	else if (getName().equals("test_printLorg_eclipse_swt_printing_Printer")) test_printLorg_eclipse_swt_printing_Printer();
-	else if (getName().equals("test_redraw")) test_redraw();
-	else if (getName().equals("test_redrawIIIIZ")) test_redrawIIIIZ();
-	else if (getName().equals("test_redrawRangeIIZ")) test_redrawRangeIIZ();
-	else if (getName().equals("test_removeBidiSegmentListenerLorg_eclipse_swt_custom_BidiSegmentListener")) test_removeBidiSegmentListenerLorg_eclipse_swt_custom_BidiSegmentListener();
-	else if (getName().equals("test_removeExtendedModifyListenerLorg_eclipse_swt_custom_ExtendedModifyListener")) test_removeExtendedModifyListenerLorg_eclipse_swt_custom_ExtendedModifyListener();
-	else if (getName().equals("test_removeLineBackgroundListenerLorg_eclipse_swt_custom_LineBackgroundListener")) test_removeLineBackgroundListenerLorg_eclipse_swt_custom_LineBackgroundListener();
-	else if (getName().equals("test_removeLineStyleListenerLorg_eclipse_swt_custom_LineStyleListener")) test_removeLineStyleListenerLorg_eclipse_swt_custom_LineStyleListener();
-	else if (getName().equals("test_removeModifyListenerLorg_eclipse_swt_events_ModifyListener")) test_removeModifyListenerLorg_eclipse_swt_events_ModifyListener();
-	else if (getName().equals("test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener")) test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener();
-	else if (getName().equals("test_removeVerifyListenerLorg_eclipse_swt_events_VerifyListener")) test_removeVerifyListenerLorg_eclipse_swt_events_VerifyListener();
-	else if (getName().equals("test_removeVerifyKeyListenerLorg_eclipse_swt_custom_VerifyKeyListener")) test_removeVerifyKeyListenerLorg_eclipse_swt_custom_VerifyKeyListener();
-	else if (getName().equals("test_replaceTextRangeIILjava_lang_String")) test_replaceTextRangeIILjava_lang_String();
-	else if (getName().equals("test_replaceStyleRanges")) test_replaceStyleRanges();
-	else if (getName().equals("test_selectAll")) test_selectAll();
-	else if (getName().equals("test_setCaretLorg_eclipse_swt_widgets_Caret")) test_setCaretLorg_eclipse_swt_widgets_Caret();
-	else if (getName().equals("test_setBidiColoringZ")) test_setBidiColoringZ();
-	else if (getName().equals("test_setCaretOffsetI")) test_setCaretOffsetI();
-	else if (getName().equals("test_setContentLorg_eclipse_swt_custom_StyledTextContent")) test_setContentLorg_eclipse_swt_custom_StyledTextContent();
-	else if (getName().equals("test_setDoubleClickEnabledZ")) test_setDoubleClickEnabledZ();
-	else if (getName().equals("test_setEditableZ")) test_setEditableZ();
-	else if (getName().equals("test_setFontLorg_eclipse_swt_graphics_Font")) test_setFontLorg_eclipse_swt_graphics_Font();
-	else if (getName().equals("test_setHorizontalIndexI")) test_setHorizontalIndexI();
-	else if (getName().equals("test_setHorizontalPixelI")) test_setHorizontalPixelI();	
-	else if (getName().equals("test_setLineBackgroundIILorg_eclipse_swt_graphics_Color")) test_setLineBackgroundIILorg_eclipse_swt_graphics_Color();
-	else if (getName().equals("test_setSelectionI")) test_setSelectionI();
-	else if (getName().equals("test_setSelectionLorg_eclipse_swt_graphics_Point")) test_setSelectionLorg_eclipse_swt_graphics_Point();
-	else if (getName().equals("test_setSelectionBackgroundLorg_eclipse_swt_graphics_Color")) test_setSelectionBackgroundLorg_eclipse_swt_graphics_Color();
-	else if (getName().equals("test_setSelectionForegroundLorg_eclipse_swt_graphics_Color")) test_setSelectionForegroundLorg_eclipse_swt_graphics_Color();
-	else if (getName().equals("test_setSelectionII")) test_setSelectionII();
-	else if (getName().equals("test_setSelectionRangeII")) test_setSelectionRangeII();
-	else if (getName().equals("test_setStyleRangeLorg_eclipse_swt_custom_StyleRange")) test_setStyleRangeLorg_eclipse_swt_custom_StyleRange();
-	else if (getName().equals("test_setStyleRanges$Lorg_eclipse_swt_custom_StyleRange")) test_setStyleRanges$Lorg_eclipse_swt_custom_StyleRange();
-	else if (getName().equals("test_setTabsI")) test_setTabsI();
-	else if (getName().equals("test_setTextLjava_lang_String")) test_setTextLjava_lang_String();
-	else if (getName().equals("test_setTextLimitI")) test_setTextLimitI();
-	else if (getName().equals("test_setTopIndexI")) test_setTopIndexI();
-	else if (getName().equals("test_setTopPixelI")) test_setTopPixelI();
-	else if (getName().equals("test_setWordWrapZ")) test_setWordWrapZ();
-	else if (getName().equals("test_showSelection")) test_showSelection();
-	else super.runTest();
-}
-/**
- * Regression test for bug 19985
- */
-protected void testRtfCopy() {
-	String lines = "Line0\nLine1\nLine2\nLine3\nLine4\nLine5";
-	boolean exceptionThrown = false;
-	final int[] linesCalled = new int[] {0};
-	LineStyleListener listener = new LineStyleListener() {
-		public void lineGetStyle(LineStyleEvent event) {
-			Display display = Display.getDefault();
-			Color red = display.getSystemColor(SWT.COLOR_RED);
-			StyledText styledText = (StyledText) event.widget;
-			int lineIndex = styledText.getLineAtOffset(event.lineOffset);
-			int lineStart = event.lineOffset;
-			int lineEnd = lineStart + event.lineText.length();
-			StyleRange goodRange = new StyleRange(0, 1, red, red);
-			
-			event.styles = new StyleRange[2];
-			switch (lineIndex % 6) {
-				case 0:
-					event.styles[0] = goodRange;
-					event.styles[1] = new StyleRange(lineEnd, 1, red, red);
-					linesCalled[0]++;
-					break;
-				case 1:
-					event.styles[0] = goodRange;
-					event.styles[1] = new StyleRange(lineEnd, -1, red, red);
-					linesCalled[0]++;
-					break;
-				case 2:
-					event.styles[0] = goodRange;
-					event.styles[1] = new StyleRange(lineEnd - 1, -1, red, red);
-					linesCalled[0]++;	
-					break;
-				case 3:
-					event.styles[0] = goodRange;
-					event.styles[1] = new StyleRange(lineStart, -1, red, red);
-					linesCalled[0]++;	
-					break;
-				case 4:
-					event.styles[0] = new StyleRange(lineStart, 1, red, red);
-					event.styles[1] = new StyleRange(lineStart, -1, red, red);
-					linesCalled[0]++;	
-					break;
-				case 5:
-					event.styles[0] = new StyleRange(lineEnd / 2, 1, red, red);
-					event.styles[1] = new StyleRange(lineEnd / 2, -1, red, red);
-					linesCalled[0]++;	
-					break;
-			}			
-		}
-	};
-	text.setText(lines);	
-	// cause StyledText to call the listener. 
-	text.setSelection(0, text.getCharCount());
-	text.addLineStyleListener(listener);
-	text.copy();
-	assertTrue("not all lines tested for RTF copy", linesCalled[0] == text.getLineCount());
-	
-	Clipboard clipboard = new Clipboard(text.getDisplay());
-	RTFTransfer rtfTranfer = RTFTransfer.getInstance();
-	String clipboardText = (String) clipboard.getContents(rtfTranfer);
-	assertTrue("RTF copy failed", clipboardText.length() > 0);
-
-	clipboard.dispose();
-	text.removeLineStyleListener(listener);	
-}
-
-}
-
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_StyledTextContent.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_StyledTextContent.java
deleted file mode 100644
index fc2a46f..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_StyledTextContent.java
+++ /dev/null
@@ -1,169 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import junit.framework.*;
-import junit.textui.*;
-import org.eclipse.swt.*;
-import org.eclipse.swt.custom.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.internal.BidiUtil;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.custom.StyledTextContent
- *
- * @see org.eclipse.swt.custom.StyledTextContent
- */
-public class Test_org_eclipse_swt_custom_StyledTextContent extends SwtTestCase {
-	int XINSET = 0;
-
-	class ContentImplementation implements StyledTextContent {
-		String textContent = "";
-		
-		public void addTextChangeListener(TextChangeListener listener){
-		}
-		public int getCharCount() {
-			return 0;
-		}
-		public String getLine(int lineIndex) {
-			return "getLine";
-		}
-		public int getLineAtOffset(int offset) {
-			return 0;
-		}
-		public int getLineCount() {
-			return 0;
-		}
-		public String getLineDelimiter() {
-			return "getLineDelimiter";
-		}
-		public int getOffsetAtLine(int lineIndex) {
-			return 0;
-		}
-		public String getTextRange(int start, int length) {
-			return textContent;
-		}
-		public void removeTextChangeListener(TextChangeListener listener) {
-		}
-		public void replaceTextRange(int start, int replaceLength, String text) {
-			textContent = text;
-		}
-		public void setText(String text) {
-			textContent = text;
-		}
-	}
-	StyledTextContent content = new ContentImplementation();
-	Shell shell;
-	StyledText styledText;
-	
-public Test_org_eclipse_swt_custom_StyledTextContent(String name) {
-	super(name);
-}
-private boolean isBidi() {
-	return BidiUtil.isBidiPlatform();
-}
-protected void setUp() {
-	if (isBidi()) XINSET = 3;
-	else XINSET = 0;
-	shell = new Shell();
-	styledText = new StyledText(shell, SWT.NULL);
-	styledText.setContent(content);
-}
-
-protected void tearDown() {
-}
-
-public void test_addTextChangeListenerLorg_eclipse_swt_custom_TextChangeListener() {
-	// does not make sense to test, not called by StyledText
-}
-
-public void test_getCharCount() {
-	assertTrue(":a:", styledText.getCharCount() == 0);
-}
-
-public void test_getLineI() {
-	// will indirectly cause getLine to be called
-	assertTrue(":b:", styledText.getLocationAtOffset(0).equals(new Point(XINSET,0)));
-}
-
-public void test_getLineAtOffsetI() {
-	assertTrue(":c:", styledText.getLineAtOffset(0) == 0);
-}
-
-public void test_getLineCount() {
-	assertTrue(":d:", styledText.getLineCount() == 1);
-}
-
-public void test_getLineDelimiter() {
-	assertTrue(":e:", styledText.getLineDelimiter().equals("getLineDelimiter"));
-}
-
-public void test_getOffsetAtLineI() {
-	// will indirectly cause getOffsetAtLine to be called
-	assertTrue(":f:", styledText.getLocationAtOffset(0).equals(new Point(XINSET,0)));
-}
-
-public void test_getTextRangeII() {
-	assertTrue(":g:", styledText.getTextRange(0,0).equals(""));
-}
-
-public void test_removeTextChangeListenerLorg_eclipse_swt_custom_TextChangeListener() {
-	// does not make sense to test, not called by StyledText
-}
-
-public void test_replaceTextRangeIILjava_lang_String() {
-	styledText.replaceTextRange(0,0,"test1");
-	assertTrue(":h:", styledText.getText().equals("test1"));
-}
-
-public void test_setTextLjava_lang_String() {
-	styledText.replaceTextRange(0,0,"test2");
-	assertTrue(":i:", styledText.getText().equals("test2"));
-}
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_addTextChangeListenerLorg_eclipse_swt_custom_TextChangeListener");
-	methodNames.addElement("test_getCharCount");
-	methodNames.addElement("test_getLineI");
-	methodNames.addElement("test_getLineAtOffsetI");
-	methodNames.addElement("test_getLineCount");
-	methodNames.addElement("test_getLineDelimiter");
-	methodNames.addElement("test_getOffsetAtLineI");
-	methodNames.addElement("test_getTextRangeII");
-	methodNames.addElement("test_removeTextChangeListenerLorg_eclipse_swt_custom_TextChangeListener");
-	methodNames.addElement("test_replaceTextRangeIILjava_lang_String");
-	methodNames.addElement("test_setTextLjava_lang_String");
-	return methodNames;
-}
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_custom_StyledTextContent((String)e.nextElement()));
-	}
-	return suite;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_addTextChangeListenerLorg_eclipse_swt_custom_TextChangeListener")) test_addTextChangeListenerLorg_eclipse_swt_custom_TextChangeListener();
-	else if (getName().equals("test_getCharCount")) test_getCharCount();
-	else if (getName().equals("test_getLineI")) test_getLineI();
-	else if (getName().equals("test_getLineAtOffsetI")) test_getLineAtOffsetI();
-	else if (getName().equals("test_getLineCount")) test_getLineCount();
-	else if (getName().equals("test_getLineDelimiter")) test_getLineDelimiter();
-	else if (getName().equals("test_getOffsetAtLineI")) test_getOffsetAtLineI();
-	else if (getName().equals("test_getTextRangeII")) test_getTextRangeII();
-	else if (getName().equals("test_removeTextChangeListenerLorg_eclipse_swt_custom_TextChangeListener")) test_removeTextChangeListenerLorg_eclipse_swt_custom_TextChangeListener();
-	else if (getName().equals("test_replaceTextRangeIILjava_lang_String")) test_replaceTextRangeIILjava_lang_String();
-	else if (getName().equals("test_setTextLjava_lang_String")) test_setTextLjava_lang_String();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_TableEditor.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_TableEditor.java
deleted file mode 100644
index 537c01f..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_TableEditor.java
+++ /dev/null
@@ -1,102 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.custom.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.custom.TableEditor
- *
- * @see org.eclipse.swt.custom.TableEditor
- */
-public class Test_org_eclipse_swt_custom_TableEditor extends Test_org_eclipse_swt_custom_ControlEditor {
-
-public Test_org_eclipse_swt_custom_TableEditor(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_Table() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_Table not written");
-}
-
-public void test_dispose() {
-	warnUnimpl("Test test_dispose not written");
-}
-
-public void test_getColumn() {
-	warnUnimpl("Test test_getColumn not written");
-}
-
-public void test_setColumnI() {
-	warnUnimpl("Test test_setColumnI not written");
-}
-
-public void test_getItem() {
-	warnUnimpl("Test test_getItem not written");
-}
-
-public void test_setItemLorg_eclipse_swt_widgets_TableItem() {
-	warnUnimpl("Test test_setItemLorg_eclipse_swt_widgets_TableItem not written");
-}
-
-public void test_setEditorLorg_eclipse_swt_widgets_Control() {
-	warnUnimpl("Test test_setEditorLorg_eclipse_swt_widgets_Control not written");
-}
-
-public void test_setEditorLorg_eclipse_swt_widgets_ControlLorg_eclipse_swt_widgets_TableItemI() {
-	warnUnimpl("Test test_setEditorLorg_eclipse_swt_widgets_ControlLorg_eclipse_swt_widgets_TableItemI not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_custom_TableEditor((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_Table");
-	methodNames.addElement("test_dispose");
-	methodNames.addElement("test_getColumn");
-	methodNames.addElement("test_setColumnI");
-	methodNames.addElement("test_getItem");
-	methodNames.addElement("test_setItemLorg_eclipse_swt_widgets_TableItem");
-	methodNames.addElement("test_setEditorLorg_eclipse_swt_widgets_Control");
-	methodNames.addElement("test_setEditorLorg_eclipse_swt_widgets_ControlLorg_eclipse_swt_widgets_TableItemI");
-	methodNames.addAll(Test_org_eclipse_swt_custom_ControlEditor.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_Table")) test_ConstructorLorg_eclipse_swt_widgets_Table();
-	else if (getName().equals("test_dispose")) test_dispose();
-	else if (getName().equals("test_getColumn")) test_getColumn();
-	else if (getName().equals("test_setColumnI")) test_setColumnI();
-	else if (getName().equals("test_getItem")) test_getItem();
-	else if (getName().equals("test_setItemLorg_eclipse_swt_widgets_TableItem")) test_setItemLorg_eclipse_swt_widgets_TableItem();
-	else if (getName().equals("test_setEditorLorg_eclipse_swt_widgets_Control")) test_setEditorLorg_eclipse_swt_widgets_Control();
-	else if (getName().equals("test_setEditorLorg_eclipse_swt_widgets_ControlLorg_eclipse_swt_widgets_TableItemI")) test_setEditorLorg_eclipse_swt_widgets_ControlLorg_eclipse_swt_widgets_TableItemI();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_TableTree.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_TableTree.java
deleted file mode 100644
index 0c0294e..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_TableTree.java
+++ /dev/null
@@ -1,216 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.custom.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.custom.TableTree
- *
- * @see org.eclipse.swt.custom.TableTree
- */
-public class Test_org_eclipse_swt_custom_TableTree extends Test_org_eclipse_swt_widgets_Composite {
-
-public Test_org_eclipse_swt_custom_TableTree(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_CompositeI() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_CompositeI not written");
-}
-
-public void test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener() {
-	warnUnimpl("Test test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener not written");
-}
-
-public void test_addTreeListenerLorg_eclipse_swt_events_TreeListener() {
-	warnUnimpl("Test test_addTreeListenerLorg_eclipse_swt_events_TreeListener not written");
-}
-
-public void test_computeSizeII() {
-	warnUnimpl("Test test_computeSizeII not written");
-}
-
-public void test_computeTrimIIII() {
-	warnUnimpl("Test test_computeTrimIIII not written");
-}
-
-public void test_deselectAll() {
-	warnUnimpl("Test test_deselectAll not written");
-}
-
-public void test_getItemCount() {
-	warnUnimpl("Test test_getItemCount not written");
-}
-
-public void test_getItemHeight() {
-	warnUnimpl("Test test_getItemHeight not written");
-}
-
-public void test_getItems() {
-	warnUnimpl("Test test_getItems not written");
-}
-
-public void test_getSelection() {
-	warnUnimpl("Test test_getSelection not written");
-}
-
-public void test_getSelectionCount() {
-	warnUnimpl("Test test_getSelectionCount not written");
-}
-
-public void test_getTable() {
-	warnUnimpl("Test test_getTable not written");
-}
-
-public void test_indexOfLorg_eclipse_swt_custom_TableTreeItem() {
-	warnUnimpl("Test test_indexOfLorg_eclipse_swt_custom_TableTreeItem not written");
-}
-
-public void test_getItemLorg_eclipse_swt_graphics_Point() {
-	warnUnimpl("Test test_getItemLorg_eclipse_swt_graphics_Point not written");
-}
-
-public void test_removeAll() {
-	warnUnimpl("Test test_removeAll not written");
-}
-
-public void test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener() {
-	warnUnimpl("Test test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener not written");
-}
-
-public void test_removeTreeListenerLorg_eclipse_swt_events_TreeListener() {
-	warnUnimpl("Test test_removeTreeListenerLorg_eclipse_swt_events_TreeListener not written");
-}
-
-public void test_selectAll() {
-	warnUnimpl("Test test_selectAll not written");
-}
-
-public void test_setBackgroundLorg_eclipse_swt_graphics_Color() {
-	warnUnimpl("Test test_setBackgroundLorg_eclipse_swt_graphics_Color not written");
-}
-
-public void test_setEnabledZ() {
-	warnUnimpl("Test test_setEnabledZ not written");
-}
-
-public void test_setFontLorg_eclipse_swt_graphics_Font() {
-	warnUnimpl("Test test_setFontLorg_eclipse_swt_graphics_Font not written");
-}
-
-public void test_setForegroundLorg_eclipse_swt_graphics_Color() {
-	warnUnimpl("Test test_setForegroundLorg_eclipse_swt_graphics_Color not written");
-}
-
-public void test_setMenuLorg_eclipse_swt_widgets_Menu() {
-	warnUnimpl("Test test_setMenuLorg_eclipse_swt_widgets_Menu not written");
-}
-
-public void test_setSelection$Lorg_eclipse_swt_custom_TableTreeItem() {
-	warnUnimpl("Test test_setSelection$Lorg_eclipse_swt_custom_TableTreeItem not written");
-}
-
-public void test_setToolTipTextLjava_lang_String() {
-	warnUnimpl("Test test_setToolTipTextLjava_lang_String not written");
-}
-
-public void test_showItemLorg_eclipse_swt_custom_TableTreeItem() {
-	warnUnimpl("Test test_showItemLorg_eclipse_swt_custom_TableTreeItem not written");
-}
-
-public void test_showSelection() {
-	warnUnimpl("Test test_showSelection not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_custom_TableTree((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_CompositeI");
-	methodNames.addElement("test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener");
-	methodNames.addElement("test_addTreeListenerLorg_eclipse_swt_events_TreeListener");
-	methodNames.addElement("test_computeSizeII");
-	methodNames.addElement("test_computeTrimIIII");
-	methodNames.addElement("test_deselectAll");
-	methodNames.addElement("test_getItemCount");
-	methodNames.addElement("test_getItemHeight");
-	methodNames.addElement("test_getItems");
-	methodNames.addElement("test_getSelection");
-	methodNames.addElement("test_getSelectionCount");
-	methodNames.addElement("test_getTable");
-	methodNames.addElement("test_indexOfLorg_eclipse_swt_custom_TableTreeItem");
-	methodNames.addElement("test_getItemLorg_eclipse_swt_graphics_Point");
-	methodNames.addElement("test_removeAll");
-	methodNames.addElement("test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener");
-	methodNames.addElement("test_removeTreeListenerLorg_eclipse_swt_events_TreeListener");
-	methodNames.addElement("test_selectAll");
-	methodNames.addElement("test_setBackgroundLorg_eclipse_swt_graphics_Color");
-	methodNames.addElement("test_setEnabledZ");
-	methodNames.addElement("test_setFontLorg_eclipse_swt_graphics_Font");
-	methodNames.addElement("test_setForegroundLorg_eclipse_swt_graphics_Color");
-	methodNames.addElement("test_setMenuLorg_eclipse_swt_widgets_Menu");
-	methodNames.addElement("test_setSelection$Lorg_eclipse_swt_custom_TableTreeItem");
-	methodNames.addElement("test_setToolTipTextLjava_lang_String");
-	methodNames.addElement("test_showItemLorg_eclipse_swt_custom_TableTreeItem");
-	methodNames.addElement("test_showSelection");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Composite.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_CompositeI")) test_ConstructorLorg_eclipse_swt_widgets_CompositeI();
-	else if (getName().equals("test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener")) test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener();
-	else if (getName().equals("test_addTreeListenerLorg_eclipse_swt_events_TreeListener")) test_addTreeListenerLorg_eclipse_swt_events_TreeListener();
-	else if (getName().equals("test_computeSizeII")) test_computeSizeII();
-	else if (getName().equals("test_computeTrimIIII")) test_computeTrimIIII();
-	else if (getName().equals("test_deselectAll")) test_deselectAll();
-	else if (getName().equals("test_getItemCount")) test_getItemCount();
-	else if (getName().equals("test_getItemHeight")) test_getItemHeight();
-	else if (getName().equals("test_getItems")) test_getItems();
-	else if (getName().equals("test_getSelection")) test_getSelection();
-	else if (getName().equals("test_getSelectionCount")) test_getSelectionCount();
-	else if (getName().equals("test_getTable")) test_getTable();
-	else if (getName().equals("test_indexOfLorg_eclipse_swt_custom_TableTreeItem")) test_indexOfLorg_eclipse_swt_custom_TableTreeItem();
-	else if (getName().equals("test_getItemLorg_eclipse_swt_graphics_Point")) test_getItemLorg_eclipse_swt_graphics_Point();
-	else if (getName().equals("test_removeAll")) test_removeAll();
-	else if (getName().equals("test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener")) test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener();
-	else if (getName().equals("test_removeTreeListenerLorg_eclipse_swt_events_TreeListener")) test_removeTreeListenerLorg_eclipse_swt_events_TreeListener();
-	else if (getName().equals("test_selectAll")) test_selectAll();
-	else if (getName().equals("test_setBackgroundLorg_eclipse_swt_graphics_Color")) test_setBackgroundLorg_eclipse_swt_graphics_Color();
-	else if (getName().equals("test_setEnabledZ")) test_setEnabledZ();
-	else if (getName().equals("test_setFontLorg_eclipse_swt_graphics_Font")) test_setFontLorg_eclipse_swt_graphics_Font();
-	else if (getName().equals("test_setForegroundLorg_eclipse_swt_graphics_Color")) test_setForegroundLorg_eclipse_swt_graphics_Color();
-	else if (getName().equals("test_setMenuLorg_eclipse_swt_widgets_Menu")) test_setMenuLorg_eclipse_swt_widgets_Menu();
-	else if (getName().equals("test_setSelection$Lorg_eclipse_swt_custom_TableTreeItem")) test_setSelection$Lorg_eclipse_swt_custom_TableTreeItem();
-	else if (getName().equals("test_setToolTipTextLjava_lang_String")) test_setToolTipTextLjava_lang_String();
-	else if (getName().equals("test_showItemLorg_eclipse_swt_custom_TableTreeItem")) test_showItemLorg_eclipse_swt_custom_TableTreeItem();
-	else if (getName().equals("test_showSelection")) test_showSelection();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_TableTreeEditor.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_TableTreeEditor.java
deleted file mode 100644
index c8581ad..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_TableTreeEditor.java
+++ /dev/null
@@ -1,102 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.custom.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.custom.TableTreeEditor
- *
- * @see org.eclipse.swt.custom.TableTreeEditor
- */
-public class Test_org_eclipse_swt_custom_TableTreeEditor extends Test_org_eclipse_swt_custom_ControlEditor {
-
-public Test_org_eclipse_swt_custom_TableTreeEditor(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_custom_TableTree() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_custom_TableTree not written");
-}
-
-public void test_dispose() {
-	warnUnimpl("Test test_dispose not written");
-}
-
-public void test_getColumn() {
-	warnUnimpl("Test test_getColumn not written");
-}
-
-public void test_setColumnI() {
-	warnUnimpl("Test test_setColumnI not written");
-}
-
-public void test_getItem() {
-	warnUnimpl("Test test_getItem not written");
-}
-
-public void test_setItemLorg_eclipse_swt_custom_TableTreeItem() {
-	warnUnimpl("Test test_setItemLorg_eclipse_swt_custom_TableTreeItem not written");
-}
-
-public void test_setEditorLorg_eclipse_swt_widgets_Control() {
-	warnUnimpl("Test test_setEditorLorg_eclipse_swt_widgets_Control not written");
-}
-
-public void test_setEditorLorg_eclipse_swt_widgets_ControlLorg_eclipse_swt_custom_TableTreeItemI() {
-	warnUnimpl("Test test_setEditorLorg_eclipse_swt_widgets_ControlLorg_eclipse_swt_custom_TableTreeItemI not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_custom_TableTreeEditor((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_custom_TableTree");
-	methodNames.addElement("test_dispose");
-	methodNames.addElement("test_getColumn");
-	methodNames.addElement("test_setColumnI");
-	methodNames.addElement("test_getItem");
-	methodNames.addElement("test_setItemLorg_eclipse_swt_custom_TableTreeItem");
-	methodNames.addElement("test_setEditorLorg_eclipse_swt_widgets_Control");
-	methodNames.addElement("test_setEditorLorg_eclipse_swt_widgets_ControlLorg_eclipse_swt_custom_TableTreeItemI");
-	methodNames.addAll(Test_org_eclipse_swt_custom_ControlEditor.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_custom_TableTree")) test_ConstructorLorg_eclipse_swt_custom_TableTree();
-	else if (getName().equals("test_dispose")) test_dispose();
-	else if (getName().equals("test_getColumn")) test_getColumn();
-	else if (getName().equals("test_setColumnI")) test_setColumnI();
-	else if (getName().equals("test_getItem")) test_getItem();
-	else if (getName().equals("test_setItemLorg_eclipse_swt_custom_TableTreeItem")) test_setItemLorg_eclipse_swt_custom_TableTreeItem();
-	else if (getName().equals("test_setEditorLorg_eclipse_swt_widgets_Control")) test_setEditorLorg_eclipse_swt_widgets_Control();
-	else if (getName().equals("test_setEditorLorg_eclipse_swt_widgets_ControlLorg_eclipse_swt_custom_TableTreeItemI")) test_setEditorLorg_eclipse_swt_widgets_ControlLorg_eclipse_swt_custom_TableTreeItemI();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_TableTreeItem.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_TableTreeItem.java
deleted file mode 100644
index cab0b52..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_TableTreeItem.java
+++ /dev/null
@@ -1,204 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.custom.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.custom.TableTreeItem
- *
- * @see org.eclipse.swt.custom.TableTreeItem
- */
-public class Test_org_eclipse_swt_custom_TableTreeItem extends Test_org_eclipse_swt_widgets_Item {
-
-	TableTree tableTree;
-	TableTreeItem tableTreeItem;
-	
-public Test_org_eclipse_swt_custom_TableTreeItem(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-	tableTree = new TableTree(shell, 0);
-	tableTreeItem = new TableTreeItem(tableTree, 0);
-	setWidget(tableTreeItem);
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_custom_TableTreeI() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_custom_TableTreeI not written");
-}
-
-public void test_ConstructorLorg_eclipse_swt_custom_TableTreeII() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_custom_TableTreeII not written");
-}
-
-public void test_ConstructorLorg_eclipse_swt_custom_TableTreeItemI() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_custom_TableTreeItemI not written");
-}
-
-public void test_ConstructorLorg_eclipse_swt_custom_TableTreeItemII() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_custom_TableTreeItemII not written");
-}
-
-public void test_getBoundsI() {
-	warnUnimpl("Test test_getBoundsI not written");
-}
-
-public void test_getChecked() {
-	warnUnimpl("Test test_getChecked not written");
-}
-
-public void test_getDisplay() {
-	warnUnimpl("Test test_getDisplay not written");
-}
-
-public void test_getExpanded() {
-	warnUnimpl("Test test_getExpanded not written");
-}
-
-public void test_getImage() {
-	warnUnimpl("Test test_getImage not written");
-}
-
-public void test_getImageI() {
-	warnUnimpl("Test test_getImageI not written");
-}
-
-public void test_getItemCount() {
-	warnUnimpl("Test test_getItemCount not written");
-}
-
-public void test_getItems() {
-	warnUnimpl("Test test_getItems not written");
-}
-
-public void test_getParent() {
-	warnUnimpl("Test test_getParent not written");
-}
-
-public void test_getParentItem() {
-	warnUnimpl("Test test_getParentItem not written");
-}
-
-public void test_getText() {
-	warnUnimpl("Test test_getText not written");
-}
-
-public void test_getTextI() {
-	warnUnimpl("Test test_getTextI not written");
-}
-
-public void test_indexOfLorg_eclipse_swt_custom_TableTreeItem() {
-	warnUnimpl("Test test_indexOfLorg_eclipse_swt_custom_TableTreeItem not written");
-}
-
-public void test_dispose() {
-	warnUnimpl("Test test_dispose not written");
-}
-
-public void test_setCheckedZ() {
-	warnUnimpl("Test test_setCheckedZ not written");
-}
-
-public void test_setExpandedZ() {
-	warnUnimpl("Test test_setExpandedZ not written");
-}
-
-public void test_setImageILorg_eclipse_swt_graphics_Image() {
-	warnUnimpl("Test test_setImageILorg_eclipse_swt_graphics_Image not written");
-}
-
-public void test_setImageLorg_eclipse_swt_graphics_Image() {
-	warnUnimpl("Test test_setImageLorg_eclipse_swt_graphics_Image not written");
-}
-
-public void test_setTextILjava_lang_String() {
-	warnUnimpl("Test test_setTextILjava_lang_String not written");
-}
-
-public void test_setTextLjava_lang_String() {
-	warnUnimpl("Test test_setTextLjava_lang_String not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_custom_TableTreeItem((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_custom_TableTreeI");
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_custom_TableTreeII");
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_custom_TableTreeItemI");
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_custom_TableTreeItemII");
-	methodNames.addElement("test_getBoundsI");
-	methodNames.addElement("test_getChecked");
-	methodNames.addElement("test_getDisplay");
-	methodNames.addElement("test_getExpanded");
-	methodNames.addElement("test_getImage");
-	methodNames.addElement("test_getImageI");
-	methodNames.addElement("test_getItemCount");
-	methodNames.addElement("test_getItems");
-	methodNames.addElement("test_getParent");
-	methodNames.addElement("test_getParentItem");
-	methodNames.addElement("test_getText");
-	methodNames.addElement("test_getTextI");
-	methodNames.addElement("test_indexOfLorg_eclipse_swt_custom_TableTreeItem");
-	methodNames.addElement("test_dispose");
-	methodNames.addElement("test_setCheckedZ");
-	methodNames.addElement("test_setExpandedZ");
-	methodNames.addElement("test_setImageILorg_eclipse_swt_graphics_Image");
-	methodNames.addElement("test_setImageLorg_eclipse_swt_graphics_Image");
-	methodNames.addElement("test_setTextILjava_lang_String");
-	methodNames.addElement("test_setTextLjava_lang_String");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Item.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_custom_TableTreeI")) test_ConstructorLorg_eclipse_swt_custom_TableTreeI();
-	else if (getName().equals("test_ConstructorLorg_eclipse_swt_custom_TableTreeII")) test_ConstructorLorg_eclipse_swt_custom_TableTreeII();
-	else if (getName().equals("test_ConstructorLorg_eclipse_swt_custom_TableTreeItemI")) test_ConstructorLorg_eclipse_swt_custom_TableTreeItemI();
-	else if (getName().equals("test_ConstructorLorg_eclipse_swt_custom_TableTreeItemII")) test_ConstructorLorg_eclipse_swt_custom_TableTreeItemII();
-	else if (getName().equals("test_getBoundsI")) test_getBoundsI();
-	else if (getName().equals("test_getChecked")) test_getChecked();
-	else if (getName().equals("test_getDisplay")) test_getDisplay();
-	else if (getName().equals("test_getExpanded")) test_getExpanded();
-	else if (getName().equals("test_getImage")) test_getImage();
-	else if (getName().equals("test_getImageI")) test_getImageI();
-	else if (getName().equals("test_getItemCount")) test_getItemCount();
-	else if (getName().equals("test_getItems")) test_getItems();
-	else if (getName().equals("test_getParent")) test_getParent();
-	else if (getName().equals("test_getParentItem")) test_getParentItem();
-	else if (getName().equals("test_getText")) test_getText();
-	else if (getName().equals("test_getTextI")) test_getTextI();
-	else if (getName().equals("test_indexOfLorg_eclipse_swt_custom_TableTreeItem")) test_indexOfLorg_eclipse_swt_custom_TableTreeItem();
-	else if (getName().equals("test_dispose")) test_dispose();
-	else if (getName().equals("test_setCheckedZ")) test_setCheckedZ();
-	else if (getName().equals("test_setExpandedZ")) test_setExpandedZ();
-	else if (getName().equals("test_setImageILorg_eclipse_swt_graphics_Image")) test_setImageILorg_eclipse_swt_graphics_Image();
-	else if (getName().equals("test_setImageLorg_eclipse_swt_graphics_Image")) test_setImageLorg_eclipse_swt_graphics_Image();
-	else if (getName().equals("test_setTextILjava_lang_String")) test_setTextILjava_lang_String();
-	else if (getName().equals("test_setTextLjava_lang_String")) test_setTextLjava_lang_String();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_TextChangeListener.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_TextChangeListener.java
deleted file mode 100644
index 780d2c4..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_TextChangeListener.java
+++ /dev/null
@@ -1,560 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.custom.*;
-import org.eclipse.swt.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.custom.TextChangeListener
- *
- * @see org.eclipse.swt.custom.TextChangeListener
- */
-public class Test_org_eclipse_swt_custom_TextChangeListener extends SwtTestCase {
-	Shell shell;
-	StyledText styledText;
-	int verify = -1;
-
-public Test_org_eclipse_swt_custom_TextChangeListener(String name) {
-	super(name);
-}
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-protected void setUp() {
-	shell = new Shell();
-	styledText = new StyledText(shell, SWT.NULL);
-}
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_custom_TextChangeListener((String)e.nextElement()));
-	}
-	return suite;
-}
-protected void tearDown() {
-}
-public void test_textChangingLorg_eclipse_swt_custom_TextChangingEvent() {
-	StyledTextContent content = styledText.getContent();
-	TextChangeListener listener = new TextChangeListener() {
-		public void textChanging(TextChangingEvent event) {
-			switch(verify) {
-				case 1 : {
-					assertTrue(":1a:", event.replaceLineCount == 0);
-					assertTrue(":1b:", event.newLineCount == 1);
-					break;
-				}
-				case 2 : {
-					assertTrue(":2a:", event.replaceLineCount == 2);
-					assertTrue(":2b:", event.newLineCount == 0);
-					break;
-				}
-				case 3 : {
-					assertTrue(":3a:", event.replaceLineCount == 0);
-					assertTrue(":3b:", event.newLineCount == 2);
-					break;
-				}
-				case 4: {
-					assertTrue(":4:", false);
-					break;
-				}
-				case 5 : {
-					assertTrue(":5a:", event.replaceLineCount == 0);
-					assertTrue(":5b:", event.newLineCount == 1);
-					break;
-				}
-				case 6 : {
-					assertTrue(":6a:", event.replaceLineCount == 1);
-					assertTrue(":6b:", event.newLineCount == 0);
-					break;
-				}
-				case 7 : {
-					assertTrue(":7a:", event.replaceLineCount == 0);
-					assertTrue(":7b:", event.newLineCount == 0);
-					break;
-				}
-				case 8 : {
-					assertTrue(":8a:", event.replaceLineCount == 1);
-					assertTrue(":8b:", event.newLineCount == 0);
-					break;
-				}
-				case 9 : {
-					assertTrue(":9a:", event.replaceLineCount == 1);
-					assertTrue(":9b:", event.newLineCount == 0);
-					break;
-				}
-				case 10:{
-					assertTrue(":10:", false);
-					break;
-				}
-				case 11: {
-					assertTrue(":11:", false);
-					break;
-				}
-				case 12: {
-					assertTrue(":12a:", event.replaceLineCount == 0);
-					assertTrue(":12b:", event.newLineCount == 1);
-					break;
-				}
-				case 13: {
-					assertTrue(":13a:", event.replaceLineCount == 0);
-					assertTrue(":13b:", event.newLineCount == 1);
-					break;
-				}
-				case 14: {
-					assertTrue(":14:", false);
-					break;
-				}
-				case 15: {
-					assertTrue(":15a:", event.replaceLineCount == 1);
-					assertTrue(":15b:", event.newLineCount == 2);
-					break;
-				}
-				case 16:{
-					assertTrue(":16:", false);
-					break;
-				}
-				case 17: {
-					assertTrue(":17:", false);
-					break;
-				}
-				case 18: {
-					assertTrue(":18a:", event.replaceLineCount == 0);
-					assertTrue(":18b:", event.newLineCount == 2);
-					break;
-				}
-				case 19: {
-					assertTrue(":19a:", event.replaceLineCount == 0);
-					assertTrue(":19b:", event.newLineCount == 3);
-					break;
-				}
-				case 20: {
-					assertTrue(":20:", false);
-					break;
-				}
-			}
-		}
-		public void textChanged(TextChangedEvent event) {
-		}
-		public void textSet(TextChangedEvent event) {
-		}
-	};
-	content.addTextChangeListener(listener);
-
-	boolean exceptionHandled = false;	
-	verify = 1;
-	styledText.setText("testing");
-	styledText.replaceTextRange(0, 0, "\n");
-
-	verify = 2;
-	styledText.setText("\n\n");
-	styledText.replaceTextRange(0, 2, "a");
-
-	verify = 3;
-	styledText.setText("a");
-	styledText.replaceTextRange(0, 1, "\n\n");
-
-	verify = 4;
-	styledText.setText("L1\r\nL2\r\nL3\r\nL4\r\n");
-	try {styledText.replaceTextRange(3, 1, "test\n");}
-	catch (IllegalArgumentException ex) {
-		exceptionHandled = true;
-	}
-	assertTrue(":4: exception not thrown", exceptionHandled);
-	exceptionHandled = false;
-
-	verify = 5;
-	styledText.setText("Line 1\r\nLine 2");
-	styledText.replaceTextRange(0, 0, "\r");
-
-	verify = 6;
-	styledText.setText("This\nis a test\nline 3\nline 4");
-	styledText.replaceTextRange(21, 7, "");
-
-	verify = 7;
-	styledText.setText("This\nis a test\r");
-	styledText.replaceTextRange(5, 9, "");
-
-	verify = 8;
-	styledText.setText("\nL1\r\nL2\r\n");
-	styledText.replaceTextRange(7, 2, "");
-
-	verify = 9;
-	styledText.setText("L1\r\n");
-	styledText.replaceTextRange(2, 2, "test");
-
-	verify = 10;
-	styledText.setText("L1\r\n");
-	try {styledText.replaceTextRange(3, 1, "");} 
-	catch (IllegalArgumentException ex) {
-		exceptionHandled = true;
-	}
-	assertTrue(":10: exception not thrown", exceptionHandled);
-	exceptionHandled = false;
-
-	verify = 11;
-	styledText.setText("L1\r\nL2\r\nL3\r\nL4\r\n");
-	try {styledText.replaceTextRange(1, 2, "");}
-	catch (IllegalArgumentException ex) {
-		exceptionHandled = true;
-	}
-	assertTrue(":11: exception not thrown", exceptionHandled);
-	exceptionHandled = false;
-
-	verify = 12;
-	styledText.setText("L1\r");
-	styledText.replaceTextRange(3, 0, "\n");
-
-	verify = 13;
-	styledText.setText("L1\n");
-	styledText.replaceTextRange(2, 0, "\r");
-
-	verify = 14;
-	styledText.setText("L1\r\n");
-	try {styledText.replaceTextRange(3, 0, "test");}
-	catch (IllegalArgumentException ex) {
-		exceptionHandled = true;
-	}
-	assertTrue(":14: exception not thrown", exceptionHandled);
-	exceptionHandled = false;
-
-	verify = 15;
-	styledText.setText("L1\r\n");
-	styledText.replaceTextRange(2, 2, "test\n\n");
-
-	verify = 16;
-	styledText.setText("L1\r\n");
-	try {styledText.replaceTextRange(3, 1, "test\r\n");}
-	catch (IllegalArgumentException ex) {
-		exceptionHandled = true;
-	}
-	assertTrue(":16: exception not thrown", exceptionHandled);
-	exceptionHandled = false;
-
-	verify = 17;
-	styledText.setText("L1\r\nL2\r\nL3\r\nL4\r\n");
-	try {styledText.replaceTextRange(1, 2, "test\n\n");}
-	catch (IllegalArgumentException ex) {
-		exceptionHandled = true;
-	}
-	assertTrue(":17: exception not thrown", exceptionHandled);
-	exceptionHandled = false;
-
-	verify = 18;
- 	styledText.setText("L1\r");
-	styledText.replaceTextRange(3, 0, "\ntest\r\n");
-
-	verify = 19;
-	styledText.setText("L1\n");
-	styledText.replaceTextRange(2, 0, "test\r\r\r");
-	verify = 20;
-	styledText.setText("L1\r\nL2\r\nL3\r\nL4\r\n");
-	try {styledText.replaceTextRange(3, 1, "test\n");}
-	catch (IllegalArgumentException ex) {
-		exceptionHandled = true;
-	}
-	assertTrue(":20: exception not thrown", exceptionHandled);
-	exceptionHandled = false;
-	content.removeTextChangeListener(listener);
-}
-
-public void test_textSetLorg_eclipse_swt_custom_TextChangedEvent() {
-	StyledTextContent content = styledText.getContent();
-	TextChangeListener listener = new TextChangeListener() {
-		public void textChanging(TextChangingEvent event) {
-		}
-		public void textChanged(TextChangedEvent event) {
-		}
-		public void textSet(TextChangedEvent event) {
-			switch (verify) {
-				case 1 : {
-					assertTrue(":1:", styledText.getText().equals("testing"));
-					break;
-				}
-				case 2 : {
-					assertTrue(":2:", styledText.getText().equals("\n\n"));
-					break;
-				}
-				case 3 : {
-					assertTrue(":3:", styledText.getText().equals("a"));
-					break;
-				}
-				case 4 : {
-					assertTrue(":4:", styledText.getText().equals(""));
-					break;
-				}
-			}
-		}
-	};
-	content.addTextChangeListener(listener);
-	
-	verify = 1;
-	styledText.setText("testing");
-
-	verify = 2;
-	styledText.setText("\n\n");
-
-	verify = 3;
-	styledText.setText("a");
-	
-	verify = 4;
-	try {styledText.setText(null);}
-	catch (IllegalArgumentException ex) {assertTrue(":4:", true);}	
-	content.removeTextChangeListener(listener);
-}
-
-public void test_textChangedLorg_eclipse_swt_custom_TextChangedEvent() {
-	StyledTextContent content = styledText.getContent();
-	TextChangeListener listener = new TextChangeListener() {
-		public void textChanged(TextChangedEvent event) {
-			switch (verify) {
-				case 1 : {
-					assertTrue(":1:", styledText.getText().equals("\ntesting"));
-					break;
-				}
-				case 2 : {
-					assertTrue(":2:", styledText.getText().equals("a"));
-					break;
-				}
-				case 3 : {
-					assertTrue(":3:", styledText.getText().equals("\n\n"));
-					break;
-				}
-				case 4: {
-					assertTrue(":4:", false);
-					break;
-				}
-				case 5 : {
-					assertTrue(":5:", styledText.getText().equals("\rLine 1\r\nLine 2"));
-					break;
-				}
-				case 6 : {
-					assertTrue(":6:", styledText.getText().equals("This\nis a test\nline 3"));
-					break;
-				}
-				case 7 : {
-					assertTrue(":7:", styledText.getText().equals("This\n\r"));
-					break;
-				}
-				case 8 : {
-					assertTrue(":8:", styledText.getText().equals("\nL1\r\nL2"));
-					break;
-				}
-				case 9 : {
-					assertTrue(":9:", styledText.getText().equals("L1test"));
-					break;
-				}
-				case 10:{
-					assertTrue(":10:", false);
-					break;
-				}
-				case 11: {
-					assertTrue(":11:", false);
-					break;
-				}
-				case 12: {
-					assertTrue(":12:", styledText.getText().equals("L1\r\n"));
-					break;
-				}
-				case 13: {
-					assertTrue(":13:", styledText.getText().equals("L1\r\n"));
-					break;
-				}
-				case 14: {
-					assertTrue(":14:", false);
-					break;
-				}
-				case 15: {
-					assertTrue(":15:", styledText.getText().equals("L1test\n\n"));
-					break;
-				}
-				case 16:{
-					assertTrue(":16:", false);
-					break;
-				}
-				case 17: {
-					assertTrue(":17:", false);
-					break;
-				}
-				case 18: {
-					assertTrue(":18:", styledText.getText().equals("L1\r\ntest\r\n"));
-					break;
-				}
-				case 19: {
-					assertTrue(":19:", styledText.getText().equals("L1test\r\r\r\n"));
-					break;
-				}
-				case 20: {
-					assertTrue(":20:", false);
-					break;
-				}
-			}
-		}
-		public void textChanging(TextChangingEvent event) {
-		}
-		public void textSet(TextChangedEvent event) {
-		}
-	};
-	content.addTextChangeListener(listener);
-	
-	boolean exceptionHandled = false;
-	verify = 0;
-	styledText.setText("testing");
-	verify = 1;
-	styledText.replaceTextRange(0, 0, "\n");
-
-	verify = 0;
-	styledText.setText("\n\n");
-	verify = 2;
-	styledText.replaceTextRange(0, 2, "a");
-
-	verify = 0;
-	styledText.setText("a");
-	verify = 3;
-	styledText.replaceTextRange(0, 1, "\n\n");
-
-	verify = 0;
-	styledText.setText("L1\r\nL2\r\nL3\r\nL4\r\n");
-	verify = 4;
-	try {styledText.replaceTextRange(3, 1, "test\n");}
-	catch (IllegalArgumentException ex) {
-		exceptionHandled = true;
-	}
-	assertTrue(":4: exception not thrown", exceptionHandled);
-	exceptionHandled = false;
-
-	verify = 0;
-	styledText.setText("Line 1\r\nLine 2");
-	verify = 5;
-	styledText.replaceTextRange(0, 0, "\r");
-
-	verify = 0;
-	styledText.setText("This\nis a test\nline 3\nline 4");
-	verify = 6;
-	styledText.replaceTextRange(21, 7, "");
-
-	verify = 0;
-	styledText.setText("This\nis a test\r");
-	verify = 7;
-	styledText.replaceTextRange(5, 9, "");
-
-	verify = 0;
-	styledText.setText("\nL1\r\nL2\r\n");
-	verify = 8;
-	styledText.replaceTextRange(7, 2, "");
-
-	verify = 0;
-	styledText.setText("L1\r\n");
-	verify = 9;
-	styledText.replaceTextRange(2, 2, "test");
-
-	verify = 0;
-	styledText.setText("L1\r\n");
-	verify = 10;
-	try {styledText.replaceTextRange(3, 1, "");} 
-	catch (IllegalArgumentException ex) {
-		exceptionHandled = true;
-	}
-	assertTrue(":10: exception not thrown", exceptionHandled);
-	exceptionHandled = false;
-
-	verify = 0;
-	styledText.setText("L1\r\nL2\r\nL3\r\nL4\r\n");
-	verify = 11;
-	try {styledText.replaceTextRange(1, 2, "");}
-	catch (IllegalArgumentException ex) {
-		exceptionHandled = true;
-	}
-	assertTrue(":11: exception not thrown", exceptionHandled);
-	exceptionHandled = false;
-
-	verify = 0;
-	styledText.setText("L1\r");
-	verify = 12;
-	styledText.replaceTextRange(3, 0, "\n");
-
-	verify = 0;
-	styledText.setText("L1\n");
-	verify = 13;
-	styledText.replaceTextRange(2, 0, "\r");
-
-	verify = 0;
-	styledText.setText("L1\r\n");
-	verify = 14;
-	try {styledText.replaceTextRange(3, 0, "test");}
-	catch (IllegalArgumentException ex) {
-		exceptionHandled = true;
-	}
-	assertTrue(":14: exception not thrown", exceptionHandled);
-	exceptionHandled = false;
-
-	verify = 0;
-	styledText.setText("L1\r\n");
-	verify = 15;
-	styledText.replaceTextRange(2, 2, "test\n\n");
-
-	verify = 0;
-	styledText.setText("L1\r\n");
-	verify = 16;
-	try {styledText.replaceTextRange(3, 1, "test\r\n");}
-	catch (IllegalArgumentException ex) {
-		exceptionHandled = true;
-	}
-	assertTrue(":16: exception not thrown", exceptionHandled);
-	exceptionHandled = false;
-
-	verify = 0;
-	styledText.setText("L1\r\nL2\r\nL3\r\nL4\r\n");
-	verify = 17;
-	try {styledText.replaceTextRange(1, 2, "test\n\n");}
-	catch (IllegalArgumentException ex) {
-		exceptionHandled = true;
-	}
-	assertTrue(":17: exception not thrown", exceptionHandled);
-	exceptionHandled = false;
-
-	verify = 0;
- 	styledText.setText("L1\r");
-	verify = 18;
-	styledText.replaceTextRange(3, 0, "\ntest\r\n");
-
-	verify = 0;
-	styledText.setText("L1\n");
-	verify = 19;
-	styledText.replaceTextRange(2, 0, "test\r\r\r");
-
-	verify = 0;
-	styledText.setText("L1\r\nL2\r\nL3\r\nL4\r\n");
-	verify = 20;
-	try {styledText.replaceTextRange(3, 1, "test\n");}
-	catch (IllegalArgumentException ex) {
-		exceptionHandled = true;
-	}
-	assertTrue(":20: exception not thrown", exceptionHandled);
-	exceptionHandled = false;
-	content.removeTextChangeListener(listener);
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_textChangingLorg_eclipse_swt_custom_TextChangingEvent");
-	methodNames.addElement("test_textChangedLorg_eclipse_swt_custom_TextChangedEvent");
-	methodNames.addElement("test_textSetLorg_eclipse_swt_custom_TextChangedEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_textChangingLorg_eclipse_swt_custom_TextChangingEvent")) test_textChangingLorg_eclipse_swt_custom_TextChangingEvent();
-	else if (getName().equals("test_textChangedLorg_eclipse_swt_custom_TextChangedEvent")) test_textChangedLorg_eclipse_swt_custom_TextChangedEvent();
-	else if (getName().equals("test_textSetLorg_eclipse_swt_custom_TextChangedEvent")) test_textSetLorg_eclipse_swt_custom_TextChangedEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_TextChangedEvent.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_TextChangedEvent.java
deleted file mode 100644
index 750c8c5..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_TextChangedEvent.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.custom.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.custom.TextChangedEvent
- *
- * @see org.eclipse.swt.custom.TextChangedEvent
- */
-public class Test_org_eclipse_swt_custom_TextChangedEvent extends Test_org_eclipse_swt_events_TypedEvent {
-
-public Test_org_eclipse_swt_custom_TextChangedEvent(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_custom_StyledTextContent() {
-	// this method tested by other test classes
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_custom_TextChangedEvent((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_custom_StyledTextContent");
-	methodNames.addAll(Test_org_eclipse_swt_events_TypedEvent.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_custom_StyledTextContent")) test_ConstructorLorg_eclipse_swt_custom_StyledTextContent();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_TextChangingEvent.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_TextChangingEvent.java
deleted file mode 100644
index 7b06e95..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_TextChangingEvent.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.custom.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.custom.TextChangingEvent
- *
- * @see org.eclipse.swt.custom.TextChangingEvent
- */
-public class Test_org_eclipse_swt_custom_TextChangingEvent extends Test_org_eclipse_swt_events_TypedEvent {
-
-public Test_org_eclipse_swt_custom_TextChangingEvent(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_custom_StyledTextContent() {
-	// this method tested by other test classes
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_custom_TextChangingEvent((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_custom_StyledTextContent");
-	methodNames.addAll(Test_org_eclipse_swt_events_TypedEvent.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_custom_StyledTextContent")) test_ConstructorLorg_eclipse_swt_custom_StyledTextContent();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_TreeEditor.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_TreeEditor.java
deleted file mode 100644
index 25da5cb..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_TreeEditor.java
+++ /dev/null
@@ -1,90 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.custom.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.custom.TreeEditor
- *
- * @see org.eclipse.swt.custom.TreeEditor
- */
-public class Test_org_eclipse_swt_custom_TreeEditor extends Test_org_eclipse_swt_custom_ControlEditor {
-
-public Test_org_eclipse_swt_custom_TreeEditor(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_Tree() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_Tree not written");
-}
-
-public void test_dispose() {
-	warnUnimpl("Test test_dispose not written");
-}
-
-public void test_getItem() {
-	warnUnimpl("Test test_getItem not written");
-}
-
-public void test_setItemLorg_eclipse_swt_widgets_TreeItem() {
-	warnUnimpl("Test test_setItemLorg_eclipse_swt_widgets_TreeItem not written");
-}
-
-public void test_setEditorLorg_eclipse_swt_widgets_ControlLorg_eclipse_swt_widgets_TreeItem() {
-	warnUnimpl("Test test_setEditorLorg_eclipse_swt_widgets_ControlLorg_eclipse_swt_widgets_TreeItem not written");
-}
-
-public void test_setEditorLorg_eclipse_swt_widgets_Control() {
-	warnUnimpl("Test test_setEditorLorg_eclipse_swt_widgets_Control not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_custom_TreeEditor((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_Tree");
-	methodNames.addElement("test_dispose");
-	methodNames.addElement("test_getItem");
-	methodNames.addElement("test_setItemLorg_eclipse_swt_widgets_TreeItem");
-	methodNames.addElement("test_setEditorLorg_eclipse_swt_widgets_ControlLorg_eclipse_swt_widgets_TreeItem");
-	methodNames.addElement("test_setEditorLorg_eclipse_swt_widgets_Control");
-	methodNames.addAll(Test_org_eclipse_swt_custom_ControlEditor.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_Tree")) test_ConstructorLorg_eclipse_swt_widgets_Tree();
-	else if (getName().equals("test_dispose")) test_dispose();
-	else if (getName().equals("test_getItem")) test_getItem();
-	else if (getName().equals("test_setItemLorg_eclipse_swt_widgets_TreeItem")) test_setItemLorg_eclipse_swt_widgets_TreeItem();
-	else if (getName().equals("test_setEditorLorg_eclipse_swt_widgets_ControlLorg_eclipse_swt_widgets_TreeItem")) test_setEditorLorg_eclipse_swt_widgets_ControlLorg_eclipse_swt_widgets_TreeItem();
-	else if (getName().equals("test_setEditorLorg_eclipse_swt_widgets_Control")) test_setEditorLorg_eclipse_swt_widgets_Control();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_VerifyKeyListener.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_VerifyKeyListener.java
deleted file mode 100644
index f7ca740..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_VerifyKeyListener.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.custom.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.custom.VerifyKeyListener
- *
- * @see org.eclipse.swt.custom.VerifyKeyListener
- */
-public class Test_org_eclipse_swt_custom_VerifyKeyListener extends SwtTestCase {
-	Shell shell;
-	StyledText styledText;
-	int verify = -1;
-
-public Test_org_eclipse_swt_custom_VerifyKeyListener(String name) {
-	super(name);
-}
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-protected void setUp() {
-	shell = new Shell();
-	styledText = new StyledText(shell, SWT.NULL);
-	shell.open();
-}
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_custom_VerifyKeyListener((String)e.nextElement()));
-	}
-	return suite;
-}
-protected void tearDown() {
-}
-
-public void test_verifyKeyLorg_eclipse_swt_events_VerifyEvent() {
-	VerifyKeyListener listener = new VerifyKeyListener() {
-		public void verifyKey(VerifyEvent event) {
-			if (verify != 1) {event.doit = false;}
-		}
-	};
-	styledText.addVerifyKeyListener(listener);
-	verify = 1;
-	Event e = new Event();
-	e.character = 'a';
-	styledText.notifyListeners(SWT.KeyDown, e);
-	assertTrue(":1:", styledText.getText().equals("a"));
-
-	verify = 2;
-	styledText.setText("");
-	e = new Event();
-	e.character = 'a';
-	styledText.notifyListeners(SWT.KeyDown, e);
-	assertTrue(":2:", styledText.getText().equals(""));
-	styledText.removeVerifyKeyListener(listener);
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_verifyKeyLorg_eclipse_swt_events_VerifyEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_verifyKeyLorg_eclipse_swt_events_VerifyEvent")) test_verifyKeyLorg_eclipse_swt_events_VerifyEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_ViewForm.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_ViewForm.java
deleted file mode 100644
index 6dc8fa6..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_ViewForm.java
+++ /dev/null
@@ -1,150 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.custom.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.custom.ViewForm
- *
- * @see org.eclipse.swt.custom.ViewForm
- */
-public class Test_org_eclipse_swt_custom_ViewForm extends Test_org_eclipse_swt_widgets_Composite {
-
-public Test_org_eclipse_swt_custom_ViewForm(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_CompositeI() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_CompositeI not written");
-}
-
-public void test_computeSizeIIZ() {
-	warnUnimpl("Test test_computeSizeIIZ not written");
-}
-
-public void test_getClientArea() {
-	warnUnimpl("Test test_getClientArea not written");
-}
-
-public void test_getContent() {
-	warnUnimpl("Test test_getContent not written");
-}
-
-public void test_getTopCenter() {
-	warnUnimpl("Test test_getTopCenter not written");
-}
-
-public void test_getTopLeft() {
-	warnUnimpl("Test test_getTopLeft not written");
-}
-
-public void test_getTopRight() {
-	warnUnimpl("Test test_getTopRight not written");
-}
-
-public void test_layoutZ() {
-	warnUnimpl("Test test_layoutZ not written");
-}
-
-public void test_setContentLorg_eclipse_swt_widgets_Control() {
-	warnUnimpl("Test test_setContentLorg_eclipse_swt_widgets_Control not written");
-}
-
-public void test_setFontLorg_eclipse_swt_graphics_Font() {
-	warnUnimpl("Test test_setFontLorg_eclipse_swt_graphics_Font not written");
-}
-
-public void test_setLayoutLorg_eclipse_swt_widgets_Layout() {
-	warnUnimpl("Test test_setLayoutLorg_eclipse_swt_widgets_Layout not written");
-}
-
-public void test_setTopCenterLorg_eclipse_swt_widgets_Control() {
-	warnUnimpl("Test test_setTopCenterLorg_eclipse_swt_widgets_Control not written");
-}
-
-public void test_setTopLeftLorg_eclipse_swt_widgets_Control() {
-	warnUnimpl("Test test_setTopLeftLorg_eclipse_swt_widgets_Control not written");
-}
-
-public void test_setTopRightLorg_eclipse_swt_widgets_Control() {
-	warnUnimpl("Test test_setTopRightLorg_eclipse_swt_widgets_Control not written");
-}
-
-public void test_setBorderVisibleZ() {
-	warnUnimpl("Test test_setBorderVisibleZ not written");
-}
-
-public void test_setTopCenterSeparateZ() {
-	warnUnimpl("Test test_setTopCenterSeparateZ not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_custom_ViewForm((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_CompositeI");
-	methodNames.addElement("test_computeSizeIIZ");
-	methodNames.addElement("test_getClientArea");
-	methodNames.addElement("test_getContent");
-	methodNames.addElement("test_getTopCenter");
-	methodNames.addElement("test_getTopLeft");
-	methodNames.addElement("test_getTopRight");
-	methodNames.addElement("test_layoutZ");
-	methodNames.addElement("test_setContentLorg_eclipse_swt_widgets_Control");
-	methodNames.addElement("test_setFontLorg_eclipse_swt_graphics_Font");
-	methodNames.addElement("test_setLayoutLorg_eclipse_swt_widgets_Layout");
-	methodNames.addElement("test_setTopCenterLorg_eclipse_swt_widgets_Control");
-	methodNames.addElement("test_setTopLeftLorg_eclipse_swt_widgets_Control");
-	methodNames.addElement("test_setTopRightLorg_eclipse_swt_widgets_Control");
-	methodNames.addElement("test_setBorderVisibleZ");
-	methodNames.addElement("test_setTopCenterSeparateZ");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Composite.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_CompositeI")) test_ConstructorLorg_eclipse_swt_widgets_CompositeI();
-	else if (getName().equals("test_computeSizeIIZ")) test_computeSizeIIZ();
-	else if (getName().equals("test_getClientArea")) test_getClientArea();
-	else if (getName().equals("test_getContent")) test_getContent();
-	else if (getName().equals("test_getTopCenter")) test_getTopCenter();
-	else if (getName().equals("test_getTopLeft")) test_getTopLeft();
-	else if (getName().equals("test_getTopRight")) test_getTopRight();
-	else if (getName().equals("test_layoutZ")) test_layoutZ();
-	else if (getName().equals("test_setContentLorg_eclipse_swt_widgets_Control")) test_setContentLorg_eclipse_swt_widgets_Control();
-	else if (getName().equals("test_setFontLorg_eclipse_swt_graphics_Font")) test_setFontLorg_eclipse_swt_graphics_Font();
-	else if (getName().equals("test_setLayoutLorg_eclipse_swt_widgets_Layout")) test_setLayoutLorg_eclipse_swt_widgets_Layout();
-	else if (getName().equals("test_setTopCenterLorg_eclipse_swt_widgets_Control")) test_setTopCenterLorg_eclipse_swt_widgets_Control();
-	else if (getName().equals("test_setTopLeftLorg_eclipse_swt_widgets_Control")) test_setTopLeftLorg_eclipse_swt_widgets_Control();
-	else if (getName().equals("test_setTopRightLorg_eclipse_swt_widgets_Control")) test_setTopRightLorg_eclipse_swt_widgets_Control();
-	else if (getName().equals("test_setBorderVisibleZ")) test_setBorderVisibleZ();
-	else if (getName().equals("test_setTopCenterSeparateZ")) test_setTopCenterSeparateZ();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_ByteArrayTransfer.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_ByteArrayTransfer.java
deleted file mode 100644
index 0581cfe..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_ByteArrayTransfer.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.dnd.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.dnd.ByteArrayTransfer
- *
- * @see org.eclipse.swt.dnd.ByteArrayTransfer
- */
-public class Test_org_eclipse_swt_dnd_ByteArrayTransfer extends Test_org_eclipse_swt_dnd_Transfer {
-
-public Test_org_eclipse_swt_dnd_ByteArrayTransfer(String name) {
-	super(name);
-}
-
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_Constructor() {
-	warnUnimpl("Test test_Constructor not written");
-}
-
-public void test_getSupportedTypes() {
-	warnUnimpl("Test test_getSupportedTypes not written");
-}
-
-public void test_isSupportedTypeLorg_eclipse_swt_dnd_TransferData() {
-	warnUnimpl("Test test_isSupportedTypeLorg_eclipse_swt_dnd_TransferData not written");
-}
-
-public void test_javaToNativeLjava_lang_ObjectLorg_eclipse_swt_dnd_TransferData() {
-	warnUnimpl("Test test_javaToNativeLjava_lang_ObjectLorg_eclipse_swt_dnd_TransferData not written");
-}
-
-public void test_nativeToJavaLorg_eclipse_swt_dnd_TransferData() {
-	warnUnimpl("Test test_nativeToJavaLorg_eclipse_swt_dnd_TransferData not written");
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_Constructor");
-	methodNames.addElement("test_getSupportedTypes");
-	methodNames.addElement("test_isSupportedTypeLorg_eclipse_swt_dnd_TransferData");
-	methodNames.addElement("test_javaToNativeLjava_lang_ObjectLorg_eclipse_swt_dnd_TransferData");
-	methodNames.addElement("test_nativeToJavaLorg_eclipse_swt_dnd_TransferData");
-	methodNames.addAll(Test_org_eclipse_swt_dnd_Transfer.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_Constructor")) test_Constructor();
-	else if (getName().equals("test_getSupportedTypes")) test_getSupportedTypes();
-	else if (getName().equals("test_isSupportedTypeLorg_eclipse_swt_dnd_TransferData")) test_isSupportedTypeLorg_eclipse_swt_dnd_TransferData();
-	else if (getName().equals("test_javaToNativeLjava_lang_ObjectLorg_eclipse_swt_dnd_TransferData")) test_javaToNativeLjava_lang_ObjectLorg_eclipse_swt_dnd_TransferData();
-	else if (getName().equals("test_nativeToJavaLorg_eclipse_swt_dnd_TransferData")) test_nativeToJavaLorg_eclipse_swt_dnd_TransferData();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_Clipboard.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_Clipboard.java
deleted file mode 100644
index 1af0a78..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_Clipboard.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.dnd.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.dnd.Clipboard
- *
- * @see org.eclipse.swt.dnd.Clipboard
- */
-public class Test_org_eclipse_swt_dnd_Clipboard extends SwtTestCase {
-
-public Test_org_eclipse_swt_dnd_Clipboard(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_Display() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_Display not written");
-}
-
-public void test_checkSubclass() {
-	warnUnimpl("Test test_checkSubclass not written");
-}
-
-public void test_dispose() {
-	warnUnimpl("Test test_dispose not written");
-}
-
-public void test_getContentsLorg_eclipse_swt_dnd_Transfer() {
-	warnUnimpl("Test test_getContentsLorg_eclipse_swt_dnd_Transfer not written");
-}
-
-public void test_setContents$Ljava_lang_Object$Lorg_eclipse_swt_dnd_Transfer() {
-	warnUnimpl("Test test_setContents$Ljava_lang_Object$Lorg_eclipse_swt_dnd_Transfer not written");
-}
-
-public void test_getAvailableTypeNames() {
-	warnUnimpl("Test test_getAvailableTypeNames not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_dnd_Clipboard((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_Display");
-	methodNames.addElement("test_checkSubclass");
-	methodNames.addElement("test_dispose");
-	methodNames.addElement("test_getContentsLorg_eclipse_swt_dnd_Transfer");
-	methodNames.addElement("test_setContents$Ljava_lang_Object$Lorg_eclipse_swt_dnd_Transfer");
-	methodNames.addElement("test_getAvailableTypeNames");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_Display")) test_ConstructorLorg_eclipse_swt_widgets_Display();
-	else if (getName().equals("test_checkSubclass")) test_checkSubclass();
-	else if (getName().equals("test_dispose")) test_dispose();
-	else if (getName().equals("test_getContentsLorg_eclipse_swt_dnd_Transfer")) test_getContentsLorg_eclipse_swt_dnd_Transfer();
-	else if (getName().equals("test_setContents$Ljava_lang_Object$Lorg_eclipse_swt_dnd_Transfer")) test_setContents$Ljava_lang_Object$Lorg_eclipse_swt_dnd_Transfer();
-	else if (getName().equals("test_getAvailableTypeNames")) test_getAvailableTypeNames();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_DND.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_DND.java
deleted file mode 100644
index 2cd7eaf..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_DND.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.dnd.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.dnd.DND
- *
- * @see org.eclipse.swt.dnd.DND
- */
-public class Test_org_eclipse_swt_dnd_DND extends SwtTestCase {
-
-public Test_org_eclipse_swt_dnd_DND(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_Constructor() {
-	warnUnimpl("Test test_Constructor not written");
-}
-
-public void test_errorI() {
-	warnUnimpl("Test test_errorI not written");
-}
-
-public void test_errorII() {
-	warnUnimpl("Test test_errorII not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_dnd_DND((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_Constructor");
-	methodNames.addElement("test_errorI");
-	methodNames.addElement("test_errorII");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_Constructor")) test_Constructor();
-	else if (getName().equals("test_errorI")) test_errorI();
-	else if (getName().equals("test_errorII")) test_errorII();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_DragSource.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_DragSource.java
deleted file mode 100644
index f9ef470..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_DragSource.java
+++ /dev/null
@@ -1,102 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.dnd.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.dnd.DragSource
- *
- * @see org.eclipse.swt.dnd.DragSource
- */
-public class Test_org_eclipse_swt_dnd_DragSource extends Test_org_eclipse_swt_widgets_Widget {
-
-public Test_org_eclipse_swt_dnd_DragSource(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_ControlI() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_ControlI not written");
-}
-
-public void test_addDragListenerLorg_eclipse_swt_dnd_DragSourceListener() {
-	warnUnimpl("Test test_addDragListenerLorg_eclipse_swt_dnd_DragSourceListener not written");
-}
-
-public void test_getControl() {
-	warnUnimpl("Test test_getControl not written");
-}
-
-public void test_getDisplay() {
-	warnUnimpl("Test test_getDisplay not written");
-}
-
-public void test_getTransfer() {
-	warnUnimpl("Test test_getTransfer not written");
-}
-
-public void test_removeDragListenerLorg_eclipse_swt_dnd_DragSourceListener() {
-	warnUnimpl("Test test_removeDragListenerLorg_eclipse_swt_dnd_DragSourceListener not written");
-}
-
-public void test_setTransfer$Lorg_eclipse_swt_dnd_Transfer() {
-	warnUnimpl("Test test_setTransfer$Lorg_eclipse_swt_dnd_Transfer not written");
-}
-
-public void test_checkSubclass() {
-	warnUnimpl("Test test_checkSubclass not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_dnd_DragSource((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_ControlI");
-	methodNames.addElement("test_addDragListenerLorg_eclipse_swt_dnd_DragSourceListener");
-	methodNames.addElement("test_getControl");
-	methodNames.addElement("test_getDisplay");
-	methodNames.addElement("test_getTransfer");
-	methodNames.addElement("test_removeDragListenerLorg_eclipse_swt_dnd_DragSourceListener");
-	methodNames.addElement("test_setTransfer$Lorg_eclipse_swt_dnd_Transfer");
-	methodNames.addElement("test_checkSubclass");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Widget.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_ControlI")) test_ConstructorLorg_eclipse_swt_widgets_ControlI();
-	else if (getName().equals("test_addDragListenerLorg_eclipse_swt_dnd_DragSourceListener")) test_addDragListenerLorg_eclipse_swt_dnd_DragSourceListener();
-	else if (getName().equals("test_getControl")) test_getControl();
-	else if (getName().equals("test_getDisplay")) test_getDisplay();
-	else if (getName().equals("test_getTransfer")) test_getTransfer();
-	else if (getName().equals("test_removeDragListenerLorg_eclipse_swt_dnd_DragSourceListener")) test_removeDragListenerLorg_eclipse_swt_dnd_DragSourceListener();
-	else if (getName().equals("test_setTransfer$Lorg_eclipse_swt_dnd_Transfer")) test_setTransfer$Lorg_eclipse_swt_dnd_Transfer();
-	else if (getName().equals("test_checkSubclass")) test_checkSubclass();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_DragSourceAdapter.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_DragSourceAdapter.java
deleted file mode 100644
index 1a21e4c..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_DragSourceAdapter.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.dnd.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.dnd.DragSourceAdapter
- *
- * @see org.eclipse.swt.dnd.DragSourceAdapter
- */
-public class Test_org_eclipse_swt_dnd_DragSourceAdapter extends SwtTestCase {
-
-public Test_org_eclipse_swt_dnd_DragSourceAdapter(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_Constructor() {
-	warnUnimpl("Test test_Constructor not written");
-}
-
-public void test_dragStartLorg_eclipse_swt_dnd_DragSourceEvent() {
-	warnUnimpl("Test test_dragStartLorg_eclipse_swt_dnd_DragSourceEvent not written");
-}
-
-public void test_dragFinishedLorg_eclipse_swt_dnd_DragSourceEvent() {
-	warnUnimpl("Test test_dragFinishedLorg_eclipse_swt_dnd_DragSourceEvent not written");
-}
-
-public void test_dragSetDataLorg_eclipse_swt_dnd_DragSourceEvent() {
-	warnUnimpl("Test test_dragSetDataLorg_eclipse_swt_dnd_DragSourceEvent not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_dnd_DragSourceAdapter((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_Constructor");
-	methodNames.addElement("test_dragStartLorg_eclipse_swt_dnd_DragSourceEvent");
-	methodNames.addElement("test_dragFinishedLorg_eclipse_swt_dnd_DragSourceEvent");
-	methodNames.addElement("test_dragSetDataLorg_eclipse_swt_dnd_DragSourceEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_Constructor")) test_Constructor();
-	else if (getName().equals("test_dragStartLorg_eclipse_swt_dnd_DragSourceEvent")) test_dragStartLorg_eclipse_swt_dnd_DragSourceEvent();
-	else if (getName().equals("test_dragFinishedLorg_eclipse_swt_dnd_DragSourceEvent")) test_dragFinishedLorg_eclipse_swt_dnd_DragSourceEvent();
-	else if (getName().equals("test_dragSetDataLorg_eclipse_swt_dnd_DragSourceEvent")) test_dragSetDataLorg_eclipse_swt_dnd_DragSourceEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_DragSourceEvent.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_DragSourceEvent.java
deleted file mode 100644
index 692cd1d..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_DragSourceEvent.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.dnd.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.dnd.DragSourceEvent
- *
- * @see org.eclipse.swt.dnd.DragSourceEvent
- */
-public class Test_org_eclipse_swt_dnd_DragSourceEvent extends Test_org_eclipse_swt_events_TypedEvent {
-
-public Test_org_eclipse_swt_dnd_DragSourceEvent(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_dnd_DNDEvent() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_dnd_DNDEvent not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_dnd_DragSourceEvent((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_dnd_DNDEvent");
-	methodNames.addAll(Test_org_eclipse_swt_events_TypedEvent.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_dnd_DNDEvent")) test_ConstructorLorg_eclipse_swt_dnd_DNDEvent();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_DragSourceListener.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_DragSourceListener.java
deleted file mode 100644
index ca0e632..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_DragSourceListener.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.dnd.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.dnd.DragSourceListener
- *
- * @see org.eclipse.swt.dnd.DragSourceListener
- */
-public class Test_org_eclipse_swt_dnd_DragSourceListener extends SwtTestCase {
-
-public Test_org_eclipse_swt_dnd_DragSourceListener(String name) {
-	super(name);
-}
-
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_dragStartLorg_eclipse_swt_dnd_DragSourceEvent() {
-	warnUnimpl("Test test_dragStartLorg_eclipse_swt_dnd_DragSourceEvent not written");
-}
-
-public void test_dragSetDataLorg_eclipse_swt_dnd_DragSourceEvent() {
-	warnUnimpl("Test test_dragSetDataLorg_eclipse_swt_dnd_DragSourceEvent not written");
-}
-
-public void test_dragFinishedLorg_eclipse_swt_dnd_DragSourceEvent() {
-	warnUnimpl("Test test_dragFinishedLorg_eclipse_swt_dnd_DragSourceEvent not written");
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_dragStartLorg_eclipse_swt_dnd_DragSourceEvent");
-	methodNames.addElement("test_dragSetDataLorg_eclipse_swt_dnd_DragSourceEvent");
-	methodNames.addElement("test_dragFinishedLorg_eclipse_swt_dnd_DragSourceEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_dragStartLorg_eclipse_swt_dnd_DragSourceEvent")) test_dragStartLorg_eclipse_swt_dnd_DragSourceEvent();
-	else if (getName().equals("test_dragSetDataLorg_eclipse_swt_dnd_DragSourceEvent")) test_dragSetDataLorg_eclipse_swt_dnd_DragSourceEvent();
-	else if (getName().equals("test_dragFinishedLorg_eclipse_swt_dnd_DragSourceEvent")) test_dragFinishedLorg_eclipse_swt_dnd_DragSourceEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_DropTarget.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_DropTarget.java
deleted file mode 100644
index a0a1f6b..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_DropTarget.java
+++ /dev/null
@@ -1,108 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.dnd.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.dnd.DropTarget
- *
- * @see org.eclipse.swt.dnd.DropTarget
- */
-public class Test_org_eclipse_swt_dnd_DropTarget extends Test_org_eclipse_swt_widgets_Widget {
-
-public Test_org_eclipse_swt_dnd_DropTarget(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_ControlI() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_ControlI not written");
-}
-
-public void test_addDropListenerLorg_eclipse_swt_dnd_DropTargetListener() {
-	warnUnimpl("Test test_addDropListenerLorg_eclipse_swt_dnd_DropTargetListener not written");
-}
-
-public void test_getControl() {
-	warnUnimpl("Test test_getControl not written");
-}
-
-public void test_getDisplay() {
-	warnUnimpl("Test test_getDisplay not written");
-}
-
-public void test_getTransfer() {
-	warnUnimpl("Test test_getTransfer not written");
-}
-
-public void test_notifyListenersILorg_eclipse_swt_widgets_Event() {
-	warnUnimpl("Test test_notifyListenersILorg_eclipse_swt_widgets_Event not written");
-}
-
-public void test_removeDropListenerLorg_eclipse_swt_dnd_DropTargetListener() {
-	warnUnimpl("Test test_removeDropListenerLorg_eclipse_swt_dnd_DropTargetListener not written");
-}
-
-public void test_setTransfer$Lorg_eclipse_swt_dnd_Transfer() {
-	warnUnimpl("Test test_setTransfer$Lorg_eclipse_swt_dnd_Transfer not written");
-}
-
-public void test_checkSubclass() {
-	warnUnimpl("Test test_checkSubclass not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_dnd_DropTarget((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_ControlI");
-	methodNames.addElement("test_addDropListenerLorg_eclipse_swt_dnd_DropTargetListener");
-	methodNames.addElement("test_getControl");
-	methodNames.addElement("test_getDisplay");
-	methodNames.addElement("test_getTransfer");
-	methodNames.addElement("test_notifyListenersILorg_eclipse_swt_widgets_Event");
-	methodNames.addElement("test_removeDropListenerLorg_eclipse_swt_dnd_DropTargetListener");
-	methodNames.addElement("test_setTransfer$Lorg_eclipse_swt_dnd_Transfer");
-	methodNames.addElement("test_checkSubclass");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Widget.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_ControlI")) test_ConstructorLorg_eclipse_swt_widgets_ControlI();
-	else if (getName().equals("test_addDropListenerLorg_eclipse_swt_dnd_DropTargetListener")) test_addDropListenerLorg_eclipse_swt_dnd_DropTargetListener();
-	else if (getName().equals("test_getControl")) test_getControl();
-	else if (getName().equals("test_getDisplay")) test_getDisplay();
-	else if (getName().equals("test_getTransfer")) test_getTransfer();
-	else if (getName().equals("test_notifyListenersILorg_eclipse_swt_widgets_Event")) test_notifyListenersILorg_eclipse_swt_widgets_Event();
-	else if (getName().equals("test_removeDropListenerLorg_eclipse_swt_dnd_DropTargetListener")) test_removeDropListenerLorg_eclipse_swt_dnd_DropTargetListener();
-	else if (getName().equals("test_setTransfer$Lorg_eclipse_swt_dnd_Transfer")) test_setTransfer$Lorg_eclipse_swt_dnd_Transfer();
-	else if (getName().equals("test_checkSubclass")) test_checkSubclass();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_DropTargetAdapter.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_DropTargetAdapter.java
deleted file mode 100644
index fdaec68..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_DropTargetAdapter.java
+++ /dev/null
@@ -1,92 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.dnd.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.dnd.DropTargetAdapter
- *
- * @see org.eclipse.swt.dnd.DropTargetAdapter
- */
-public class Test_org_eclipse_swt_dnd_DropTargetAdapter extends SwtTestCase {
-
-public Test_org_eclipse_swt_dnd_DropTargetAdapter(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_Constructor() {
-	warnUnimpl("Test test_Constructor not written");
-}
-
-public void test_dragEnterLorg_eclipse_swt_dnd_DropTargetEvent() {
-	warnUnimpl("Test test_dragEnterLorg_eclipse_swt_dnd_DropTargetEvent not written");
-}
-
-public void test_dragLeaveLorg_eclipse_swt_dnd_DropTargetEvent() {
-	warnUnimpl("Test test_dragLeaveLorg_eclipse_swt_dnd_DropTargetEvent not written");
-}
-
-public void test_dragOperationChangedLorg_eclipse_swt_dnd_DropTargetEvent() {
-	warnUnimpl("Test test_dragOperationChangedLorg_eclipse_swt_dnd_DropTargetEvent not written");
-}
-
-public void test_dragOverLorg_eclipse_swt_dnd_DropTargetEvent() {
-	warnUnimpl("Test test_dragOverLorg_eclipse_swt_dnd_DropTargetEvent not written");
-}
-
-public void test_dropLorg_eclipse_swt_dnd_DropTargetEvent() {
-	warnUnimpl("Test test_dropLorg_eclipse_swt_dnd_DropTargetEvent not written");
-}
-
-public void test_dropAcceptLorg_eclipse_swt_dnd_DropTargetEvent() {
-	warnUnimpl("Test test_dropAcceptLorg_eclipse_swt_dnd_DropTargetEvent not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_dnd_DropTargetAdapter((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_Constructor");
-	methodNames.addElement("test_dragEnterLorg_eclipse_swt_dnd_DropTargetEvent");
-	methodNames.addElement("test_dragLeaveLorg_eclipse_swt_dnd_DropTargetEvent");
-	methodNames.addElement("test_dragOperationChangedLorg_eclipse_swt_dnd_DropTargetEvent");
-	methodNames.addElement("test_dragOverLorg_eclipse_swt_dnd_DropTargetEvent");
-	methodNames.addElement("test_dropLorg_eclipse_swt_dnd_DropTargetEvent");
-	methodNames.addElement("test_dropAcceptLorg_eclipse_swt_dnd_DropTargetEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_Constructor")) test_Constructor();
-	else if (getName().equals("test_dragEnterLorg_eclipse_swt_dnd_DropTargetEvent")) test_dragEnterLorg_eclipse_swt_dnd_DropTargetEvent();
-	else if (getName().equals("test_dragLeaveLorg_eclipse_swt_dnd_DropTargetEvent")) test_dragLeaveLorg_eclipse_swt_dnd_DropTargetEvent();
-	else if (getName().equals("test_dragOperationChangedLorg_eclipse_swt_dnd_DropTargetEvent")) test_dragOperationChangedLorg_eclipse_swt_dnd_DropTargetEvent();
-	else if (getName().equals("test_dragOverLorg_eclipse_swt_dnd_DropTargetEvent")) test_dragOverLorg_eclipse_swt_dnd_DropTargetEvent();
-	else if (getName().equals("test_dropLorg_eclipse_swt_dnd_DropTargetEvent")) test_dropLorg_eclipse_swt_dnd_DropTargetEvent();
-	else if (getName().equals("test_dropAcceptLorg_eclipse_swt_dnd_DropTargetEvent")) test_dropAcceptLorg_eclipse_swt_dnd_DropTargetEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_DropTargetEvent.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_DropTargetEvent.java
deleted file mode 100644
index 7c4e19b..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_DropTargetEvent.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.dnd.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.dnd.DropTargetEvent
- *
- * @see org.eclipse.swt.dnd.DropTargetEvent
- */
-public class Test_org_eclipse_swt_dnd_DropTargetEvent extends Test_org_eclipse_swt_events_TypedEvent {
-
-public Test_org_eclipse_swt_dnd_DropTargetEvent(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_dnd_DNDEvent() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_dnd_DNDEvent not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_dnd_DropTargetEvent((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_dnd_DNDEvent");
-	methodNames.addAll(Test_org_eclipse_swt_events_TypedEvent.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_dnd_DNDEvent")) test_ConstructorLorg_eclipse_swt_dnd_DNDEvent();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_DropTargetListener.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_DropTargetListener.java
deleted file mode 100644
index 27236a8..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_DropTargetListener.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.dnd.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.dnd.DropTargetListener
- *
- * @see org.eclipse.swt.dnd.DropTargetListener
- */
-public class Test_org_eclipse_swt_dnd_DropTargetListener extends SwtTestCase {
-
-public Test_org_eclipse_swt_dnd_DropTargetListener(String name) {
-	super(name);
-}
-
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_dragEnterLorg_eclipse_swt_dnd_DropTargetEvent() {
-	warnUnimpl("Test test_dragEnterLorg_eclipse_swt_dnd_DropTargetEvent not written");
-}
-
-public void test_dragLeaveLorg_eclipse_swt_dnd_DropTargetEvent() {
-	warnUnimpl("Test test_dragLeaveLorg_eclipse_swt_dnd_DropTargetEvent not written");
-}
-
-public void test_dragOperationChangedLorg_eclipse_swt_dnd_DropTargetEvent() {
-	warnUnimpl("Test test_dragOperationChangedLorg_eclipse_swt_dnd_DropTargetEvent not written");
-}
-
-public void test_dragOverLorg_eclipse_swt_dnd_DropTargetEvent() {
-	warnUnimpl("Test test_dragOverLorg_eclipse_swt_dnd_DropTargetEvent not written");
-}
-
-public void test_dropLorg_eclipse_swt_dnd_DropTargetEvent() {
-	warnUnimpl("Test test_dropLorg_eclipse_swt_dnd_DropTargetEvent not written");
-}
-
-public void test_dropAcceptLorg_eclipse_swt_dnd_DropTargetEvent() {
-	warnUnimpl("Test test_dropAcceptLorg_eclipse_swt_dnd_DropTargetEvent not written");
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_dragEnterLorg_eclipse_swt_dnd_DropTargetEvent");
-	methodNames.addElement("test_dragLeaveLorg_eclipse_swt_dnd_DropTargetEvent");
-	methodNames.addElement("test_dragOperationChangedLorg_eclipse_swt_dnd_DropTargetEvent");
-	methodNames.addElement("test_dragOverLorg_eclipse_swt_dnd_DropTargetEvent");
-	methodNames.addElement("test_dropLorg_eclipse_swt_dnd_DropTargetEvent");
-	methodNames.addElement("test_dropAcceptLorg_eclipse_swt_dnd_DropTargetEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_dragEnterLorg_eclipse_swt_dnd_DropTargetEvent")) test_dragEnterLorg_eclipse_swt_dnd_DropTargetEvent();
-	else if (getName().equals("test_dragLeaveLorg_eclipse_swt_dnd_DropTargetEvent")) test_dragLeaveLorg_eclipse_swt_dnd_DropTargetEvent();
-	else if (getName().equals("test_dragOperationChangedLorg_eclipse_swt_dnd_DropTargetEvent")) test_dragOperationChangedLorg_eclipse_swt_dnd_DropTargetEvent();
-	else if (getName().equals("test_dragOverLorg_eclipse_swt_dnd_DropTargetEvent")) test_dragOverLorg_eclipse_swt_dnd_DropTargetEvent();
-	else if (getName().equals("test_dropLorg_eclipse_swt_dnd_DropTargetEvent")) test_dropLorg_eclipse_swt_dnd_DropTargetEvent();
-	else if (getName().equals("test_dropAcceptLorg_eclipse_swt_dnd_DropTargetEvent")) test_dropAcceptLorg_eclipse_swt_dnd_DropTargetEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_FileTransfer.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_FileTransfer.java
deleted file mode 100644
index 15e6776..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_FileTransfer.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.dnd.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.dnd.FileTransfer
- *
- * @see org.eclipse.swt.dnd.FileTransfer
- */
-public class Test_org_eclipse_swt_dnd_FileTransfer extends Test_org_eclipse_swt_dnd_ByteArrayTransfer {
-
-public Test_org_eclipse_swt_dnd_FileTransfer(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_getInstance() {
-	warnUnimpl("Test test_getInstance not written");
-}
-
-public void test_javaToNativeLjava_lang_ObjectLorg_eclipse_swt_dnd_TransferData() {
-	warnUnimpl("Test test_javaToNativeLjava_lang_ObjectLorg_eclipse_swt_dnd_TransferData not written");
-}
-
-public void test_nativeToJavaLorg_eclipse_swt_dnd_TransferData() {
-	warnUnimpl("Test test_nativeToJavaLorg_eclipse_swt_dnd_TransferData not written");
-}
-
-public void test_getTypeIds() {
-	warnUnimpl("Test test_getTypeIds not written");
-}
-
-public void test_getTypeNames() {
-	warnUnimpl("Test test_getTypeNames not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_dnd_FileTransfer((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_getInstance");
-	methodNames.addElement("test_javaToNativeLjava_lang_ObjectLorg_eclipse_swt_dnd_TransferData");
-	methodNames.addElement("test_nativeToJavaLorg_eclipse_swt_dnd_TransferData");
-	methodNames.addElement("test_getTypeIds");
-	methodNames.addElement("test_getTypeNames");
-	methodNames.addAll(Test_org_eclipse_swt_dnd_ByteArrayTransfer.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_getInstance")) test_getInstance();
-	else if (getName().equals("test_javaToNativeLjava_lang_ObjectLorg_eclipse_swt_dnd_TransferData")) test_javaToNativeLjava_lang_ObjectLorg_eclipse_swt_dnd_TransferData();
-	else if (getName().equals("test_nativeToJavaLorg_eclipse_swt_dnd_TransferData")) test_nativeToJavaLorg_eclipse_swt_dnd_TransferData();
-	else if (getName().equals("test_getTypeIds")) test_getTypeIds();
-	else if (getName().equals("test_getTypeNames")) test_getTypeNames();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_RTFTransfer.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_RTFTransfer.java
deleted file mode 100644
index e5b7ca4..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_RTFTransfer.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.dnd.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.dnd.RTFTransfer
- *
- * @see org.eclipse.swt.dnd.RTFTransfer
- */
-public class Test_org_eclipse_swt_dnd_RTFTransfer extends Test_org_eclipse_swt_dnd_ByteArrayTransfer {
-
-public Test_org_eclipse_swt_dnd_RTFTransfer(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_getInstance() {
-	warnUnimpl("Test test_getInstance not written");
-}
-
-public void test_javaToNativeLjava_lang_ObjectLorg_eclipse_swt_dnd_TransferData() {
-	warnUnimpl("Test test_javaToNativeLjava_lang_ObjectLorg_eclipse_swt_dnd_TransferData not written");
-}
-
-public void test_nativeToJavaLorg_eclipse_swt_dnd_TransferData() {
-	warnUnimpl("Test test_nativeToJavaLorg_eclipse_swt_dnd_TransferData not written");
-}
-
-public void test_getTypeIds() {
-	warnUnimpl("Test test_getTypeIds not written");
-}
-
-public void test_getTypeNames() {
-	warnUnimpl("Test test_getTypeNames not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_dnd_RTFTransfer((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_getInstance");
-	methodNames.addElement("test_javaToNativeLjava_lang_ObjectLorg_eclipse_swt_dnd_TransferData");
-	methodNames.addElement("test_nativeToJavaLorg_eclipse_swt_dnd_TransferData");
-	methodNames.addElement("test_getTypeIds");
-	methodNames.addElement("test_getTypeNames");
-	methodNames.addAll(Test_org_eclipse_swt_dnd_ByteArrayTransfer.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_getInstance")) test_getInstance();
-	else if (getName().equals("test_javaToNativeLjava_lang_ObjectLorg_eclipse_swt_dnd_TransferData")) test_javaToNativeLjava_lang_ObjectLorg_eclipse_swt_dnd_TransferData();
-	else if (getName().equals("test_nativeToJavaLorg_eclipse_swt_dnd_TransferData")) test_nativeToJavaLorg_eclipse_swt_dnd_TransferData();
-	else if (getName().equals("test_getTypeIds")) test_getTypeIds();
-	else if (getName().equals("test_getTypeNames")) test_getTypeNames();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_TextTransfer.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_TextTransfer.java
deleted file mode 100644
index 65e7021..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_TextTransfer.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.dnd.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.dnd.TextTransfer
- *
- * @see org.eclipse.swt.dnd.TextTransfer
- */
-public class Test_org_eclipse_swt_dnd_TextTransfer extends Test_org_eclipse_swt_dnd_ByteArrayTransfer {
-
-public Test_org_eclipse_swt_dnd_TextTransfer(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_getInstance() {
-	warnUnimpl("Test test_getInstance not written");
-}
-
-public void test_javaToNativeLjava_lang_ObjectLorg_eclipse_swt_dnd_TransferData() {
-	warnUnimpl("Test test_javaToNativeLjava_lang_ObjectLorg_eclipse_swt_dnd_TransferData not written");
-}
-
-public void test_nativeToJavaLorg_eclipse_swt_dnd_TransferData() {
-	warnUnimpl("Test test_nativeToJavaLorg_eclipse_swt_dnd_TransferData not written");
-}
-
-public void test_getTypeIds() {
-	warnUnimpl("Test test_getTypeIds not written");
-}
-
-public void test_getTypeNames() {
-	warnUnimpl("Test test_getTypeNames not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_dnd_TextTransfer((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_getInstance");
-	methodNames.addElement("test_javaToNativeLjava_lang_ObjectLorg_eclipse_swt_dnd_TransferData");
-	methodNames.addElement("test_nativeToJavaLorg_eclipse_swt_dnd_TransferData");
-	methodNames.addElement("test_getTypeIds");
-	methodNames.addElement("test_getTypeNames");
-	methodNames.addAll(Test_org_eclipse_swt_dnd_ByteArrayTransfer.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_getInstance")) test_getInstance();
-	else if (getName().equals("test_javaToNativeLjava_lang_ObjectLorg_eclipse_swt_dnd_TransferData")) test_javaToNativeLjava_lang_ObjectLorg_eclipse_swt_dnd_TransferData();
-	else if (getName().equals("test_nativeToJavaLorg_eclipse_swt_dnd_TransferData")) test_nativeToJavaLorg_eclipse_swt_dnd_TransferData();
-	else if (getName().equals("test_getTypeIds")) test_getTypeIds();
-	else if (getName().equals("test_getTypeNames")) test_getTypeNames();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_Transfer.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_Transfer.java
deleted file mode 100644
index 04e4eac..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_Transfer.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.dnd.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.dnd.Transfer
- *
- * @see org.eclipse.swt.dnd.Transfer
- */
-public class Test_org_eclipse_swt_dnd_Transfer extends SwtTestCase {
-
-public Test_org_eclipse_swt_dnd_Transfer(String name) {
-	super(name);
-}
-
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_Constructor() {
-	warnUnimpl("Test test_Constructor not written");
-}
-
-public void test_getSupportedTypes() {
-	warnUnimpl("Test test_getSupportedTypes not written");
-}
-
-public void test_isSupportedTypeLorg_eclipse_swt_dnd_TransferData() {
-	warnUnimpl("Test test_isSupportedTypeLorg_eclipse_swt_dnd_TransferData not written");
-}
-
-public void test_getTypeIds() {
-	warnUnimpl("Test test_getTypeIds not written");
-}
-
-public void test_getTypeNames() {
-	warnUnimpl("Test test_getTypeNames not written");
-}
-
-public void test_javaToNativeLjava_lang_ObjectLorg_eclipse_swt_dnd_TransferData() {
-	warnUnimpl("Test test_javaToNativeLjava_lang_ObjectLorg_eclipse_swt_dnd_TransferData not written");
-}
-
-public void test_nativeToJavaLorg_eclipse_swt_dnd_TransferData() {
-	warnUnimpl("Test test_nativeToJavaLorg_eclipse_swt_dnd_TransferData not written");
-}
-
-public void test_registerTypeLjava_lang_String() {
-	warnUnimpl("Test test_registerTypeLjava_lang_String not written");
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_Constructor");
-	methodNames.addElement("test_getSupportedTypes");
-	methodNames.addElement("test_isSupportedTypeLorg_eclipse_swt_dnd_TransferData");
-	methodNames.addElement("test_getTypeIds");
-	methodNames.addElement("test_getTypeNames");
-	methodNames.addElement("test_javaToNativeLjava_lang_ObjectLorg_eclipse_swt_dnd_TransferData");
-	methodNames.addElement("test_nativeToJavaLorg_eclipse_swt_dnd_TransferData");
-	methodNames.addElement("test_registerTypeLjava_lang_String");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_Constructor")) test_Constructor();
-	else if (getName().equals("test_getSupportedTypes")) test_getSupportedTypes();
-	else if (getName().equals("test_isSupportedTypeLorg_eclipse_swt_dnd_TransferData")) test_isSupportedTypeLorg_eclipse_swt_dnd_TransferData();
-	else if (getName().equals("test_getTypeIds")) test_getTypeIds();
-	else if (getName().equals("test_getTypeNames")) test_getTypeNames();
-	else if (getName().equals("test_javaToNativeLjava_lang_ObjectLorg_eclipse_swt_dnd_TransferData")) test_javaToNativeLjava_lang_ObjectLorg_eclipse_swt_dnd_TransferData();
-	else if (getName().equals("test_nativeToJavaLorg_eclipse_swt_dnd_TransferData")) test_nativeToJavaLorg_eclipse_swt_dnd_TransferData();
-	else if (getName().equals("test_registerTypeLjava_lang_String")) test_registerTypeLjava_lang_String();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_TransferData.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_TransferData.java
deleted file mode 100644
index 21a3901..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_dnd_TransferData.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.dnd.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.dnd.TransferData
- *
- * @see org.eclipse.swt.dnd.TransferData
- */
-public class Test_org_eclipse_swt_dnd_TransferData extends SwtTestCase {
-
-public Test_org_eclipse_swt_dnd_TransferData(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_Constructor() {
-	warnUnimpl("Test test_Constructor not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_dnd_TransferData((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_Constructor");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_Constructor")) test_Constructor();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_ArmEvent.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_ArmEvent.java
deleted file mode 100644
index acb5545..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_ArmEvent.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.ArmEvent
- *
- * @see org.eclipse.swt.events.ArmEvent
- */
-public class Test_org_eclipse_swt_events_ArmEvent extends Test_org_eclipse_swt_events_TypedEvent {
-
-public Test_org_eclipse_swt_events_ArmEvent(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_Event() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_Event not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_events_ArmEvent((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_Event");
-	methodNames.addAll(Test_org_eclipse_swt_events_TypedEvent.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_Event")) test_ConstructorLorg_eclipse_swt_widgets_Event();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_ArmListener.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_ArmListener.java
deleted file mode 100644
index 1ba1c0e..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_ArmListener.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.ArmListener
- *
- * @see org.eclipse.swt.events.ArmListener
- */
-public class Test_org_eclipse_swt_events_ArmListener extends SwtTestCase {
-
-public Test_org_eclipse_swt_events_ArmListener(String name) {
-	super(name);
-}
-
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_widgetArmedLorg_eclipse_swt_events_ArmEvent() {
-	warnUnimpl("Test test_widgetArmedLorg_eclipse_swt_events_ArmEvent not written");
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_widgetArmedLorg_eclipse_swt_events_ArmEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_widgetArmedLorg_eclipse_swt_events_ArmEvent")) test_widgetArmedLorg_eclipse_swt_events_ArmEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_ControlAdapter.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_ControlAdapter.java
deleted file mode 100644
index ba5dab7..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_ControlAdapter.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.ControlAdapter
- *
- * @see org.eclipse.swt.events.ControlAdapter
- */
-public class Test_org_eclipse_swt_events_ControlAdapter extends SwtTestCase {
-
-public Test_org_eclipse_swt_events_ControlAdapter(String name) {
-	super(name);
-}
-
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_Constructor() {
-	warnUnimpl("Test test_Constructor not written");
-}
-
-public void test_controlMovedLorg_eclipse_swt_events_ControlEvent() {
-	warnUnimpl("Test test_controlMovedLorg_eclipse_swt_events_ControlEvent not written");
-}
-
-public void test_controlResizedLorg_eclipse_swt_events_ControlEvent() {
-	warnUnimpl("Test test_controlResizedLorg_eclipse_swt_events_ControlEvent not written");
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_Constructor");
-	methodNames.addElement("test_controlMovedLorg_eclipse_swt_events_ControlEvent");
-	methodNames.addElement("test_controlResizedLorg_eclipse_swt_events_ControlEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_Constructor")) test_Constructor();
-	else if (getName().equals("test_controlMovedLorg_eclipse_swt_events_ControlEvent")) test_controlMovedLorg_eclipse_swt_events_ControlEvent();
-	else if (getName().equals("test_controlResizedLorg_eclipse_swt_events_ControlEvent")) test_controlResizedLorg_eclipse_swt_events_ControlEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_ControlEvent.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_ControlEvent.java
deleted file mode 100644
index ceaa0e9..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_ControlEvent.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.ControlEvent
- *
- * @see org.eclipse.swt.events.ControlEvent
- */
-public class Test_org_eclipse_swt_events_ControlEvent extends Test_org_eclipse_swt_events_TypedEvent {
-
-public Test_org_eclipse_swt_events_ControlEvent(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_Event() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_Event not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_events_ControlEvent((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_Event");
-	methodNames.addAll(Test_org_eclipse_swt_events_TypedEvent.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_Event")) test_ConstructorLorg_eclipse_swt_widgets_Event();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_ControlListener.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_ControlListener.java
deleted file mode 100644
index d3fc992..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_ControlListener.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.ControlListener
- *
- * @see org.eclipse.swt.events.ControlListener
- */
-public class Test_org_eclipse_swt_events_ControlListener extends SwtTestCase {
-
-public Test_org_eclipse_swt_events_ControlListener(String name) {
-	super(name);
-}
-
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_controlMovedLorg_eclipse_swt_events_ControlEvent() {
-	warnUnimpl("Test test_controlMovedLorg_eclipse_swt_events_ControlEvent not written");
-}
-
-public void test_controlResizedLorg_eclipse_swt_events_ControlEvent() {
-	warnUnimpl("Test test_controlResizedLorg_eclipse_swt_events_ControlEvent not written");
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_controlMovedLorg_eclipse_swt_events_ControlEvent");
-	methodNames.addElement("test_controlResizedLorg_eclipse_swt_events_ControlEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_controlMovedLorg_eclipse_swt_events_ControlEvent")) test_controlMovedLorg_eclipse_swt_events_ControlEvent();
-	else if (getName().equals("test_controlResizedLorg_eclipse_swt_events_ControlEvent")) test_controlResizedLorg_eclipse_swt_events_ControlEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_DisposeEvent.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_DisposeEvent.java
deleted file mode 100644
index 526c658..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_DisposeEvent.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.DisposeEvent
- *
- * @see org.eclipse.swt.events.DisposeEvent
- */
-public class Test_org_eclipse_swt_events_DisposeEvent extends Test_org_eclipse_swt_events_TypedEvent {
-
-public Test_org_eclipse_swt_events_DisposeEvent(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_Event() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_Event not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_events_DisposeEvent((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_Event");
-	methodNames.addAll(Test_org_eclipse_swt_events_TypedEvent.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_Event")) test_ConstructorLorg_eclipse_swt_widgets_Event();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_DisposeListener.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_DisposeListener.java
deleted file mode 100644
index cabf654..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_DisposeListener.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.DisposeListener
- *
- * @see org.eclipse.swt.events.DisposeListener
- */
-public class Test_org_eclipse_swt_events_DisposeListener extends SwtTestCase {
-
-public Test_org_eclipse_swt_events_DisposeListener(String name) {
-	super(name);
-}
-
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_widgetDisposedLorg_eclipse_swt_events_DisposeEvent() {
-	warnUnimpl("Test test_widgetDisposedLorg_eclipse_swt_events_DisposeEvent not written");
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_widgetDisposedLorg_eclipse_swt_events_DisposeEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_widgetDisposedLorg_eclipse_swt_events_DisposeEvent")) test_widgetDisposedLorg_eclipse_swt_events_DisposeEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_FocusAdapter.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_FocusAdapter.java
deleted file mode 100644
index e970b05..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_FocusAdapter.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.FocusAdapter
- *
- * @see org.eclipse.swt.events.FocusAdapter
- */
-public class Test_org_eclipse_swt_events_FocusAdapter extends SwtTestCase {
-
-public Test_org_eclipse_swt_events_FocusAdapter(String name) {
-	super(name);
-}
-
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_Constructor() {
-	warnUnimpl("Test test_Constructor not written");
-}
-
-public void test_focusGainedLorg_eclipse_swt_events_FocusEvent() {
-	warnUnimpl("Test test_focusGainedLorg_eclipse_swt_events_FocusEvent not written");
-}
-
-public void test_focusLostLorg_eclipse_swt_events_FocusEvent() {
-	warnUnimpl("Test test_focusLostLorg_eclipse_swt_events_FocusEvent not written");
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_Constructor");
-	methodNames.addElement("test_focusGainedLorg_eclipse_swt_events_FocusEvent");
-	methodNames.addElement("test_focusLostLorg_eclipse_swt_events_FocusEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_Constructor")) test_Constructor();
-	else if (getName().equals("test_focusGainedLorg_eclipse_swt_events_FocusEvent")) test_focusGainedLorg_eclipse_swt_events_FocusEvent();
-	else if (getName().equals("test_focusLostLorg_eclipse_swt_events_FocusEvent")) test_focusLostLorg_eclipse_swt_events_FocusEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_FocusEvent.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_FocusEvent.java
deleted file mode 100644
index fdb31f5..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_FocusEvent.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.FocusEvent
- *
- * @see org.eclipse.swt.events.FocusEvent
- */
-public class Test_org_eclipse_swt_events_FocusEvent extends Test_org_eclipse_swt_events_TypedEvent {
-
-public Test_org_eclipse_swt_events_FocusEvent(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_Event() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_Event not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_events_FocusEvent((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_Event");
-	methodNames.addAll(Test_org_eclipse_swt_events_TypedEvent.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_Event")) test_ConstructorLorg_eclipse_swt_widgets_Event();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_FocusListener.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_FocusListener.java
deleted file mode 100644
index a67219e..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_FocusListener.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.FocusListener
- *
- * @see org.eclipse.swt.events.FocusListener
- */
-public class Test_org_eclipse_swt_events_FocusListener extends SwtTestCase {
-
-public Test_org_eclipse_swt_events_FocusListener(String name) {
-	super(name);
-}
-
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_focusGainedLorg_eclipse_swt_events_FocusEvent() {
-	warnUnimpl("Test test_focusGainedLorg_eclipse_swt_events_FocusEvent not written");
-}
-
-public void test_focusLostLorg_eclipse_swt_events_FocusEvent() {
-	warnUnimpl("Test test_focusLostLorg_eclipse_swt_events_FocusEvent not written");
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_focusGainedLorg_eclipse_swt_events_FocusEvent");
-	methodNames.addElement("test_focusLostLorg_eclipse_swt_events_FocusEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_focusGainedLorg_eclipse_swt_events_FocusEvent")) test_focusGainedLorg_eclipse_swt_events_FocusEvent();
-	else if (getName().equals("test_focusLostLorg_eclipse_swt_events_FocusEvent")) test_focusLostLorg_eclipse_swt_events_FocusEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_HelpEvent.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_HelpEvent.java
deleted file mode 100644
index bd22654..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_HelpEvent.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.HelpEvent
- *
- * @see org.eclipse.swt.events.HelpEvent
- */
-public class Test_org_eclipse_swt_events_HelpEvent extends Test_org_eclipse_swt_events_TypedEvent {
-
-public Test_org_eclipse_swt_events_HelpEvent(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_Event() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_Event not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_events_HelpEvent((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_Event");
-	methodNames.addAll(Test_org_eclipse_swt_events_TypedEvent.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_Event")) test_ConstructorLorg_eclipse_swt_widgets_Event();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_HelpListener.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_HelpListener.java
deleted file mode 100644
index bb5422f..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_HelpListener.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.HelpListener
- *
- * @see org.eclipse.swt.events.HelpListener
- */
-public class Test_org_eclipse_swt_events_HelpListener extends SwtTestCase {
-
-public Test_org_eclipse_swt_events_HelpListener(String name) {
-	super(name);
-}
-
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_helpRequestedLorg_eclipse_swt_events_HelpEvent() {
-	warnUnimpl("Test test_helpRequestedLorg_eclipse_swt_events_HelpEvent not written");
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_helpRequestedLorg_eclipse_swt_events_HelpEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_helpRequestedLorg_eclipse_swt_events_HelpEvent")) test_helpRequestedLorg_eclipse_swt_events_HelpEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_KeyAdapter.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_KeyAdapter.java
deleted file mode 100644
index a68e1f5..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_KeyAdapter.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.KeyAdapter
- *
- * @see org.eclipse.swt.events.KeyAdapter
- */
-public class Test_org_eclipse_swt_events_KeyAdapter extends SwtTestCase {
-
-public Test_org_eclipse_swt_events_KeyAdapter(String name) {
-	super(name);
-}
-
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_Constructor() {
-	warnUnimpl("Test test_Constructor not written");
-}
-
-public void test_keyPressedLorg_eclipse_swt_events_KeyEvent() {
-	warnUnimpl("Test test_keyPressedLorg_eclipse_swt_events_KeyEvent not written");
-}
-
-public void test_keyReleasedLorg_eclipse_swt_events_KeyEvent() {
-	warnUnimpl("Test test_keyReleasedLorg_eclipse_swt_events_KeyEvent not written");
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_Constructor");
-	methodNames.addElement("test_keyPressedLorg_eclipse_swt_events_KeyEvent");
-	methodNames.addElement("test_keyReleasedLorg_eclipse_swt_events_KeyEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_Constructor")) test_Constructor();
-	else if (getName().equals("test_keyPressedLorg_eclipse_swt_events_KeyEvent")) test_keyPressedLorg_eclipse_swt_events_KeyEvent();
-	else if (getName().equals("test_keyReleasedLorg_eclipse_swt_events_KeyEvent")) test_keyReleasedLorg_eclipse_swt_events_KeyEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_KeyEvent.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_KeyEvent.java
deleted file mode 100644
index edafd10..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_KeyEvent.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.KeyEvent
- *
- * @see org.eclipse.swt.events.KeyEvent
- */
-public class Test_org_eclipse_swt_events_KeyEvent extends Test_org_eclipse_swt_events_TypedEvent {
-
-public Test_org_eclipse_swt_events_KeyEvent(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_Event() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_Event not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_events_KeyEvent((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_Event");
-	methodNames.addAll(Test_org_eclipse_swt_events_TypedEvent.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_Event")) test_ConstructorLorg_eclipse_swt_widgets_Event();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_KeyListener.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_KeyListener.java
deleted file mode 100644
index fbc5ecc..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_KeyListener.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.KeyListener
- *
- * @see org.eclipse.swt.events.KeyListener
- */
-public class Test_org_eclipse_swt_events_KeyListener extends SwtTestCase {
-
-public Test_org_eclipse_swt_events_KeyListener(String name) {
-	super(name);
-}
-
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_keyPressedLorg_eclipse_swt_events_KeyEvent() {
-	warnUnimpl("Test test_keyPressedLorg_eclipse_swt_events_KeyEvent not written");
-}
-
-public void test_keyReleasedLorg_eclipse_swt_events_KeyEvent() {
-	warnUnimpl("Test test_keyReleasedLorg_eclipse_swt_events_KeyEvent not written");
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_keyPressedLorg_eclipse_swt_events_KeyEvent");
-	methodNames.addElement("test_keyReleasedLorg_eclipse_swt_events_KeyEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_keyPressedLorg_eclipse_swt_events_KeyEvent")) test_keyPressedLorg_eclipse_swt_events_KeyEvent();
-	else if (getName().equals("test_keyReleasedLorg_eclipse_swt_events_KeyEvent")) test_keyReleasedLorg_eclipse_swt_events_KeyEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_MenuAdapter.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_MenuAdapter.java
deleted file mode 100644
index fdde805..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_MenuAdapter.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.MenuAdapter
- *
- * @see org.eclipse.swt.events.MenuAdapter
- */
-public class Test_org_eclipse_swt_events_MenuAdapter extends SwtTestCase {
-
-public Test_org_eclipse_swt_events_MenuAdapter(String name) {
-	super(name);
-}
-
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_Constructor() {
-	warnUnimpl("Test test_Constructor not written");
-}
-
-public void test_menuHiddenLorg_eclipse_swt_events_MenuEvent() {
-	warnUnimpl("Test test_menuHiddenLorg_eclipse_swt_events_MenuEvent not written");
-}
-
-public void test_menuShownLorg_eclipse_swt_events_MenuEvent() {
-	warnUnimpl("Test test_menuShownLorg_eclipse_swt_events_MenuEvent not written");
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_Constructor");
-	methodNames.addElement("test_menuHiddenLorg_eclipse_swt_events_MenuEvent");
-	methodNames.addElement("test_menuShownLorg_eclipse_swt_events_MenuEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_Constructor")) test_Constructor();
-	else if (getName().equals("test_menuHiddenLorg_eclipse_swt_events_MenuEvent")) test_menuHiddenLorg_eclipse_swt_events_MenuEvent();
-	else if (getName().equals("test_menuShownLorg_eclipse_swt_events_MenuEvent")) test_menuShownLorg_eclipse_swt_events_MenuEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_MenuEvent.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_MenuEvent.java
deleted file mode 100644
index 8accf1e..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_MenuEvent.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.MenuEvent
- *
- * @see org.eclipse.swt.events.MenuEvent
- */
-public class Test_org_eclipse_swt_events_MenuEvent extends Test_org_eclipse_swt_events_TypedEvent {
-
-public Test_org_eclipse_swt_events_MenuEvent(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_Event() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_Event not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_events_MenuEvent((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_Event");
-	methodNames.addAll(Test_org_eclipse_swt_events_TypedEvent.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_Event")) test_ConstructorLorg_eclipse_swt_widgets_Event();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_MenuListener.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_MenuListener.java
deleted file mode 100644
index 8bc0433..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_MenuListener.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.MenuListener
- *
- * @see org.eclipse.swt.events.MenuListener
- */
-public class Test_org_eclipse_swt_events_MenuListener extends SwtTestCase {
-
-public Test_org_eclipse_swt_events_MenuListener(String name) {
-	super(name);
-}
-
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_menuHiddenLorg_eclipse_swt_events_MenuEvent() {
-	warnUnimpl("Test test_menuHiddenLorg_eclipse_swt_events_MenuEvent not written");
-}
-
-public void test_menuShownLorg_eclipse_swt_events_MenuEvent() {
-	warnUnimpl("Test test_menuShownLorg_eclipse_swt_events_MenuEvent not written");
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_menuHiddenLorg_eclipse_swt_events_MenuEvent");
-	methodNames.addElement("test_menuShownLorg_eclipse_swt_events_MenuEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_menuHiddenLorg_eclipse_swt_events_MenuEvent")) test_menuHiddenLorg_eclipse_swt_events_MenuEvent();
-	else if (getName().equals("test_menuShownLorg_eclipse_swt_events_MenuEvent")) test_menuShownLorg_eclipse_swt_events_MenuEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_ModifyEvent.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_ModifyEvent.java
deleted file mode 100644
index 2c958b0..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_ModifyEvent.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.ModifyEvent
- *
- * @see org.eclipse.swt.events.ModifyEvent
- */
-public class Test_org_eclipse_swt_events_ModifyEvent extends Test_org_eclipse_swt_events_TypedEvent {
-
-public Test_org_eclipse_swt_events_ModifyEvent(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_Event() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_Event not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_events_ModifyEvent((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_Event");
-	methodNames.addAll(Test_org_eclipse_swt_events_TypedEvent.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_Event")) test_ConstructorLorg_eclipse_swt_widgets_Event();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_ModifyListener.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_ModifyListener.java
deleted file mode 100644
index 8a8dc6b..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_ModifyListener.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.ModifyListener
- *
- * @see org.eclipse.swt.events.ModifyListener
- */
-public class Test_org_eclipse_swt_events_ModifyListener extends SwtTestCase {
-
-public Test_org_eclipse_swt_events_ModifyListener(String name) {
-	super(name);
-}
-
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_modifyTextLorg_eclipse_swt_events_ModifyEvent() {
-	warnUnimpl("Test test_modifyTextLorg_eclipse_swt_events_ModifyEvent not written");
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_modifyTextLorg_eclipse_swt_events_ModifyEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_modifyTextLorg_eclipse_swt_events_ModifyEvent")) test_modifyTextLorg_eclipse_swt_events_ModifyEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_MouseAdapter.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_MouseAdapter.java
deleted file mode 100644
index c64d2d4..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_MouseAdapter.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.MouseAdapter
- *
- * @see org.eclipse.swt.events.MouseAdapter
- */
-public class Test_org_eclipse_swt_events_MouseAdapter extends SwtTestCase {
-
-public Test_org_eclipse_swt_events_MouseAdapter(String name) {
-	super(name);
-}
-
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_Constructor() {
-	warnUnimpl("Test test_Constructor not written");
-}
-
-public void test_mouseDoubleClickLorg_eclipse_swt_events_MouseEvent() {
-	warnUnimpl("Test test_mouseDoubleClickLorg_eclipse_swt_events_MouseEvent not written");
-}
-
-public void test_mouseDownLorg_eclipse_swt_events_MouseEvent() {
-	warnUnimpl("Test test_mouseDownLorg_eclipse_swt_events_MouseEvent not written");
-}
-
-public void test_mouseUpLorg_eclipse_swt_events_MouseEvent() {
-	warnUnimpl("Test test_mouseUpLorg_eclipse_swt_events_MouseEvent not written");
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_Constructor");
-	methodNames.addElement("test_mouseDoubleClickLorg_eclipse_swt_events_MouseEvent");
-	methodNames.addElement("test_mouseDownLorg_eclipse_swt_events_MouseEvent");
-	methodNames.addElement("test_mouseUpLorg_eclipse_swt_events_MouseEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_Constructor")) test_Constructor();
-	else if (getName().equals("test_mouseDoubleClickLorg_eclipse_swt_events_MouseEvent")) test_mouseDoubleClickLorg_eclipse_swt_events_MouseEvent();
-	else if (getName().equals("test_mouseDownLorg_eclipse_swt_events_MouseEvent")) test_mouseDownLorg_eclipse_swt_events_MouseEvent();
-	else if (getName().equals("test_mouseUpLorg_eclipse_swt_events_MouseEvent")) test_mouseUpLorg_eclipse_swt_events_MouseEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_MouseEvent.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_MouseEvent.java
deleted file mode 100644
index c84317d..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_MouseEvent.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.MouseEvent
- *
- * @see org.eclipse.swt.events.MouseEvent
- */
-public class Test_org_eclipse_swt_events_MouseEvent extends Test_org_eclipse_swt_events_TypedEvent {
-
-public Test_org_eclipse_swt_events_MouseEvent(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_Event() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_Event not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_events_MouseEvent((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_Event");
-	methodNames.addAll(Test_org_eclipse_swt_events_TypedEvent.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_Event")) test_ConstructorLorg_eclipse_swt_widgets_Event();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_MouseListener.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_MouseListener.java
deleted file mode 100644
index e4f576c..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_MouseListener.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.MouseListener
- *
- * @see org.eclipse.swt.events.MouseListener
- */
-public class Test_org_eclipse_swt_events_MouseListener extends SwtTestCase {
-
-public Test_org_eclipse_swt_events_MouseListener(String name) {
-	super(name);
-}
-
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_mouseDoubleClickLorg_eclipse_swt_events_MouseEvent() {
-	warnUnimpl("Test test_mouseDoubleClickLorg_eclipse_swt_events_MouseEvent not written");
-}
-
-public void test_mouseDownLorg_eclipse_swt_events_MouseEvent() {
-	warnUnimpl("Test test_mouseDownLorg_eclipse_swt_events_MouseEvent not written");
-}
-
-public void test_mouseUpLorg_eclipse_swt_events_MouseEvent() {
-	warnUnimpl("Test test_mouseUpLorg_eclipse_swt_events_MouseEvent not written");
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_mouseDoubleClickLorg_eclipse_swt_events_MouseEvent");
-	methodNames.addElement("test_mouseDownLorg_eclipse_swt_events_MouseEvent");
-	methodNames.addElement("test_mouseUpLorg_eclipse_swt_events_MouseEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_mouseDoubleClickLorg_eclipse_swt_events_MouseEvent")) test_mouseDoubleClickLorg_eclipse_swt_events_MouseEvent();
-	else if (getName().equals("test_mouseDownLorg_eclipse_swt_events_MouseEvent")) test_mouseDownLorg_eclipse_swt_events_MouseEvent();
-	else if (getName().equals("test_mouseUpLorg_eclipse_swt_events_MouseEvent")) test_mouseUpLorg_eclipse_swt_events_MouseEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_MouseMoveListener.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_MouseMoveListener.java
deleted file mode 100644
index 640de13..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_MouseMoveListener.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.MouseMoveListener
- *
- * @see org.eclipse.swt.events.MouseMoveListener
- */
-public class Test_org_eclipse_swt_events_MouseMoveListener extends SwtTestCase {
-
-public Test_org_eclipse_swt_events_MouseMoveListener(String name) {
-	super(name);
-}
-
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_mouseMoveLorg_eclipse_swt_events_MouseEvent() {
-	warnUnimpl("Test test_mouseMoveLorg_eclipse_swt_events_MouseEvent not written");
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_mouseMoveLorg_eclipse_swt_events_MouseEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_mouseMoveLorg_eclipse_swt_events_MouseEvent")) test_mouseMoveLorg_eclipse_swt_events_MouseEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_MouseTrackAdapter.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_MouseTrackAdapter.java
deleted file mode 100644
index 214b553..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_MouseTrackAdapter.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.MouseTrackAdapter
- *
- * @see org.eclipse.swt.events.MouseTrackAdapter
- */
-public class Test_org_eclipse_swt_events_MouseTrackAdapter extends SwtTestCase {
-
-public Test_org_eclipse_swt_events_MouseTrackAdapter(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_Constructor() {
-	warnUnimpl("Test test_Constructor not written");
-}
-
-public void test_mouseEnterLorg_eclipse_swt_events_MouseEvent() {
-	warnUnimpl("Test test_mouseEnterLorg_eclipse_swt_events_MouseEvent not written");
-}
-
-public void test_mouseExitLorg_eclipse_swt_events_MouseEvent() {
-	warnUnimpl("Test test_mouseExitLorg_eclipse_swt_events_MouseEvent not written");
-}
-
-public void test_mouseHoverLorg_eclipse_swt_events_MouseEvent() {
-	warnUnimpl("Test test_mouseHoverLorg_eclipse_swt_events_MouseEvent not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_events_MouseTrackAdapter((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_Constructor");
-	methodNames.addElement("test_mouseEnterLorg_eclipse_swt_events_MouseEvent");
-	methodNames.addElement("test_mouseExitLorg_eclipse_swt_events_MouseEvent");
-	methodNames.addElement("test_mouseHoverLorg_eclipse_swt_events_MouseEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_Constructor")) test_Constructor();
-	else if (getName().equals("test_mouseEnterLorg_eclipse_swt_events_MouseEvent")) test_mouseEnterLorg_eclipse_swt_events_MouseEvent();
-	else if (getName().equals("test_mouseExitLorg_eclipse_swt_events_MouseEvent")) test_mouseExitLorg_eclipse_swt_events_MouseEvent();
-	else if (getName().equals("test_mouseHoverLorg_eclipse_swt_events_MouseEvent")) test_mouseHoverLorg_eclipse_swt_events_MouseEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_MouseTrackListener.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_MouseTrackListener.java
deleted file mode 100644
index cf702a4..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_MouseTrackListener.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.MouseTrackListener
- *
- * @see org.eclipse.swt.events.MouseTrackListener
- */
-public class Test_org_eclipse_swt_events_MouseTrackListener extends SwtTestCase {
-
-public Test_org_eclipse_swt_events_MouseTrackListener(String name) {
-	super(name);
-}
-
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_mouseEnterLorg_eclipse_swt_events_MouseEvent() {
-	warnUnimpl("Test test_mouseEnterLorg_eclipse_swt_events_MouseEvent not written");
-}
-
-public void test_mouseExitLorg_eclipse_swt_events_MouseEvent() {
-	warnUnimpl("Test test_mouseExitLorg_eclipse_swt_events_MouseEvent not written");
-}
-
-public void test_mouseHoverLorg_eclipse_swt_events_MouseEvent() {
-	warnUnimpl("Test test_mouseHoverLorg_eclipse_swt_events_MouseEvent not written");
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_mouseEnterLorg_eclipse_swt_events_MouseEvent");
-	methodNames.addElement("test_mouseExitLorg_eclipse_swt_events_MouseEvent");
-	methodNames.addElement("test_mouseHoverLorg_eclipse_swt_events_MouseEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_mouseEnterLorg_eclipse_swt_events_MouseEvent")) test_mouseEnterLorg_eclipse_swt_events_MouseEvent();
-	else if (getName().equals("test_mouseExitLorg_eclipse_swt_events_MouseEvent")) test_mouseExitLorg_eclipse_swt_events_MouseEvent();
-	else if (getName().equals("test_mouseHoverLorg_eclipse_swt_events_MouseEvent")) test_mouseHoverLorg_eclipse_swt_events_MouseEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_PaintEvent.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_PaintEvent.java
deleted file mode 100644
index ea25a62..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_PaintEvent.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.PaintEvent
- *
- * @see org.eclipse.swt.events.PaintEvent
- */
-public class Test_org_eclipse_swt_events_PaintEvent extends Test_org_eclipse_swt_events_TypedEvent {
-
-public Test_org_eclipse_swt_events_PaintEvent(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_Event() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_Event not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_events_PaintEvent((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_Event");
-	methodNames.addAll(Test_org_eclipse_swt_events_TypedEvent.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_Event")) test_ConstructorLorg_eclipse_swt_widgets_Event();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_PaintListener.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_PaintListener.java
deleted file mode 100644
index 11e541b..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_PaintListener.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.PaintListener
- *
- * @see org.eclipse.swt.events.PaintListener
- */
-public class Test_org_eclipse_swt_events_PaintListener extends SwtTestCase {
-
-public Test_org_eclipse_swt_events_PaintListener(String name) {
-	super(name);
-}
-
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_paintControlLorg_eclipse_swt_events_PaintEvent() {
-	warnUnimpl("Test test_paintControlLorg_eclipse_swt_events_PaintEvent not written");
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_paintControlLorg_eclipse_swt_events_PaintEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_paintControlLorg_eclipse_swt_events_PaintEvent")) test_paintControlLorg_eclipse_swt_events_PaintEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_SelectionAdapter.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_SelectionAdapter.java
deleted file mode 100644
index 4f4f4bd..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_SelectionAdapter.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.SelectionAdapter
- *
- * @see org.eclipse.swt.events.SelectionAdapter
- */
-public class Test_org_eclipse_swt_events_SelectionAdapter extends SwtTestCase {
-
-public Test_org_eclipse_swt_events_SelectionAdapter(String name) {
-	super(name);
-}
-
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_Constructor() {
-	warnUnimpl("Test test_Constructor not written");
-}
-
-public void test_widgetSelectedLorg_eclipse_swt_events_SelectionEvent() {
-	warnUnimpl("Test test_widgetSelectedLorg_eclipse_swt_events_SelectionEvent not written");
-}
-
-public void test_widgetDefaultSelectedLorg_eclipse_swt_events_SelectionEvent() {
-	warnUnimpl("Test test_widgetDefaultSelectedLorg_eclipse_swt_events_SelectionEvent not written");
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_Constructor");
-	methodNames.addElement("test_widgetSelectedLorg_eclipse_swt_events_SelectionEvent");
-	methodNames.addElement("test_widgetDefaultSelectedLorg_eclipse_swt_events_SelectionEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_Constructor")) test_Constructor();
-	else if (getName().equals("test_widgetSelectedLorg_eclipse_swt_events_SelectionEvent")) test_widgetSelectedLorg_eclipse_swt_events_SelectionEvent();
-	else if (getName().equals("test_widgetDefaultSelectedLorg_eclipse_swt_events_SelectionEvent")) test_widgetDefaultSelectedLorg_eclipse_swt_events_SelectionEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_SelectionEvent.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_SelectionEvent.java
deleted file mode 100644
index dae7f0b..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_SelectionEvent.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.SelectionEvent
- *
- * @see org.eclipse.swt.events.SelectionEvent
- */
-public class Test_org_eclipse_swt_events_SelectionEvent extends Test_org_eclipse_swt_events_TypedEvent {
-
-public Test_org_eclipse_swt_events_SelectionEvent(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_Event() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_Event not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_events_SelectionEvent((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_Event");
-	methodNames.addAll(Test_org_eclipse_swt_events_TypedEvent.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_Event")) test_ConstructorLorg_eclipse_swt_widgets_Event();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_SelectionListener.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_SelectionListener.java
deleted file mode 100644
index b031cbf..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_SelectionListener.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.SelectionListener
- *
- * @see org.eclipse.swt.events.SelectionListener
- */
-public class Test_org_eclipse_swt_events_SelectionListener extends SwtTestCase {
-
-public Test_org_eclipse_swt_events_SelectionListener(String name) {
-	super(name);
-}
-
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_widgetSelectedLorg_eclipse_swt_events_SelectionEvent() {
-	warnUnimpl("Test test_widgetSelectedLorg_eclipse_swt_events_SelectionEvent not written");
-}
-
-public void test_widgetDefaultSelectedLorg_eclipse_swt_events_SelectionEvent() {
-	warnUnimpl("Test test_widgetDefaultSelectedLorg_eclipse_swt_events_SelectionEvent not written");
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_widgetSelectedLorg_eclipse_swt_events_SelectionEvent");
-	methodNames.addElement("test_widgetDefaultSelectedLorg_eclipse_swt_events_SelectionEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_widgetSelectedLorg_eclipse_swt_events_SelectionEvent")) test_widgetSelectedLorg_eclipse_swt_events_SelectionEvent();
-	else if (getName().equals("test_widgetDefaultSelectedLorg_eclipse_swt_events_SelectionEvent")) test_widgetDefaultSelectedLorg_eclipse_swt_events_SelectionEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_ShellAdapter.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_ShellAdapter.java
deleted file mode 100644
index 45d2fcc..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_ShellAdapter.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.ShellAdapter
- *
- * @see org.eclipse.swt.events.ShellAdapter
- */
-public class Test_org_eclipse_swt_events_ShellAdapter extends SwtTestCase {
-
-public Test_org_eclipse_swt_events_ShellAdapter(String name) {
-	super(name);
-}
-
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_Constructor() {
-	warnUnimpl("Test test_Constructor not written");
-}
-
-public void test_shellActivatedLorg_eclipse_swt_events_ShellEvent() {
-	warnUnimpl("Test test_shellActivatedLorg_eclipse_swt_events_ShellEvent not written");
-}
-
-public void test_shellClosedLorg_eclipse_swt_events_ShellEvent() {
-	warnUnimpl("Test test_shellClosedLorg_eclipse_swt_events_ShellEvent not written");
-}
-
-public void test_shellDeactivatedLorg_eclipse_swt_events_ShellEvent() {
-	warnUnimpl("Test test_shellDeactivatedLorg_eclipse_swt_events_ShellEvent not written");
-}
-
-public void test_shellDeiconifiedLorg_eclipse_swt_events_ShellEvent() {
-	warnUnimpl("Test test_shellDeiconifiedLorg_eclipse_swt_events_ShellEvent not written");
-}
-
-public void test_shellIconifiedLorg_eclipse_swt_events_ShellEvent() {
-	warnUnimpl("Test test_shellIconifiedLorg_eclipse_swt_events_ShellEvent not written");
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_Constructor");
-	methodNames.addElement("test_shellActivatedLorg_eclipse_swt_events_ShellEvent");
-	methodNames.addElement("test_shellClosedLorg_eclipse_swt_events_ShellEvent");
-	methodNames.addElement("test_shellDeactivatedLorg_eclipse_swt_events_ShellEvent");
-	methodNames.addElement("test_shellDeiconifiedLorg_eclipse_swt_events_ShellEvent");
-	methodNames.addElement("test_shellIconifiedLorg_eclipse_swt_events_ShellEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_Constructor")) test_Constructor();
-	else if (getName().equals("test_shellActivatedLorg_eclipse_swt_events_ShellEvent")) test_shellActivatedLorg_eclipse_swt_events_ShellEvent();
-	else if (getName().equals("test_shellClosedLorg_eclipse_swt_events_ShellEvent")) test_shellClosedLorg_eclipse_swt_events_ShellEvent();
-	else if (getName().equals("test_shellDeactivatedLorg_eclipse_swt_events_ShellEvent")) test_shellDeactivatedLorg_eclipse_swt_events_ShellEvent();
-	else if (getName().equals("test_shellDeiconifiedLorg_eclipse_swt_events_ShellEvent")) test_shellDeiconifiedLorg_eclipse_swt_events_ShellEvent();
-	else if (getName().equals("test_shellIconifiedLorg_eclipse_swt_events_ShellEvent")) test_shellIconifiedLorg_eclipse_swt_events_ShellEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_ShellEvent.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_ShellEvent.java
deleted file mode 100644
index d3e8274..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_ShellEvent.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.ShellEvent
- *
- * @see org.eclipse.swt.events.ShellEvent
- */
-public class Test_org_eclipse_swt_events_ShellEvent extends Test_org_eclipse_swt_events_TypedEvent {
-
-public Test_org_eclipse_swt_events_ShellEvent(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_Event() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_Event not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_events_ShellEvent((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_Event");
-	methodNames.addAll(Test_org_eclipse_swt_events_TypedEvent.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_Event")) test_ConstructorLorg_eclipse_swt_widgets_Event();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_ShellListener.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_ShellListener.java
deleted file mode 100644
index d43cc3f..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_ShellListener.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.ShellListener
- *
- * @see org.eclipse.swt.events.ShellListener
- */
-public class Test_org_eclipse_swt_events_ShellListener extends SwtTestCase {
-
-public Test_org_eclipse_swt_events_ShellListener(String name) {
-	super(name);
-}
-
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_shellActivatedLorg_eclipse_swt_events_ShellEvent() {
-	warnUnimpl("Test test_shellActivatedLorg_eclipse_swt_events_ShellEvent not written");
-}
-
-public void test_shellClosedLorg_eclipse_swt_events_ShellEvent() {
-	warnUnimpl("Test test_shellClosedLorg_eclipse_swt_events_ShellEvent not written");
-}
-
-public void test_shellDeactivatedLorg_eclipse_swt_events_ShellEvent() {
-	warnUnimpl("Test test_shellDeactivatedLorg_eclipse_swt_events_ShellEvent not written");
-}
-
-public void test_shellDeiconifiedLorg_eclipse_swt_events_ShellEvent() {
-	warnUnimpl("Test test_shellDeiconifiedLorg_eclipse_swt_events_ShellEvent not written");
-}
-
-public void test_shellIconifiedLorg_eclipse_swt_events_ShellEvent() {
-	warnUnimpl("Test test_shellIconifiedLorg_eclipse_swt_events_ShellEvent not written");
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_shellActivatedLorg_eclipse_swt_events_ShellEvent");
-	methodNames.addElement("test_shellClosedLorg_eclipse_swt_events_ShellEvent");
-	methodNames.addElement("test_shellDeactivatedLorg_eclipse_swt_events_ShellEvent");
-	methodNames.addElement("test_shellDeiconifiedLorg_eclipse_swt_events_ShellEvent");
-	methodNames.addElement("test_shellIconifiedLorg_eclipse_swt_events_ShellEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_shellActivatedLorg_eclipse_swt_events_ShellEvent")) test_shellActivatedLorg_eclipse_swt_events_ShellEvent();
-	else if (getName().equals("test_shellClosedLorg_eclipse_swt_events_ShellEvent")) test_shellClosedLorg_eclipse_swt_events_ShellEvent();
-	else if (getName().equals("test_shellDeactivatedLorg_eclipse_swt_events_ShellEvent")) test_shellDeactivatedLorg_eclipse_swt_events_ShellEvent();
-	else if (getName().equals("test_shellDeiconifiedLorg_eclipse_swt_events_ShellEvent")) test_shellDeiconifiedLorg_eclipse_swt_events_ShellEvent();
-	else if (getName().equals("test_shellIconifiedLorg_eclipse_swt_events_ShellEvent")) test_shellIconifiedLorg_eclipse_swt_events_ShellEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_TraverseEvent.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_TraverseEvent.java
deleted file mode 100644
index bdd3c17f..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_TraverseEvent.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.TraverseEvent
- *
- * @see org.eclipse.swt.events.TraverseEvent
- */
-public class Test_org_eclipse_swt_events_TraverseEvent extends Test_org_eclipse_swt_events_KeyEvent {
-
-public Test_org_eclipse_swt_events_TraverseEvent(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_Event() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_Event not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_events_TraverseEvent((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_Event");
-	methodNames.addAll(Test_org_eclipse_swt_events_KeyEvent.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_Event")) test_ConstructorLorg_eclipse_swt_widgets_Event();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_TraverseListener.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_TraverseListener.java
deleted file mode 100644
index ce6fb11..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_TraverseListener.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.TraverseListener
- *
- * @see org.eclipse.swt.events.TraverseListener
- */
-public class Test_org_eclipse_swt_events_TraverseListener extends SwtTestCase {
-
-public Test_org_eclipse_swt_events_TraverseListener(String name) {
-	super(name);
-}
-
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_keyTraversedLorg_eclipse_swt_events_TraverseEvent() {
-	warnUnimpl("Test test_keyTraversedLorg_eclipse_swt_events_TraverseEvent not written");
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_keyTraversedLorg_eclipse_swt_events_TraverseEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_keyTraversedLorg_eclipse_swt_events_TraverseEvent")) test_keyTraversedLorg_eclipse_swt_events_TraverseEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_TreeAdapter.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_TreeAdapter.java
deleted file mode 100644
index 924f710..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_TreeAdapter.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.TreeAdapter
- *
- * @see org.eclipse.swt.events.TreeAdapter
- */
-public class Test_org_eclipse_swt_events_TreeAdapter extends SwtTestCase {
-
-public Test_org_eclipse_swt_events_TreeAdapter(String name) {
-	super(name);
-}
-
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_Constructor() {
-	warnUnimpl("Test test_Constructor not written");
-}
-
-public void test_treeCollapsedLorg_eclipse_swt_events_TreeEvent() {
-	warnUnimpl("Test test_treeCollapsedLorg_eclipse_swt_events_TreeEvent not written");
-}
-
-public void test_treeExpandedLorg_eclipse_swt_events_TreeEvent() {
-	warnUnimpl("Test test_treeExpandedLorg_eclipse_swt_events_TreeEvent not written");
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_Constructor");
-	methodNames.addElement("test_treeCollapsedLorg_eclipse_swt_events_TreeEvent");
-	methodNames.addElement("test_treeExpandedLorg_eclipse_swt_events_TreeEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_Constructor")) test_Constructor();
-	else if (getName().equals("test_treeCollapsedLorg_eclipse_swt_events_TreeEvent")) test_treeCollapsedLorg_eclipse_swt_events_TreeEvent();
-	else if (getName().equals("test_treeExpandedLorg_eclipse_swt_events_TreeEvent")) test_treeExpandedLorg_eclipse_swt_events_TreeEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_TreeEvent.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_TreeEvent.java
deleted file mode 100644
index 8e9d9b2..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_TreeEvent.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.TreeEvent
- *
- * @see org.eclipse.swt.events.TreeEvent
- */
-public class Test_org_eclipse_swt_events_TreeEvent extends Test_org_eclipse_swt_events_SelectionEvent {
-
-public Test_org_eclipse_swt_events_TreeEvent(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_Event() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_Event not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_events_TreeEvent((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_Event");
-	methodNames.addAll(Test_org_eclipse_swt_events_SelectionEvent.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_Event")) test_ConstructorLorg_eclipse_swt_widgets_Event();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_TreeListener.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_TreeListener.java
deleted file mode 100644
index 190894f..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_TreeListener.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.TreeListener
- *
- * @see org.eclipse.swt.events.TreeListener
- */
-public class Test_org_eclipse_swt_events_TreeListener extends SwtTestCase {
-
-public Test_org_eclipse_swt_events_TreeListener(String name) {
-	super(name);
-}
-
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_treeCollapsedLorg_eclipse_swt_events_TreeEvent() {
-	warnUnimpl("Test test_treeCollapsedLorg_eclipse_swt_events_TreeEvent not written");
-}
-
-public void test_treeExpandedLorg_eclipse_swt_events_TreeEvent() {
-	warnUnimpl("Test test_treeExpandedLorg_eclipse_swt_events_TreeEvent not written");
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_treeCollapsedLorg_eclipse_swt_events_TreeEvent");
-	methodNames.addElement("test_treeExpandedLorg_eclipse_swt_events_TreeEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_treeCollapsedLorg_eclipse_swt_events_TreeEvent")) test_treeCollapsedLorg_eclipse_swt_events_TreeEvent();
-	else if (getName().equals("test_treeExpandedLorg_eclipse_swt_events_TreeEvent")) test_treeExpandedLorg_eclipse_swt_events_TreeEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_TypedEvent.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_TypedEvent.java
deleted file mode 100644
index 0b15741..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_TypedEvent.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.TypedEvent
- *
- * @see org.eclipse.swt.events.TypedEvent
- */
-public class Test_org_eclipse_swt_events_TypedEvent extends SwtTestCase {
-
-public Test_org_eclipse_swt_events_TypedEvent(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_ConstructorLjava_lang_Object() {
-	warnUnimpl("Test test_ConstructorLjava_lang_Object not written");
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_Event() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_Event not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_events_TypedEvent((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLjava_lang_Object");
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_Event");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLjava_lang_Object")) test_ConstructorLjava_lang_Object();
-	else if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_Event")) test_ConstructorLorg_eclipse_swt_widgets_Event();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_VerifyEvent.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_VerifyEvent.java
deleted file mode 100644
index 8b1438a..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_VerifyEvent.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.VerifyEvent
- *
- * @see org.eclipse.swt.events.VerifyEvent
- */
-public class Test_org_eclipse_swt_events_VerifyEvent extends Test_org_eclipse_swt_events_KeyEvent {
-
-public Test_org_eclipse_swt_events_VerifyEvent(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_Event() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_Event not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_events_VerifyEvent((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_Event");
-	methodNames.addAll(Test_org_eclipse_swt_events_KeyEvent.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_Event")) test_ConstructorLorg_eclipse_swt_widgets_Event();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_VerifyListener.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_VerifyListener.java
deleted file mode 100644
index fd4b590..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_events_VerifyListener.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.events.VerifyListener
- *
- * @see org.eclipse.swt.events.VerifyListener
- */
-public class Test_org_eclipse_swt_events_VerifyListener extends SwtTestCase {
-
-public Test_org_eclipse_swt_events_VerifyListener(String name) {
-	super(name);
-}
-
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_verifyTextLorg_eclipse_swt_events_VerifyEvent() {
-	warnUnimpl("Test test_verifyTextLorg_eclipse_swt_events_VerifyEvent not written");
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_verifyTextLorg_eclipse_swt_events_VerifyEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_verifyTextLorg_eclipse_swt_events_VerifyEvent")) test_verifyTextLorg_eclipse_swt_events_VerifyEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_Color.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_Color.java
deleted file mode 100644
index 0684a9f..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_Color.java
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_Cursor.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_Cursor.java
deleted file mode 100644
index 72ed0f2..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_Cursor.java
+++ /dev/null
@@ -1,222 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.graphics.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.graphics.Cursor
- *
- * @see org.eclipse.swt.graphics.Cursor
- */
-public class Test_org_eclipse_swt_graphics_Cursor extends SwtTestCase {
-
-Display display;
-
-public Test_org_eclipse_swt_graphics_Cursor(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	display = new Display();
-}
-
-protected void tearDown() {
-	display.dispose();
-}
-
-public void test_ConstructorLorg_eclipse_swt_graphics_DeviceI() {
-	// Test new Cursor(Device device, int style)
-	// IllegalArgumentException when an unknown style is specified
-
-	Cursor cursor = new Cursor(display, SWT.CURSOR_ARROW);
-	cursor.dispose();
-
-	cursor = new Cursor(display, SWT.CURSOR_WAIT);
-	cursor.dispose();
-
-	cursor = new Cursor(display, SWT.CURSOR_CROSS);
-	cursor.dispose();
-
-	cursor = new Cursor(display, SWT.CURSOR_APPSTARTING);
-	cursor.dispose();
-
-	cursor = new Cursor(display, SWT.CURSOR_HELP);
-	cursor.dispose();
-
-	cursor = new Cursor(display, SWT.CURSOR_SIZEALL);
-	cursor.dispose();
-
-	cursor = new Cursor(display, SWT.CURSOR_SIZENESW);
-	cursor.dispose();
-
-	cursor = new Cursor(display, SWT.CURSOR_SIZENS);
-	cursor.dispose();
-
-	cursor = new Cursor(display, SWT.CURSOR_SIZENWSE);
-	cursor.dispose();
-
-	cursor = new Cursor(display, SWT.CURSOR_SIZEWE);
-	cursor.dispose();
-
-	cursor = new Cursor(display, SWT.CURSOR_SIZEN);
-	cursor.dispose();
-
-	cursor = new Cursor(display, SWT.CURSOR_SIZES);
-	cursor.dispose();
-
-	cursor = new Cursor(display, SWT.CURSOR_SIZEE);
-	cursor.dispose();
-
-	cursor = new Cursor(display, SWT.CURSOR_SIZEW);
-	cursor.dispose();
-
-	cursor = new Cursor(display, SWT.CURSOR_SIZENE);
-	cursor.dispose();
-
-	cursor = new Cursor(display, SWT.CURSOR_SIZESE);
-	cursor.dispose();
-
-	cursor = new Cursor(display, SWT.CURSOR_SIZESW);
-	cursor.dispose();
-
-	cursor = new Cursor(display, SWT.CURSOR_SIZENW);
-	cursor.dispose();
-
-	cursor = new Cursor(display, SWT.CURSOR_UPARROW);
-	cursor.dispose();
-
-	cursor = new Cursor(display, SWT.CURSOR_IBEAM);
-	cursor.dispose();
-
-	cursor = new Cursor(display, SWT.CURSOR_NO);
-	cursor.dispose();
-
-	cursor = new Cursor(display, SWT.CURSOR_HAND);
-	cursor.dispose();
-
-	// device == null (valid)
-	cursor = new Cursor(null, SWT.CURSOR_ARROW);
-	cursor.dispose();
-
-	// illegal argument, style > SWT.CURSOR_HAND (21)
-	try {
-		cursor = new Cursor(display, 100);
-		cursor.dispose();
-		fail("No exception thrown for style > SWT.CURSOR_HAND (21)");
-	} catch (IllegalArgumentException e) {
-	}
-
-	// illegal argument, style < 0
-	try {
-		cursor = new Cursor(display, -100);
-		cursor.dispose();
-		fail("No exception thrown for style < 0");
-	} catch (IllegalArgumentException e) {
-	}
-}
-
-public void test_ConstructorLorg_eclipse_swt_graphics_DeviceLorg_eclipse_swt_graphics_ImageDataLorg_eclipse_swt_graphics_ImageDataII() {
-	// Test new Cursor(Device device, ImageData source, ImageData mask, int hotspotX, int hotspotY)
-	ImageLoader loader = new ImageLoader();
-	ImageData source = loader.load(SwtTestCase.class.getResourceAsStream("dot.gif"))[0];
-	ImageData mask = source.getTransparencyMask();
-	Cursor cursor = new Cursor(display, source, mask, 0, 0);
-	cursor.dispose();
-}
-public void test_dispose() {
-	// tested in test_isDisposed
-}
-
-public void test_equalsLjava_lang_Object() {
-	/* Note: Two cursors are only considered equal if their handles are equal.
-	 * So since Windows reuses cursor handles, and other platforms do not,
-	 * it does not make sense to test whether cursor.equals(sameCursor).
-	 */
-	Cursor cursor = new Cursor(display, SWT.CURSOR_WAIT);
-	Cursor otherCursor = new Cursor(display, SWT.CURSOR_CROSS);
-	try {
-		// Test Cursor.equals(Object)
-		assertTrue("!cursor.equals((Object)null)", !cursor.equals((Object)null));
-
-		// Test Cursor.equals(Cursor)
-		assertTrue("!cursor.equals((Cursor)null)", !cursor.equals((Cursor)null));
-		assertTrue("cursor.equals(cursor)", cursor.equals(cursor));
-		assertTrue("!cursor.equals(otherCursor)", !cursor.equals(otherCursor));
-	} finally {
-		cursor.dispose();
-		otherCursor.dispose();
-	}
-}
-
-public void test_hashCode() {
-	warnUnimpl("Test test_hashCode not written");
-}
-
-public void test_isDisposed() {
-	// Test Cursor.isDisposed() false
-	Cursor cursor = new Cursor(display, SWT.CURSOR_WAIT);
-	try {
-		assertTrue("Cursor should not be disposed", !cursor.isDisposed());
-	} finally {
-		// Test Cursor.isDisposed() true
-		cursor.dispose();
-		assertTrue("Cursor should be disposed", cursor.isDisposed());
-	}
-}
-
-public void test_toString() {
-	Cursor cursor = new Cursor(display, SWT.CURSOR_WAIT);
-	assertNotNull(cursor.toString());
-	assertTrue(cursor.toString().length() > 0);
-}
-
-public void test_win32_newLorg_eclipse_swt_graphics_DeviceI() {
-	// do not test - Windows only
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_graphics_Cursor((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_graphics_DeviceI");
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_graphics_DeviceLorg_eclipse_swt_graphics_ImageDataLorg_eclipse_swt_graphics_ImageDataII");
-	methodNames.addElement("test_dispose");
-	methodNames.addElement("test_equalsLjava_lang_Object");
-	methodNames.addElement("test_hashCode");
-	methodNames.addElement("test_isDisposed");
-	methodNames.addElement("test_toString");
-	methodNames.addElement("test_win32_newLorg_eclipse_swt_graphics_DeviceI");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_graphics_DeviceI")) test_ConstructorLorg_eclipse_swt_graphics_DeviceI();
-	else if (getName().equals("test_ConstructorLorg_eclipse_swt_graphics_DeviceLorg_eclipse_swt_graphics_ImageDataLorg_eclipse_swt_graphics_ImageDataII")) test_ConstructorLorg_eclipse_swt_graphics_DeviceLorg_eclipse_swt_graphics_ImageDataLorg_eclipse_swt_graphics_ImageDataII();
-	else if (getName().equals("test_dispose")) test_dispose();
-	else if (getName().equals("test_equalsLjava_lang_Object")) test_equalsLjava_lang_Object();
-	else if (getName().equals("test_hashCode")) test_hashCode();
-	else if (getName().equals("test_isDisposed")) test_isDisposed();
-	else if (getName().equals("test_toString")) test_toString();
-	else if (getName().equals("test_win32_newLorg_eclipse_swt_graphics_DeviceI")) test_win32_newLorg_eclipse_swt_graphics_DeviceI();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_Device.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_Device.java
deleted file mode 100644
index 12e2e9c..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_Device.java
+++ /dev/null
@@ -1,158 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.graphics.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.graphics.Device
- *
- * @see org.eclipse.swt.graphics.Device
- */
-public class Test_org_eclipse_swt_graphics_Device extends SwtTestCase {
-
-public Test_org_eclipse_swt_graphics_Device(String name) {
-	super(name);
-}
-
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_ConstructorLorg_eclipse_swt_graphics_DeviceData() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_graphics_DeviceData not written");
-}
-
-public void test_checkDevice() {
-	warnUnimpl("Test test_checkDevice not written");
-}
-
-public void test_createLorg_eclipse_swt_graphics_DeviceData() {
-	warnUnimpl("Test test_createLorg_eclipse_swt_graphics_DeviceData not written");
-}
-
-public void test_destroy() {
-	warnUnimpl("Test test_destroy not written");
-}
-
-public void test_dispose() {
-	warnUnimpl("Test test_dispose not written");
-}
-
-public void test_getBounds() {
-	warnUnimpl("Test test_getBounds not written");
-}
-
-public void test_getDeviceData() {
-	warnUnimpl("Test test_getDeviceData not written");
-}
-
-public void test_getClientArea() {
-	warnUnimpl("Test test_getClientArea not written");
-}
-
-public void test_getDepth() {
-	warnUnimpl("Test test_getDepth not written");
-}
-
-public void test_getDPI() {
-	warnUnimpl("Test test_getDPI not written");
-}
-
-public void test_getFontListLjava_lang_StringZ() {
-	warnUnimpl("Test test_getFontListLjava_lang_StringZ not written");
-}
-
-public void test_getSystemColorI() {
-	warnUnimpl("Test test_getSystemColorI not written");
-}
-
-public void test_getSystemFont() {
-	warnUnimpl("Test test_getSystemFont not written");
-}
-
-public void test_getWarnings() {
-	warnUnimpl("Test test_getWarnings not written");
-}
-
-public void test_init() {
-	warnUnimpl("Test test_init not written");
-}
-
-public void test_internal_new_GCLorg_eclipse_swt_graphics_GCData() {
-	warnUnimpl("Test test_internal_new_GCLorg_eclipse_swt_graphics_GCData not written");
-}
-
-public void test_internal_dispose_GCILorg_eclipse_swt_graphics_GCData() {
-	warnUnimpl("Test test_internal_dispose_GCILorg_eclipse_swt_graphics_GCData not written");
-}
-
-public void test_isDisposed() {
-	warnUnimpl("Test test_isDisposed not written");
-}
-
-public void test_release() {
-	warnUnimpl("Test test_release not written");
-}
-
-public void test_setWarningsZ() {
-	warnUnimpl("Test test_setWarningsZ not written");
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_graphics_DeviceData");
-	methodNames.addElement("test_checkDevice");
-	methodNames.addElement("test_createLorg_eclipse_swt_graphics_DeviceData");
-	methodNames.addElement("test_destroy");
-	methodNames.addElement("test_dispose");
-	methodNames.addElement("test_getBounds");
-	methodNames.addElement("test_getDeviceData");
-	methodNames.addElement("test_getClientArea");
-	methodNames.addElement("test_getDepth");
-	methodNames.addElement("test_getDPI");
-	methodNames.addElement("test_getFontListLjava_lang_StringZ");
-	methodNames.addElement("test_getSystemColorI");
-	methodNames.addElement("test_getSystemFont");
-	methodNames.addElement("test_getWarnings");
-	methodNames.addElement("test_init");
-	methodNames.addElement("test_internal_new_GCLorg_eclipse_swt_graphics_GCData");
-	methodNames.addElement("test_internal_dispose_GCILorg_eclipse_swt_graphics_GCData");
-	methodNames.addElement("test_isDisposed");
-	methodNames.addElement("test_release");
-	methodNames.addElement("test_setWarningsZ");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_graphics_DeviceData")) test_ConstructorLorg_eclipse_swt_graphics_DeviceData();
-	else if (getName().equals("test_checkDevice")) test_checkDevice();
-	else if (getName().equals("test_createLorg_eclipse_swt_graphics_DeviceData")) test_createLorg_eclipse_swt_graphics_DeviceData();
-	else if (getName().equals("test_destroy")) test_destroy();
-	else if (getName().equals("test_dispose")) test_dispose();
-	else if (getName().equals("test_getBounds")) test_getBounds();
-	else if (getName().equals("test_getDeviceData")) test_getDeviceData();
-	else if (getName().equals("test_getClientArea")) test_getClientArea();
-	else if (getName().equals("test_getDepth")) test_getDepth();
-	else if (getName().equals("test_getDPI")) test_getDPI();
-	else if (getName().equals("test_getFontListLjava_lang_StringZ")) test_getFontListLjava_lang_StringZ();
-	else if (getName().equals("test_getSystemColorI")) test_getSystemColorI();
-	else if (getName().equals("test_getSystemFont")) test_getSystemFont();
-	else if (getName().equals("test_getWarnings")) test_getWarnings();
-	else if (getName().equals("test_init")) test_init();
-	else if (getName().equals("test_internal_new_GCLorg_eclipse_swt_graphics_GCData")) test_internal_new_GCLorg_eclipse_swt_graphics_GCData();
-	else if (getName().equals("test_internal_dispose_GCILorg_eclipse_swt_graphics_GCData")) test_internal_dispose_GCILorg_eclipse_swt_graphics_GCData();
-	else if (getName().equals("test_isDisposed")) test_isDisposed();
-	else if (getName().equals("test_release")) test_release();
-	else if (getName().equals("test_setWarningsZ")) test_setWarningsZ();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_DeviceData.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_DeviceData.java
deleted file mode 100644
index 2b5c394..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_DeviceData.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.graphics.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.graphics.DeviceData
- *
- * @see org.eclipse.swt.graphics.DeviceData
- */
-public class Test_org_eclipse_swt_graphics_DeviceData extends SwtTestCase {
-
-public Test_org_eclipse_swt_graphics_DeviceData(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_Constructor() {
-	DeviceData data = new DeviceData();
-	data.debug = true;
-	data.tracking = true;
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_graphics_DeviceData((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_Constructor");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_Constructor")) test_Constructor();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_Drawable.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_Drawable.java
deleted file mode 100644
index a04c4ae..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_Drawable.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.graphics.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.graphics.Drawable
- *
- * @see org.eclipse.swt.graphics.Drawable
- */
-public class Test_org_eclipse_swt_graphics_Drawable extends SwtTestCase {
-
-public Test_org_eclipse_swt_graphics_Drawable(String name) {
-	super(name);
-}
-
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_internal_new_GCLorg_eclipse_swt_graphics_GCData() {
-	warnUnimpl("Test test_internal_new_GCLorg_eclipse_swt_graphics_GCData not written");
-}
-
-public void test_internal_dispose_GCILorg_eclipse_swt_graphics_GCData() {
-	warnUnimpl("Test test_internal_dispose_GCILorg_eclipse_swt_graphics_GCData not written");
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_internal_new_GCLorg_eclipse_swt_graphics_GCData");
-	methodNames.addElement("test_internal_dispose_GCILorg_eclipse_swt_graphics_GCData");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_internal_new_GCLorg_eclipse_swt_graphics_GCData")) test_internal_new_GCLorg_eclipse_swt_graphics_GCData();
-	else if (getName().equals("test_internal_dispose_GCILorg_eclipse_swt_graphics_GCData")) test_internal_dispose_GCILorg_eclipse_swt_graphics_GCData();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_Font.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_Font.java
deleted file mode 100644
index 0c9f504..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_Font.java
+++ /dev/null
@@ -1,304 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.graphics.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.graphics.Font
- *
- * @see org.eclipse.swt.graphics.Font
- */
-public class Test_org_eclipse_swt_graphics_Font extends SwtTestCase {
-
-Display display;
-
-public Test_org_eclipse_swt_graphics_Font(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	display = new Display();
-}
-
-protected void tearDown() {
-	display.dispose();
-}
-
-public void test_ConstructorLorg_eclipse_swt_graphics_DeviceLorg_eclipse_swt_graphics_FontData() {
-	// Test new Font(Device device, FontData fd)
-	// IllegalArgumentException if the fd argument is null
-	// SWTError: ERROR_NO_HANDLES, if a font could not be created from the given font data
-
-	// valid font with no name (strange, but apparently valid)
-	Font font = new Font(display, new FontData("", 10, SWT.NORMAL));
-	font.dispose();
-
-	// valid font with unknown name (strange, but apparently valid)
-	font = new Font(display, new FontData("bad-font", 10, SWT.NORMAL));
-	font.dispose();
-
-	// valid font with 0 height (strange, but apparently valid)
-	font = new Font(display, new FontData(SwtJunit.testFontName, 0, SWT.NORMAL));
-	font.dispose();
-
-	// valid normal 1000-point font (pretty big, but apparently valid)
-	font = new Font(display, new FontData(SwtJunit.testFontName, 1000, SWT.NORMAL));
-	font.dispose();
-
-	// valid normal 10-point font
-	font = new Font(display, new FontData(SwtJunit.testFontName, 10, SWT.NORMAL));
-	font.dispose();
-
-	// valid bold 10-point font
-	font = new Font(display, new FontData(SwtJunit.testFontName, 10, SWT.BOLD));
-	font.dispose();
-
-	// valid italic 10-point font
-	font = new Font(display, new FontData(SwtJunit.testFontName, 10, SWT.ITALIC));
-	font.dispose();
-
-	// valid bold italic 10-point font
-	font = new Font(display, new FontData(SwtJunit.testFontName, 10, SWT.BOLD | SWT.ITALIC));
-	font.dispose();
-
-	// illegal argument, fontData == null
-	try {
-		font = new Font(display, null);
-		font.dispose();
-		fail("No exception thrown for fontData == null");
-	} catch (IllegalArgumentException e) {
-	}
-
-	// illegal argument, name == null
-	try {
-		font = new Font(display, new FontData(null, 10, SWT.NORMAL));
-		font.dispose();
-		fail("No exception thrown for name == null");
-	} catch (IllegalArgumentException e) {
-	}
-
-	// illegal argument, height < 0
-	try {
-		font = new Font(display, new FontData(SwtJunit.testFontName, -10, SWT.NORMAL));
-		font.dispose();
-		fail("No exception thrown for height < 0");
-	} catch (IllegalArgumentException e) {
-	}
-}
-
-public void test_ConstructorLorg_eclipse_swt_graphics_DeviceLjava_lang_StringII() {
-	// Test new Font(Device device, String name, int height, int style)
-	// IllegalArgumentException if the name argument is null or the height is negative
-	// SWTError: ERROR_NO_HANDLES, if a font could not be created from the given arguments
-
-	// valid font with no name (strange, but apparently valid)
-	Font font = new Font(display, "", 10, SWT.NORMAL);
-	font.dispose();
-
-	// valid font with unknown name (strange, but apparently valid)
-	font = new Font(display, "bad-font", 10, SWT.NORMAL);
-	font.dispose();
-
-	// valid font with 0 height (strange, but apparently valid)
-	font = new Font(display, SwtJunit.testFontName, 0, SWT.NORMAL);
-	font.dispose();
-
-	// valid normal 1000-point font (pretty big, but apparently valid)
-	font = new Font(display, SwtJunit.testFontName, 1000, SWT.NORMAL);
-	font.dispose();
-
-	// valid normal 10-point font
-	font = new Font(display, SwtJunit.testFontName, 10, SWT.NORMAL);
-	font.dispose();
-
-	// valid bold 10-point font
-	font = new Font(display, SwtJunit.testFontName, 10, SWT.BOLD);
-	font.dispose();
-
-	// valid italic 10-point font
-	font = new Font(display, SwtJunit.testFontName, 10, SWT.ITALIC);
-	font.dispose();
-
-	// valid bold italic 10-point font
-	font = new Font(display, SwtJunit.testFontName, 10, SWT.BOLD | SWT.ITALIC);
-	font.dispose();
-
-	// device == null (valid)
-	font = new Font(null, SwtJunit.testFontName, 10, SWT.NORMAL);
-	font.dispose();
-
-	// illegal argument, name == null
-	try {
-		font = new Font(display, null, 10, SWT.NORMAL);
-		font.dispose();
-		fail("No exception thrown for name == null");
-	} catch (IllegalArgumentException e) {
-	}
-
-	// illegal argument, height < 0
-	try {
-		font = new Font(display, SwtJunit.testFontName, -10, SWT.NORMAL);
-		font.dispose();
-		fail("No exception thrown for height < 0");
-	} catch (IllegalArgumentException e) {
-	}
-}
-
-public void test_dispose() {
-	warnUnimpl("Test test_dispose not written");
-}
-
-public void test_equalsLjava_lang_Object() {
-	// Fonts are only equal if their handles are the same (?!)
-	Font font = new Font(display, SwtJunit.testFontName, 10, SWT.NORMAL);
-	Font otherFont = new Font(display, SwtJunit.testFontName, 20, SWT.NORMAL);
-	try {
-		// Test Font.equals(Object)
-		assertTrue("!font.equals((Object)null)", !font.equals((Object)null));
-
-		// Test Font.equals(Font)
-		assertTrue("!font.equals((Font)null)", !font.equals((Font)null));
-		assertTrue("font.equals(font)", font.equals(font));
-		assertTrue("!font.equals(otherFont)", !font.equals(otherFont));
-	} finally {
-		font.dispose();
-		otherFont.dispose();
-	}
-}
-
-public void test_getFontData() {
-	// Test Font.getFontData()
-	// valid normal 10-point font
-	Font font = new Font(display, SwtJunit.testFontName, 10, SWT.NORMAL);
-	try {
-		FontData fontData[] = font.getFontData();
-		assertTrue("No font data", fontData != null && fontData.length > 0);
-		assertEquals("Wrong font name", SwtJunit.testFontName, fontData[0].getName());
-		assertEquals("Wrong font height", 10, fontData[0].getHeight());
-		assertEquals("Wrong font style", SWT.NORMAL, fontData[0].getStyle());
-	} finally {
-		font.dispose();
-	}
-
-	// valid bold 20-point font
-	font = new Font(display, SwtJunit.testFontName, 20, SWT.BOLD);
-	try {
-		FontData fontData[] = font.getFontData();
-		assertTrue("No font data", fontData != null && fontData.length > 0);
-		assertEquals("Wrong font name", SwtJunit.testFontName, fontData[0].getName());
-		assertEquals("Wrong font height", 20, fontData[0].getHeight());
-		assertEquals("Wrong font style", SWT.BOLD, fontData[0].getStyle());
-	} finally {
-		font.dispose();
-	}
-
-	// valid italic 30-point font
-	font = new Font(display, SwtJunit.testFontName, 30, SWT.ITALIC);
-	try {
-		FontData fontData[] = font.getFontData();
-		assertTrue("No font data", fontData != null && fontData.length > 0);
-//		assertEquals("Wrong font name", SwtJunit.testFontName, fontData[0].getName());
-		assertEquals("Wrong font height", 30, fontData[0].getHeight());
-		assertEquals("Wrong font style", SWT.ITALIC, fontData[0].getStyle());
-	} finally {
-		font.dispose();
-	}
-
-	// valid bold italic 40-point font
-	font = new Font(display, SwtJunit.testFontName, 40, SWT.BOLD | SWT.ITALIC);
-	try {
-		FontData fontData[] = font.getFontData();
-		font.dispose();
-		assertTrue("No font data", fontData != null && fontData.length > 0);
-//		assertEquals("Wrong font name", SwtJunit.testFontName, fontData[0].getName());
-		assertEquals("Wrong font height", 40, fontData[0].getHeight());
-		assertEquals("Wrong font style", SWT.BOLD | SWT.ITALIC, fontData[0].getStyle());
-	} finally {
-		font.dispose();
-	}
-
-	// valid 10-point font with unknown name
-	font = new Font(display, "bad-font", 10, SWT.NORMAL);
-	try {
-		FontData fontData[] = font.getFontData();
-		assertTrue("No font data", fontData != null && fontData.length > 0);
-//		assertEquals("Wrong font name", "bad-font", fontData[0].getName());
-		assertEquals("Wrong font height", 10, fontData[0].getHeight());
-		assertEquals("Wrong font style", SWT.NORMAL, fontData[0].getStyle());
-	} finally {
-		font.dispose();
-	}
-}
-
-public void test_hashCode() {
-	warnUnimpl("Test test_hashCode not written");
-}
-
-public void test_isDisposed() {
-	// Test Font.isDisposed() false
-	Font font = new Font(display, SwtJunit.testFontName, 10, SWT.NORMAL);
-	try {
-		assertTrue("Font should not be disposed", !font.isDisposed());
-	} finally {
-		// Test Font.isDisposed() true
-		font.dispose();
-		assertTrue("Font should be disposed", font.isDisposed());
-	}
-}
-
-public void test_toString() {
-	warnUnimpl("Test test_toString not written");
-}
-
-public void test_win32_newLorg_eclipse_swt_graphics_DeviceI() {
-	// do not test - Windows only
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_graphics_Font((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_graphics_DeviceLorg_eclipse_swt_graphics_FontData");
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_graphics_DeviceLjava_lang_StringII");
-	methodNames.addElement("test_dispose");
-	methodNames.addElement("test_equalsLjava_lang_Object");
-	methodNames.addElement("test_getFontData");
-	methodNames.addElement("test_hashCode");
-	methodNames.addElement("test_isDisposed");
-	methodNames.addElement("test_toString");
-	methodNames.addElement("test_win32_newLorg_eclipse_swt_graphics_DeviceI");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_graphics_DeviceLorg_eclipse_swt_graphics_FontData")) test_ConstructorLorg_eclipse_swt_graphics_DeviceLorg_eclipse_swt_graphics_FontData();
-	else if (getName().equals("test_ConstructorLorg_eclipse_swt_graphics_DeviceLjava_lang_StringII")) test_ConstructorLorg_eclipse_swt_graphics_DeviceLjava_lang_StringII();
-	else if (getName().equals("test_dispose")) test_dispose();
-	else if (getName().equals("test_equalsLjava_lang_Object")) test_equalsLjava_lang_Object();
-	else if (getName().equals("test_getFontData")) test_getFontData();
-	else if (getName().equals("test_hashCode")) test_hashCode();
-	else if (getName().equals("test_isDisposed")) test_isDisposed();
-	else if (getName().equals("test_toString")) test_toString();
-	else if (getName().equals("test_win32_newLorg_eclipse_swt_graphics_DeviceI")) test_win32_newLorg_eclipse_swt_graphics_DeviceI();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_FontData.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_FontData.java
deleted file mode 100644
index 2788ec2..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_FontData.java
+++ /dev/null
@@ -1,251 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.graphics.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.graphics.FontData
- *
- * @see org.eclipse.swt.graphics.FontData
- */
-public class Test_org_eclipse_swt_graphics_FontData extends SwtTestCase {
-
-public Test_org_eclipse_swt_graphics_FontData(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_Constructor() {
-	// Test new FontData()
-	FontData fd = new FontData();
-}
-
-public void test_ConstructorLjava_lang_String() {
-	// Test new FontData(String string)
-	FontData fd = new FontData(SwtJunit.testFontName, 10, SWT.NORMAL);
-	FontData reconstructedFontData = new FontData(fd.toString());
-	assertEquals(fd, reconstructedFontData);
-}
-
-public void test_ConstructorLjava_lang_StringII() {
-	// Test new FontData(String name, int height, int style)
-	// valid font data with no name (strange, but apparently valid)
-	FontData fd = new FontData("", 10, SWT.NORMAL);
-
-	// valid font data with unknown name (strange, but apparently valid)
-	fd = new FontData("bad-font", 10, SWT.NORMAL);
-
-	// valid font data with 0 height (strange, but apparently valid)
-	fd = new FontData(SwtJunit.testFontName, 0, SWT.NORMAL);
-
-	// valid font data with 1000 height (pretty big, but apparently valid)
-	fd = new FontData(SwtJunit.testFontName, 1000, SWT.NORMAL);
-
-	// valid normal 10-point font data
-	fd = new FontData(SwtJunit.testFontName, 10, SWT.NORMAL);
-
-	// valid bold 10-point font data
-	fd = new FontData(SwtJunit.testFontName, 10, SWT.BOLD);
-
-	// valid italic 10-point font data
-	fd = new FontData(SwtJunit.testFontName, 10, SWT.ITALIC);
-
-	// valid bold italic 10-point font data
-	fd = new FontData(SwtJunit.testFontName, 10, SWT.BOLD | SWT.ITALIC);
-
-	// illegal argument, name == null
-	try {
-		fd = new FontData(null, 10, SWT.NORMAL);
-		fail("No exception thrown for name == null");
-	} catch (IllegalArgumentException e) {
-	}
-
-	// illegal argument, height < 0
-	try {
-		fd = new FontData(SwtJunit.testFontName, -10, SWT.NORMAL);
-		fail("No exception thrown for height < 0");
-	} catch (IllegalArgumentException e) {
-	}
-}
-
-public void test_equalsLjava_lang_Object() {
-	warnUnimpl("Test test_equalsLjava_lang_Object not written");
-}
-
-public void test_getHeight() {
-	// Font.getHeight() tested in test_setHeightI
-}
-
-public void test_getName() {
-	// Font.getName() tested in test_setNameLjava_lang_String
-}
-
-public void test_getStyle() {
-	// Font.getStyle() tested in test_setStyleI
-}
-
-public void test_hashCode() {
-	warnUnimpl("Test test_hashCode not written");
-}
-
-public void test_setHeightI() {
-	// Test Font.setHeight(int  height)
-	// valid normal font data for various heights
-	FontData fontData = new FontData(SwtJunit.testFontName, 10, SWT.NORMAL);	
-	for (int height = 0; height < 1000; height++) {
-		fontData.setHeight(height);
-		assertEquals("Wrong height", fontData.getHeight(), height);
-	}
-
-	// valid bold font data for various heights
-	fontData = new FontData(SwtJunit.testFontName, 10, SWT.BOLD);	
-	for (int height = 0; height < 1000; height++) {
-		fontData.setHeight(height);
-		assertEquals("Wrong height", fontData.getHeight(), height);
-	}
-
-	// valid italic font data for various heights
-	fontData = new FontData(SwtJunit.testFontName, 10, SWT.ITALIC);	
-	for (int height = 0; height < 1000; height++) {
-		fontData.setHeight(height);
-		assertEquals("Wrong height", fontData.getHeight(), height);
-	}
-
-	// valid bold italic font data for various heights
-	fontData = new FontData(SwtJunit.testFontName, 10, SWT.BOLD | SWT.ITALIC);	
-	for (int height = 0; height < 1000; height++) {
-		fontData.setHeight(height);
-		assertEquals("Wrong height", fontData.getHeight(), height);
-	}
-}
-
-public void test_setLocaleLjava_lang_String() {
-	warnUnimpl("Test test_setLocaleLjava_lang_String not written");
-}
-
-public void test_setNameLjava_lang_String() {
-	// Test Font.setName(String name)
-	// valid name
-	FontData fontData = new FontData(SwtJunit.testFontName, 10, SWT.NORMAL);
-	assertEquals("Wrong name", fontData.getName(), SwtJunit.testFontName);
-
-	// valid name (unknown name, but valid)
-	fontData.setName("bad-font");
-	assertEquals("Wrong name", fontData.getName(), "bad-font");
-
-	// valid name (empty string, but valid)
-	// only on windows since motif supports separate font foundries
-	if (SwtJunit.isWindows) {
-		fontData.setName("");
-		assertEquals("Wrong name", fontData.getName(), "");
-	}
-
-	// valid name
-	fontData.setName(SwtJunit.testFontName);	
-	assertEquals("Wrong name", fontData.getName(), SwtJunit.testFontName);
-System.out.println(4);
-	// illegal argument, name == null
-	try {
-		fontData.setName(null);
-		fail("No exception thrown for name == null");
-	} catch (IllegalArgumentException e) {
-	}
-System.out.println(5);
-}
-
-public void test_setStyleI() {
-	// Test Font.setStyle(int  style)
-	for (int height = 0; height < 1000; height++) {
-		// valid normal font data
-		FontData fontData = new FontData(SwtJunit.testFontName, height, SWT.NORMAL);	
-		assertEquals("Wrong style", fontData.getStyle(), SWT.NORMAL);
-
-		// valid bold font data
-		fontData.setStyle(SWT.BOLD);
-		assertEquals("Wrong style", fontData.getStyle(), SWT.BOLD);
-
-		// valid italic font data
-		fontData.setStyle(SWT.ITALIC);
-		assertEquals("Wrong style", fontData.getStyle(), SWT.ITALIC);
-		
-		// valid bold italic font data
-		fontData.setStyle(SWT.ITALIC | SWT.BOLD);
-		assertEquals("Wrong style", fontData.getStyle(), SWT.BOLD | SWT.ITALIC);
-
-		// valid normal font data
-		fontData.setStyle(SWT.NORMAL);
-		assertEquals("Wrong style", fontData.getStyle(), SWT.NORMAL);
-	}
-}
-
-public void test_toString() {
-	warnUnimpl("Test test_toString not written");
-}
-
-public void test_win32_newLorg_eclipse_swt_internal_win32_LOGFONTI() {
-	// do not test - Windows only
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_graphics_FontData((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_Constructor");
-	methodNames.addElement("test_ConstructorLjava_lang_String");
-	methodNames.addElement("test_ConstructorLjava_lang_StringII");
-	methodNames.addElement("test_equalsLjava_lang_Object");
-	methodNames.addElement("test_getHeight");
-	methodNames.addElement("test_getName");
-	methodNames.addElement("test_getStyle");
-	methodNames.addElement("test_hashCode");
-	methodNames.addElement("test_setHeightI");
-	methodNames.addElement("test_setLocaleLjava_lang_String");
-	methodNames.addElement("test_setNameLjava_lang_String");
-	methodNames.addElement("test_setStyleI");
-	methodNames.addElement("test_toString");
-	methodNames.addElement("test_win32_newLorg_eclipse_swt_internal_win32_LOGFONTI");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_Constructor")) test_Constructor();
-	else if (getName().equals("test_ConstructorLjava_lang_String")) test_ConstructorLjava_lang_String();
-	else if (getName().equals("test_ConstructorLjava_lang_StringII")) test_ConstructorLjava_lang_StringII();
-	else if (getName().equals("test_equalsLjava_lang_Object")) test_equalsLjava_lang_Object();
-	else if (getName().equals("test_getHeight")) test_getHeight();
-	else if (getName().equals("test_getName")) test_getName();
-	else if (getName().equals("test_getStyle")) test_getStyle();
-	else if (getName().equals("test_hashCode")) test_hashCode();
-	else if (getName().equals("test_setHeightI")) test_setHeightI();
-	else if (getName().equals("test_setLocaleLjava_lang_String")) test_setLocaleLjava_lang_String();
-	else if (getName().equals("test_setNameLjava_lang_String")) test_setNameLjava_lang_String();
-	else if (getName().equals("test_setStyleI")) test_setStyleI();
-	else if (getName().equals("test_toString")) test_toString();
-	else if (getName().equals("test_win32_newLorg_eclipse_swt_internal_win32_LOGFONTI")) test_win32_newLorg_eclipse_swt_internal_win32_LOGFONTI();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_FontMetrics.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_FontMetrics.java
deleted file mode 100644
index fef2e7e..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_FontMetrics.java
+++ /dev/null
@@ -1,121 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.graphics.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.graphics.FontMetrics
- *
- * @see org.eclipse.swt.graphics.FontMetrics
- */
-public class Test_org_eclipse_swt_graphics_FontMetrics extends SwtTestCase {
-
-	Display display;
-	Shell shell;
-	GC gc;
-
-public Test_org_eclipse_swt_graphics_FontMetrics(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	display = new Display();
-	shell = new Shell(display);
-	gc = new GC(shell);
-}
-
-protected void tearDown() {
-	gc.dispose();
-	shell.dispose();
-	display.dispose();
-}
-
-public void test_equalsLjava_lang_Object() {
-	FontMetrics fm1 = gc.getFontMetrics();
-	FontMetrics fm2 = gc.getFontMetrics();
-	assertTrue(fm1.equals(fm2));
-}
-
-public void test_getAscent() {
-	FontMetrics fm = gc.getFontMetrics();
-	fm.getAscent();
-}
-
-public void test_getAverageCharWidth() {
-	FontMetrics fm = gc.getFontMetrics();
-	fm.getAverageCharWidth();
-}
-
-public void test_getDescent() {
-	FontMetrics fm = gc.getFontMetrics();
-	fm.getDescent();
-}
-
-public void test_getHeight() {
-	FontMetrics fm = gc.getFontMetrics();
-	fm.getHeight();
-}
-
-public void test_getLeading() {
-	FontMetrics fm = gc.getFontMetrics();
-	fm.getLeading();
-}
-
-public void test_hashCode() {
-	FontMetrics fm1 = gc.getFontMetrics();
-	FontMetrics fm2 = gc.getFontMetrics();
-	if (fm1.equals(fm2)) {
-		assertEquals(fm1.hashCode(), fm2.hashCode());
-	}
-}
-
-public void test_win32_newLorg_eclipse_swt_internal_win32_TEXTMETRIC() {
-	// do not test - Windows only
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_graphics_FontMetrics((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_equalsLjava_lang_Object");
-	methodNames.addElement("test_getAscent");
-	methodNames.addElement("test_getAverageCharWidth");
-	methodNames.addElement("test_getDescent");
-	methodNames.addElement("test_getHeight");
-	methodNames.addElement("test_getLeading");
-	methodNames.addElement("test_hashCode");
-	methodNames.addElement("test_win32_newLorg_eclipse_swt_internal_win32_TEXTMETRIC");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_equalsLjava_lang_Object")) test_equalsLjava_lang_Object();
-	else if (getName().equals("test_getAscent")) test_getAscent();
-	else if (getName().equals("test_getAverageCharWidth")) test_getAverageCharWidth();
-	else if (getName().equals("test_getDescent")) test_getDescent();
-	else if (getName().equals("test_getHeight")) test_getHeight();
-	else if (getName().equals("test_getLeading")) test_getLeading();
-	else if (getName().equals("test_hashCode")) test_hashCode();
-	else if (getName().equals("test_win32_newLorg_eclipse_swt_internal_win32_TEXTMETRIC")) test_win32_newLorg_eclipse_swt_internal_win32_TEXTMETRIC();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_GC.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_GC.java
deleted file mode 100644
index 4f7b56c..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_GC.java
+++ /dev/null
@@ -1,449 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.graphics.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.graphics.GC
- *
- * @see org.eclipse.swt.graphics.GC
- */
-public class Test_org_eclipse_swt_graphics_GC extends SwtTestCase {
-
-Display display;
-Shell shell;
-GC gc;
-
-public Test_org_eclipse_swt_graphics_GC(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	display = new Display();
-	shell = new Shell(display);
-	shell.setBounds(0,30,240,290);
-	shell.open();
-	gc = new GC(shell);
-}
-
-protected void tearDown() {
-	gc.dispose();
-	shell.dispose();
-	display.dispose();
-}
-
-public void test_ConstructorLorg_eclipse_swt_graphics_Drawable() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_graphics_Drawable not written");
-}
-
-public void test_copyAreaLorg_eclipse_swt_graphics_ImageII() {
-	warnUnimpl("Test test_copyAreaLorg_eclipse_swt_graphics_ImageII not written");
-}
-
-public void test_copyAreaIIIIII() {
-	warnUnimpl("Test test_copyAreaIIIIII not written");
-}
-
-public void test_dispose() {
-	warnUnimpl("Test test_dispose not written");
-}
-
-public void test_drawArcIIIIII() {
-	warnUnimpl("Test test_drawArcIIIIII not written");
-}
-
-public void test_drawFocusIIII() {
-	warnUnimpl("Test test_drawFocusIIII not written");
-}
-
-public void test_drawImageLorg_eclipse_swt_graphics_ImageII() {		
-		Color c1 = new Color(display, 255, 0, 0);
-		Color c2 = new Color(display, 0, 0, 0);
-		Color c3 = new Color(display, 255, 255, 0);
-		
-		PaletteData paletteData = new PaletteData(new RGB[] {c1.getRGB(), c2.getRGB(), c3.getRGB()});
-		ImageData data = new ImageData(30,30, 8, paletteData);
-		for (int y = 0; y < data.height; y++) {
-			for (int x = 0; x < data.width; x++) {
-				if (x > y) data.setPixel(x, y, paletteData.getPixel(c1.getRGB()));
-				else if (x < y) data.setPixel(x, y, paletteData.getPixel(c2.getRGB()));
-				else data.setPixel(x, y, paletteData.getPixel(c3.getRGB()));
-			}
-		}
-		Image image = new Image(display, data);
-		data = image.getImageData();
-		data.transparentPixel = paletteData.getPixel(c1.getRGB());
-		Image imageTransparent = new Image(display, data);
-		data.transparentPixel = -1;
-		for (int y = 0; y < data.height; y++) {
-			for (int x = 0; x < data.width; x++) {
-				data.setAlpha(x, y, 127);
-			}
-		}		
-		Image imageAlpha = new Image(display, data);
-								
-		gc.drawImage(image, 100, 100);
-		gc.drawImage(imageTransparent, 130, 100);
-		gc.drawImage(imageAlpha, 160, 100);
-		try {
-			gc.drawImage(null, 100, 100);
-			fail("No exception thrown"); //should never get here
-		}
-		catch (IllegalArgumentException e) {
-		}	
-}
-
-public void test_drawImageLorg_eclipse_swt_graphics_ImageIIIIIIII() {		
-		Color c1 = new Color(display, 255, 0, 0);
-		Color c2 = new Color(display, 0, 0, 0);
-		Color c3 = new Color(display, 255, 255, 0);
-		
-		PaletteData paletteData = new PaletteData(new RGB[] {c1.getRGB(), c2.getRGB(), c3.getRGB()});
-		ImageData data = new ImageData(30,30, 8, paletteData);
-		for (int y = 0; y < data.height; y++) {
-			for (int x = 0; x < data.width; x++) {
-				if (x > y) data.setPixel(x, y, paletteData.getPixel(c1.getRGB()));
-				else if (x < y) data.setPixel(x, y, paletteData.getPixel(c2.getRGB()));
-				else data.setPixel(x, y, paletteData.getPixel(c3.getRGB()));
-			}
-		}
-		Image image = new Image(display, data);
-		data = image.getImageData();
-		data.transparentPixel = paletteData.getPixel(c1.getRGB());
-		Image imageTransparent = new Image(display, data);
-		data.transparentPixel = -1;
-		for (int y = 0; y < data.height; y++) {
-			for (int x = 0; x < data.width; x++) {
-				data.setAlpha(x, y, 127);
-			}
-		}		
-		Image imageAlpha = new Image(display, data);
-								
-		gc.drawImage(image, 10, 5, 20, 15, 100, 120, 50, 60);
-		gc.drawImage(imageTransparent, 10, 5, 20, 15, 100, 120, 10, 10);
-		gc.drawImage(imageAlpha, 10, 5, 20, 15, 100, 120, 20, 15);
-		try {
-			gc.drawImage(null, 10, 5, 20, 15, 100, 120, 50, 60);
-			fail("No exception thrown"); //should never get here
-		}
-		catch (IllegalArgumentException e) {
-		}
-}
-
-public void test_drawLineIIII() {
-}
-
-public void test_drawOvalIIII() {
-}
-
-public void test_drawPolygon$I() {
-}
-
-public void test_drawPolyline$I() {
-	warnUnimpl("Test test_drawPolyline$I not written");
-}
-
-public void test_drawRectangleIIII() {
-	warnUnimpl("Test test_drawRectangleIIII not written");
-}
-
-public void test_drawRectangleLorg_eclipse_swt_graphics_Rectangle() {
-	warnUnimpl("Test test_drawRectangleLorg_eclipse_swt_graphics_Rectangle not written");
-}
-
-public void test_drawRoundRectangleIIIIII() {
-	warnUnimpl("Test test_drawRoundRectangleIIIIII not written");
-}
-
-public void test_drawStringLjava_lang_StringII() {
-	warnUnimpl("Test test_drawStringLjava_lang_StringII not written");
-}
-
-public void test_drawStringLjava_lang_StringIIZ() {
-	warnUnimpl("Test test_drawStringLjava_lang_StringIIZ not written");
-}
-
-public void test_drawTextLjava_lang_StringII() {
-	warnUnimpl("Test test_drawTextLjava_lang_StringII not written");
-}
-
-public void test_drawTextLjava_lang_StringIIZ() {
-	warnUnimpl("Test test_drawTextLjava_lang_StringIIZ not written");
-}
-
-public void test_equalsLjava_lang_Object() {
-	warnUnimpl("Test test_equalsLjava_lang_Object not written");
-}
-
-public void test_fillArcIIIIII() {
-	warnUnimpl("Test test_fillArcIIIIII not written");
-}
-
-public void test_fillGradientRectangleIIIIZ() {
-	warnUnimpl("Test test_fillGradientRectangleIIIIZ not written");
-}
-
-public void test_fillOvalIIII() {
-	warnUnimpl("Test test_fillOvalIIII not written");
-}
-
-public void test_fillPolygon$I() {
-	warnUnimpl("Test test_fillPolygon$I not written");
-}
-
-public void test_fillRectangleIIII() {
-	warnUnimpl("Test test_fillRectangleIIII not written");
-}
-
-public void test_fillRectangleLorg_eclipse_swt_graphics_Rectangle() {
-	warnUnimpl("Test test_fillRectangleLorg_eclipse_swt_graphics_Rectangle not written");
-}
-
-public void test_fillRoundRectangleIIIIII() {
-	warnUnimpl("Test test_fillRoundRectangleIIIIII not written");
-}
-
-public void test_getAdvanceWidthC() {
-	warnUnimpl("Test test_getAdvanceWidthC not written");
-}
-
-public void test_getBackground() {
-	warnUnimpl("Test test_getBackground not written");
-}
-
-public void test_getCharWidthC() {
-	warnUnimpl("Test test_getCharWidthC not written");
-}
-
-public void test_getClipping() {
-	warnUnimpl("Test test_getClipping not written");
-}
-
-public void test_getClippingLorg_eclipse_swt_graphics_Region() {
-	warnUnimpl("Test test_getClippingLorg_eclipse_swt_graphics_Region not written");
-}
-
-public void test_getFont() {
-	warnUnimpl("Test test_getFont not written");
-}
-
-public void test_getFontMetrics() {
-	warnUnimpl("Test test_getFontMetrics not written");
-}
-
-public void test_getForeground() {
-	warnUnimpl("Test test_getForeground not written");
-}
-
-public void test_getLineStyle() {
-	warnUnimpl("Test test_getLineStyle not written");
-}
-
-public void test_getLineWidth() {
-	warnUnimpl("Test test_getLineWidth not written");
-}
-
-public void test_getXORMode() {
-	warnUnimpl("Test test_getXORMode not written");
-}
-
-public void test_hashCode() {
-	warnUnimpl("Test test_hashCode not written");
-}
-
-public void test_isClipped() {
-	warnUnimpl("Test test_isClipped not written");
-}
-
-public void test_isDisposed() {
-	warnUnimpl("Test test_isDisposed not written");
-}
-
-public void test_setBackgroundLorg_eclipse_swt_graphics_Color() {
-	warnUnimpl("Test test_setBackgroundLorg_eclipse_swt_graphics_Color not written");
-}
-
-public void test_setClippingIIII() {
-	warnUnimpl("Test test_setClippingIIII not written");
-}
-
-public void test_setClippingLorg_eclipse_swt_graphics_Rectangle() {
-	warnUnimpl("Test test_setClippingLorg_eclipse_swt_graphics_Rectangle not written");
-}
-
-public void test_setClippingLorg_eclipse_swt_graphics_Region() {
-	warnUnimpl("Test test_setClippingLorg_eclipse_swt_graphics_Region not written");
-}
-
-public void test_setFontLorg_eclipse_swt_graphics_Font() {
-	warnUnimpl("Test test_setFontLorg_eclipse_swt_graphics_Font not written");
-}
-
-public void test_setForegroundLorg_eclipse_swt_graphics_Color() {
-	warnUnimpl("Test test_setForegroundLorg_eclipse_swt_graphics_Color not written");
-}
-
-public void test_setLineStyleI() {
-	warnUnimpl("Test test_setLineStyleI not written");
-}
-
-public void test_setLineWidthI() {
-	warnUnimpl("Test test_setLineWidthI not written");
-}
-
-public void test_setXORModeZ() {
-	warnUnimpl("Test test_setXORModeZ not written");
-}
-
-public void test_stringExtentLjava_lang_String() {
-	warnUnimpl("Test test_stringExtentLjava_lang_String not written");
-}
-
-public void test_textExtentLjava_lang_String() {
-	warnUnimpl("Test test_textExtentLjava_lang_String not written");
-}
-
-public void test_toString() {
-	warnUnimpl("Test test_toString not written");
-}
-
-public void test_win32_newLorg_eclipse_swt_graphics_DrawableLorg_eclipse_swt_graphics_GCData() {
-	// do not test - Windows only
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_graphics_GC((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_graphics_Drawable");
-	methodNames.addElement("test_copyAreaLorg_eclipse_swt_graphics_ImageII");
-	methodNames.addElement("test_copyAreaIIIIII");
-	methodNames.addElement("test_dispose");
-	methodNames.addElement("test_drawArcIIIIII");
-	methodNames.addElement("test_drawFocusIIII");
-	methodNames.addElement("test_drawImageLorg_eclipse_swt_graphics_ImageII");
-	methodNames.addElement("test_drawImageLorg_eclipse_swt_graphics_ImageIIIIIIII");
-	methodNames.addElement("test_drawLineIIII");
-	methodNames.addElement("test_drawOvalIIII");
-	methodNames.addElement("test_drawPolygon$I");
-	methodNames.addElement("test_drawPolyline$I");
-	methodNames.addElement("test_drawRectangleIIII");
-	methodNames.addElement("test_drawRectangleLorg_eclipse_swt_graphics_Rectangle");
-	methodNames.addElement("test_drawRoundRectangleIIIIII");
-	methodNames.addElement("test_drawStringLjava_lang_StringII");
-	methodNames.addElement("test_drawStringLjava_lang_StringIIZ");
-	methodNames.addElement("test_drawTextLjava_lang_StringII");
-	methodNames.addElement("test_drawTextLjava_lang_StringIIZ");
-	methodNames.addElement("test_equalsLjava_lang_Object");
-	methodNames.addElement("test_fillArcIIIIII");
-	methodNames.addElement("test_fillGradientRectangleIIIIZ");
-	methodNames.addElement("test_fillOvalIIII");
-	methodNames.addElement("test_fillPolygon$I");
-	methodNames.addElement("test_fillRectangleIIII");
-	methodNames.addElement("test_fillRectangleLorg_eclipse_swt_graphics_Rectangle");
-	methodNames.addElement("test_fillRoundRectangleIIIIII");
-	methodNames.addElement("test_getAdvanceWidthC");
-	methodNames.addElement("test_getBackground");
-	methodNames.addElement("test_getCharWidthC");
-	methodNames.addElement("test_getClipping");
-	methodNames.addElement("test_getClippingLorg_eclipse_swt_graphics_Region");
-	methodNames.addElement("test_getFont");
-	methodNames.addElement("test_getFontMetrics");
-	methodNames.addElement("test_getForeground");
-	methodNames.addElement("test_getLineStyle");
-	methodNames.addElement("test_getLineWidth");
-	methodNames.addElement("test_getXORMode");
-	methodNames.addElement("test_hashCode");
-	methodNames.addElement("test_isClipped");
-	methodNames.addElement("test_isDisposed");
-	methodNames.addElement("test_setBackgroundLorg_eclipse_swt_graphics_Color");
-	methodNames.addElement("test_setClippingIIII");
-	methodNames.addElement("test_setClippingLorg_eclipse_swt_graphics_Rectangle");
-	methodNames.addElement("test_setClippingLorg_eclipse_swt_graphics_Region");
-	methodNames.addElement("test_setFontLorg_eclipse_swt_graphics_Font");
-	methodNames.addElement("test_setForegroundLorg_eclipse_swt_graphics_Color");
-	methodNames.addElement("test_setLineStyleI");
-	methodNames.addElement("test_setLineWidthI");
-	methodNames.addElement("test_setXORModeZ");
-	methodNames.addElement("test_stringExtentLjava_lang_String");
-	methodNames.addElement("test_textExtentLjava_lang_String");
-	methodNames.addElement("test_toString");
-	methodNames.addElement("test_win32_newLorg_eclipse_swt_graphics_DrawableLorg_eclipse_swt_graphics_GCData");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_graphics_Drawable")) test_ConstructorLorg_eclipse_swt_graphics_Drawable();
-	else if (getName().equals("test_copyAreaLorg_eclipse_swt_graphics_ImageII")) test_copyAreaLorg_eclipse_swt_graphics_ImageII();
-	else if (getName().equals("test_copyAreaIIIIII")) test_copyAreaIIIIII();
-	else if (getName().equals("test_dispose")) test_dispose();
-	else if (getName().equals("test_drawArcIIIIII")) test_drawArcIIIIII();
-	else if (getName().equals("test_drawFocusIIII")) test_drawFocusIIII();
-	else if (getName().equals("test_drawImageLorg_eclipse_swt_graphics_ImageII")) test_drawImageLorg_eclipse_swt_graphics_ImageII();
-	else if (getName().equals("test_drawImageLorg_eclipse_swt_graphics_ImageIIIIIIII")) test_drawImageLorg_eclipse_swt_graphics_ImageIIIIIIII();
-	else if (getName().equals("test_drawLineIIII")) test_drawLineIIII();
-	else if (getName().equals("test_drawOvalIIII")) test_drawOvalIIII();
-	else if (getName().equals("test_drawPolygon$I")) test_drawPolygon$I();
-	else if (getName().equals("test_drawPolyline$I")) test_drawPolyline$I();
-	else if (getName().equals("test_drawRectangleIIII")) test_drawRectangleIIII();
-	else if (getName().equals("test_drawRectangleLorg_eclipse_swt_graphics_Rectangle")) test_drawRectangleLorg_eclipse_swt_graphics_Rectangle();
-	else if (getName().equals("test_drawRoundRectangleIIIIII")) test_drawRoundRectangleIIIIII();
-	else if (getName().equals("test_drawStringLjava_lang_StringII")) test_drawStringLjava_lang_StringII();
-	else if (getName().equals("test_drawStringLjava_lang_StringIIZ")) test_drawStringLjava_lang_StringIIZ();
-	else if (getName().equals("test_drawTextLjava_lang_StringII")) test_drawTextLjava_lang_StringII();
-	else if (getName().equals("test_drawTextLjava_lang_StringIIZ")) test_drawTextLjava_lang_StringIIZ();
-	else if (getName().equals("test_equalsLjava_lang_Object")) test_equalsLjava_lang_Object();
-	else if (getName().equals("test_fillArcIIIIII")) test_fillArcIIIIII();
-	else if (getName().equals("test_fillGradientRectangleIIIIZ")) test_fillGradientRectangleIIIIZ();
-	else if (getName().equals("test_fillOvalIIII")) test_fillOvalIIII();
-	else if (getName().equals("test_fillPolygon$I")) test_fillPolygon$I();
-	else if (getName().equals("test_fillRectangleIIII")) test_fillRectangleIIII();
-	else if (getName().equals("test_fillRectangleLorg_eclipse_swt_graphics_Rectangle")) test_fillRectangleLorg_eclipse_swt_graphics_Rectangle();
-	else if (getName().equals("test_fillRoundRectangleIIIIII")) test_fillRoundRectangleIIIIII();
-	else if (getName().equals("test_getAdvanceWidthC")) test_getAdvanceWidthC();
-	else if (getName().equals("test_getBackground")) test_getBackground();
-	else if (getName().equals("test_getCharWidthC")) test_getCharWidthC();
-	else if (getName().equals("test_getClipping")) test_getClipping();
-	else if (getName().equals("test_getClippingLorg_eclipse_swt_graphics_Region")) test_getClippingLorg_eclipse_swt_graphics_Region();
-	else if (getName().equals("test_getFont")) test_getFont();
-	else if (getName().equals("test_getFontMetrics")) test_getFontMetrics();
-	else if (getName().equals("test_getForeground")) test_getForeground();
-	else if (getName().equals("test_getLineStyle")) test_getLineStyle();
-	else if (getName().equals("test_getLineWidth")) test_getLineWidth();
-	else if (getName().equals("test_getXORMode")) test_getXORMode();
-	else if (getName().equals("test_hashCode")) test_hashCode();
-	else if (getName().equals("test_isClipped")) test_isClipped();
-	else if (getName().equals("test_isDisposed")) test_isDisposed();
-	else if (getName().equals("test_setBackgroundLorg_eclipse_swt_graphics_Color")) test_setBackgroundLorg_eclipse_swt_graphics_Color();
-	else if (getName().equals("test_setClippingIIII")) test_setClippingIIII();
-	else if (getName().equals("test_setClippingLorg_eclipse_swt_graphics_Rectangle")) test_setClippingLorg_eclipse_swt_graphics_Rectangle();
-	else if (getName().equals("test_setClippingLorg_eclipse_swt_graphics_Region")) test_setClippingLorg_eclipse_swt_graphics_Region();
-	else if (getName().equals("test_setFontLorg_eclipse_swt_graphics_Font")) test_setFontLorg_eclipse_swt_graphics_Font();
-	else if (getName().equals("test_setForegroundLorg_eclipse_swt_graphics_Color")) test_setForegroundLorg_eclipse_swt_graphics_Color();
-	else if (getName().equals("test_setLineStyleI")) test_setLineStyleI();
-	else if (getName().equals("test_setLineWidthI")) test_setLineWidthI();
-	else if (getName().equals("test_setXORModeZ")) test_setXORModeZ();
-	else if (getName().equals("test_stringExtentLjava_lang_String")) test_stringExtentLjava_lang_String();
-	else if (getName().equals("test_textExtentLjava_lang_String")) test_textExtentLjava_lang_String();
-	else if (getName().equals("test_toString")) test_toString();
-	else if (getName().equals("test_win32_newLorg_eclipse_swt_graphics_DrawableLorg_eclipse_swt_graphics_GCData")) test_win32_newLorg_eclipse_swt_graphics_DrawableLorg_eclipse_swt_graphics_GCData();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_GCData.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_GCData.java
deleted file mode 100644
index 432a5e7..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_GCData.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.graphics.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.graphics.GCData
- *
- * @see org.eclipse.swt.graphics.GCData
- */
-public class Test_org_eclipse_swt_graphics_GCData extends SwtTestCase {
-
-public Test_org_eclipse_swt_graphics_GCData(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_Constructor() {
-	warnUnimpl("Test test_Constructor not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_graphics_GCData((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_Constructor");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_Constructor")) test_Constructor();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_Image.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_Image.java
deleted file mode 100644
index 360b693..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_Image.java
+++ /dev/null
@@ -1,177 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.graphics.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.graphics.Image
- *
- * @see org.eclipse.swt.graphics.Image
- */
-public class Test_org_eclipse_swt_graphics_Image extends SwtTestCase {
-
-Display display;
-
-public Test_org_eclipse_swt_graphics_Image(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	display = new Display();
-}
-
-protected void tearDown() {
-	display.dispose();
-}
-
-public void test_ConstructorLorg_eclipse_swt_graphics_DeviceII() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_graphics_DeviceII not written");
-}
-
-public void test_ConstructorLorg_eclipse_swt_graphics_DeviceLorg_eclipse_swt_graphics_ImageI() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_graphics_DeviceLorg_eclipse_swt_graphics_ImageI not written");
-}
-
-public void test_ConstructorLorg_eclipse_swt_graphics_DeviceLorg_eclipse_swt_graphics_Rectangle() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_graphics_DeviceLorg_eclipse_swt_graphics_Rectangle not written");
-}
-
-public void test_ConstructorLorg_eclipse_swt_graphics_DeviceLorg_eclipse_swt_graphics_ImageData() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_graphics_DeviceLorg_eclipse_swt_graphics_ImageData not written");
-}
-
-public void test_ConstructorLorg_eclipse_swt_graphics_DeviceLorg_eclipse_swt_graphics_ImageDataLorg_eclipse_swt_graphics_ImageData() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_graphics_DeviceLorg_eclipse_swt_graphics_ImageDataLorg_eclipse_swt_graphics_ImageData not written");
-}
-
-public void test_ConstructorLorg_eclipse_swt_graphics_DeviceLjava_io_InputStream() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_graphics_DeviceLjava_io_InputStream not written");
-}
-
-public void test_ConstructorLorg_eclipse_swt_graphics_DeviceLjava_lang_String() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_graphics_DeviceLjava_lang_String not written");
-}
-
-public void test_dispose() {
-	warnUnimpl("Test test_dispose not written");
-}
-
-public void test_equalsLjava_lang_Object() {
-	warnUnimpl("Test test_equalsLjava_lang_Object not written");
-}
-
-public void test_getBackground() {
-	warnUnimpl("Test test_getBackground not written");
-}
-
-public void test_getBounds() {
-	warnUnimpl("Test test_getBounds not written");
-}
-
-public void test_getImageData() {
-	ImageLoader loader = new ImageLoader();
-	ImageData data1 = loader.load(SwtTestCase.class.getResourceAsStream("dot.gif"))[0];
-
-	Image image = new Image(display, data1);
-	ImageData data2 = image.getImageData();
-	
-	assertEquals("Image width should be the same", data1.width, data2.width);
-	assertEquals("Image height should be the same", data1.height, data2.height);
-}
-
-public void test_hashCode() {
-	warnUnimpl("Test test_hashCode not written");
-}
-
-public void test_internal_new_GCLorg_eclipse_swt_graphics_GCData() {
-	warnUnimpl("Test test_internal_new_GCLorg_eclipse_swt_graphics_GCData not written");
-}
-
-public void test_internal_dispose_GCILorg_eclipse_swt_graphics_GCData() {
-	warnUnimpl("Test test_internal_dispose_GCILorg_eclipse_swt_graphics_GCData not written");
-}
-
-public void test_isDisposed() {
-	warnUnimpl("Test test_isDisposed not written");
-}
-
-public void test_setBackgroundLorg_eclipse_swt_graphics_Color() {
-	warnUnimpl("Test test_setBackgroundLorg_eclipse_swt_graphics_Color not written");
-}
-
-public void test_toString() {
-	warnUnimpl("Test test_toString not written");
-}
-
-public void test_win32_newLorg_eclipse_swt_graphics_DeviceII() {
-	// do not test - Windows only
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_graphics_Image((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_graphics_DeviceII");
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_graphics_DeviceLorg_eclipse_swt_graphics_ImageI");
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_graphics_DeviceLorg_eclipse_swt_graphics_Rectangle");
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_graphics_DeviceLorg_eclipse_swt_graphics_ImageData");
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_graphics_DeviceLorg_eclipse_swt_graphics_ImageDataLorg_eclipse_swt_graphics_ImageData");
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_graphics_DeviceLjava_io_InputStream");
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_graphics_DeviceLjava_lang_String");
-	methodNames.addElement("test_dispose");
-	methodNames.addElement("test_equalsLjava_lang_Object");
-	methodNames.addElement("test_getBackground");
-	methodNames.addElement("test_getBounds");
-	methodNames.addElement("test_getImageData");
-	methodNames.addElement("test_hashCode");
-	methodNames.addElement("test_internal_new_GCLorg_eclipse_swt_graphics_GCData");
-	methodNames.addElement("test_internal_dispose_GCILorg_eclipse_swt_graphics_GCData");
-	methodNames.addElement("test_isDisposed");
-	methodNames.addElement("test_setBackgroundLorg_eclipse_swt_graphics_Color");
-	methodNames.addElement("test_toString");
-	methodNames.addElement("test_win32_newLorg_eclipse_swt_graphics_DeviceII");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_graphics_DeviceII")) test_ConstructorLorg_eclipse_swt_graphics_DeviceII();
-	else if (getName().equals("test_ConstructorLorg_eclipse_swt_graphics_DeviceLorg_eclipse_swt_graphics_ImageI")) test_ConstructorLorg_eclipse_swt_graphics_DeviceLorg_eclipse_swt_graphics_ImageI();
-	else if (getName().equals("test_ConstructorLorg_eclipse_swt_graphics_DeviceLorg_eclipse_swt_graphics_Rectangle")) test_ConstructorLorg_eclipse_swt_graphics_DeviceLorg_eclipse_swt_graphics_Rectangle();
-	else if (getName().equals("test_ConstructorLorg_eclipse_swt_graphics_DeviceLorg_eclipse_swt_graphics_ImageData")) test_ConstructorLorg_eclipse_swt_graphics_DeviceLorg_eclipse_swt_graphics_ImageData();
-	else if (getName().equals("test_ConstructorLorg_eclipse_swt_graphics_DeviceLorg_eclipse_swt_graphics_ImageDataLorg_eclipse_swt_graphics_ImageData")) test_ConstructorLorg_eclipse_swt_graphics_DeviceLorg_eclipse_swt_graphics_ImageDataLorg_eclipse_swt_graphics_ImageData();
-	else if (getName().equals("test_ConstructorLorg_eclipse_swt_graphics_DeviceLjava_io_InputStream")) test_ConstructorLorg_eclipse_swt_graphics_DeviceLjava_io_InputStream();
-	else if (getName().equals("test_ConstructorLorg_eclipse_swt_graphics_DeviceLjava_lang_String")) test_ConstructorLorg_eclipse_swt_graphics_DeviceLjava_lang_String();
-	else if (getName().equals("test_dispose")) test_dispose();
-	else if (getName().equals("test_equalsLjava_lang_Object")) test_equalsLjava_lang_Object();
-	else if (getName().equals("test_getBackground")) test_getBackground();
-	else if (getName().equals("test_getBounds")) test_getBounds();
-	else if (getName().equals("test_getImageData")) test_getImageData();
-	else if (getName().equals("test_hashCode")) test_hashCode();
-	else if (getName().equals("test_internal_new_GCLorg_eclipse_swt_graphics_GCData")) test_internal_new_GCLorg_eclipse_swt_graphics_GCData();
-	else if (getName().equals("test_internal_dispose_GCILorg_eclipse_swt_graphics_GCData")) test_internal_dispose_GCILorg_eclipse_swt_graphics_GCData();
-	else if (getName().equals("test_isDisposed")) test_isDisposed();
-	else if (getName().equals("test_setBackgroundLorg_eclipse_swt_graphics_Color")) test_setBackgroundLorg_eclipse_swt_graphics_Color();
-	else if (getName().equals("test_toString")) test_toString();
-	else if (getName().equals("test_win32_newLorg_eclipse_swt_graphics_DeviceII")) test_win32_newLorg_eclipse_swt_graphics_DeviceII();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_ImageData.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_ImageData.java
deleted file mode 100644
index 1ab02d8..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_ImageData.java
+++ /dev/null
@@ -1,170 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.graphics.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.graphics.ImageData
- *
- * @see org.eclipse.swt.graphics.ImageData
- */
-public class Test_org_eclipse_swt_graphics_ImageData extends SwtTestCase {
-
-public Test_org_eclipse_swt_graphics_ImageData(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_ConstructorIIILorg_eclipse_swt_graphics_PaletteData() {
-	warnUnimpl("Test test_ConstructorIIILorg_eclipse_swt_graphics_PaletteData not written");
-}
-
-public void test_ConstructorIIILorg_eclipse_swt_graphics_PaletteDataI$B() {
-	warnUnimpl("Test test_ConstructorIIILorg_eclipse_swt_graphics_PaletteDataI$B not written");
-}
-
-public void test_ConstructorLjava_io_InputStream() {
-	warnUnimpl("Test test_ConstructorLjava_io_InputStream not written");
-}
-
-public void test_ConstructorLjava_lang_String() {
-	warnUnimpl("Test test_ConstructorLjava_lang_String not written");
-}
-
-public void test_internal_newIIILorg_eclipse_swt_graphics_PaletteDataI$BI$B$BIIIIIII() {
-	warnUnimpl("Test test_internal_newIIILorg_eclipse_swt_graphics_PaletteDataI$BI$B$BIIIIIII not written");
-}
-
-public void test_clone() {
-	warnUnimpl("Test test_clone not written");
-}
-
-public void test_getAlphaII() {
-	warnUnimpl("Test test_getAlphaII not written");
-}
-
-public void test_getAlphasIII$BI() {
-	warnUnimpl("Test test_getAlphasIII$BI not written");
-}
-
-public void test_getPixelII() {
-	warnUnimpl("Test test_getPixelII not written");
-}
-
-public void test_getPixelsIII$BI() {
-	warnUnimpl("Test test_getPixelsIII$BI not written");
-}
-
-public void test_getPixelsIII$II() {
-	warnUnimpl("Test test_getPixelsIII$II not written");
-}
-
-public void test_getRGBs() {
-	warnUnimpl("Test test_getRGBs not written");
-}
-
-public void test_getTransparencyMask() {
-	warnUnimpl("Test test_getTransparencyMask not written");
-}
-
-public void test_getTransparencyType() {
-	warnUnimpl("Test test_getTransparencyType not written");
-}
-
-public void test_scaledToII() {
-	warnUnimpl("Test test_scaledToII not written");
-}
-
-public void test_setAlphaIII() {
-	warnUnimpl("Test test_setAlphaIII not written");
-}
-
-public void test_setAlphasIII$BI() {
-	warnUnimpl("Test test_setAlphasIII$BI not written");
-}
-
-public void test_setPixelIII() {
-	warnUnimpl("Test test_setPixelIII not written");
-}
-
-public void test_setPixelsIII$BI() {
-	warnUnimpl("Test test_setPixelsIII$BI not written");
-}
-
-public void test_setPixelsIII$II() {
-	warnUnimpl("Test test_setPixelsIII$II not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_graphics_ImageData((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorIIILorg_eclipse_swt_graphics_PaletteData");
-	methodNames.addElement("test_ConstructorIIILorg_eclipse_swt_graphics_PaletteDataI$B");
-	methodNames.addElement("test_ConstructorLjava_io_InputStream");
-	methodNames.addElement("test_ConstructorLjava_lang_String");
-	methodNames.addElement("test_internal_newIIILorg_eclipse_swt_graphics_PaletteDataI$BI$B$BIIIIIII");
-	methodNames.addElement("test_clone");
-	methodNames.addElement("test_getAlphaII");
-	methodNames.addElement("test_getAlphasIII$BI");
-	methodNames.addElement("test_getPixelII");
-	methodNames.addElement("test_getPixelsIII$BI");
-	methodNames.addElement("test_getPixelsIII$II");
-	methodNames.addElement("test_getRGBs");
-	methodNames.addElement("test_getTransparencyMask");
-	methodNames.addElement("test_getTransparencyType");
-	methodNames.addElement("test_scaledToII");
-	methodNames.addElement("test_setAlphaIII");
-	methodNames.addElement("test_setAlphasIII$BI");
-	methodNames.addElement("test_setPixelIII");
-	methodNames.addElement("test_setPixelsIII$BI");
-	methodNames.addElement("test_setPixelsIII$II");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorIIILorg_eclipse_swt_graphics_PaletteData")) test_ConstructorIIILorg_eclipse_swt_graphics_PaletteData();
-	else if (getName().equals("test_ConstructorIIILorg_eclipse_swt_graphics_PaletteDataI$B")) test_ConstructorIIILorg_eclipse_swt_graphics_PaletteDataI$B();
-	else if (getName().equals("test_ConstructorLjava_io_InputStream")) test_ConstructorLjava_io_InputStream();
-	else if (getName().equals("test_ConstructorLjava_lang_String")) test_ConstructorLjava_lang_String();
-	else if (getName().equals("test_internal_newIIILorg_eclipse_swt_graphics_PaletteDataI$BI$B$BIIIIIII")) test_internal_newIIILorg_eclipse_swt_graphics_PaletteDataI$BI$B$BIIIIIII();
-	else if (getName().equals("test_clone")) test_clone();
-	else if (getName().equals("test_getAlphaII")) test_getAlphaII();
-	else if (getName().equals("test_getAlphasIII$BI")) test_getAlphasIII$BI();
-	else if (getName().equals("test_getPixelII")) test_getPixelII();
-	else if (getName().equals("test_getPixelsIII$BI")) test_getPixelsIII$BI();
-	else if (getName().equals("test_getPixelsIII$II")) test_getPixelsIII$II();
-	else if (getName().equals("test_getRGBs")) test_getRGBs();
-	else if (getName().equals("test_getTransparencyMask")) test_getTransparencyMask();
-	else if (getName().equals("test_getTransparencyType")) test_getTransparencyType();
-	else if (getName().equals("test_scaledToII")) test_scaledToII();
-	else if (getName().equals("test_setAlphaIII")) test_setAlphaIII();
-	else if (getName().equals("test_setAlphasIII$BI")) test_setAlphasIII$BI();
-	else if (getName().equals("test_setPixelIII")) test_setPixelIII();
-	else if (getName().equals("test_setPixelsIII$BI")) test_setPixelsIII$BI();
-	else if (getName().equals("test_setPixelsIII$II")) test_setPixelsIII$II();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_ImageLoader.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_ImageLoader.java
deleted file mode 100644
index f98b348..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_ImageLoader.java
+++ /dev/null
@@ -1,104 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.graphics.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.graphics.ImageLoader
- *
- * @see org.eclipse.swt.graphics.ImageLoader
- */
-public class Test_org_eclipse_swt_graphics_ImageLoader extends SwtTestCase {
-
-public Test_org_eclipse_swt_graphics_ImageLoader(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_Constructor() {
-	warnUnimpl("Test test_Constructor not written");
-}
-
-public void test_loadLjava_io_InputStream() {
-	warnUnimpl("Test test_loadLjava_io_InputStream not written");
-}
-
-public void test_loadLjava_lang_String() {
-	warnUnimpl("Test test_loadLjava_lang_String not written");
-}
-
-public void test_saveLjava_io_OutputStreamI() {
-	warnUnimpl("Test test_saveLjava_io_OutputStreamI not written");
-}
-
-public void test_saveLjava_lang_StringI() {
-	warnUnimpl("Test test_saveLjava_lang_StringI not written");
-}
-
-public void test_addImageLoaderListenerLorg_eclipse_swt_graphics_ImageLoaderListener() {
-	warnUnimpl("Test test_addImageLoaderListenerLorg_eclipse_swt_graphics_ImageLoaderListener not written");
-}
-
-public void test_removeImageLoaderListenerLorg_eclipse_swt_graphics_ImageLoaderListener() {
-	warnUnimpl("Test test_removeImageLoaderListenerLorg_eclipse_swt_graphics_ImageLoaderListener not written");
-}
-
-public void test_hasListeners() {
-	warnUnimpl("Test test_hasListeners not written");
-}
-
-public void test_notifyListenersLorg_eclipse_swt_graphics_ImageLoaderEvent() {
-	warnUnimpl("Test test_notifyListenersLorg_eclipse_swt_graphics_ImageLoaderEvent not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_graphics_ImageLoader((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_Constructor");
-	methodNames.addElement("test_loadLjava_io_InputStream");
-	methodNames.addElement("test_loadLjava_lang_String");
-	methodNames.addElement("test_saveLjava_io_OutputStreamI");
-	methodNames.addElement("test_saveLjava_lang_StringI");
-	methodNames.addElement("test_addImageLoaderListenerLorg_eclipse_swt_graphics_ImageLoaderListener");
-	methodNames.addElement("test_removeImageLoaderListenerLorg_eclipse_swt_graphics_ImageLoaderListener");
-	methodNames.addElement("test_hasListeners");
-	methodNames.addElement("test_notifyListenersLorg_eclipse_swt_graphics_ImageLoaderEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_Constructor")) test_Constructor();
-	else if (getName().equals("test_loadLjava_io_InputStream")) test_loadLjava_io_InputStream();
-	else if (getName().equals("test_loadLjava_lang_String")) test_loadLjava_lang_String();
-	else if (getName().equals("test_saveLjava_io_OutputStreamI")) test_saveLjava_io_OutputStreamI();
-	else if (getName().equals("test_saveLjava_lang_StringI")) test_saveLjava_lang_StringI();
-	else if (getName().equals("test_addImageLoaderListenerLorg_eclipse_swt_graphics_ImageLoaderListener")) test_addImageLoaderListenerLorg_eclipse_swt_graphics_ImageLoaderListener();
-	else if (getName().equals("test_removeImageLoaderListenerLorg_eclipse_swt_graphics_ImageLoaderListener")) test_removeImageLoaderListenerLorg_eclipse_swt_graphics_ImageLoaderListener();
-	else if (getName().equals("test_hasListeners")) test_hasListeners();
-	else if (getName().equals("test_notifyListenersLorg_eclipse_swt_graphics_ImageLoaderEvent")) test_notifyListenersLorg_eclipse_swt_graphics_ImageLoaderEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_ImageLoaderEvent.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_ImageLoaderEvent.java
deleted file mode 100644
index 5d3ee58..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_ImageLoaderEvent.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.graphics.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.graphics.ImageLoaderEvent
- *
- * @see org.eclipse.swt.graphics.ImageLoaderEvent
- */
-public class Test_org_eclipse_swt_graphics_ImageLoaderEvent extends SwtTestCase {
-
-public Test_org_eclipse_swt_graphics_ImageLoaderEvent(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_ConstructorLorg_eclipse_swt_graphics_ImageLoaderLorg_eclipse_swt_graphics_ImageDataIZ() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_graphics_ImageLoaderLorg_eclipse_swt_graphics_ImageDataIZ not written");
-}
-
-public void test_toString() {
-	warnUnimpl("Test test_toString not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_graphics_ImageLoaderEvent((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_graphics_ImageLoaderLorg_eclipse_swt_graphics_ImageDataIZ");
-	methodNames.addElement("test_toString");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_graphics_ImageLoaderLorg_eclipse_swt_graphics_ImageDataIZ")) test_ConstructorLorg_eclipse_swt_graphics_ImageLoaderLorg_eclipse_swt_graphics_ImageDataIZ();
-	else if (getName().equals("test_toString")) test_toString();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_ImageLoaderListener.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_ImageLoaderListener.java
deleted file mode 100644
index c7955e7..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_ImageLoaderListener.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.graphics.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.graphics.ImageLoaderListener
- *
- * @see org.eclipse.swt.graphics.ImageLoaderListener
- */
-public class Test_org_eclipse_swt_graphics_ImageLoaderListener extends SwtTestCase {
-
-public Test_org_eclipse_swt_graphics_ImageLoaderListener(String name) {
-	super(name);
-}
-
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_imageDataLoadedLorg_eclipse_swt_graphics_ImageLoaderEvent() {
-	warnUnimpl("Test test_imageDataLoadedLorg_eclipse_swt_graphics_ImageLoaderEvent not written");
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_imageDataLoadedLorg_eclipse_swt_graphics_ImageLoaderEvent");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_imageDataLoadedLorg_eclipse_swt_graphics_ImageLoaderEvent")) test_imageDataLoadedLorg_eclipse_swt_graphics_ImageLoaderEvent();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_PaletteData.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_PaletteData.java
deleted file mode 100644
index 5b75ab7..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_PaletteData.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.graphics.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.graphics.PaletteData
- *
- * @see org.eclipse.swt.graphics.PaletteData
- */
-public class Test_org_eclipse_swt_graphics_PaletteData extends SwtTestCase {
-
-public Test_org_eclipse_swt_graphics_PaletteData(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_Constructor$Lorg_eclipse_swt_graphics_RGB() {
-	warnUnimpl("Test test_Constructor$Lorg_eclipse_swt_graphics_RGB not written");
-}
-
-public void test_ConstructorIII() {
-	warnUnimpl("Test test_ConstructorIII not written");
-}
-
-public void test_getPixelLorg_eclipse_swt_graphics_RGB() {
-	warnUnimpl("Test test_getPixelLorg_eclipse_swt_graphics_RGB not written");
-}
-
-public void test_getRGBI() {
-	warnUnimpl("Test test_getRGBI not written");
-}
-
-public void test_getRGBs() {
-	warnUnimpl("Test test_getRGBs not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_graphics_PaletteData((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_Constructor$Lorg_eclipse_swt_graphics_RGB");
-	methodNames.addElement("test_ConstructorIII");
-	methodNames.addElement("test_getPixelLorg_eclipse_swt_graphics_RGB");
-	methodNames.addElement("test_getRGBI");
-	methodNames.addElement("test_getRGBs");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_Constructor$Lorg_eclipse_swt_graphics_RGB")) test_Constructor$Lorg_eclipse_swt_graphics_RGB();
-	else if (getName().equals("test_ConstructorIII")) test_ConstructorIII();
-	else if (getName().equals("test_getPixelLorg_eclipse_swt_graphics_RGB")) test_getPixelLorg_eclipse_swt_graphics_RGB();
-	else if (getName().equals("test_getRGBI")) test_getRGBI();
-	else if (getName().equals("test_getRGBs")) test_getRGBs();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_Point.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_Point.java
deleted file mode 100644
index d7c94bd..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_Point.java
+++ /dev/null
@@ -1,100 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.graphics.Point
- *
- * @see org.eclipse.swt.graphics.Point
- */
-public class Test_org_eclipse_swt_graphics_Point extends SwtTestCase {
-
-public Test_org_eclipse_swt_graphics_Point(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_ConstructorII(){
-	// Test new Point (int x, int y)
-	Point p = new Point(3, 4);
-	assertEquals(3, p.x);
-	assertEquals(4, p.y);
-
-	p = new Point(-4, -3);
-	assertEquals(-4, p.x);
-	assertEquals(-3, p.y);
-
-	p = new Point(500000, 700000);
-	assertEquals(500000, p.x);
-	assertEquals(700000, p.y);
-}
-
-public void test_equalsLjava_lang_Object(){
-	Point p1 = new Point(5, 5);
-	Point p2 = new Point(5, 5);
-	assertTrue("Points should be equal", p1.equals(p2));
-
-	p1 = new Point(-5, -5);
-	p2 = new Point(-5, -5);
-	assertTrue("Points should be equal", p1.equals(p2));
-
-	p2 = new Point(3, 4);
-	assertTrue("Points should not be equal", !p1.equals(p2));
-}
-
-public void test_hashCode(){
-	Point p1 = new Point(5, 5);
-	Point p2 = new Point(5, 5);
-	assertTrue("Points should have the same hashCode", p1.hashCode() == p2.hashCode());
-}
-
-public void test_toString(){
-	Point p = new Point(3, 4);
-	assertNotNull(p.toString());
-	assertTrue(p.toString().length() > 0);
-	assertEquals("Point {3, 4}", p.toString());
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_graphics_Point((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorII");
-	methodNames.addElement("test_equalsLjava_lang_Object");
-	methodNames.addElement("test_hashCode");
-	methodNames.addElement("test_toString");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorII")) test_ConstructorII();
-	else if (getName().equals("test_equalsLjava_lang_Object")) test_equalsLjava_lang_Object();
-	else if (getName().equals("test_hashCode")) test_hashCode();
-	else if (getName().equals("test_toString")) test_toString();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_RGB.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_RGB.java
deleted file mode 100644
index 3458daf..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_RGB.java
+++ /dev/null
@@ -1,161 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.graphics.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.graphics.RGB
- *
- * @see org.eclipse.swt.graphics.RGB
- */
-public class Test_org_eclipse_swt_graphics_RGB extends SwtTestCase {
-
-public Test_org_eclipse_swt_graphics_RGB(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_ConstructorIII() {
-	// Test RGB(int red, int green, int blue)
-	RGB rgb = new RGB(20,100,200);
-	
-	rgb = new RGB(0,0,0);
-
-	rgb = new RGB(255,255,255);
-
-	try {
-		rgb = new RGB(-1, 20, 50);
-		fail("No exception thrown for red < 0");
-	}
-	catch (IllegalArgumentException e) {
-	}
-	
-	try {
-		rgb = new RGB(256, 20, 50);
-		fail("No exception thrown for red > 255");
-	}
-	catch (IllegalArgumentException e) {
-	}
-	
-	try {
-		rgb = new RGB(20, -1, 50);
-		fail("No exception thrown for green < 0");
-	}
-	catch (IllegalArgumentException e) {
-	}
-	
-	try {
-		rgb = new RGB(20, 256, 50);
-		fail("No exception thrown for green > 255");
-	}
-	catch (IllegalArgumentException e) {
-	}
-
-	try {
-		rgb = new RGB(20, 50, -1);
-		fail("No exception thrown for blue < 0");
-	}
-	catch (IllegalArgumentException e) {
-	}
-	
-	try {
-		rgb = new RGB(20, 50, 256);
-		fail("No exception thrown for blue > 255");
-	}
-	catch (IllegalArgumentException e) {
-	}
-			
-}
-
-public void test_equalsLjava_lang_Object() {
-	int r = 0, g = 127, b = 254;
-	RGB rgb1 = new RGB(r, g, b);
-	RGB rgb2;
-	
-	rgb2 = rgb1;
-	if (!rgb1.equals(rgb2)) {
-		fail("Two references to the same RGB instance not found equal");
-	}
-	
-	rgb2 = new RGB(r, g, b);
-	if (!rgb1.equals(rgb2)) {
-		fail("References to two different RGB instances with same R G B parameters not found equal");
-	}
-	
-	if (rgb1.equals(new RGB(r+1, g, b)) ||
-	    rgb1.equals(new RGB(r, g+1, b)) ||
-	    rgb1.equals(new RGB(r, g, b+1)) ||
-	    rgb1.equals(new RGB(r+1, g+1, b+1))) {
-		fail("Comparing two RGB instances with different combination of R G B parameters found equal");    	
-	}
-}
-
-public void test_hashCode() {
-	int r = 255, g = 100, b = 0;
-	RGB rgb1 = new RGB(r, g, b);
-	RGB rgb2 = new RGB(r, g, b);
-	
-	int hash1 = rgb1.hashCode();
-	int hash2 = rgb2.hashCode();
-	
-	if (hash1 != hash2) {
-		fail("Two RGB instances with same R G B parameters returned different hash codes");
-	}
-	
-	if (rgb1.hashCode() == new RGB(g, b, r).hashCode() ||
-		rgb1.hashCode() == new RGB(b, r, g).hashCode()) {
-		fail("Two RGB instances with different R G B parameters returned the same hash code");
-	}
-}
-
-public void test_toString() {
-	RGB rgb = new RGB(0, 100, 200);
-
-	String s = rgb.toString();
-	
-	if (s == null || s.length() == 0) {
-		fail("RGB.toString returns a null or empty String");
-	}
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_graphics_RGB((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorIII");
-	methodNames.addElement("test_equalsLjava_lang_Object");
-	methodNames.addElement("test_hashCode");
-	methodNames.addElement("test_toString");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorIII")) test_ConstructorIII();
-	else if (getName().equals("test_equalsLjava_lang_Object")) test_equalsLjava_lang_Object();
-	else if (getName().equals("test_hashCode")) test_hashCode();
-	else if (getName().equals("test_toString")) test_toString();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_Rectangle.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_Rectangle.java
deleted file mode 100644
index 0c05ffa..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_Rectangle.java
+++ /dev/null
@@ -1,322 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.graphics.Rectangle
- *
- * @see org.eclipse.swt.graphics.Rectangle
- */
-public class Test_org_eclipse_swt_graphics_Rectangle extends SwtTestCase {
-
-public Test_org_eclipse_swt_graphics_Rectangle(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_ConstructorIIII(){
-	// Test new Rectangle (int x, int y, int width, int height)
-	Rectangle r = new Rectangle(3, 4, 5, 6);
-	assertEquals(3, r.x);
-	assertEquals(4, r.y);
-	assertEquals(5, r.width);
-	assertEquals(6, r.height);
-
-	r = new Rectangle(-4, -3, -2, -1);
-	assertEquals(-4, r.x);
-	assertEquals(-3, r.y);
-	assertEquals(-2, r.width);
-	assertEquals(-1, r.height);
-
-	r = new Rectangle(500000, 700000, 200000, 100000);
-	assertEquals(500000, r.x);
-	assertEquals(700000, r.y);
-	assertEquals(200000, r.width);
-	assertEquals(100000, r.height);
-}
-
-/**
- * Destructively replaces the x, y, width and height values
- * in the receiver with ones which represent the union of the
- * rectangles specified by the receiver and the given rectangle.
- *
- * @exception IllegalArgumentException <ul>
- *    <li>ERROR_NULL_ARGUMENT - if the argument is null</li>
- * </ul>
- */
-public void test_addLorg_eclipse_swt_graphics_Rectangle(){
-	Rectangle r1 = new Rectangle(1, 2, 3, 4);
-	Rectangle r2 = new Rectangle(3, 3, 2, 2);
-	r1.add(r2);
-	assertEquals("Rectangle add incorrect", new Rectangle(1, 2, 4, 4), r1);
-
-	r1.add(r2);
-	assertEquals("Rectangle add incorrect", new Rectangle(1, 2, 4, 4), r1);
-	
-	r1 = new Rectangle(1, 2, 3, 4);
-	r2 = new Rectangle(3, 3, 0, 0);
-	r1.add(r2);
-	assertEquals("Rectangle add incorrect", new Rectangle(1, 2, 3, 4), r1);
-
-	r1 = new Rectangle(1, 2, 3, 4);
-	r2 = new Rectangle(6, 6, 0, 0);
-	r1.add(r2);
-	assertEquals("Rectangle add incorrect", new Rectangle(1, 2, 5, 4), r1);
-
-	try {
-		r1.add(null);
-		fail("No exception thrown for rectangle == null");
-	} catch (IllegalArgumentException e) {
-	}
-}
-
-/**
- * Returns <code>true</code> if the point specified by the
- * arguments is inside the area specified by the receiver.
- */
-public void test_containsII(){
-	Rectangle r = new Rectangle(1, 2, 3, 4);
-	assertTrue("Rectangle should contain point (1, 2)", r.contains(1, 2));
-
-	assertTrue("Rectangle should contain point (3, 4)", r.contains(3, 4));
-
-	assertTrue("Rectangle should contain point (3, 5)", r.contains(3, 5));
-
-//	assertTrue("Rectangle should contain point (3, 6)", r.contains(3, 6));
-//
-//	assertTrue("Rectangle should contain point (4, 5)", r.contains(4, 5));
-//
-//	assertTrue("Rectangle should contain point (4, 6)", r.contains(4, 6));
-
-	assertTrue("Rectangle should not contain point (9, 10)", !r.contains(9, 10));
-
-	assertTrue("Rectangle should not contain point (-1, -1)", !r.contains(-1, -1));
-}
-
-/**
- * Returns <code>true</code> if the given point is inside the
- * area specified by the receiver.
- *
- * @exception IllegalArgumentException <ul>
- *    <li>ERROR_NULL_ARGUMENT - if the argument is null</li>
- * </ul>
- */
-public void test_containsLorg_eclipse_swt_graphics_Point(){
-	Rectangle r = new Rectangle(1, 2, 3, 4);
-	assertTrue("Rectangle should contain Point(1, 2)", r.contains(new Point(1, 2)));
-
-	assertTrue("Rectangle should contain Point(3, 4)", r.contains(new Point(3, 4)));
-
-	assertTrue("Rectangle should contain point (3, 5)", r.contains(new Point(3, 5)));
-
-//	assertTrue("Rectangle should contain point (3, 6)", r.contains(new Point(3, 6)));
-//
-//	assertTrue("Rectangle should contain point (4, 5)", r.contains(new Point(4, 5)));
-//
-//	assertTrue("Rectangle should contain Point(4, 6)", r.contains(new Point(4, 6)));
-
-	assertTrue("Rectangle should not contain Point(9, 10)", !r.contains(new Point(9, 10)));
-
-	assertTrue("Rectangle should not contain point (-1, -1)", !r.contains(new Point(-1, -1)));
-
-	try {
-		r.contains(null);
-		fail("No exception thrown for rectangle == null");
-	} catch (IllegalArgumentException e) {
-	}
-}
-
-public void test_equalsLjava_lang_Object(){
-	Rectangle r1 = new Rectangle(5, 4, 3, 2);
-	Rectangle r2 = new Rectangle(5, 4, 3, 2);
-	assertTrue("Rectangles should be equal", r1.equals(r2));
-
-	r2 = new Rectangle(3, 4, 5, 6);
-	assertTrue("Rectangles should not be equal", !r1.equals(r2));
-
-	r2 = new Rectangle(2, 3, 4, 5);
-	assertTrue("Rectangles should not be equal", !r1.equals(r2));
-
-	r2 = new Rectangle(5, 4, 2, 3);
-	assertTrue("Rectangles should not be equal", !r1.equals(r2));
-
-	r2 = new Rectangle(4, 5, 3, 2);
-	assertTrue("Rectangles should not be equal", !r1.equals(r2));
-}
-
-public void test_hashCode(){
-	Rectangle r1 = new Rectangle(5, 4, 3, 2);
-	Rectangle r2 = new Rectangle(5, 4, 3, 2);
-	assertTrue("Rectangles should have the same hashCode", r1.hashCode() == r2.hashCode());
-}
-
-/**
- * Returns a new rectangle which represents the intersection
- * of the receiver and the given rectangle. 
- *
- * @exception IllegalArgumentException <ul>
- *    <li>ERROR_NULL_ARGUMENT - if the argument is null</li>
- * </ul>
- */
-public void test_intersectionLorg_eclipse_swt_graphics_Rectangle(){
-	Rectangle r1 = new Rectangle(1, 2, 3, 4);
-	Rectangle r2 = new Rectangle(3, 3, 2, 2);
-	assertEquals("Rectangle intersection incorrect", new Rectangle(3, 3, 1, 2), r1.intersection(r2));
-
-	r2 = new Rectangle(3, 3, 0, 0);
-	assertEquals("Rectangle intersection incorrect", new Rectangle(3, 3, 0, 0), r1.intersection(r2));
-
-	r2 = new Rectangle(3, 3, -1, -1);
-	assertEquals("Rectangle intersection incorrect", new Rectangle(0, 0, 0, 0), r1.intersection(r2));
-
-	try {
-		r1.intersection(null);
-		fail("No exception thrown for rectangle == null");
-	} catch (IllegalArgumentException e) {
-	}
-}
-
-/**
- * Returns <code>true</code> if the given rectangle intersects
- * with the receiver and <code>false</code> otherwise.
- *
- * @exception IllegalArgumentException <ul>
- *    <li>ERROR_NULL_ARGUMENT - if the argument is null</li>
- * </ul>
- */
-public void test_intersectsLorg_eclipse_swt_graphics_Rectangle(){
-	Rectangle r1 = new Rectangle(1, 2, 3, 4);
-	Rectangle r2 = new Rectangle(2, 3, 7, 8);
-	assertTrue("Rectangle(1, 2, 3, 4) should intersect Rectangle(2, 3, 7, 8)", r1.intersects(r2));
-	assertTrue("Rectangle(2, 3, 7, 8) should intersect Rectangle(1, 2, 3, 4)", r2.intersects(r1));
-
-	r2 = new Rectangle(200, 300, 400, 500);
-	assertTrue("Rectangle(1, 2, 3, 4) should not intersect Rectangle(200, 300, 400, 500)", !r1.intersects(r2));
-	assertTrue("Rectangle(200, 300, 400, 500) should not intersect Rectangle(1, 2, 3, 4)", !r2.intersects(r1));
-	
-	r2 = new Rectangle(3, 3, 0, 0);
-	assertTrue("Rectangle(1, 2, 3, 4) should intersect Rectangle(3, 3, 0, 0)", r1.intersects(r2));
-	assertTrue("Rectangle(3, 3, 0, 0) should intersect Rectangle(1, 2, 3, 4)", r2.intersects(r1));
-
-	r2 = new Rectangle(3, 3, -1, -1);
-	assertTrue("Rectangle(1, 2, 3, 4) should not intersect Rectangle(3, 3, -1, -1)", !r1.intersects(r2));
-	assertTrue("Rectangle(3, 3, -1, -1) should not intersect Rectangle(1, 2, 3, 4)", !r2.intersects(r1));
-
-	try {
-		r1.intersects(null);
-		fail("No exception thrown for rectangle == null");
-	} catch (IllegalArgumentException e) {
-	}
-}
-
-/**
- * Returns <code>true</code> if the receiver does not cover any
- * area in the (x, y) coordinate plane, and <code>false</code> if
- * the receiver does cover some area in the plane.
- * <p>
- * A rectangle is considered to <em>cover area</em> in the 
- * (x, y) coordinate plane if both its width and height are 
- * non-zero.
- * </p>
- */
-public void test_isEmpty(){
-	Rectangle r = new Rectangle(1, 2, 0, 0);
-	assertTrue("Rectangle is empty", r.isEmpty());
-
-	r = new Rectangle(1, 2, -3, -4);
-	assertTrue("Rectangle is empty", r.isEmpty());
-
-	r = new Rectangle(1, 2, 3, 4);
-	assertTrue("Rectangle is not empty", !r.isEmpty());
-}
-
-public void test_toString(){
-	Rectangle r = new Rectangle(3, 4, 5, 6);
-	assertNotNull(r.toString());
-	assertTrue(r.toString().length() > 0);
-	assertEquals("Rectangle {3, 4, 5, 6}", r.toString());
-}
-
-/**
- * Returns a new rectangle which represents the union of
- * the receiver and the given rectangle.
- *
- * @exception IllegalArgumentException <ul>
- *    <li>ERROR_NULL_ARGUMENT - if the argument is null</li>
- * </ul>
- */
-public void test_unionLorg_eclipse_swt_graphics_Rectangle(){
-	Rectangle r1 = new Rectangle(1, 2, 3, 4);
-	Rectangle r2 = new Rectangle(3, 3, 2, 2);
-	assertEquals("Rectangle union incorrect", new Rectangle(1, 2, 4, 4), r1.union(r2));
-	
-	r2 = new Rectangle(3, 3, 0, 0);
-	assertEquals("Rectangle union incorrect", new Rectangle(1, 2, 3, 4), r1.union(r2));
-
-	r2 = new Rectangle(3, 3, -1, -1);
-	assertEquals("Rectangle union incorrect", new Rectangle(1, 2, 3, 4), r1.union(r2));
-
-	try {
-		r1.union(null);
-		fail("No exception thrown for rectangle == null");
-	} catch (IllegalArgumentException e) {
-	}
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_graphics_Rectangle((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorIIII");
-	methodNames.addElement("test_addLorg_eclipse_swt_graphics_Rectangle");
-	methodNames.addElement("test_containsII");
-	methodNames.addElement("test_containsLorg_eclipse_swt_graphics_Point");
-	methodNames.addElement("test_equalsLjava_lang_Object");
-	methodNames.addElement("test_hashCode");
-	methodNames.addElement("test_intersectionLorg_eclipse_swt_graphics_Rectangle");
-	methodNames.addElement("test_intersectsLorg_eclipse_swt_graphics_Rectangle");
-	methodNames.addElement("test_isEmpty");
-	methodNames.addElement("test_toString");
-	methodNames.addElement("test_unionLorg_eclipse_swt_graphics_Rectangle");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorIIII")) test_ConstructorIIII();
-	else if (getName().equals("test_addLorg_eclipse_swt_graphics_Rectangle")) test_addLorg_eclipse_swt_graphics_Rectangle();
-	else if (getName().equals("test_containsII")) test_containsII();
-	else if (getName().equals("test_containsLorg_eclipse_swt_graphics_Point")) test_containsLorg_eclipse_swt_graphics_Point();
-	else if (getName().equals("test_equalsLjava_lang_Object")) test_equalsLjava_lang_Object();
-	else if (getName().equals("test_hashCode")) test_hashCode();
-	else if (getName().equals("test_intersectionLorg_eclipse_swt_graphics_Rectangle")) test_intersectionLorg_eclipse_swt_graphics_Rectangle();
-	else if (getName().equals("test_intersectsLorg_eclipse_swt_graphics_Rectangle")) test_intersectsLorg_eclipse_swt_graphics_Rectangle();
-	else if (getName().equals("test_isEmpty")) test_isEmpty();
-	else if (getName().equals("test_toString")) test_toString();
-	else if (getName().equals("test_unionLorg_eclipse_swt_graphics_Rectangle")) test_unionLorg_eclipse_swt_graphics_Rectangle();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_Region.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_Region.java
deleted file mode 100644
index 78c62e8..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_Region.java
+++ /dev/null
@@ -1,530 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.graphics.Region
- *
- * @see org.eclipse.swt.graphics.Region
- */
-public class Test_org_eclipse_swt_graphics_Region extends SwtTestCase {
-
-public Test_org_eclipse_swt_graphics_Region(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_Constructor(){
-	// test Region()
-	Region reg = new Region();
-	if (reg.isDisposed()) {
-		fail("Constructor for Region didn't initialize handle field");
-	}
-	reg.dispose();
-}
-
-public void test_addLorg_eclipse_swt_graphics_Rectangle(){
-	Region reg = new Region();
-	// add a rectangle
-	reg.add(new Rectangle(0, 0, 100, 50));
-	// add a second rectangle
-	reg.add(new Rectangle(200, 200, 10,10));	
-
-	try {
-		reg.add((Rectangle)null);
-		fail("no exception thrown for adding a null rectangle");
-	}
-	catch (IllegalArgumentException e) {
-	}
-	
-	reg.dispose();
-	
-	try {
-		reg.add(new Rectangle(20,30,10,5));
-		fail("no exception thrown for adding a rectangle after Region got disposed");
-	}
-	catch (SWTException e) {
-	}
-}
-
-public void test_addLorg_eclipse_swt_graphics_Region(){
-	Region reg1 = new Region();
-	// make a second region and add it to the first one
-	Region reg2 = new Region();
-	reg2.add(new Rectangle(40, 50, 10, 20));
-	reg1.add(reg2);
-
-	try {
-		reg1.add((Region)null);
-		fail("no exception thrown for adding a null region");
-	}
-	catch (IllegalArgumentException e) {
-	}
-
-	try {
-		reg2 = new Region();
-		reg2.add(new Rectangle(1,1,100,200));
-		reg2.dispose();
-		reg1.add(reg2);
-		fail("no exception thrown for adding to a Region a Region which got disposed");
-	}
-	catch (IllegalArgumentException e) {
-	}
-	
-	reg1.dispose();
-	
-	try {
-		reg2 = new Region();
-		reg2.add(new Rectangle(1,1,100,200));
-		reg1.add(reg2);
-		fail("no exception thrown for adding a Region to a Region which got disposed");
-	}
-	catch (SWTException e) {
-	}
-}
-
-public void test_containsII(){
-	Rectangle rect1 = new Rectangle(10,10,200,100);
-	Point pointInRect1 = new Point(10,10);
-	Rectangle rect2 = new Rectangle(50,50,1000,1000);
-	Point pointInRect2 = new Point(1049,1009);
-	Point pointNotInRect12 = new Point(49,110);
-	
-	Region reg = new Region();
-	reg.dispose();
-	try {
-		boolean res = reg.contains(pointInRect1.x, pointInRect1.y);
-		fail("no exception thrown on disposed region");
-	}
-	catch (Exception e) {
-	}
-	
-	reg = new Region();
-	if (reg.contains(pointInRect1.x, pointInRect1.y)) {
-		reg.dispose();
-		fail("Empty region should not contain point");
-	}
-	reg.add(rect1);
-	if (!reg.contains(pointInRect1.x, pointInRect1.y)) {
-		reg.dispose();
-		fail("Region should contain point");
-	}
-	reg.add(rect2);
-	if (!reg.contains(pointInRect1.x, pointInRect1.y) ||
-		!reg.contains(pointInRect2.x, pointInRect2.y)) {
-		reg.dispose();
-		fail("Region should contain point");
-	}
-	if (reg.contains(pointNotInRect12.x, pointNotInRect12.y)) {
-		reg.dispose();
-		fail("Region should not contain point");
-	}	
-	reg.dispose();
-}
-
-public void test_containsLorg_eclipse_swt_graphics_Point(){
-	Rectangle rect1 = new Rectangle(10,10,200,100);
-	Point pointInRect1 = new Point(10,10);
-	Rectangle rect2 = new Rectangle(50,50,1000,1000);
-	Point pointInRect2 = new Point(1049,1009);
-	Point pointNotInRect12 = new Point(49,110);
-	
-	Region reg = new Region();
-	reg.dispose();
-	try {
-		boolean res = reg.contains(pointInRect1);
-		fail("no exception thrown on disposed region");
-	}
-	catch (Exception e) {
-	}
-	
-	reg = new Region();
-	if (reg.contains(pointInRect1)) {
-		reg.dispose();
-		fail("Empty region should not contain point");
-	}
-	reg.add(rect1);
-	if (!reg.contains(pointInRect1)) {
-		reg.dispose();
-		fail("Region should contain point");
-	}
-	reg.add(rect2);
-	if (!reg.contains(pointInRect1) ||
-		!reg.contains(pointInRect2)) {
-		reg.dispose();
-		fail("Region should contain point");
-	}
-	if (reg.contains(pointNotInRect12)) {
-		reg.dispose();
-		fail("Region should not contain point");
-	}
-	reg.dispose();
-}
-
-public void test_dispose(){
-	Region reg = new Region();
-	reg.add(new Rectangle(1,1,50,100));
-	if (reg.isDisposed()) {
-		fail("Region should not be in the disposed state");
-	}
-	
-	// dispose twice as this is allowed
-	for (int i = 0; i < 2; i++) {
-		reg.dispose();
-		if (!reg.isDisposed()) {
-			fail("Region should be in the disposed state");
-		}
-	}
-}
-
-public void test_equalsLjava_lang_Object(){
-	Rectangle rect1 = new Rectangle(25, 100, 200, 780);
-	Rectangle rect2 = new Rectangle(30, 105, 205, 785);
-	
-	Region reg1 = new Region();
-	reg1.add(rect1);
-
-	Region reg2 = reg1;
-	
-	if (!reg1.equals(reg2)) {
-		reg1.dispose();
-		reg2.dispose();
-		fail("references to the same instance of Region should be considered equal");
-	}
-	
-	reg2 = new Region();
-	reg2.add(rect1);
-	
-// Currently, Regions are only "equal" if they have the same handle.
-// This is so that identical objects are properly hashed.
-// We are considering adding a new method that will compare Regions for the same area.
-//	if (!reg1.equals(reg2)) {
-//		reg1.dispose();
-//		reg2.dispose();
-//		fail("two instances of Region representing the same area should be considered equal");
-//	}		
-	
-	reg2.dispose();
-	reg2 = new Region();
-	if (reg1.equals(reg2)) {
-		reg1.dispose();
-		reg2.dispose();
-		fail("Non empty region considered equal to empty one");
-	}
-	
-	reg2.add(rect2);
-	if (reg1.equals(reg2)) {
-		reg1.dispose();
-		reg2.dispose();
-		fail("two different regions considered equal");
-	}
-	
-	reg1.dispose();
-	reg2.dispose();
-}
-
-public void test_getBounds(){
-	Region reg = new Region();
-	reg.dispose();
-	
-	try {
-		Rectangle rect = reg.getBounds();
-		fail("Region disposed should throw Exception");
-	}
-	catch (Exception e) {
-	}
-
-	Rectangle rect1 = new Rectangle(10,10,50,30);
-	Rectangle rect2 = new Rectangle(100,100,10,10);
-	// the rectangle enclosing the two preceding rectangles
-	Rectangle rect12Bounds = new Rectangle(10,10,100,100);
-	
-	reg = new Region();
-	reg.add(rect1);
-	Rectangle rect1Bis = reg.getBounds();
-	if (rect1Bis.x != rect1.x || rect1Bis.y != rect1.y || 
-		rect1Bis.height != rect1.height || rect1Bis.width != rect1.width) {
-		reg.dispose();
-		fail("getBounds doesn't return the borders of the rectangle area which was set up");
-	}
-	
-	reg.add(rect2);
-	Rectangle rect12 = reg.getBounds();
-	if (rect12.x != rect12Bounds.x || rect12.y != rect12Bounds.y || 
-		rect12.height != rect12Bounds.height || rect12.width != rect12Bounds.width) {
-		reg.dispose();
-		fail("getBounds doesn't return the borders of the resulting rectangle area which was set up");
-	}
-	
-	reg.dispose();
-}
-
-public void test_hashCode(){
-	Region reg1 = new Region();
-	Region reg2 = new Region();
-		
-	Rectangle rect1 = new Rectangle(25, 100, 200, 780);
-	Rectangle rect2 = new Rectangle(30, 105, 205, 785);
-	
-	reg1.add(rect1);
-	reg2.add(rect2);
-	
-	if (reg1.hashCode() == reg2.hashCode()) {
-		reg1.dispose();
-		reg2.dispose();
-		fail("two different regions should have different hashCode");
-	}
-	reg2.dispose();	
-
-	reg2 = new Region();
-	reg2.add(rect1);
-
-
-// BUG: this should pass	
-//	if (reg1.hashCode() != reg2.hashCode()) {
-//		reg1.dispose();
-//		reg2.dispose();
-//		fail("two regions representing same area should have same hashCode");
-//	}
-	
-	reg1.dispose();
-	reg2.dispose();
-}
-
-public void test_intersectsIIII(){
-	Rectangle rect1 = new Rectangle(10,20,50,30);
-	Rectangle rectInter1 = new Rectangle(59,49,10,20);
-	Rectangle rectNotInter1 = new Rectangle(0,5,10,15);
-	
-	Rectangle rect2 = new Rectangle(30,40,10,100);
-	Rectangle rectInter2 = new Rectangle(39,139,1,5);
-	Rectangle rectNotInter12 = new Rectangle(40,50,5,15);
-	
-	
-	Region reg = new Region();
-	reg.dispose();
-	try {
-		boolean res = reg.intersects(rectInter1.x, rectInter1.y, rectInter1.width, rectInter1.height);
-		fail("no exception thrown on disposed region");
-	}
-	catch (Exception e) {
-	}
-	
-	reg = new Region();
-	if (reg.intersects(rect1.x, rect1.y, rect1.width, rect1.height)) {
-		reg.dispose();
-		fail("intersects can't return true on empty region");
-	}
-	reg.add(rect1);
-	if (!reg.intersects(rect1.x, rect1.y, rect1.width, rect1.height)) {
-		reg.dispose();
-		fail("intersects didn't return true");
-	}
-	if (!reg.intersects(rectInter1.x, rectInter1.y, rectInter1.width, rectInter1.height)) {
-		reg.dispose();
-		fail("intersects didn't return true ");
-	}
-	if (reg.intersects(rectNotInter1.x, rectNotInter1.y, rectNotInter1.width, rectNotInter1.height)) {
-		reg.dispose();
-		fail("intersects return true on rectangle not intersecting with region");
-	}
-	
-	reg.add(rect2);
-	if (!reg.intersects(rect2.x, rect2.y, rect2.width, rect2.height)) {
-		reg.dispose();
-		fail("intersects didn't return true");
-	}
-	if (!reg.intersects(rectInter2.x, rectInter2.y, rectInter2.width, rectInter2.height)) {
-		reg.dispose();
-		fail("intersects didn't return true ");
-	}
-	if (reg.intersects(rectNotInter12.x, rectNotInter12.y, rectNotInter12.width, rectNotInter12.height)) {
-		reg.dispose();
-		fail("intersects return true on rectangle not intersecting with region");
-	}
-	reg.dispose();
-}
-
-public void test_intersectsLorg_eclipse_swt_graphics_Rectangle(){
-	Rectangle rect1 = new Rectangle(10,20,50,30);
-	Rectangle rectInter1 = new Rectangle(59,49,10,20);
-	Rectangle rectNotInter1 = new Rectangle(0,5,10,15);
-	
-	Rectangle rect2 = new Rectangle(30,40,10,100);
-	Rectangle rectInter2 = new Rectangle(39,139,1,5);
-	Rectangle rectNotInter12 = new Rectangle(40,50,5,15);
-	
-	
-	Region reg = new Region();
-	reg.dispose();
-	try {
-		boolean res = reg.intersects(rectInter1);
-		fail("no exception thrown on disposed region");
-	}
-	catch (Exception e) {
-	}
-	
-	reg = new Region();
-	if (reg.intersects(rect1)) {
-		reg.dispose();
-		fail("intersects can't return true on empty region");
-	}
-	reg.add(rect1);
-	if (!reg.intersects(rect1)) {
-		reg.dispose();
-		fail("intersects didn't return true");
-	}
-	if (!reg.intersects(rectInter1)) {
-		reg.dispose();
-		fail("intersects didn't return true ");
-	}
-	if (reg.intersects(rectNotInter1)) {
-		reg.dispose();
-		fail("intersects return true on rectangle not intersecting with region");
-	}
-	
-	reg.add(rect2);
-	if (!reg.intersects(rect2)) {
-		reg.dispose();
-		fail("intersects didn't return true");
-	}
-	if (!reg.intersects(rectInter2)) {
-		reg.dispose();
-		fail("intersects didn't return true ");
-	}
-	if (reg.intersects(rectNotInter12)) {
-		reg.dispose();
-		fail("intersects return true on rectangle not intersecting with region");
-	}
-	reg.dispose();
-}
-
-public void test_isDisposed(){
-	// test in dispose()
-}
-
-public void test_isEmpty(){
-	Region reg = new Region();
-	Rectangle emptyRect1 = new Rectangle(10,20,0,200);
-	Rectangle emptyRect2 = new Rectangle(10,20,10,0);
-	Rectangle rect = new Rectangle(10,20,50,100);
-	
-	if (!reg.isEmpty()) {
-		reg.dispose();
-		fail("isEmpty didn't return true on empty region");
-	}
-	
-	reg.add(emptyRect1);
-	if (!reg.isEmpty()) {
-		reg.dispose();
-		fail("isEmpty didn't return true on empty region");
-	}
-
-	reg.add(emptyRect2);
-	if (!reg.isEmpty()) {
-		reg.dispose();
-		fail("isEmpty didn't return true on empty region");
-	}
-
-	reg.add(rect);
-	if (reg.isEmpty()) {
-		reg.dispose();
-		fail("isEmpty returned true on non empty region");
-	}
-	
-	reg.dispose();	
-}
-
-public void test_win32_newI(){
-	// not part of public api
-}
-
-public void test_toString(){
-	Region reg = new Region();
-	
-	String s = reg.toString();
-	
-	if (s == null || s.length() == 0) {
-		fail("toString returns null or empty string");
-	}
-	
-	reg.add(new Rectangle(1,1,10,20));
-	s = reg.toString();
-	
-	if (s == null || s.length() == 0) {
-		fail("toString returns null or empty string");
-	}
-
-	reg.dispose();
-	s = reg.toString();
-	
-	if (s == null || s.length() == 0) {
-		fail("toString returns null or empty string");
-	}				
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_graphics_Region((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_Constructor");
-	methodNames.addElement("test_addLorg_eclipse_swt_graphics_Rectangle");
-	methodNames.addElement("test_addLorg_eclipse_swt_graphics_Region");
-	methodNames.addElement("test_containsII");
-	methodNames.addElement("test_containsLorg_eclipse_swt_graphics_Point");
-	methodNames.addElement("test_dispose");
-	methodNames.addElement("test_equalsLjava_lang_Object");
-	methodNames.addElement("test_getBounds");
-	methodNames.addElement("test_hashCode");
-	methodNames.addElement("test_intersectsIIII");
-	methodNames.addElement("test_intersectsLorg_eclipse_swt_graphics_Rectangle");
-	methodNames.addElement("test_isDisposed");
-	methodNames.addElement("test_isEmpty");
-	methodNames.addElement("test_win32_newI");
-	methodNames.addElement("test_toString");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_Constructor")) test_Constructor();
-	else if (getName().equals("test_addLorg_eclipse_swt_graphics_Rectangle")) test_addLorg_eclipse_swt_graphics_Rectangle();
-	else if (getName().equals("test_addLorg_eclipse_swt_graphics_Region")) test_addLorg_eclipse_swt_graphics_Region();
-	else if (getName().equals("test_containsII")) test_containsII();
-	else if (getName().equals("test_containsLorg_eclipse_swt_graphics_Point")) test_containsLorg_eclipse_swt_graphics_Point();
-	else if (getName().equals("test_dispose")) test_dispose();
-	else if (getName().equals("test_equalsLjava_lang_Object")) test_equalsLjava_lang_Object();
-	else if (getName().equals("test_getBounds")) test_getBounds();
-	else if (getName().equals("test_hashCode")) test_hashCode();
-	else if (getName().equals("test_intersectsIIII")) test_intersectsIIII();
-	else if (getName().equals("test_intersectsLorg_eclipse_swt_graphics_Rectangle")) test_intersectsLorg_eclipse_swt_graphics_Rectangle();
-	else if (getName().equals("test_isDisposed")) test_isDisposed();
-	else if (getName().equals("test_isEmpty")) test_isEmpty();
-	else if (getName().equals("test_win32_newI")) test_win32_newI();
-	else if (getName().equals("test_toString")) test_toString();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_layout_FillLayout.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_layout_FillLayout.java
deleted file mode 100644
index a4708e0..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_layout_FillLayout.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.layout.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.layout.FillLayout
- *
- * @see org.eclipse.swt.layout.FillLayout
- */
-public class Test_org_eclipse_swt_layout_FillLayout extends Test_org_eclipse_swt_widgets_Layout {
-
-public Test_org_eclipse_swt_layout_FillLayout(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_Constructor() {
-	warnUnimpl("Test test_Constructor not written");
-}
-
-public void test_computeSizeLorg_eclipse_swt_widgets_CompositeIIZ() {
-	warnUnimpl("Test test_computeSizeLorg_eclipse_swt_widgets_CompositeIIZ not written");
-}
-
-public void test_layoutLorg_eclipse_swt_widgets_CompositeZ() {
-	warnUnimpl("Test test_layoutLorg_eclipse_swt_widgets_CompositeZ not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_layout_FillLayout((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_Constructor");
-	methodNames.addElement("test_computeSizeLorg_eclipse_swt_widgets_CompositeIIZ");
-	methodNames.addElement("test_layoutLorg_eclipse_swt_widgets_CompositeZ");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Layout.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_Constructor")) test_Constructor();
-	else if (getName().equals("test_computeSizeLorg_eclipse_swt_widgets_CompositeIIZ")) test_computeSizeLorg_eclipse_swt_widgets_CompositeIIZ();
-	else if (getName().equals("test_layoutLorg_eclipse_swt_widgets_CompositeZ")) test_layoutLorg_eclipse_swt_widgets_CompositeZ();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_layout_GridData.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_layout_GridData.java
deleted file mode 100644
index b8a8952..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_layout_GridData.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.layout.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.layout.GridData
- *
- * @see org.eclipse.swt.layout.GridData
- */
-public class Test_org_eclipse_swt_layout_GridData extends SwtTestCase {
-
-public Test_org_eclipse_swt_layout_GridData(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_Constructor() {
-	warnUnimpl("Test test_Constructor not written");
-}
-
-public void test_ConstructorI() {
-	warnUnimpl("Test test_ConstructorI not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_layout_GridData((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_Constructor");
-	methodNames.addElement("test_ConstructorI");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_Constructor")) test_Constructor();
-	else if (getName().equals("test_ConstructorI")) test_ConstructorI();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_layout_GridLayout.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_layout_GridLayout.java
deleted file mode 100644
index 124b662..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_layout_GridLayout.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.layout.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.layout.GridLayout
- *
- * @see org.eclipse.swt.layout.GridLayout
- */
-public class Test_org_eclipse_swt_layout_GridLayout extends Test_org_eclipse_swt_widgets_Layout {
-
-public Test_org_eclipse_swt_layout_GridLayout(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_Constructor() {
-	warnUnimpl("Test test_Constructor not written");
-}
-
-public void test_computeSizeLorg_eclipse_swt_widgets_CompositeIIZ() {
-	warnUnimpl("Test test_computeSizeLorg_eclipse_swt_widgets_CompositeIIZ not written");
-}
-
-public void test_layoutLorg_eclipse_swt_widgets_CompositeZ() {
-	warnUnimpl("Test test_layoutLorg_eclipse_swt_widgets_CompositeZ not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_layout_GridLayout((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_Constructor");
-	methodNames.addElement("test_computeSizeLorg_eclipse_swt_widgets_CompositeIIZ");
-	methodNames.addElement("test_layoutLorg_eclipse_swt_widgets_CompositeZ");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Layout.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_Constructor")) test_Constructor();
-	else if (getName().equals("test_computeSizeLorg_eclipse_swt_widgets_CompositeIIZ")) test_computeSizeLorg_eclipse_swt_widgets_CompositeIIZ();
-	else if (getName().equals("test_layoutLorg_eclipse_swt_widgets_CompositeZ")) test_layoutLorg_eclipse_swt_widgets_CompositeZ();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_layout_RowData.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_layout_RowData.java
deleted file mode 100644
index 5a3b66b..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_layout_RowData.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.layout.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.layout.RowData
- *
- * @see org.eclipse.swt.layout.RowData
- */
-public class Test_org_eclipse_swt_layout_RowData extends SwtTestCase {
-
-public Test_org_eclipse_swt_layout_RowData(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_Constructor() {
-	warnUnimpl("Test test_Constructor not written");
-}
-
-public void test_ConstructorII() {
-	warnUnimpl("Test test_ConstructorII not written");
-}
-
-public void test_ConstructorLorg_eclipse_swt_graphics_Point() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_graphics_Point not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_layout_RowData((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_Constructor");
-	methodNames.addElement("test_ConstructorII");
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_graphics_Point");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_Constructor")) test_Constructor();
-	else if (getName().equals("test_ConstructorII")) test_ConstructorII();
-	else if (getName().equals("test_ConstructorLorg_eclipse_swt_graphics_Point")) test_ConstructorLorg_eclipse_swt_graphics_Point();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_layout_RowLayout.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_layout_RowLayout.java
deleted file mode 100644
index 70ea1f4..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_layout_RowLayout.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.layout.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.layout.RowLayout
- *
- * @see org.eclipse.swt.layout.RowLayout
- */
-public class Test_org_eclipse_swt_layout_RowLayout extends Test_org_eclipse_swt_widgets_Layout {
-
-public Test_org_eclipse_swt_layout_RowLayout(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_Constructor() {
-	warnUnimpl("Test test_Constructor not written");
-}
-
-public void test_computeSizeLorg_eclipse_swt_widgets_CompositeIIZ() {
-	warnUnimpl("Test test_computeSizeLorg_eclipse_swt_widgets_CompositeIIZ not written");
-}
-
-public void test_layoutLorg_eclipse_swt_widgets_CompositeZ() {
-	warnUnimpl("Test test_layoutLorg_eclipse_swt_widgets_CompositeZ not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_layout_RowLayout((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_Constructor");
-	methodNames.addElement("test_computeSizeLorg_eclipse_swt_widgets_CompositeIIZ");
-	methodNames.addElement("test_layoutLorg_eclipse_swt_widgets_CompositeZ");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Layout.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_Constructor")) test_Constructor();
-	else if (getName().equals("test_computeSizeLorg_eclipse_swt_widgets_CompositeIIZ")) test_computeSizeLorg_eclipse_swt_widgets_CompositeIIZ();
-	else if (getName().equals("test_layoutLorg_eclipse_swt_widgets_CompositeZ")) test_layoutLorg_eclipse_swt_widgets_CompositeZ();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_printing_PrintDialog.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_printing_PrintDialog.java
deleted file mode 100644
index c8cf602..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_printing_PrintDialog.java
+++ /dev/null
@@ -1,145 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.printing.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.printing.PrintDialog
- *
- * @see org.eclipse.swt.printing.PrintDialog
- */
-public class Test_org_eclipse_swt_printing_PrintDialog extends Test_org_eclipse_swt_widgets_Dialog {
-
-	PrintDialog printDialog;
-	
-public Test_org_eclipse_swt_printing_PrintDialog(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-	printDialog = new PrintDialog(shell, SWT.NONE);
-	setDialog(printDialog);
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_Shell() {
-	new PrintDialog(shell);
-	
-	try {
-		new PrintDialog(null);
-		fail("No exception thrown for parent == null");
-	}
-	catch (IllegalArgumentException e) {
-	}
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_ShellI() {
-	new PrintDialog(shell, SWT.NONE);
-	
-	try {
-		new PrintDialog(null, SWT.NONE);
-		fail("No exception thrown for parent == null");
-	}
-	catch (IllegalArgumentException e) {
-	}
-}
-
-public void test_getScope() {
-	warnUnimpl("Test test_getScope not written");
-}
-
-public void test_setScopeI() {
-	warnUnimpl("Test test_setScopeI not written");
-}
-
-public void test_getStartPage() {
-	warnUnimpl("Test test_getStartPage not written");
-}
-
-public void test_setStartPageI() {
-	warnUnimpl("Test test_setStartPageI not written");
-}
-
-public void test_getEndPage() {
-	warnUnimpl("Test test_getEndPage not written");
-}
-
-public void test_setEndPageI() {
-	warnUnimpl("Test test_setEndPageI not written");
-}
-
-public void test_getPrintToFile() {
-	warnUnimpl("Test test_getPrintToFile not written");
-}
-
-public void test_setPrintToFileZ() {
-	warnUnimpl("Test test_setPrintToFileZ not written");
-}
-
-public void test_checkSubclass() {
-	warnUnimpl("Test test_checkSubclass not written");
-}
-
-public void test_open() {
-	warnUnimpl("Test test_open not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_printing_PrintDialog((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_Shell");
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_ShellI");
-	methodNames.addElement("test_getScope");
-	methodNames.addElement("test_setScopeI");
-	methodNames.addElement("test_getStartPage");
-	methodNames.addElement("test_setStartPageI");
-	methodNames.addElement("test_getEndPage");
-	methodNames.addElement("test_setEndPageI");
-	methodNames.addElement("test_getPrintToFile");
-	methodNames.addElement("test_setPrintToFileZ");
-	methodNames.addElement("test_checkSubclass");
-	methodNames.addElement("test_open");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Dialog.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_Shell")) test_ConstructorLorg_eclipse_swt_widgets_Shell();
-	else if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_ShellI")) test_ConstructorLorg_eclipse_swt_widgets_ShellI();
-	else if (getName().equals("test_getScope")) test_getScope();
-	else if (getName().equals("test_setScopeI")) test_setScopeI();
-	else if (getName().equals("test_getStartPage")) test_getStartPage();
-	else if (getName().equals("test_setStartPageI")) test_setStartPageI();
-	else if (getName().equals("test_getEndPage")) test_getEndPage();
-	else if (getName().equals("test_setEndPageI")) test_setEndPageI();
-	else if (getName().equals("test_getPrintToFile")) test_getPrintToFile();
-	else if (getName().equals("test_setPrintToFileZ")) test_setPrintToFileZ();
-	else if (getName().equals("test_checkSubclass")) test_checkSubclass();
-	else if (getName().equals("test_open")) test_open();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_printing_Printer.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_printing_Printer.java
deleted file mode 100644
index 5fcd3be..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_printing_Printer.java
+++ /dev/null
@@ -1,168 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.printing.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.printing.Printer
- *
- * @see org.eclipse.swt.printing.Printer
- */
-public class Test_org_eclipse_swt_printing_Printer extends Test_org_eclipse_swt_graphics_Device {
-
-public Test_org_eclipse_swt_printing_Printer(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_getPrinterList() {
-	warnUnimpl("Test test_getPrinterList not written");
-}
-
-public void test_Constructor() {
-	warnUnimpl("Test test_Constructor not written");
-}
-
-public void test_ConstructorLorg_eclipse_swt_printing_PrinterData() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_printing_PrinterData not written");
-}
-
-public void test_createLorg_eclipse_swt_graphics_DeviceData() {
-	warnUnimpl("Test test_createLorg_eclipse_swt_graphics_DeviceData not written");
-}
-
-public void test_internal_new_GCLorg_eclipse_swt_graphics_GCData() {
-	warnUnimpl("Test test_internal_new_GCLorg_eclipse_swt_graphics_GCData not written");
-}
-
-public void test_internal_dispose_GCILorg_eclipse_swt_graphics_GCData() {
-	warnUnimpl("Test test_internal_dispose_GCILorg_eclipse_swt_graphics_GCData not written");
-}
-
-public void test_startJobLjava_lang_String() {
-	warnUnimpl("Test test_startJobLjava_lang_String not written");
-}
-
-public void test_endJob() {
-	warnUnimpl("Test test_endJob not written");
-}
-
-public void test_cancelJob() {
-	warnUnimpl("Test test_cancelJob not written");
-}
-
-public void test_startPage() {
-	warnUnimpl("Test test_startPage not written");
-}
-
-public void test_endPage() {
-	warnUnimpl("Test test_endPage not written");
-}
-
-public void test_getDPI() {
-	warnUnimpl("Test test_getDPI not written");
-}
-
-public void test_getBounds() {
-	warnUnimpl("Test test_getBounds not written");
-}
-
-public void test_getClientArea() {
-	warnUnimpl("Test test_getClientArea not written");
-}
-
-public void test_computeTrimIIII() {
-	warnUnimpl("Test test_computeTrimIIII not written");
-}
-
-public void test_getPrinterData() {
-	warnUnimpl("Test test_getPrinterData not written");
-}
-
-public void test_checkDevice() {
-	warnUnimpl("Test test_checkDevice not written");
-}
-
-public void test_release() {
-	warnUnimpl("Test test_release not written");
-}
-
-public void test_destroy() {
-	warnUnimpl("Test test_destroy not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_printing_Printer((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_getPrinterList");
-	methodNames.addElement("test_Constructor");
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_printing_PrinterData");
-	methodNames.addElement("test_createLorg_eclipse_swt_graphics_DeviceData");
-	methodNames.addElement("test_internal_new_GCLorg_eclipse_swt_graphics_GCData");
-	methodNames.addElement("test_internal_dispose_GCILorg_eclipse_swt_graphics_GCData");
-	methodNames.addElement("test_startJobLjava_lang_String");
-	methodNames.addElement("test_endJob");
-	methodNames.addElement("test_cancelJob");
-	methodNames.addElement("test_startPage");
-	methodNames.addElement("test_endPage");
-	methodNames.addElement("test_getDPI");
-	methodNames.addElement("test_getBounds");
-	methodNames.addElement("test_getClientArea");
-	methodNames.addElement("test_computeTrimIIII");
-	methodNames.addElement("test_getPrinterData");
-	methodNames.addElement("test_checkDevice");
-	methodNames.addElement("test_release");
-	methodNames.addElement("test_destroy");
-	methodNames.addAll(Test_org_eclipse_swt_graphics_Device.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_getPrinterList")) test_getPrinterList();
-	else if (getName().equals("test_Constructor")) test_Constructor();
-	else if (getName().equals("test_ConstructorLorg_eclipse_swt_printing_PrinterData")) test_ConstructorLorg_eclipse_swt_printing_PrinterData();
-	else if (getName().equals("test_createLorg_eclipse_swt_graphics_DeviceData")) test_createLorg_eclipse_swt_graphics_DeviceData();
-	else if (getName().equals("test_internal_new_GCLorg_eclipse_swt_graphics_GCData")) test_internal_new_GCLorg_eclipse_swt_graphics_GCData();
-	else if (getName().equals("test_internal_dispose_GCILorg_eclipse_swt_graphics_GCData")) test_internal_dispose_GCILorg_eclipse_swt_graphics_GCData();
-	else if (getName().equals("test_startJobLjava_lang_String")) test_startJobLjava_lang_String();
-	else if (getName().equals("test_endJob")) test_endJob();
-	else if (getName().equals("test_cancelJob")) test_cancelJob();
-	else if (getName().equals("test_startPage")) test_startPage();
-	else if (getName().equals("test_endPage")) test_endPage();
-	else if (getName().equals("test_getDPI")) test_getDPI();
-	else if (getName().equals("test_getBounds")) test_getBounds();
-	else if (getName().equals("test_getClientArea")) test_getClientArea();
-	else if (getName().equals("test_computeTrimIIII")) test_computeTrimIIII();
-	else if (getName().equals("test_getPrinterData")) test_getPrinterData();
-	else if (getName().equals("test_checkDevice")) test_checkDevice();
-	else if (getName().equals("test_release")) test_release();
-	else if (getName().equals("test_destroy")) test_destroy();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_printing_PrinterData.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_printing_PrinterData.java
deleted file mode 100644
index 13aa24b..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_printing_PrinterData.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.printing.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.printing.PrinterData
- *
- * @see org.eclipse.swt.printing.PrinterData
- */
-public class Test_org_eclipse_swt_printing_PrinterData extends Test_org_eclipse_swt_graphics_DeviceData {
-
-public Test_org_eclipse_swt_printing_PrinterData(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_Constructor() {
-	PrinterData data = new PrinterData();
-}
-
-public void test_ConstructorLjava_lang_StringLjava_lang_String() {
-	PrinterData data = new PrinterData("hello", "there");
-}
-
-public void test_toString() {
-	PrinterData data = new PrinterData();
-	assertNotNull(data.toString());
-	assertTrue(data.toString().length() > 0);
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_printing_PrinterData((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_Constructor");
-	methodNames.addElement("test_ConstructorLjava_lang_StringLjava_lang_String");
-	methodNames.addElement("test_toString");
-	methodNames.addAll(Test_org_eclipse_swt_graphics_DeviceData.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_Constructor")) test_Constructor();
-	else if (getName().equals("test_ConstructorLjava_lang_StringLjava_lang_String")) test_ConstructorLjava_lang_StringLjava_lang_String();
-	else if (getName().equals("test_toString")) test_toString();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_program_Program.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_program_Program.java
deleted file mode 100644
index 57f2001..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_program_Program.java
+++ /dev/null
@@ -1,110 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.program.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.program.Program
- *
- * @see org.eclipse.swt.program.Program
- */
-public class Test_org_eclipse_swt_program_Program extends SwtTestCase {
-
-public Test_org_eclipse_swt_program_Program(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_findProgramLjava_lang_String() {
-	warnUnimpl("Test test_findProgramLjava_lang_String not written");
-}
-
-public void test_getExtensions() {
-	warnUnimpl("Test test_getExtensions not written");
-}
-
-public void test_getPrograms() {
-	warnUnimpl("Test test_getPrograms not written");
-}
-
-public void test_launchLjava_lang_String() {
-	warnUnimpl("Test test_launchLjava_lang_String not written");
-}
-
-public void test_executeLjava_lang_String() {
-	warnUnimpl("Test test_executeLjava_lang_String not written");
-}
-
-public void test_getImageData() {
-	warnUnimpl("Test test_getImageData not written");
-}
-
-public void test_getName() {
-	warnUnimpl("Test test_getName not written");
-}
-
-public void test_equalsLjava_lang_Object() {
-	warnUnimpl("Test test_equalsLjava_lang_Object not written");
-}
-
-public void test_hashCode() {
-	warnUnimpl("Test test_hashCode not written");
-}
-
-public void test_toString() {
-	warnUnimpl("Test test_toString not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_program_Program((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_findProgramLjava_lang_String");
-	methodNames.addElement("test_getExtensions");
-	methodNames.addElement("test_getPrograms");
-	methodNames.addElement("test_launchLjava_lang_String");
-	methodNames.addElement("test_executeLjava_lang_String");
-	methodNames.addElement("test_getImageData");
-	methodNames.addElement("test_getName");
-	methodNames.addElement("test_equalsLjava_lang_Object");
-	methodNames.addElement("test_hashCode");
-	methodNames.addElement("test_toString");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_findProgramLjava_lang_String")) test_findProgramLjava_lang_String();
-	else if (getName().equals("test_getExtensions")) test_getExtensions();
-	else if (getName().equals("test_getPrograms")) test_getPrograms();
-	else if (getName().equals("test_launchLjava_lang_String")) test_launchLjava_lang_String();
-	else if (getName().equals("test_executeLjava_lang_String")) test_executeLjava_lang_String();
-	else if (getName().equals("test_getImageData")) test_getImageData();
-	else if (getName().equals("test_getName")) test_getName();
-	else if (getName().equals("test_equalsLjava_lang_Object")) test_equalsLjava_lang_Object();
-	else if (getName().equals("test_hashCode")) test_hashCode();
-	else if (getName().equals("test_toString")) test_toString();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Button.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Button.java
deleted file mode 100644
index 73ee6f3..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Button.java
+++ /dev/null
@@ -1,272 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.graphics.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.widgets.Button
- *
- * @see org.eclipse.swt.widgets.Button
- */
-public class Test_org_eclipse_swt_widgets_Button extends Test_org_eclipse_swt_widgets_Control {
-
-Button button;
-
-public Test_org_eclipse_swt_widgets_Button(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-	button = new Button(shell, SWT.PUSH);
-	setWidget(button);
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_CompositeI() {
-	// Test Button(Composite parent, int style)
-	Button button = new Button(shell, SWT.NULL);
-
-	button = new Button(shell, SWT.PUSH);
-
-	button = new Button(shell, SWT.CHECK);
-
-	button = new Button(shell, SWT.TOGGLE);
-
-	button = new Button(shell, SWT.ARROW);
-
-	button = new Button(shell, SWT.PUSH | SWT.CHECK);
-
-	try {
-		button = new Button(null, 0);
-		fail("No exception thrown for parent == null");
-	}
-	catch (IllegalArgumentException e) {
-	}
-}
-
-public void test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener() {
-	warnUnimpl("Test test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener not written");
-}
-
-public void test_computeSizeIIZ() {
-	button.computeSize(0, 0);
-
-	button.computeSize(0, 0, false);
-
-	button.computeSize(-10, -10);
-
-	button.computeSize(-10, -10, false);
-
-	button.computeSize(10, 10);
-
-	button.computeSize(10, 10, false);
-
-	button.computeSize(10000, 10000);
-
-	button.computeSize(10000, 10000, false);
-}
-
-public void test_getAlignment() {
-	warnUnimpl("Test test_getAlignment not written");
-}
-
-public void test_getImage() {
-	// tested in test_setImageLorg_eclipse_swt_graphics_Image
-}
-
-public void test_getSelection() {
-	// tested in test_setSelectionZ
-}
-
-public void test_getText() {
-	warnUnimpl("Test test_getText not written");
-}
-
-public void test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener() {
-	warnUnimpl("Test test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener not written");
-}
-
-public void test_setAlignmentI() {
-	button.setAlignment(SWT.LEFT);
-	assertEquals(SWT.LEFT, button.getAlignment());
-
-	button.setAlignment(SWT.RIGHT);
-	assertEquals(SWT.RIGHT, button.getAlignment());
-
-	button.setAlignment(SWT.CENTER);
-	assertEquals(SWT.CENTER, button.getAlignment());
-
-	button.setAlignment(SWT.UP); // bad value for push button
-	assertTrue(SWT.UP != button.getAlignment());
-
-	Button arrowButton = new Button(shell, SWT.ARROW);
-	arrowButton.setAlignment(SWT.LEFT);
-	assertEquals(SWT.LEFT, arrowButton.getAlignment());
-
-	arrowButton.setAlignment(SWT.RIGHT);
-	assertEquals(SWT.RIGHT, arrowButton.getAlignment());
-
-	arrowButton.setAlignment(SWT.UP);
-	assertEquals(SWT.UP, arrowButton.getAlignment());
-
-	arrowButton.setAlignment(SWT.DOWN);
-	assertEquals(SWT.DOWN, arrowButton.getAlignment());
-
-	arrowButton.setAlignment(SWT.CENTER); // bad value for arrow button
-	assertTrue(SWT.CENTER != arrowButton.getAlignment());
-	arrowButton.dispose();
-
-	int alignment = 55; // some bogus number
-	button.setAlignment(alignment);
-	assertTrue(alignment != button.getAlignment());
-}
-
-public void test_setFocus() {
-	warnUnimpl("Test test_setFocus not written");
-}
-
-public void test_setImageLorg_eclipse_swt_graphics_Image() {
-	Image image = button.getImage();
-	button.setImage(image);
-	assertEquals(image, button.getImage());
-
-	button.setImage(null);
-	assertNull(button.getImage());
-
-	image = new Image(shell.getDisplay(), 10, 10);
-	button.setImage(image);
-	assertEquals(image, button.getImage());
-
-	button.setImage(null);
-	image.dispose();
-	try {
-		button.setImage(image);
-		button.setImage(null);
-		fail("No exception thrown for disposed image");
-	} catch (IllegalArgumentException e) {
-	}
-}
-
-public void test_setSelectionZ() {
-	// test setSelection for check box
-	button = new Button(shell, SWT.CHECK);
-	button.setSelection(true);
-	assertTrue(button.getSelection());
-	button.setSelection(false);
-	assertTrue(!button.getSelection());
-
-	// test setSelection for arrow button
-	Button newButton = new Button(shell, SWT.ARROW);
-	newButton.setSelection(true);
-	assertTrue(!newButton.getSelection());
-	newButton.setSelection(false);
-	assertTrue(!newButton.getSelection());
-	newButton.dispose();
-
-	// test setSelection for push button
-	newButton = new Button(shell, SWT.PUSH);
-	newButton.setSelection(true);
-	assertTrue(!newButton.getSelection());
-	newButton.setSelection(false);
-	assertTrue(!newButton.getSelection());
-	newButton.dispose();
-
-	// test setSelection for radio button
-	newButton = new Button(shell, SWT.RADIO);
-	newButton.setSelection(true);
-	assertTrue(newButton.getSelection());
-	newButton.setSelection(false);
-	assertTrue(!newButton.getSelection());
-	newButton.dispose();
-
-	// test setSelection for toggle button
-	newButton = new Button(shell, SWT.TOGGLE);
-	newButton.setSelection(true);
-	assertTrue(newButton.getSelection());
-	newButton.setSelection(false);
-	assertTrue(!newButton.getSelection());
-	newButton.dispose();
-}
-
-public void test_setTextLjava_lang_String() {
-	String[] cases = {"", "some text", "ldkashdoehufweovcnhslvhregojebckreavbkuhxbiufvcyhbifuyewvbiureyd.,cmnesljliewjfchvbwoifivbeworixuieurvbiuvbohflksjeahfcliureafgyciabelitvyrwtlicuyrtliureybcliuyreuceyvbliureybct", "\n \n \b \t ", "\0"};
-	int goodCases = 4;
-	for (int i=0; i<goodCases; i++){
-		button.setText(cases[i]);
-		assertTrue("good case: " + String.valueOf(i), button.getText().equals(cases[i]));
-	};
-
-	try {
-		button.setText(null);
-		fail("No exception thrown for text == null");
-	}
-	catch (IllegalArgumentException e) {
-	}
-
-	button.setText("");
-
-	button.setText("some name ");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_widgets_Button((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_CompositeI");
-	methodNames.addElement("test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener");
-	methodNames.addElement("test_computeSizeIIZ");
-	methodNames.addElement("test_getAlignment");
-	methodNames.addElement("test_getImage");
-	methodNames.addElement("test_getSelection");
-	methodNames.addElement("test_getText");
-	methodNames.addElement("test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener");
-	methodNames.addElement("test_setAlignmentI");
-	methodNames.addElement("test_setFocus");
-	methodNames.addElement("test_setImageLorg_eclipse_swt_graphics_Image");
-	methodNames.addElement("test_setSelectionZ");
-	methodNames.addElement("test_setTextLjava_lang_String");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Control.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_CompositeI")) test_ConstructorLorg_eclipse_swt_widgets_CompositeI();
-	else if (getName().equals("test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener")) test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener();
-	else if (getName().equals("test_computeSizeIIZ")) test_computeSizeIIZ();
-	else if (getName().equals("test_getAlignment")) test_getAlignment();
-	else if (getName().equals("test_getImage")) test_getImage();
-	else if (getName().equals("test_getSelection")) test_getSelection();
-	else if (getName().equals("test_getText")) test_getText();
-	else if (getName().equals("test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener")) test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener();
-	else if (getName().equals("test_setAlignmentI")) test_setAlignmentI();
-	else if (getName().equals("test_setFocus")) test_setFocus();
-	else if (getName().equals("test_setImageLorg_eclipse_swt_graphics_Image")) test_setImageLorg_eclipse_swt_graphics_Image();
-	else if (getName().equals("test_setSelectionZ")) test_setSelectionZ();
-	else if (getName().equals("test_setTextLjava_lang_String")) test_setTextLjava_lang_String();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Canvas.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Canvas.java
deleted file mode 100644
index 96929f2..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Canvas.java
+++ /dev/null
@@ -1,113 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.widgets.Canvas
- *
- * @see org.eclipse.swt.widgets.Canvas
- */
-public class Test_org_eclipse_swt_widgets_Canvas extends Test_org_eclipse_swt_widgets_Composite {
-
-Canvas canvas;
-
-public Test_org_eclipse_swt_widgets_Canvas(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-	canvas = new Canvas(shell, 0);
-	super.setWidget(canvas);
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-protected void setWidget(Widget w) {
-	if (!canvas.isDisposed())
-		canvas.dispose();
-	canvas = (Canvas)w;
-	super.setWidget(w);
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_CompositeI() {
-	Canvas newCanvas;
-	try {
-		newCanvas = new Canvas(null, SWT.NONE);
-		fail("No exception thrown for parent == null");
-	}
-	catch (IllegalArgumentException e) {
-	}
-}
-
-public void test_getCaret() {
-	// tested in test_setCaretLorg_eclipse_swt_widgets_Caret
-}
-
-public void test_scrollIIIIIIZ() {
-	warnUnimpl("Test test_scrollIIIIIIZ not written");
-}
-
-public void test_setCaretLorg_eclipse_swt_widgets_Caret() {
-	int number = 5;
-	Caret[] carets = new Caret[number];
-	for (int i = 0; i < number; i++) {
-		carets[i] = new Caret(canvas, SWT.NONE);
-	}
-	for (int i = 0; i < number; i++) {
-		canvas.setCaret(carets[i]);
-		assertEquals("Caret # " + i + "not set properly", canvas.getCaret(), carets[i]);
-	}
-
-	canvas.setCaret(null);
-	assertNull("Caret should be null" , canvas.getCaret());
-}
-
-public void test_setFontLorg_eclipse_swt_graphics_Font() {
-	warnUnimpl("Test test_setFontLorg_eclipse_swt_graphics_Font not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_widgets_Canvas((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_CompositeI");
-	methodNames.addElement("test_getCaret");
-	methodNames.addElement("test_scrollIIIIIIZ");
-	methodNames.addElement("test_setCaretLorg_eclipse_swt_widgets_Caret");
-	methodNames.addElement("test_setFontLorg_eclipse_swt_graphics_Font");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Composite.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_CompositeI")) test_ConstructorLorg_eclipse_swt_widgets_CompositeI();
-	else if (getName().equals("test_getCaret")) test_getCaret();
-	else if (getName().equals("test_scrollIIIIIIZ")) test_scrollIIIIIIZ();
-	else if (getName().equals("test_setCaretLorg_eclipse_swt_widgets_Caret")) test_setCaretLorg_eclipse_swt_widgets_Caret();
-	else if (getName().equals("test_setFontLorg_eclipse_swt_graphics_Font")) test_setFontLorg_eclipse_swt_graphics_Font();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Caret.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Caret.java
deleted file mode 100644
index 3e3e519..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Caret.java
+++ /dev/null
@@ -1,210 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.graphics.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.widgets.Caret
- *
- * @see org.eclipse.swt.widgets.Caret
- */
-public class Test_org_eclipse_swt_widgets_Caret extends Test_org_eclipse_swt_widgets_Widget {
-
-Canvas canvas;
-Caret caret;
-
-public Test_org_eclipse_swt_widgets_Caret(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-	canvas = new Canvas(shell, SWT.NULL);
-	caret = new Caret(canvas, SWT.NULL);
-	setWidget(caret);
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_CanvasI() {
-	Caret newCaret;
-	try {
-		newCaret = new Caret(null, 0);
-		fail("No exception thrown for parent == null");
-	}
-	catch (IllegalArgumentException e) {
-	}
-}
-
-public void test_getBounds() {
-	Rectangle rect = new Rectangle(0,0,30,30);
-	caret.setBounds(rect);
-	assertTrue(caret.getBounds().equals(rect));
-
-	rect = new Rectangle(0,0,30,30);
-	caret.setBounds(rect);
-	assertTrue(!caret.getBounds().equals(new Rectangle (0,0,60,70)));
-}
-
-public void test_getFont() {
-	// tested in test_setFontLorg_eclipse_swt_graphics_Font
-}
-
-public void test_getImage() {
-	// tested in test_setImageLorg_eclipse_swt_graphics_Image
-}
-
-public void test_getParent() {
-	assertEquals(canvas, caret.getParent());
-
-	assertTrue(caret.getDisplay()==shell.getDisplay());
-}
-
-public void test_getVisible() {
-	// tested in test_setVisibleZ
-}
-
-public void test_isVisible() {
-	caret.setVisible(true);
-	assertTrue(!caret.isVisible()); //because the shell is not visible
-
-	caret.setVisible(false);
-	assertTrue(!caret.isVisible());
-
-	caret.setVisible(true);
-	canvas.setVisible(true);
-	shell.setVisible(true);
-	assertTrue(caret.getVisible() == true);
-	canvas.setVisible(false);
-	if (fCheckVisibility) {
-		assertTrue(!caret.getVisible());
-	}
-
-	shell.setVisible(false);
-	canvas.setVisible(false);
-	caret.setVisible(false);
-	assertTrue(!caret.getVisible());
-}
-
-public void test_setBoundsIIII() {
-	caret.setBounds(0, 0, 30, 30);
-}
-
-public void test_setBoundsLorg_eclipse_swt_graphics_Rectangle() {
-	caret.setBounds(new Rectangle(0,0,30,30));
-
-	try {
-		caret.setBounds(null);
-		fail("No exception thrown for bounds == null");
-	}
-	catch (IllegalArgumentException e) {
-	}
-}
-
-public void test_setFontLorg_eclipse_swt_graphics_Font() {
-	Font font = caret.getFont();
-	caret.setFont(font);
-	assertEquals(font, caret.getFont());
-	
-	font = new Font(caret.getDisplay(), SwtJunit.testFontName, 10, SWT.NORMAL);
-	caret.setFont(font);
-	assertEquals(font, caret.getFont());
-
-	caret.setFont(null);
-	font.dispose();
-	try {
-		caret.setFont(font);
-		caret.setFont(null);
-		fail("No exception thrown for disposed font");
-	} catch (IllegalArgumentException e) {
-	}
-}
-
-public void test_setImageLorg_eclipse_swt_graphics_Image() {
-	Image image = caret.getImage();
-	caret.setImage(image);
-	assertEquals(image, caret.getImage());
-
-	caret.setImage(null);
-	assertNull(caret.getImage());
-
-	image = new Image(shell.getDisplay(), 10, 10);
-	caret.setImage(image);
-	assertEquals(image, caret.getImage());
-
-	caret.setImage(null);
-	image.dispose();
-	try {
-		caret.setImage(image);
-		caret.setImage(null);
-		fail("No exception thrown for disposed image");
-	} catch (IllegalArgumentException e) {
-	}
-}
-
-public void test_setVisibleZ() {
-	caret.setVisible(true);
-	assertTrue("Caret should be visible", caret.getVisible()==true);
-
-	caret.setVisible(false);
-	assertTrue("Caret should not be visible", caret.getVisible()==false);
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_widgets_Caret((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_CanvasI");
-	methodNames.addElement("test_getBounds");
-	methodNames.addElement("test_getFont");
-	methodNames.addElement("test_getImage");
-	methodNames.addElement("test_getParent");
-	methodNames.addElement("test_getVisible");
-	methodNames.addElement("test_isVisible");
-	methodNames.addElement("test_setBoundsIIII");
-	methodNames.addElement("test_setBoundsLorg_eclipse_swt_graphics_Rectangle");
-	methodNames.addElement("test_setFontLorg_eclipse_swt_graphics_Font");
-	methodNames.addElement("test_setImageLorg_eclipse_swt_graphics_Image");
-	methodNames.addElement("test_setVisibleZ");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Widget.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_CanvasI")) test_ConstructorLorg_eclipse_swt_widgets_CanvasI();
-	else if (getName().equals("test_getBounds")) test_getBounds();
-	else if (getName().equals("test_getFont")) test_getFont();
-	else if (getName().equals("test_getImage")) test_getImage();
-	else if (getName().equals("test_getParent")) test_getParent();
-	else if (getName().equals("test_getVisible")) test_getVisible();
-	else if (getName().equals("test_isVisible")) test_isVisible();
-	else if (getName().equals("test_setBoundsIIII")) test_setBoundsIIII();
-	else if (getName().equals("test_setBoundsLorg_eclipse_swt_graphics_Rectangle")) test_setBoundsLorg_eclipse_swt_graphics_Rectangle();
-	else if (getName().equals("test_setFontLorg_eclipse_swt_graphics_Font")) test_setFontLorg_eclipse_swt_graphics_Font();
-	else if (getName().equals("test_setImageLorg_eclipse_swt_graphics_Image")) test_setImageLorg_eclipse_swt_graphics_Image();
-	else if (getName().equals("test_setVisibleZ")) test_setVisibleZ();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_ColorDialog.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_ColorDialog.java
deleted file mode 100644
index d8f2bb4..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_ColorDialog.java
+++ /dev/null
@@ -1,118 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.graphics.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.widgets.ColorDialog
- *
- * @see org.eclipse.swt.widgets.ColorDialog
- */
-public class Test_org_eclipse_swt_widgets_ColorDialog extends Test_org_eclipse_swt_widgets_Dialog {
-
-ColorDialog colorDialog;
-
-public Test_org_eclipse_swt_widgets_ColorDialog(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-	colorDialog = new ColorDialog(shell, SWT.NULL);
-	setDialog(colorDialog);
-}
-
-protected void tearDown() {
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_Shell() {
-	new ColorDialog(shell);
-	
-	try {
-		new ColorDialog(null);
-		fail("No exception thrown for parent == null");
-	}
-	catch (IllegalArgumentException e) {
-	}
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_ShellI() {
-	new ColorDialog(shell, SWT.NULL);
-	
-	try {
-		new ColorDialog(null, SWT.NULL);
-		fail("No exception thrown for parent == null");
-	}
-	catch (IllegalArgumentException e) {
-	}
-}
-
-public void test_getRGB() {
-	// tested in test_setRGBLorg_eclipse_swt_graphics_RGB
-}
-
-public void test_open() {
-	warnUnimpl("Test test_open not written");
-}
-
-public void test_setRGBLorg_eclipse_swt_graphics_RGB() {
-	RGB rgb = new RGB(0, 0, 0);
-
-	assertTrue(":a:", colorDialog.getRGB() == null);	
-		
-	colorDialog.setRGB(rgb);
-	assertTrue(":b:", colorDialog.getRGB() == rgb);
-
-	if (fCheckSwtNullExceptions) {
-		try {
-			colorDialog.setRGB(null);
-			fail("No exception thrown for rgb == null");
-		}
-		catch (IllegalArgumentException e) {
-		}
-	}
-	assertTrue(":c:", colorDialog.getRGB() == rgb);	
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_widgets_ColorDialog((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_Shell");
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_ShellI");
-	methodNames.addElement("test_getRGB");
-	methodNames.addElement("test_open");
-	methodNames.addElement("test_setRGBLorg_eclipse_swt_graphics_RGB");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Dialog.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_Shell")) test_ConstructorLorg_eclipse_swt_widgets_Shell();
-	else if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_ShellI")) test_ConstructorLorg_eclipse_swt_widgets_ShellI();
-	else if (getName().equals("test_getRGB")) test_getRGB();
-	else if (getName().equals("test_open")) test_open();
-	else if (getName().equals("test_setRGBLorg_eclipse_swt_graphics_RGB")) test_setRGBLorg_eclipse_swt_graphics_RGB();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Combo.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Combo.java
deleted file mode 100644
index cf5324a..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Combo.java
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Composite.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Composite.java
deleted file mode 100644
index 04d9792..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Composite.java
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Control.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Control.java
deleted file mode 100644
index 9038fed..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Control.java
+++ /dev/null
@@ -1,825 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.events.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.widgets.Control
- *
- * @see org.eclipse.swt.widgets.Control
- */
-public class Test_org_eclipse_swt_widgets_Control extends Test_org_eclipse_swt_widgets_Widget {
-
-	Control control;
-	boolean eventOccurred;
-
-public Test_org_eclipse_swt_widgets_Control(String name) {
-	super(name);
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-protected void setWidget(Widget w) {
-	control = (Control)w;
-	super.setWidget(w);
-}
-
-public void test_addControlListenerLorg_eclipse_swt_events_ControlListener() {
-	ControlListener listener = new ControlListener() {
-		public void controlMoved(ControlEvent e) {
-			eventOccurred = true;
-		};
-		public void controlResized(ControlEvent e) {
-			eventOccurred = true;
-		};
-	};
-	control.addControlListener(listener);
-	eventOccurred = false;
-	control.notifyListeners(SWT.Move, new Event());
-	assertTrue(eventOccurred);
-	eventOccurred = false;
-	control.notifyListeners(SWT.Resize, new Event());
-	assertTrue(eventOccurred);
-	control.removeControlListener(listener);
-}
-
-public void test_addFocusListenerLorg_eclipse_swt_events_FocusListener() {
-	FocusListener listener = new FocusListener() {
-		public void focusGained(FocusEvent e) {
-			eventOccurred = true;
-		};
-		public void focusLost(FocusEvent e) {
-			eventOccurred = true;
-		};
-	};
-	control.addFocusListener(listener);
-	eventOccurred = false;
-	control.notifyListeners(SWT.FocusIn, new Event());
-	assertTrue(eventOccurred);
-	eventOccurred = false;
-	control.notifyListeners(SWT.FocusOut, new Event());
-	assertTrue(eventOccurred);
-	control.removeFocusListener(listener);
-}
-
-public void test_addHelpListenerLorg_eclipse_swt_events_HelpListener() {
-	HelpListener listener = new HelpListener() {
-		public void helpRequested(HelpEvent e) {
-			eventOccurred = true;
-		};
-	};
-	control.addHelpListener(listener);
-	eventOccurred = false;
-	control.notifyListeners(SWT.Help, new Event());
-	assertTrue(eventOccurred);
-	control.removeHelpListener(listener);
-}
-
-public void test_addKeyListenerLorg_eclipse_swt_events_KeyListener() {
-	KeyListener listener = new KeyListener() {
-		public void keyPressed(KeyEvent e) {
-			eventOccurred = true;
-		};
-		public void keyReleased(KeyEvent e) {
-			eventOccurred = true;
-		};
-	};
-	control.addKeyListener(listener);
-	eventOccurred = false;
-	control.notifyListeners(SWT.KeyDown, new Event());
-	assertTrue(eventOccurred);
-	eventOccurred = false;
-	control.notifyListeners(SWT.KeyUp, new Event());
-	assertTrue(eventOccurred);
-	control.removeKeyListener(listener);
-}
-
-public void test_addMouseListenerLorg_eclipse_swt_events_MouseListener() {
-	MouseListener listener = new MouseListener() {
-		public void mouseDown(MouseEvent e) {
-			eventOccurred = true;
-		};
-		public void mouseUp(MouseEvent e) {
-			eventOccurred = true;
-		};
-		public void mouseDoubleClick(MouseEvent e) {
-			eventOccurred = true;
-		};
-	};
-	control.addMouseListener(listener);
-	eventOccurred = false;
-	control.notifyListeners(SWT.MouseDown, new Event());
-	assertTrue(eventOccurred);
-	eventOccurred = false;
-	control.notifyListeners(SWT.MouseUp, new Event());
-	assertTrue(eventOccurred);
-	eventOccurred = false;
-	control.notifyListeners(SWT.MouseDoubleClick, new Event());
-	assertTrue(eventOccurred);
-	control.removeMouseListener(listener);
-}
-
-public void test_addMouseTrackListenerLorg_eclipse_swt_events_MouseTrackListener() {
-	MouseTrackListener listener = new MouseTrackListener() {
-		public void mouseEnter(MouseEvent e) {
-			eventOccurred = true;
-		};
-		public void mouseExit(MouseEvent e) {
-			eventOccurred = true;
-		};
-		public void mouseHover(MouseEvent e) {
-			eventOccurred = true;
-		};
-	};
-	control.addMouseTrackListener(listener);
-	eventOccurred = false;
-	control.notifyListeners(SWT.MouseEnter, new Event());
-	assertTrue(eventOccurred);
-	eventOccurred = false;
-	control.notifyListeners(SWT.MouseExit, new Event());
-	assertTrue(eventOccurred);
-	eventOccurred = false;
-	control.notifyListeners(SWT.MouseHover, new Event());
-	assertTrue(eventOccurred);
-	control.removeMouseTrackListener(listener);
-}
-
-public void test_addMouseMoveListenerLorg_eclipse_swt_events_MouseMoveListener() {
-	MouseMoveListener listener = new MouseMoveListener() {
-		public void mouseMove(MouseEvent e) {
-			eventOccurred = true;
-		};
-	};
-	control.addMouseMoveListener(listener);
-	eventOccurred = false;
-	control.notifyListeners(SWT.MouseMove, new Event());
-	assertTrue(eventOccurred);
-	control.removeMouseMoveListener(listener);
-}
-
-public void test_addPaintListenerLorg_eclipse_swt_events_PaintListener() {
-	PaintListener listener = new PaintListener() {
-		public void paintControl(PaintEvent e) {
-			eventOccurred = true;
-		};
-	};
-	control.addPaintListener(listener);
-	eventOccurred = false;
-	control.notifyListeners(SWT.Paint, new Event());
-	assertTrue(eventOccurred);
-	control.removePaintListener(listener);
-}
-
-public void test_addTraverseListenerLorg_eclipse_swt_events_TraverseListener() {
-	TraverseListener listener = new TraverseListener() {
-		public void keyTraversed(TraverseEvent e) {
-			eventOccurred = true;
-		};
-	};
-	control.addTraverseListener(listener);
-	eventOccurred = false;
-	control.notifyListeners(SWT.Traverse, new Event());
-	assertTrue(eventOccurred);
-	control.removeTraverseListener(listener);
-}
-
-public void test_computeSizeII() {
-	control.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-	Point size = control.getSize();
-	control.computeSize(size.x, size.y);
-	assertEquals(size.x, control.getSize().x);
-	assertEquals(size.y, control.getSize().y);
-}
-
-public void test_computeSizeIIZ() {
-	control.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
-	Point size = control.getSize();
-	control.computeSize(size.x, size.y, false);
-	assertEquals(size.x, control.getSize().x);
-	assertEquals(size.y, control.getSize().y);
-}
-
-public void test_forceFocus() {
-	// this is difficult to test in Control.
-	// subclasses that wish to test this should override.
-}
-
-public void test_getBackground() {
-	// tested in test_setBackgroundLorg_eclipse_swt_graphics_Color
-}
-
-public void test_getBorderWidth() {
-	control.getBorderWidth();
-}
-
-public void test_getBounds() {
-	// tested in test_setBoundsIIII and test_setBoundsLorg_eclipse_swt_graphics_Rectangle
-}
-
-public void test_getDisplay() {
-	assertEquals(control.getDisplay(), control.getShell().getDisplay());
-}
-
-public void test_getEnabled() {
-	// tested in test_setEnabledZ
-}
-
-public void test_getFont() {
-	// tested in test_setFontLorg_eclipse_swt_graphics_Font
-}
-
-public void test_getForeground() {
-	// tested in test_setForegroundLorg_eclipse_swt_graphics_Color
-}
-
-public void test_getLayoutData() {
-	// tested in test_setLayoutDataLjava_lang_Object
-}
-
-public void test_getLocation() {
-	control.setBounds(32, 43, 30, 40);
-	assertTrue(control.getLocation().equals(new Point(32, 43)));
-}
-
-public void test_getMenu() {
-	// tested in test_setMenuLorg_eclipse_swt_widgets_Menu
-}
-
-public void test_getParent() {
-	assertEquals(shell, control.getParent());
-}
-
-public void test_getShell() {
-	assertEquals(shell, control.getShell());
-}
-
-public void test_getSize() {
-	// tested in test_setSizeII
-}
-
-public void test_getToolTipText() {
-	// tested in test_setToolTipTextLjava_lang_String
-}
-
-public void test_getVisible() {
-	// tested in test_setVisibleZ
-}
-
-public void test_internal_new_GCLorg_eclipse_swt_graphics_GCData() {
-	GCData data = new GCData();
-	int hDC = control.internal_new_GC(data);
-	control.internal_dispose_GC(hDC, data);
-}
-
-public void test_internal_dispose_GCILorg_eclipse_swt_graphics_GCData() {
-	// tested in test_internal_new_GCLorg_eclipse_swt_graphics_GCData
-}
-
-public void test_isDisposed() {
-	assertTrue(!control.isDisposed());
-}
-
-public void test_isEnabled() {
-	control.setEnabled(true);
-	assertTrue(control.isEnabled());
-
-	control.setEnabled(false);
-	assertTrue(!control.isEnabled());
-}
-
-public void test_isFocusControl() {
-	assertTrue(!control.isFocusControl());
-}
-
-public void test_isReparentable() {
-	if (SwtJunit.isWindows) {
-		assertTrue(control.isReparentable());
-	} else {
-		assertTrue(!control.isReparentable());
-	}
-}
-
-public void test_isVisible() {
-	control.setVisible(true);
-	assertTrue(!control.isVisible());  //because the shell is not visible
-
-	control.setVisible(false);
-	assertTrue(!control.isVisible());
-
-	if (!SwtJunit.isAIX) {
-		control.setVisible(true);
-		shell.setVisible(true);
-		assertTrue("Window should be visible", control.isVisible());
-		shell.setVisible(false);
-		assertTrue("Window should not be visible", !control.isVisible());
-	}
-}
-
-public void test_moveAboveLorg_eclipse_swt_widgets_Control() {
-	control.moveAbove(null);
-
-	control.moveAbove(control);
-
-	Button b = new Button(shell, 0);
-	control.moveAbove(b);
-	b.dispose();
-}
-
-public void test_moveBelowLorg_eclipse_swt_widgets_Control() {
-	control.moveBelow(null);
-
-	control.moveBelow(control);
-
-	Button b = new Button(shell, 0);
-	control.moveBelow(b);
-	b.dispose();
-}
-
-public void test_pack() {
-	control.pack();
-}
-
-public void test_packZ() {
-	control.pack(true);
-	control.pack(false);
-}
-
-public void test_redraw() {
-	control.redraw();
-}
-
-public void test_redrawIIIIZ() {
-	control.redraw(0, 0, 0, 0, false);
-
-	control.redraw(0, 0, 0, 0, true);
-
-	control.redraw(-10, -10, -10, -10, true);
-
-	control.redraw(10, 10, 10, 10, true);
-
-	control.redraw(10, 10, 10, 10, false);
-
-	control.redraw(10000, 10000, 10000, 10000, false);
-}
-
-public void test_removeControlListenerLorg_eclipse_swt_events_ControlListener() {
-	// tested in test_addControlListenerLorg_eclipse_swt_events_ControlListener
-}
-
-public void test_removeFocusListenerLorg_eclipse_swt_events_FocusListener() {
-	// tested in test_addFocusListenerLorg_eclipse_swt_events_FocusListener
-}
-
-public void test_removeHelpListenerLorg_eclipse_swt_events_HelpListener() {
-	// tested in test_addHelpListenerLorg_eclipse_swt_events_HelpListener
-}
-
-public void test_removeKeyListenerLorg_eclipse_swt_events_KeyListener() {
-	// tested in test_addKeyListenerLorg_eclipse_swt_events_KeyListener
-}
-
-public void test_removeMouseTrackListenerLorg_eclipse_swt_events_MouseTrackListener() {
-	// tested in test_addMouseTrackListenerLorg_eclipse_swt_events_MouseTrackListener
-}
-
-public void test_removeMouseListenerLorg_eclipse_swt_events_MouseListener() {
-	// tested in test_addMouseListenerLorg_eclipse_swt_events_MouseListener
-}
-
-public void test_removeMouseMoveListenerLorg_eclipse_swt_events_MouseMoveListener() {
-	// tested in test_addMouseMoveListenerLorg_eclipse_swt_events_MouseMoveListener
-}
-
-public void test_removePaintListenerLorg_eclipse_swt_events_PaintListener() {
-	// tested in test_addPaintListenerLorg_eclipse_swt_events_PaintListener
-}
-
-public void test_removeTraverseListenerLorg_eclipse_swt_events_TraverseListener() {
-	// tested in test_addTraverseListenerLorg_eclipse_swt_events_TraverseListener
-}
-
-public void test_setBackgroundLorg_eclipse_swt_graphics_Color() {
-	Color color = new Color(control.getDisplay(), 255, 0, 0);
-	control.setBackground(color);
-	assertEquals(color, control.getBackground());
-	control.setBackground(null);
-	assertTrue(!control.getBackground().equals(color));
-	color.dispose();
-}
-
-public void test_setBoundsIIII() {
-	control.setBounds(10, 20, 30, 40);
-	assertEquals(new Rectangle(10, 20, 30, 40), control.getBounds());
-
-	control.setBounds(20, 30, 40, 50);
-	assertEquals(false, control.getBounds().equals(new Rectangle(10, 20, 30, 40)));
-
-	control.setBounds(10, 20, 30, 40);
-}
-
-public void test_setBoundsLorg_eclipse_swt_graphics_Rectangle() {
-	control.setBounds(new Rectangle(10, 20, 30, 40));
-	assertEquals(new Rectangle(10, 20, 30, 40), control.getBounds());
-
-	control.setBounds(new Rectangle(20, 30, 40, 50));
-	assertEquals(false, control.getBounds().equals(new Rectangle(10, 20, 30, 40)));
-
-	try {
-		control.setBounds(null);
-		fail("No exception thrown for rectangle == null");
-	}
-	catch (IllegalArgumentException e) {
-	}
-
-	control.setBounds(new Rectangle(10, 20, 30, 40));
-}
-
-public void test_setCaptureZ() {
-	control.setCapture(true);
-
-	control.setCapture(false);
-}
-
-public void test_setCursorLorg_eclipse_swt_graphics_Cursor() {
-	control.setCursor(null);
-
-	Cursor c = new Cursor(control.getDisplay(), 0);
-	control.setCursor(c);
-	c.dispose();
-}
-
-public void test_setEnabledZ() {
-	control.setEnabled(true);
-	assertTrue(control.getEnabled());
-
-	control.setEnabled(false);
-	assertTrue(!control.getEnabled());
-}
-
-public void test_setFocus() {
-	control.setFocus();
-}
-
-public void test_setFontLorg_eclipse_swt_graphics_Font() {
-	Font font = control.getFont();
-	control.setFont(font);
-	assertEquals(font, control.getFont());
-	
-	font = new Font(control.getDisplay(), SwtJunit.testFontName, 10, SWT.NORMAL);
-	control.setFont(font);
-	assertEquals(font, control.getFont());
-
-	control.setFont(null);
-	font.dispose();
-	try {
-		control.setFont(font);
-		control.setFont(null);
-		fail("No exception thrown for disposed font");
-	} catch (IllegalArgumentException e) {
-	}
-}
-
-public void test_setForegroundLorg_eclipse_swt_graphics_Color() {
-	Color color = new Color(control.getDisplay(), 255, 0, 0);
-	control.setForeground(color);
-	assertEquals(color, control.getForeground());
-	control.setForeground(null);
-	assertTrue(!control.getForeground().equals(color));
-	color.dispose();
-}
-
-public void test_setLayoutDataLjava_lang_Object() {
-	control.setLayoutData(this);
-	assertEquals(this, control.getLayoutData());
-
-	control.setLayoutData("asldsahdahcaslcshdac");
-	assertEquals("asldsahdahcaslcshdac", control.getLayoutData());
-
-	control.setLayoutData(this.getClass());
-	assertEquals(this.getClass(), control.getLayoutData());
-
-	control.setLayoutData(null);
-	assertNull(control.getLayoutData());
-}
-
-public void test_setLocationII() {
-	control.setBounds(32, 43, 30, 40);
-	control.setLocation(11, 22);
-	control.setSize(32, 43);
-	assertEquals(control.getLocation(), new Point(11, 22));
-
-	control.setLocation(10, 10);
-	assertEquals(control.getLocation(), new Point(10, 10));
-}
-
-public void test_setLocationLorg_eclipse_swt_graphics_Point() {
-	try {
-		control.setLocation(null);
-		fail("No exception thrown for location == null");
-	}
-	catch (IllegalArgumentException e) {
-	}
-
-	Point loc = new Point(30, 40);
-	control.setLocation(loc);
-	assertEquals(control.getLocation(), loc);
-
-	loc = new Point(10, 10);
-	control.setLocation(loc);
-	assertEquals(control.getLocation(), loc);
-
-	loc = new Point(10000, 10000);
-	control.setLocation(loc);
-	assertEquals(control.getLocation(), loc);
-
-	loc = new Point(-10, -10);
-	control.setLocation(loc);
-	assertEquals(control.getLocation(), loc);
-}
-
-public void test_setMenuLorg_eclipse_swt_widgets_Menu () {
-	/* this is a valid thing to do, you can reset a menu to nothing */
-	control.setMenu(null);
-
-	Menu m = new Menu(control);
-	control.setMenu(m);
-	assertEquals(m, control.getMenu());
-}
-
-public void test_setRedrawZ() {
-	control.setRedraw(false);
-
-	control.setRedraw(true);
-}
-
-public void test_setSizeII() {
-	control.setBounds(32, 43, 30, 40);
-	assertEquals(new Point(30, 40), control.getSize());
-
-	control.setBounds(32, 43, 30, 40);
-	control.setLocation(11, 22);
-	control.setSize(32, 43);
-	assertEquals(new Point(32, 43), control.getSize());
-
-	control.setSize(0, 0);
-	
-	control.setSize(10, 10);
-
-	control.setSize(10000, 10000);
-
-	control.setSize(-10, -10);
-}
-
-public void test_setSizeLorg_eclipse_swt_graphics_Point() {
-	control.setSize(new Point(30, 40));
-	assertEquals(new Point(30, 40), control.getSize());
-
-	try {
-		control.setSize(null);
-		fail("No exception thrown for size == null");
-	}
-	catch (IllegalArgumentException e) {
-	}
-
-	control.setSize(new Point(0, 0));
-	
-	control.setSize(new Point(10, 10));
-
-	control.setSize(new Point(10000, 10000));
-
-	control.setSize(new Point(-10, -10));
-}
-
-public void test_setToolTipTextLjava_lang_String() {
-	control.setToolTipText("This is a tip");
-	assertEquals("This is a tip", control.getToolTipText());
-
-	control.setToolTipText(null);
-	assertNull(control.getToolTipText());
-}
-
-public void test_setVisibleZ() {
-	control.setVisible(true);
-	assertTrue(control.getVisible());
-
-	control.setVisible(false);
-	assertTrue(!control.getVisible());
-}
-
-public void test_toControlLorg_eclipse_swt_graphics_Point() {
-	Point controlCoords = control.toControl(new Point(0, 0));
-	assertEquals(new Point(0, 0), control.toDisplay(controlCoords));
-	try {
-		control.toControl(null);
-		fail("No exception thrown for size == null");
-	}
-	catch (IllegalArgumentException e) {
-	}
-}
-
-public void test_toDisplayLorg_eclipse_swt_graphics_Point() {
-	Point displayCoords = control.toDisplay(new Point(0, 0));
-	assertEquals(new Point(0, 0), control.toControl(displayCoords));
-	try {
-		control.toDisplay(null);
-		fail("No exception thrown for size == null");
-	}
-	catch (IllegalArgumentException e) {
-	}
-}
-
-public void test_traverseI() {
-	control.traverse(SWT.TRAVERSE_ESCAPE);
-	control.traverse(SWT.TRAVERSE_RETURN);
-	control.traverse(SWT.TRAVERSE_TAB_NEXT);
-	control.traverse(SWT.TRAVERSE_TAB_PREVIOUS);
-	control.traverse(SWT.TRAVERSE_ARROW_NEXT);
-	control.traverse(SWT.TRAVERSE_ARROW_PREVIOUS);
-}
-
-public void test_update() {
-	control.update();
-}
-
-public void test_setParentLorg_eclipse_swt_widgets_Composite() {
-	if (control.isReparentable()) {
-		Shell originalParent = new Shell();
-		Shell newParent = new Shell();
-		Button b = new Button(originalParent, SWT.PUSH);
-		b.setParent(newParent);
-		originalParent.dispose();
-		assertTrue(!b.isDisposed());
-		newParent.dispose();
-	}
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_addControlListenerLorg_eclipse_swt_events_ControlListener");
-	methodNames.addElement("test_addFocusListenerLorg_eclipse_swt_events_FocusListener");
-	methodNames.addElement("test_addHelpListenerLorg_eclipse_swt_events_HelpListener");
-	methodNames.addElement("test_addKeyListenerLorg_eclipse_swt_events_KeyListener");
-	methodNames.addElement("test_addMouseListenerLorg_eclipse_swt_events_MouseListener");
-	methodNames.addElement("test_addMouseTrackListenerLorg_eclipse_swt_events_MouseTrackListener");
-	methodNames.addElement("test_addMouseMoveListenerLorg_eclipse_swt_events_MouseMoveListener");
-	methodNames.addElement("test_addPaintListenerLorg_eclipse_swt_events_PaintListener");
-	methodNames.addElement("test_addTraverseListenerLorg_eclipse_swt_events_TraverseListener");
-	methodNames.addElement("test_computeSizeII");
-	methodNames.addElement("test_computeSizeIIZ");
-	methodNames.addElement("test_forceFocus");
-	methodNames.addElement("test_getBackground");
-	methodNames.addElement("test_getBorderWidth");
-	methodNames.addElement("test_getBounds");
-	methodNames.addElement("test_getDisplay");
-	methodNames.addElement("test_getEnabled");
-	methodNames.addElement("test_getFont");
-	methodNames.addElement("test_getForeground");
-	methodNames.addElement("test_getLayoutData");
-	methodNames.addElement("test_getLocation");
-	methodNames.addElement("test_getMenu");
-	methodNames.addElement("test_getParent");
-	methodNames.addElement("test_getShell");
-	methodNames.addElement("test_getSize");
-	methodNames.addElement("test_getToolTipText");
-	methodNames.addElement("test_getVisible");
-	methodNames.addElement("test_internal_new_GCLorg_eclipse_swt_graphics_GCData");
-	methodNames.addElement("test_internal_dispose_GCILorg_eclipse_swt_graphics_GCData");
-	methodNames.addElement("test_isDisposed");
-	methodNames.addElement("test_isEnabled");
-	methodNames.addElement("test_isFocusControl");
-	methodNames.addElement("test_isReparentable");
-	methodNames.addElement("test_isVisible");
-	methodNames.addElement("test_moveAboveLorg_eclipse_swt_widgets_Control");
-	methodNames.addElement("test_moveBelowLorg_eclipse_swt_widgets_Control");
-	methodNames.addElement("test_pack");
-	methodNames.addElement("test_packZ");
-	methodNames.addElement("test_redraw");
-	methodNames.addElement("test_redrawIIIIZ");
-	methodNames.addElement("test_removeControlListenerLorg_eclipse_swt_events_ControlListener");
-	methodNames.addElement("test_removeFocusListenerLorg_eclipse_swt_events_FocusListener");
-	methodNames.addElement("test_removeHelpListenerLorg_eclipse_swt_events_HelpListener");
-	methodNames.addElement("test_removeKeyListenerLorg_eclipse_swt_events_KeyListener");
-	methodNames.addElement("test_removeMouseTrackListenerLorg_eclipse_swt_events_MouseTrackListener");
-	methodNames.addElement("test_removeMouseListenerLorg_eclipse_swt_events_MouseListener");
-	methodNames.addElement("test_removeMouseMoveListenerLorg_eclipse_swt_events_MouseMoveListener");
-	methodNames.addElement("test_removePaintListenerLorg_eclipse_swt_events_PaintListener");
-	methodNames.addElement("test_removeTraverseListenerLorg_eclipse_swt_events_TraverseListener");
-	methodNames.addElement("test_setBackgroundLorg_eclipse_swt_graphics_Color");
-	methodNames.addElement("test_setBoundsIIII");
-	methodNames.addElement("test_setBoundsLorg_eclipse_swt_graphics_Rectangle");
-	methodNames.addElement("test_setCaptureZ");
-	methodNames.addElement("test_setCursorLorg_eclipse_swt_graphics_Cursor");
-	methodNames.addElement("test_setEnabledZ");
-	methodNames.addElement("test_setFocus");
-	methodNames.addElement("test_setFontLorg_eclipse_swt_graphics_Font");
-	methodNames.addElement("test_setForegroundLorg_eclipse_swt_graphics_Color");
-	methodNames.addElement("test_setLayoutDataLjava_lang_Object");
-	methodNames.addElement("test_setLocationII");
-	methodNames.addElement("test_setLocationLorg_eclipse_swt_graphics_Point");
-	methodNames.addElement("test_setMenuLorg_eclipse_swt_widgets_Menu");
-	methodNames.addElement("test_setRedrawZ");
-	methodNames.addElement("test_setSizeII");
-	methodNames.addElement("test_setSizeLorg_eclipse_swt_graphics_Point");
-	methodNames.addElement("test_setToolTipTextLjava_lang_String");
-	methodNames.addElement("test_setVisibleZ");
-	methodNames.addElement("test_toControlLorg_eclipse_swt_graphics_Point");
-	methodNames.addElement("test_toDisplayLorg_eclipse_swt_graphics_Point");
-	methodNames.addElement("test_traverseI");
-	methodNames.addElement("test_update");
-	methodNames.addElement("test_setParentLorg_eclipse_swt_widgets_Composite");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Widget.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_addControlListenerLorg_eclipse_swt_events_ControlListener")) test_addControlListenerLorg_eclipse_swt_events_ControlListener();
-	else if (getName().equals("test_addFocusListenerLorg_eclipse_swt_events_FocusListener")) test_addFocusListenerLorg_eclipse_swt_events_FocusListener();
-	else if (getName().equals("test_addHelpListenerLorg_eclipse_swt_events_HelpListener")) test_addHelpListenerLorg_eclipse_swt_events_HelpListener();
-	else if (getName().equals("test_addKeyListenerLorg_eclipse_swt_events_KeyListener")) test_addKeyListenerLorg_eclipse_swt_events_KeyListener();
-	else if (getName().equals("test_addMouseListenerLorg_eclipse_swt_events_MouseListener")) test_addMouseListenerLorg_eclipse_swt_events_MouseListener();
-	else if (getName().equals("test_addMouseTrackListenerLorg_eclipse_swt_events_MouseTrackListener")) test_addMouseTrackListenerLorg_eclipse_swt_events_MouseTrackListener();
-	else if (getName().equals("test_addMouseMoveListenerLorg_eclipse_swt_events_MouseMoveListener")) test_addMouseMoveListenerLorg_eclipse_swt_events_MouseMoveListener();
-	else if (getName().equals("test_addPaintListenerLorg_eclipse_swt_events_PaintListener")) test_addPaintListenerLorg_eclipse_swt_events_PaintListener();
-	else if (getName().equals("test_addTraverseListenerLorg_eclipse_swt_events_TraverseListener")) test_addTraverseListenerLorg_eclipse_swt_events_TraverseListener();
-	else if (getName().equals("test_computeSizeII")) test_computeSizeII();
-	else if (getName().equals("test_computeSizeIIZ")) test_computeSizeIIZ();
-	else if (getName().equals("test_forceFocus")) test_forceFocus();
-	else if (getName().equals("test_getBackground")) test_getBackground();
-	else if (getName().equals("test_getBorderWidth")) test_getBorderWidth();
-	else if (getName().equals("test_getBounds")) test_getBounds();
-	else if (getName().equals("test_getDisplay")) test_getDisplay();
-	else if (getName().equals("test_getEnabled")) test_getEnabled();
-	else if (getName().equals("test_getFont")) test_getFont();
-	else if (getName().equals("test_getForeground")) test_getForeground();
-	else if (getName().equals("test_getLayoutData")) test_getLayoutData();
-	else if (getName().equals("test_getLocation")) test_getLocation();
-	else if (getName().equals("test_getMenu")) test_getMenu();
-	else if (getName().equals("test_getParent")) test_getParent();
-	else if (getName().equals("test_getShell")) test_getShell();
-	else if (getName().equals("test_getSize")) test_getSize();
-	else if (getName().equals("test_getToolTipText")) test_getToolTipText();
-	else if (getName().equals("test_getVisible")) test_getVisible();
-	else if (getName().equals("test_internal_new_GCLorg_eclipse_swt_graphics_GCData")) test_internal_new_GCLorg_eclipse_swt_graphics_GCData();
-	else if (getName().equals("test_internal_dispose_GCILorg_eclipse_swt_graphics_GCData")) test_internal_dispose_GCILorg_eclipse_swt_graphics_GCData();
-	else if (getName().equals("test_isDisposed")) test_isDisposed();
-	else if (getName().equals("test_isEnabled")) test_isEnabled();
-	else if (getName().equals("test_isFocusControl")) test_isFocusControl();
-	else if (getName().equals("test_isReparentable")) test_isReparentable();
-	else if (getName().equals("test_isVisible")) test_isVisible();
-	else if (getName().equals("test_moveAboveLorg_eclipse_swt_widgets_Control")) test_moveAboveLorg_eclipse_swt_widgets_Control();
-	else if (getName().equals("test_moveBelowLorg_eclipse_swt_widgets_Control")) test_moveBelowLorg_eclipse_swt_widgets_Control();
-	else if (getName().equals("test_pack")) test_pack();
-	else if (getName().equals("test_packZ")) test_packZ();
-	else if (getName().equals("test_redraw")) test_redraw();
-	else if (getName().equals("test_redrawIIIIZ")) test_redrawIIIIZ();
-	else if (getName().equals("test_removeControlListenerLorg_eclipse_swt_events_ControlListener")) test_removeControlListenerLorg_eclipse_swt_events_ControlListener();
-	else if (getName().equals("test_removeFocusListenerLorg_eclipse_swt_events_FocusListener")) test_removeFocusListenerLorg_eclipse_swt_events_FocusListener();
-	else if (getName().equals("test_removeHelpListenerLorg_eclipse_swt_events_HelpListener")) test_removeHelpListenerLorg_eclipse_swt_events_HelpListener();
-	else if (getName().equals("test_removeKeyListenerLorg_eclipse_swt_events_KeyListener")) test_removeKeyListenerLorg_eclipse_swt_events_KeyListener();
-	else if (getName().equals("test_removeMouseTrackListenerLorg_eclipse_swt_events_MouseTrackListener")) test_removeMouseTrackListenerLorg_eclipse_swt_events_MouseTrackListener();
-	else if (getName().equals("test_removeMouseListenerLorg_eclipse_swt_events_MouseListener")) test_removeMouseListenerLorg_eclipse_swt_events_MouseListener();
-	else if (getName().equals("test_removeMouseMoveListenerLorg_eclipse_swt_events_MouseMoveListener")) test_removeMouseMoveListenerLorg_eclipse_swt_events_MouseMoveListener();
-	else if (getName().equals("test_removePaintListenerLorg_eclipse_swt_events_PaintListener")) test_removePaintListenerLorg_eclipse_swt_events_PaintListener();
-	else if (getName().equals("test_removeTraverseListenerLorg_eclipse_swt_events_TraverseListener")) test_removeTraverseListenerLorg_eclipse_swt_events_TraverseListener();
-	else if (getName().equals("test_setBackgroundLorg_eclipse_swt_graphics_Color")) test_setBackgroundLorg_eclipse_swt_graphics_Color();
-	else if (getName().equals("test_setBoundsIIII")) test_setBoundsIIII();
-	else if (getName().equals("test_setBoundsLorg_eclipse_swt_graphics_Rectangle")) test_setBoundsLorg_eclipse_swt_graphics_Rectangle();
-	else if (getName().equals("test_setCaptureZ")) test_setCaptureZ();
-	else if (getName().equals("test_setCursorLorg_eclipse_swt_graphics_Cursor")) test_setCursorLorg_eclipse_swt_graphics_Cursor();
-	else if (getName().equals("test_setEnabledZ")) test_setEnabledZ();
-	else if (getName().equals("test_setFocus")) test_setFocus();
-	else if (getName().equals("test_setFontLorg_eclipse_swt_graphics_Font")) test_setFontLorg_eclipse_swt_graphics_Font();
-	else if (getName().equals("test_setForegroundLorg_eclipse_swt_graphics_Color")) test_setForegroundLorg_eclipse_swt_graphics_Color();
-	else if (getName().equals("test_setLayoutDataLjava_lang_Object")) test_setLayoutDataLjava_lang_Object();
-	else if (getName().equals("test_setLocationII")) test_setLocationII();
-	else if (getName().equals("test_setLocationLorg_eclipse_swt_graphics_Point")) test_setLocationLorg_eclipse_swt_graphics_Point();
-	else if (getName().equals("test_setMenuLorg_eclipse_swt_widgets_Menu")) test_setMenuLorg_eclipse_swt_widgets_Menu();
-	else if (getName().equals("test_setRedrawZ")) test_setRedrawZ();
-	else if (getName().equals("test_setSizeII")) test_setSizeII();
-	else if (getName().equals("test_setSizeLorg_eclipse_swt_graphics_Point")) test_setSizeLorg_eclipse_swt_graphics_Point();
-	else if (getName().equals("test_setToolTipTextLjava_lang_String")) test_setToolTipTextLjava_lang_String();
-	else if (getName().equals("test_setVisibleZ")) test_setVisibleZ();
-	else if (getName().equals("test_toControlLorg_eclipse_swt_graphics_Point")) test_toControlLorg_eclipse_swt_graphics_Point();
-	else if (getName().equals("test_toDisplayLorg_eclipse_swt_graphics_Point")) test_toDisplayLorg_eclipse_swt_graphics_Point();
-	else if (getName().equals("test_traverseI")) test_traverseI();
-	else if (getName().equals("test_update")) test_update();
-	else if (getName().equals("test_setParentLorg_eclipse_swt_widgets_Composite")) test_setParentLorg_eclipse_swt_widgets_Composite();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_CoolBar.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_CoolBar.java
deleted file mode 100644
index c2698e3..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_CoolBar.java
+++ /dev/null
@@ -1,130 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.graphics.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.widgets.CoolBar
- *
- * @see org.eclipse.swt.widgets.CoolBar
- */
-public class Test_org_eclipse_swt_widgets_CoolBar extends Test_org_eclipse_swt_widgets_Composite {
-
-public Test_org_eclipse_swt_widgets_CoolBar(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-	CoolBar coolBar = new CoolBar(shell, 0);
-	setWidget(coolBar);
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_CompositeI() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_CompositeI not written");
-}
-
-public void test_checkSubclass() {
-	warnUnimpl("Test test_checkSubclass not written");
-}
-
-public void test_computeSizeIIZ(){
-	warnUnimpl( "Test test_computeSizeIIZ not written");
-}
-
-public void test_getItemI() {
-	warnUnimpl("Test test_getItemI not written");
-}
-
-public void test_getItemCount() {
-	warnUnimpl("Test test_getItemCount not written");
-}
-
-public void test_getItems() {
-	warnUnimpl("Test test_getItems not written");
-}
-
-public void test_indexOfLorg_eclipse_swt_widgets_CoolItem() {
-	warnUnimpl("Test test_indexOfLorg_eclipse_swt_widgets_CoolItem not written");
-}
-
-public void test_getItemOrder() {
-	warnUnimpl("Test test_getItemOrder not written");
-}
-
-public void test_getItemSizes() {
-	warnUnimpl("Test test_getItemSizes not written");
-}
-
-public void test_getWrapIndices() {
-	warnUnimpl("Test test_getWrapIndices not written");
-}
-
-public void test_setWrapIndices$I() {
-	warnUnimpl("Test test_setWrapIndices$I not written");
-}
-
-public void test_setItemLayout$I$I$Lorg_eclipse_swt_graphics_Point() {
-	warnUnimpl("Test test_setItemLayout$I$I$Lorg_eclipse_swt_graphics_Point not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_widgets_CoolBar((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_CompositeI");
-	methodNames.addElement("test_checkSubclass");
-	methodNames.addElement("test_computeSizeIIZ");
-	methodNames.addElement("test_getItemI");
-	methodNames.addElement("test_getItemCount");
-	methodNames.addElement("test_getItems");
-	methodNames.addElement("test_indexOfLorg_eclipse_swt_widgets_CoolItem");
-	methodNames.addElement("test_getItemOrder");
-	methodNames.addElement("test_getItemSizes");
-	methodNames.addElement("test_getWrapIndices");
-	methodNames.addElement("test_setWrapIndices$I");
-	methodNames.addElement("test_setItemLayout$I$I$Lorg_eclipse_swt_graphics_Point");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Composite.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_CompositeI")) test_ConstructorLorg_eclipse_swt_widgets_CompositeI();
-	else if (getName().equals("test_checkSubclass")) test_checkSubclass();
-	else if (getName().equals("test_computeSizeIIZ")) test_computeSizeIIZ();
-	else if (getName().equals("test_getItemI")) test_getItemI();
-	else if (getName().equals("test_getItemCount")) test_getItemCount();
-	else if (getName().equals("test_getItems")) test_getItems();
-	else if (getName().equals("test_indexOfLorg_eclipse_swt_widgets_CoolItem")) test_indexOfLorg_eclipse_swt_widgets_CoolItem();
-	else if (getName().equals("test_getItemOrder")) test_getItemOrder();
-	else if (getName().equals("test_getItemSizes")) test_getItemSizes();
-	else if (getName().equals("test_getWrapIndices")) test_getWrapIndices();
-	else if (getName().equals("test_setWrapIndices$I")) test_setWrapIndices$I();
-	else if (getName().equals("test_setItemLayout$I$I$Lorg_eclipse_swt_graphics_Point")) test_setItemLayout$I$I$Lorg_eclipse_swt_graphics_Point();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_CoolItem.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_CoolItem.java
deleted file mode 100644
index 0e0d62a..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_CoolItem.java
+++ /dev/null
@@ -1,336 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.widgets.CoolItem
- *
- * @see org.eclipse.swt.widgets.CoolItem
- */
-public class Test_org_eclipse_swt_widgets_CoolItem extends Test_org_eclipse_swt_widgets_Item {
-
-static final boolean MINIMAL_CONFORMANCE = false;
-
-public Test_org_eclipse_swt_widgets_CoolItem(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-	CoolBar coolBar = new CoolBar(shell, 0);
-	CoolItem coolItem = new CoolItem(coolBar, 0);
-	setWidget(coolItem);
-}
-
-protected void tearDown() {
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_CoolBarI() {
-	CoolBar coolBar = new CoolBar(shell, 0);
-	CoolItem coolItem = new CoolItem(coolBar, 0);
-	
-	try {
-		coolItem = new CoolItem(null, 0);
-		fail("No exception thrown for parent == null");	
-	}
-	catch (IllegalArgumentException e) {
-	}
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_CoolBarII() {
-	CoolBar coolBar = new CoolBar(shell, 0);
-	CoolItem coolItem = new CoolItem(coolBar, 0, 0);
-	try {
-		coolItem = new CoolItem(coolBar, 0, -1);
-		fail("No exception thrown for index == -1");
-	}
-	catch (IllegalArgumentException e){
-	}
-	try {
-		coolItem = new CoolItem(coolBar, 0, 2);
-		fail("No exception thrown for index == 2");
-	}
-	catch (IllegalArgumentException e){
-	}
-	assertEquals(1, coolBar.getItemCount());
-	coolItem = new CoolItem(coolBar, 0, 1);
-	assertEquals(2, coolBar.getItemCount());
-	coolItem = new CoolItem(coolBar, 0, 0);
-	assertEquals(3, coolBar.getItemCount());
-	assertEquals(coolItem, coolBar.getItem(0));	
-}
-
-public void test_checkSubclass() {
-	warnUnimpl("Test test_checkSubclass not written");
-}
-
-public void test_computeSizeII() {
-	CoolBar coolBar = new CoolBar(shell, 0);
-	CoolItem coolItem = new CoolItem(coolBar, 0);
-	Button button = new Button(coolBar, SWT.PUSH);
-	button.setText("foo");
-
-	Point size = coolItem.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-	Point size2 = coolItem.computeSize(0, 0);
-	assertEquals(size, size2);
-	
-	coolItem.setControl(button);
-	size2 = coolItem.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-	assertTrue(size2.x > size.x);
-
-	size = coolItem.computeSize(50, 25);
-	size2 = coolItem.computeSize(100, 25);
-	assertEquals(size.x + 50, size2.x);
-	assertEquals(size.y, size2.y);
-
-	size = coolItem.computeSize(1,1);
-	size2 = coolItem.computeSize(26, 26);
-	assertEquals(25, size2.x - size.x);
-}
-
-public void test_getBounds() {
-	CoolBar coolBar = new CoolBar(shell, 0);
-	CoolItem coolItem = new CoolItem(coolBar, 0);
-	Button button = new Button(coolBar, SWT.PUSH);
-	button.setText("foo");
-	coolItem.setControl(button);
-	
-	Rectangle rect = coolItem.getBounds();
-	Point size = coolItem.getSize();
-	assertEquals(size.x, rect.width);
-	assertEquals(size.y, rect.height);
-	
-	coolItem.setSize(25, 25);
-	rect = coolItem.getBounds();
-	coolItem.setSize(100, 25);
-	Rectangle newRect = coolItem.getBounds();
-	assertEquals(rect.width + 75, newRect.width);
-	assertEquals(rect.x, newRect.x);
-	assertEquals(rect.y, newRect.y);
-}
-
-public void test_getControl() {
-	CoolBar coolBar = new CoolBar(shell, 0);
-	CoolItem coolItem = new CoolItem(coolBar, 0);
-	assertNull(coolItem.getControl());
-
-	Button button = new Button(coolBar, SWT.PUSH);
-	coolItem.setControl(button);
-	Control control = coolItem.getControl();
-	assertEquals(button, control);
-
-	button = new Button(coolBar, SWT.PUSH);
-	coolItem.setControl(button);
-	control = coolItem.getControl();
-	assertEquals(button, control);
-}
-
-public void test_getDisplay() {
-	CoolBar coolBar = new CoolBar(shell, 0);
-	CoolItem coolItem = new CoolItem(coolBar, 0);
-	assertEquals(coolBar.getDisplay(), coolItem.getDisplay());
-	
-	coolBar.dispose();
-	try {
-		coolItem.getDisplay();
-		fail("No exception thrown for getDisplay() when parent is disposed");	
-	}
-	catch (SWTException e) {
-	}
-}
-
-public void test_getParent() {
-	CoolBar coolBar = new CoolBar(shell, 0);
-	CoolItem coolItem = new CoolItem(coolBar, 0);
-	assertEquals(coolBar, coolItem.getParent());
-}
-
-public void test_setControlLorg_eclipse_swt_widgets_Control() {
-	CoolBar coolBar = new CoolBar(shell, 0);
-	CoolItem coolItem = new CoolItem(coolBar, 0);
-	coolItem.setControl(null);
-	
-	Button button = new Button(coolBar, SWT.PUSH);
-	button.setText("foobar");
-	
-	Point size = coolItem.getSize();
-	coolItem.setControl(button);
-	Point size2 = coolItem.getSize();
-	assertTrue(size2.x > size.x);
-	
-	if (!MINIMAL_CONFORMANCE) {
-		size = button.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-		size2 = coolItem.computeSize(size.x, size.y);
-		assertEquals(size2, coolItem.getSize());
-	}
-	
-	button = new Button(coolBar, SWT.PUSH);
-	button.dispose();
-	try {
-		coolItem.setControl(button);
-		fail("No exception when control.isDisposed()");
-	}
-	catch (IllegalArgumentException e) {
-	}
-	
-	button = new Button(shell, SWT.PUSH);
-	try {
-		coolItem.setControl(button);
-		fail("No exception thrown when control has wrong parent");
-	}
-	catch (IllegalArgumentException e) {
-	}
-}
-
-public void test_getPreferredSize() {
-	CoolBar coolBar = new CoolBar(shell, 0);
-	CoolItem coolItem = new CoolItem(coolBar, 0);
-	Button button = new Button(coolBar, SWT.PUSH);
-	button.setText("foobar");
-	coolItem.setControl(button);
-	
-	Point pref = coolItem.getPreferredSize();
-	coolItem.setPreferredSize(pref);
-	assertEquals(pref, coolItem.getPreferredSize());
-}
-
-public void test_setPreferredSizeII() {
-	CoolBar coolBar = new CoolBar(shell, 0);
-	CoolItem coolItem = new CoolItem(coolBar, 0);
-	Button button = new Button(coolBar, SWT.PUSH);
-	button.setText("foobar");
-	coolItem.setControl(button);
-	
-	Point size = coolItem.getSize();
-	coolItem.setPreferredSize(size);
-	assertEquals(size.x, coolItem.getSize().x);
-	coolItem.setSize(coolItem.getPreferredSize());
-	assertEquals(size, coolItem.getSize());
-}
-
-public void test_setPreferredSizeLorg_eclipse_swt_graphics_Point() {
-	CoolBar coolBar = new CoolBar(shell, 0);
-	CoolItem coolItem = new CoolItem(coolBar, 0);
-	Button button = new Button(coolBar, SWT.PUSH);
-	button.setText("foobar");
-	coolItem.setControl(button);
-	
-	Point size = new Point(50, 30);
-	coolItem.setPreferredSize(size);
-	Point size2 = coolItem.getPreferredSize();
-	coolItem.setPreferredSize(50, 30);
-	assertEquals(size2, coolItem.getPreferredSize());
-}
-
-public void test_getSize() {
-	CoolBar coolBar = new CoolBar(shell, 0);
-	CoolItem coolItem = new CoolItem(coolBar, 0);
-	Button button = new Button(coolBar, SWT.PUSH);
-	button.setText("foo");
-	coolItem.setControl(button);
-	
-	Point size = coolItem.getSize();
-	Rectangle rect = coolItem.getBounds();
-	assertEquals(rect.width, size.x);
-	assertEquals(rect.height, size.y);
-}
-
-public void test_setSizeII() {
-	CoolBar coolBar = new CoolBar(shell, 0);
-	CoolItem coolItem = new CoolItem(coolBar, 0);
-	Button button = new Button(coolBar, SWT.PUSH);
-	button.setText("foo");
-	coolItem.setControl(button);
-
-	coolItem.setSize(50, 50);
-	assertEquals(new Point(50, 50), coolItem.getSize());
-
-	coolItem.setSize(0, 0);
-	Point smallest = coolItem.getSize();
-	coolItem.setSize(1, 1);
-	assertEquals(smallest, coolItem.getSize());
-	
-	Rectangle rect = coolItem.getBounds();
-	Point size = coolItem.getSize();
-	coolItem.setSize(rect.width, rect.height);
-	assertEquals(size, coolItem.getSize());
-}
-
-public void test_setSizeLorg_eclipse_swt_graphics_Point() {
-	CoolBar coolBar = new CoolBar(shell, 0);
-	CoolItem coolItem = new CoolItem(coolBar, 0);
-	Button button = new Button(coolBar, SWT.PUSH);
-	button.setText("foo");
-	coolItem.setControl(button);
-	
-	Point size = new Point(50, 50);
-	coolItem.setSize(size);
-	Point size2 = coolItem.getSize();
-	coolItem.setSize(50, 50);
-	assertEquals(size2, coolItem.getSize());
-}
-
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_widgets_CoolItem((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_CoolBarI");
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_CoolBarII");
-	methodNames.addElement("test_checkSubclass");
-	methodNames.addElement("test_computeSizeII");
-	methodNames.addElement("test_getBounds");
-	methodNames.addElement("test_getControl");
-	methodNames.addElement("test_getDisplay");
-	methodNames.addElement("test_getParent");
-	methodNames.addElement("test_setControlLorg_eclipse_swt_widgets_Control");
-	methodNames.addElement("test_getPreferredSize");
-	methodNames.addElement("test_setPreferredSizeII");
-	methodNames.addElement("test_setPreferredSizeLorg_eclipse_swt_graphics_Point");
-	methodNames.addElement("test_getSize");
-	methodNames.addElement("test_setSizeII");
-	methodNames.addElement("test_setSizeLorg_eclipse_swt_graphics_Point");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Item.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_CoolBarI")) test_ConstructorLorg_eclipse_swt_widgets_CoolBarI();
-	else if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_CoolBarII")) test_ConstructorLorg_eclipse_swt_widgets_CoolBarII();
-	else if (getName().equals("test_checkSubclass")) test_checkSubclass();
-	else if (getName().equals("test_computeSizeII")) test_computeSizeII();
-	else if (getName().equals("test_getBounds")) test_getBounds();
-	else if (getName().equals("test_getControl")) test_getControl();
-	else if (getName().equals("test_getDisplay")) test_getDisplay();
-	else if (getName().equals("test_getParent")) test_getParent();
-	else if (getName().equals("test_setControlLorg_eclipse_swt_widgets_Control")) test_setControlLorg_eclipse_swt_widgets_Control();
-	else if (getName().equals("test_getPreferredSize")) test_getPreferredSize();
-	else if (getName().equals("test_setPreferredSizeII")) test_setPreferredSizeII();
-	else if (getName().equals("test_setPreferredSizeLorg_eclipse_swt_graphics_Point")) test_setPreferredSizeLorg_eclipse_swt_graphics_Point();
-	else if (getName().equals("test_getSize")) test_getSize();
-	else if (getName().equals("test_setSizeII")) test_setSizeII();
-	else if (getName().equals("test_setSizeLorg_eclipse_swt_graphics_Point")) test_setSizeLorg_eclipse_swt_graphics_Point();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Decorations.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Decorations.java
deleted file mode 100644
index 631b6ae..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Decorations.java
+++ /dev/null
@@ -1,248 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.graphics.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.widgets.Decorations
- *
- * @see org.eclipse.swt.widgets.Decorations
- */
-public class Test_org_eclipse_swt_widgets_Decorations extends Test_org_eclipse_swt_widgets_Canvas {
-
-Decorations decorations;
-Image[] images = new Image [3];
-
-public Test_org_eclipse_swt_widgets_Decorations(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-	decorations = new Decorations(shell, SWT.NULL);
-	super.setWidget(decorations);
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-protected void setWidget(Widget w) {
-	if (!decorations.isDisposed())
-		decorations.dispose();
-	decorations = (Decorations)w;
-	super.setWidget(w);
-}
-
-// this method must be private or protected so the auto-gen tool keeps it
-private void loadImages() {
-	images [0] = new Image (shell.getDisplay(), this.getClass().getResourceAsStream("folder.bmp"));
-	images [1] = new Image (shell.getDisplay(), this.getClass().getResourceAsStream("folderOpen.bmp"));
-	images [2] = new Image (shell.getDisplay(), this.getClass().getResourceAsStream("target.bmp"));
-}
-
-// this method must be private or protected so the auto-gen tool keeps it
-private void freeImages() {
-	for (int i=0; i<images.length; i++) images[i].dispose();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_CompositeI() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_CompositeI not written");
-}
-
-public void test_computeTrimIIII() {
-	warnUnimpl("Test test_computeTrimIIII not written");
-}
-
-public void test_getBounds() {
-	warnUnimpl("Test test_getBounds not written");
-}
-
-public void test_getClientArea() {
-	warnUnimpl("Test test_getClientArea not written");
-}
-
-public void test_getDefaultButton() {
-	warnUnimpl("Test test_getDefaultButton not written");
-}
-
-public void test_getImage() {
-	warnUnimpl("Test test_getImage not written");
-}
-
-public void test_getLocation() {
-	warnUnimpl("Test test_getLocation not written");
-}
-
-public void test_getMaximized() {
-	warnUnimpl("Test test_getMaximized not written");
-}
-
-public void test_getMenuBar() {
-	warnUnimpl("Test test_getMenuBar not written");
-}
-
-public void test_getMinimized() {
-	warnUnimpl("Test test_getMinimized not written");
-}
-
-public void test_getSize() {
-	warnUnimpl("Test test_getSize not written");
-}
-
-public void test_getText() {
-	warnUnimpl("Test test_getText not written");
-}
-
-public void test_setDefaultButtonLorg_eclipse_swt_widgets_Button() {
-	assertNull(decorations.getDefaultButton());
-	Button button = new Button(decorations, SWT.NULL);
-	decorations.setDefaultButton(button);
-	assertTrue("button not default", decorations.getDefaultButton() == button);
-	if (fCheckBogusTestCases) {
-		decorations.setDefaultButton(null);
-		assertNull(decorations.getDefaultButton());
-	}
-}
-
-public void test_setFocus() {
-	decorations.setFocus();
-}
-
-public void test_setImageLorg_eclipse_swt_graphics_Image() {
-	assertNull(":a:", decorations.getImage());
-	loadImages();
-	decorations.setImage(images[0]);
-	assertTrue(":b:", images[0] == decorations.getImage());
-	assertTrue(":c:", images[1] != decorations.getImage());
-	decorations.setImage(null);
-	assertNull(":d:", decorations.getImage());
-	freeImages();
-}
-
-public void test_setMaximizedZ() {
-	decorations.setMaximized(false);
-	assertTrue(":1:", decorations.getMaximized() == false);
-	decorations.setMaximized(true);
-	assertTrue(":2:", decorations.getMaximized() == true);
-	assertTrue(":3:", decorations.getMinimized() == false);
-}
-
-public void test_setMenuBarLorg_eclipse_swt_widgets_Menu() {
-	assertNull(decorations.getMenu());
-	Menu testMenu = new Menu(decorations);
-	decorations.setMenu(testMenu);
-	assertTrue("Incorrect menu", decorations.getMenu() == testMenu);
-	decorations.setMenu(null);
-	assertNull(decorations.getMenu());
-}
-
-public void test_setMinimizedZ() {
-	decorations.setMinimized(false);
-	assertTrue(":1:", decorations.getMinimized() == false);
-	decorations.setMinimized(true);
-	assertTrue(":2:", decorations.getMinimized() == true);
-	assertTrue(":3:", decorations.getMaximized() == false);
-}
-
-public void test_setTextLjava_lang_String() {
-	try {
-		decorations.setText(null);
-		fail("No exception thrown for string == null");
-	}
-	catch (IllegalArgumentException e) {
-	}
-
-	String testStr = "test string";
-	decorations.setText(testStr);
-	assertTrue("a", decorations.getText().equals(testStr));
-	decorations.setText("");
-	assertTrue("b", decorations.getText().equals(""));
-	try {
-		decorations.setText(null);
-		fail("No exception thrown for string == null");
-	}
-	catch (IllegalArgumentException e) {
-	}
-}
-
-public void test_setVisibleZ() {
-	decorations.setVisible(false);
-	assertTrue(!decorations.getVisible());
-	
-	decorations.setVisible(true);
-	assertTrue(decorations.getVisible());
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_widgets_Decorations((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_CompositeI");
-	methodNames.addElement("test_computeTrimIIII");
-	methodNames.addElement("test_getBounds");
-	methodNames.addElement("test_getClientArea");
-	methodNames.addElement("test_getDefaultButton");
-	methodNames.addElement("test_getImage");
-	methodNames.addElement("test_getLocation");
-	methodNames.addElement("test_getMaximized");
-	methodNames.addElement("test_getMenuBar");
-	methodNames.addElement("test_getMinimized");
-	methodNames.addElement("test_getSize");
-	methodNames.addElement("test_getText");
-	methodNames.addElement("test_setDefaultButtonLorg_eclipse_swt_widgets_Button");
-	methodNames.addElement("test_setFocus");
-	methodNames.addElement("test_setImageLorg_eclipse_swt_graphics_Image");
-	methodNames.addElement("test_setMaximizedZ");
-	methodNames.addElement("test_setMenuBarLorg_eclipse_swt_widgets_Menu");
-	methodNames.addElement("test_setMinimizedZ");
-	methodNames.addElement("test_setTextLjava_lang_String");
-	methodNames.addElement("test_setVisibleZ");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Canvas.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_CompositeI")) test_ConstructorLorg_eclipse_swt_widgets_CompositeI();
-	else if (getName().equals("test_computeTrimIIII")) test_computeTrimIIII();
-	else if (getName().equals("test_getBounds")) test_getBounds();
-	else if (getName().equals("test_getClientArea")) test_getClientArea();
-	else if (getName().equals("test_getDefaultButton")) test_getDefaultButton();
-	else if (getName().equals("test_getImage")) test_getImage();
-	else if (getName().equals("test_getLocation")) test_getLocation();
-	else if (getName().equals("test_getMaximized")) test_getMaximized();
-	else if (getName().equals("test_getMenuBar")) test_getMenuBar();
-	else if (getName().equals("test_getMinimized")) test_getMinimized();
-	else if (getName().equals("test_getSize")) test_getSize();
-	else if (getName().equals("test_getText")) test_getText();
-	else if (getName().equals("test_setDefaultButtonLorg_eclipse_swt_widgets_Button")) test_setDefaultButtonLorg_eclipse_swt_widgets_Button();
-	else if (getName().equals("test_setFocus")) test_setFocus();
-	else if (getName().equals("test_setImageLorg_eclipse_swt_graphics_Image")) test_setImageLorg_eclipse_swt_graphics_Image();
-	else if (getName().equals("test_setMaximizedZ")) test_setMaximizedZ();
-	else if (getName().equals("test_setMenuBarLorg_eclipse_swt_widgets_Menu")) test_setMenuBarLorg_eclipse_swt_widgets_Menu();
-	else if (getName().equals("test_setMinimizedZ")) test_setMinimizedZ();
-	else if (getName().equals("test_setTextLjava_lang_String")) test_setTextLjava_lang_String();
-	else if (getName().equals("test_setVisibleZ")) test_setVisibleZ();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Dialog.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Dialog.java
deleted file mode 100644
index 1cb27de..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Dialog.java
+++ /dev/null
@@ -1,110 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.graphics.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.widgets.Dialog
- *
- * @see org.eclipse.swt.widgets.Dialog
- */
-public class Test_org_eclipse_swt_widgets_Dialog extends SwtTestCase {
-
-public Shell shell;
-private Dialog dialog;
-private int junitStyle;
-
-public Test_org_eclipse_swt_widgets_Dialog(String name) {
-	super(name);
-}
-
-
-protected void setUp() {
-	shell = new Shell();
-}
-
-protected void tearDown() {
-	shell.dispose();
-}
-
-protected void setDialog(Dialog newDialog) {
-	dialog = newDialog;
-}
-protected void setStyle(int style) {
-	style = junitStyle;
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_Shell() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_Shell not written");
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_ShellI() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_ShellI not written");
-}
-
-public void test_checkSubclass() {
-	warnUnimpl("Test test_checkSubclass not written");
-}
-
-public void test_getParent() {
-	assertTrue(":a:", dialog.getParent() == shell);
-}
-
-public void test_getStyle () {
-	// we use this call in a Constructor test so that we can
-	// check if the style is the one that was created
-	dialog.getStyle();
-}
-
-public void test_getText() {
-	warnUnimpl("Test test_getText not written");
-}
-
-public void test_setTextLjava_lang_String() {
-	assertTrue(":1:", dialog.getText() == "");
-	String testStr = "test string";
-	dialog.setText(testStr);
-	assertTrue(":2:", dialog.getText().equals(testStr));
-	dialog.setText("");
-	assertTrue(":3:", dialog.getText().equals(""));
-	if (fCheckSwtNullExceptions) {
-		try {
-			dialog.setText(null);
-			fail("No exception thrown for string = null");
-		}
-		catch (IllegalArgumentException e) {
-		}
-	}
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_Shell");
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_ShellI");
-	methodNames.addElement("test_checkSubclass");
-	methodNames.addElement("test_getParent");
-	methodNames.addElement("test_getStyle");
-	methodNames.addElement("test_getText");
-	methodNames.addElement("test_setTextLjava_lang_String");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_Shell")) test_ConstructorLorg_eclipse_swt_widgets_Shell();
-	else if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_ShellI")) test_ConstructorLorg_eclipse_swt_widgets_ShellI();
-	else if (getName().equals("test_checkSubclass")) test_checkSubclass();
-	else if (getName().equals("test_getParent")) test_getParent();
-	else if (getName().equals("test_getStyle")) test_getStyle();
-	else if (getName().equals("test_getText")) test_getText();
-	else if (getName().equals("test_setTextLjava_lang_String")) test_setTextLjava_lang_String();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_DirectoryDialog.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_DirectoryDialog.java
deleted file mode 100644
index e611b04..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_DirectoryDialog.java
+++ /dev/null
@@ -1,137 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.graphics.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.widgets.DirectoryDialog
- *
- * @see org.eclipse.swt.widgets.DirectoryDialog
- */
-public class Test_org_eclipse_swt_widgets_DirectoryDialog extends Test_org_eclipse_swt_widgets_Dialog {
-
-DirectoryDialog dirDialog;
-
-public Test_org_eclipse_swt_widgets_DirectoryDialog(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-	dirDialog = new DirectoryDialog(shell, SWT.NULL);
-	setDialog(dirDialog);
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_Shell() {
-	if (fCheckSwtNullExceptions) {
-		DirectoryDialog dd = new DirectoryDialog(shell);
-		try {
-			dd = new DirectoryDialog(null);
-			fail("No exception thrown for null parent");
-		}
-		catch (IllegalArgumentException e) {
-		}		
-	}
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_ShellI() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_ShellI not written");
-}
-
-public void test_getFilterPath() {
-	// tested in test_setFilterPathLjava_lang_String
-}
-
-public void test_getMessage() {
-	// tested in test_setMessageLjava_lang_String
-}
-
-public void test_open() {
-	if (fTestDialogOpen)
-		dirDialog.open();
-}
-
-public void test_setFilterPathLjava_lang_String() {
-	assertTrue(":1:", dirDialog.getFilterPath() == "");
-	String testStr = "./*";
-	dirDialog.setFilterPath(testStr);
-	assertTrue(":2:", dirDialog.getFilterPath().equals(testStr));
-	dirDialog.setFilterPath("");
-	assertTrue(":3:", dirDialog.getFilterPath().equals(""));
-	if (fCheckSwtNullExceptions) {
-		try {
-			dirDialog.setFilterPath(null);
-			fail("No exception thrown for filterPath == null");
-		}
-		catch (IllegalArgumentException e) {
-		}
-	}
-}
-
-public void test_setMessageLjava_lang_String() {
-	assertTrue(":1:", dirDialog.getMessage() == "");
-	String testStr = "test string";
-	dirDialog.setMessage(testStr);
-	assertTrue(":2:", dirDialog.getMessage().equals(testStr));
-	dirDialog.setMessage("");
-	assertTrue(":3:", dirDialog.getMessage().equals(""));
-	if (fCheckSwtNullExceptions) {
-		try {
-			dirDialog.setMessage(null);
-			fail("No exception thrown for message == null");
-		}
-		catch (IllegalArgumentException e) {
-		}
-	}
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_widgets_DirectoryDialog((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_Shell");
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_ShellI");
-	methodNames.addElement("test_getFilterPath");
-	methodNames.addElement("test_getMessage");
-	methodNames.addElement("test_open");
-	methodNames.addElement("test_setFilterPathLjava_lang_String");
-	methodNames.addElement("test_setMessageLjava_lang_String");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Dialog.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_Shell")) test_ConstructorLorg_eclipse_swt_widgets_Shell();
-	else if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_ShellI")) test_ConstructorLorg_eclipse_swt_widgets_ShellI();
-	else if (getName().equals("test_getFilterPath")) test_getFilterPath();
-	else if (getName().equals("test_getMessage")) test_getMessage();
-	else if (getName().equals("test_open")) test_open();
-	else if (getName().equals("test_setFilterPathLjava_lang_String")) test_setFilterPathLjava_lang_String();
-	else if (getName().equals("test_setMessageLjava_lang_String")) test_setMessageLjava_lang_String();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Display.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Display.java
deleted file mode 100644
index 20be2be..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Display.java
+++ /dev/null
@@ -1,365 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.widgets.Display
- *
- * @see org.eclipse.swt.widgets.Display
- */
-public class Test_org_eclipse_swt_widgets_Display extends Test_org_eclipse_swt_graphics_Device {
-
-boolean disposeExecRan;
-
-public Test_org_eclipse_swt_widgets_Display(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	// There can only be one Display object per thread.
-	// If a second Display is created on the same thread, an 
-	// InvalidThreadAccessException is thrown.
-	//
-	// Each test will create its own Display and must dispose of it 
-	// before completing.
-}
-
-protected void tearDown() {
-}
-
-public void test_Constructor() {
-	Display disp = new Display();
-	disp.dispose();
-}
-
-public void test_ConstructorLorg_eclipse_swt_graphics_DeviceData() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_graphics_DeviceData not written");
-}
-
-public void test_asyncExecLjava_lang_Runnable() {
-	warnUnimpl("Test test_asyncExecLjava_lang_Runnable not written");
-}
-
-public void test_beep() {
-	Display display = new Display();
-	try {
-		display.beep();
-	} finally {
-		display.dispose();
-	}
-}
-
-public void test_checkSubclass() {
-	warnUnimpl("Test test_checkSubclass not written");
-}
-
-public void test_checkDevice() {
-	warnUnimpl("Test test_checkDevice not written");
-}
-
-public void test_createLorg_eclipse_swt_graphics_DeviceData() {
-	warnUnimpl("Test test_createLorg_eclipse_swt_graphics_DeviceData not written");
-}
-
-public void test_destroy() {
-	warnUnimpl("Test test_destroy not written");
-}
-
-public void test_disposeExecLjava_lang_Runnable() {
-	// Also tests dispose and isDisposed
-	Display testDisplay = new Display();
-	disposeExecRan = false;
-	testDisplay.disposeExec(new Runnable() {
-		public void run() {
-			disposeExecRan = true;
-		}
-	});
-	assertEquals("Display should not be disposed", false, testDisplay.isDisposed());
-	testDisplay.dispose();
-	assertTrue("Display should be disposed", testDisplay.isDisposed());
-	assertTrue("DisposeExec Runnable did not run", disposeExecRan);
-}
-
-public void test_findWidgetI() {
-	warnUnimpl("Test test_findWidgetI not written");
-}
-
-public void test_findDisplayLjava_lang_Thread() {
-	warnUnimpl("Test test_findDisplayLjava_lang_Thread not written");
-}
-
-public void test_getActiveShell() {
-	warnUnimpl("Test test_getActiveShell not written");
-}
-
-public void test_getBounds() {
-	Display display = new Display();
-	try {
-		Rectangle rect = display.getBounds();
-		assertNotNull(rect);
-	} finally {
-		display.dispose();
-	}
-}
-
-public void test_getCurrent() {
-	warnUnimpl("Test test_getCurrent not written");
-}
-
-public void test_getClientArea() {
-	warnUnimpl("Test test_getClientArea not written");
-}
-
-public void test_getCursorControl() {
-	Display display = new Display();
-	try {
-		display.getCursorControl();
-	} finally {
-		display.dispose();
-	}
-}
-
-public void test_getCursorLocation() {
-	warnUnimpl("Test test_getCursorLocation not written");
-}
-
-public void test_getDefault() {
-	Display display = new Display();
-	try {
-		assertNotNull(display.getDefault());
-	} finally {
-		display.dispose();
-	}
-}
-
-public void test_getDataLjava_lang_String() {
-	warnUnimpl("Test test_getDataLjava_lang_String not written");
-}
-
-public void test_getData() {
-	warnUnimpl("Test test_getData not written");
-}
-
-public void test_getDoubleClickTime() {
-	warnUnimpl("Test test_getDoubleClickTime not written");
-}
-
-public void test_getFocusControl() {
-	Display display = new Display();
-	try {
-		display.getFocusControl();
-	} finally {
-		display.dispose();
-	}
-}
-
-public void test_getIconDepth() {
-	warnUnimpl("Test test_getIconDepth not written");
-}
-
-public void test_getShells() {
-	warnUnimpl("Test test_getShells not written");
-}
-
-public void test_getSyncThread() {
-	warnUnimpl("Test test_getSyncThread not written");
-}
-
-public void test_getSystemColorI() {
-	Display display = new Display();
-	try {
-		int [] colorIds = {
-			SWT.COLOR_WIDGET_DARK_SHADOW, SWT.COLOR_WIDGET_NORMAL_SHADOW,
-			SWT.COLOR_WIDGET_LIGHT_SHADOW, SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW,
-			SWT.COLOR_WIDGET_BACKGROUND, SWT.COLOR_WIDGET_BORDER,
-			SWT.COLOR_WIDGET_FOREGROUND, SWT.COLOR_LIST_FOREGROUND,
-			SWT.COLOR_LIST_BACKGROUND, SWT.COLOR_LIST_SELECTION,
-			SWT.COLOR_LIST_SELECTION_TEXT,
-		};
-		for (int i=0; i < colorIds.length; i++) {
-			assertNotNull(display.getSystemColor(colorIds[i]));
-		}
-	} finally {
-		display.dispose();
-	}
-}
-
-public void test_getSystemFont() {
-	warnUnimpl("Test test_getSystemFont not written");
-}
-
-public void test_getThread() {
-	warnUnimpl("Test test_getThread not written");
-}
-
-public void test_internal_new_GCLorg_eclipse_swt_graphics_GCData() {
-	warnUnimpl("Test test_internal_new_GCLorg_eclipse_swt_graphics_GCData not written");
-}
-
-public void test_init() {
-	warnUnimpl("Test test_init not written");
-}
-
-public void test_internal_dispose_GCILorg_eclipse_swt_graphics_GCData() {
-	warnUnimpl("Test test_internal_dispose_GCILorg_eclipse_swt_graphics_GCData not written");
-}
-
-public void test_readAndDispatch() {
-	warnUnimpl("Test test_readAndDispatch not written");
-}
-
-public void test_release() {
-	warnUnimpl("Test test_release not written");
-}
-
-public void test_setDataLjava_lang_StringLjava_lang_Object() {
-	warnUnimpl("Test test_setDataLjava_lang_StringLjava_lang_Object not written");
-}
-
-public void test_setDataLjava_lang_Object() {
-	warnUnimpl("Test test_setDataLjava_lang_Object not written");
-}
-
-public void test_setAppNameLjava_lang_String() {
-	warnUnimpl("Test test_setAppNameLjava_lang_String not written");
-}
-
-public void test_setSynchronizerLorg_eclipse_swt_widgets_Synchronizer() {
-	warnUnimpl("Test test_setSynchronizerLorg_eclipse_swt_widgets_Synchronizer not written");
-}
-
-public void test_sleep() {
-	warnUnimpl("Test test_sleep not written");
-}
-
-public void test_syncExecLjava_lang_Runnable() {
-	warnUnimpl("Test test_syncExecLjava_lang_Runnable not written");
-}
-
-public void test_timerExecILjava_lang_Runnable() {
-	warnUnimpl("Test test_timerExecILjava_lang_Runnable not written");
-}
-
-public void test_update() {
-	warnUnimpl("Test test_update not written");
-}
-
-public void test_wake() {
-	warnUnimpl("Test test_wake not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_widgets_Display((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_Constructor");
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_graphics_DeviceData");
-	methodNames.addElement("test_asyncExecLjava_lang_Runnable");
-	methodNames.addElement("test_beep");
-	methodNames.addElement("test_checkSubclass");
-	methodNames.addElement("test_checkDevice");
-	methodNames.addElement("test_createLorg_eclipse_swt_graphics_DeviceData");
-	methodNames.addElement("test_destroy");
-	methodNames.addElement("test_disposeExecLjava_lang_Runnable");
-	methodNames.addElement("test_findWidgetI");
-	methodNames.addElement("test_findDisplayLjava_lang_Thread");
-	methodNames.addElement("test_getActiveShell");
-	methodNames.addElement("test_getBounds");
-	methodNames.addElement("test_getCurrent");
-	methodNames.addElement("test_getClientArea");
-	methodNames.addElement("test_getCursorControl");
-	methodNames.addElement("test_getCursorLocation");
-	methodNames.addElement("test_getDefault");
-	methodNames.addElement("test_getDataLjava_lang_String");
-	methodNames.addElement("test_getData");
-	methodNames.addElement("test_getDoubleClickTime");
-	methodNames.addElement("test_getFocusControl");
-	methodNames.addElement("test_getIconDepth");
-	methodNames.addElement("test_getShells");
-	methodNames.addElement("test_getSyncThread");
-	methodNames.addElement("test_getSystemColorI");
-	methodNames.addElement("test_getSystemFont");
-	methodNames.addElement("test_getThread");
-	methodNames.addElement("test_internal_new_GCLorg_eclipse_swt_graphics_GCData");
-	methodNames.addElement("test_init");
-	methodNames.addElement("test_internal_dispose_GCILorg_eclipse_swt_graphics_GCData");
-	methodNames.addElement("test_readAndDispatch");
-	methodNames.addElement("test_release");
-	methodNames.addElement("test_setDataLjava_lang_StringLjava_lang_Object");
-	methodNames.addElement("test_setDataLjava_lang_Object");
-	methodNames.addElement("test_setAppNameLjava_lang_String");
-	methodNames.addElement("test_setSynchronizerLorg_eclipse_swt_widgets_Synchronizer");
-	methodNames.addElement("test_sleep");
-	methodNames.addElement("test_syncExecLjava_lang_Runnable");
-	methodNames.addElement("test_timerExecILjava_lang_Runnable");
-	methodNames.addElement("test_update");
-	methodNames.addElement("test_wake");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_Constructor")) test_Constructor();
-	else if (getName().equals("test_ConstructorLorg_eclipse_swt_graphics_DeviceData")) test_ConstructorLorg_eclipse_swt_graphics_DeviceData();
-	else if (getName().equals("test_asyncExecLjava_lang_Runnable")) test_asyncExecLjava_lang_Runnable();
-	else if (getName().equals("test_beep")) test_beep();
-	else if (getName().equals("test_checkSubclass")) test_checkSubclass();
-	else if (getName().equals("test_checkDevice")) test_checkDevice();
-	else if (getName().equals("test_createLorg_eclipse_swt_graphics_DeviceData")) test_createLorg_eclipse_swt_graphics_DeviceData();
-	else if (getName().equals("test_destroy")) test_destroy();
-	else if (getName().equals("test_disposeExecLjava_lang_Runnable")) test_disposeExecLjava_lang_Runnable();
-	else if (getName().equals("test_findWidgetI")) test_findWidgetI();
-	else if (getName().equals("test_findDisplayLjava_lang_Thread")) test_findDisplayLjava_lang_Thread();
-	else if (getName().equals("test_getActiveShell")) test_getActiveShell();
-	else if (getName().equals("test_getBounds")) test_getBounds();
-	else if (getName().equals("test_getCurrent")) test_getCurrent();
-	else if (getName().equals("test_getClientArea")) test_getClientArea();
-	else if (getName().equals("test_getCursorControl")) test_getCursorControl();
-	else if (getName().equals("test_getCursorLocation")) test_getCursorLocation();
-	else if (getName().equals("test_getDefault")) test_getDefault();
-	else if (getName().equals("test_getDataLjava_lang_String")) test_getDataLjava_lang_String();
-	else if (getName().equals("test_getData")) test_getData();
-	else if (getName().equals("test_getDoubleClickTime")) test_getDoubleClickTime();
-	else if (getName().equals("test_getFocusControl")) test_getFocusControl();
-	else if (getName().equals("test_getIconDepth")) test_getIconDepth();
-	else if (getName().equals("test_getShells")) test_getShells();
-	else if (getName().equals("test_getSyncThread")) test_getSyncThread();
-	else if (getName().equals("test_getSystemColorI")) test_getSystemColorI();
-	else if (getName().equals("test_getSystemFont")) test_getSystemFont();
-	else if (getName().equals("test_getThread")) test_getThread();
-	else if (getName().equals("test_internal_new_GCLorg_eclipse_swt_graphics_GCData")) test_internal_new_GCLorg_eclipse_swt_graphics_GCData();
-	else if (getName().equals("test_init")) test_init();
-	else if (getName().equals("test_internal_dispose_GCILorg_eclipse_swt_graphics_GCData")) test_internal_dispose_GCILorg_eclipse_swt_graphics_GCData();
-	else if (getName().equals("test_readAndDispatch")) test_readAndDispatch();
-	else if (getName().equals("test_release")) test_release();
-	else if (getName().equals("test_setDataLjava_lang_StringLjava_lang_Object")) test_setDataLjava_lang_StringLjava_lang_Object();
-	else if (getName().equals("test_setDataLjava_lang_Object")) test_setDataLjava_lang_Object();
-	else if (getName().equals("test_setAppNameLjava_lang_String")) test_setAppNameLjava_lang_String();
-	else if (getName().equals("test_setSynchronizerLorg_eclipse_swt_widgets_Synchronizer")) test_setSynchronizerLorg_eclipse_swt_widgets_Synchronizer();
-	else if (getName().equals("test_sleep")) test_sleep();
-	else if (getName().equals("test_syncExecLjava_lang_Runnable")) test_syncExecLjava_lang_Runnable();
-	else if (getName().equals("test_timerExecILjava_lang_Runnable")) test_timerExecILjava_lang_Runnable();
-	else if (getName().equals("test_update")) test_update();
-	else if (getName().equals("test_wake")) test_wake();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Event.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Event.java
deleted file mode 100644
index 19a0a72..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Event.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.widgets.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.widgets.Event
- *
- * @see org.eclipse.swt.widgets.Event
- */
-public class Test_org_eclipse_swt_widgets_Event extends SwtTestCase {
-
-public Test_org_eclipse_swt_widgets_Event(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_Constructor() {
-	warnUnimpl("Test test_Constructor not written");
-}
-
-public void test_getBounds() {
-	warnUnimpl("Test test_getBounds not written");
-}
-
-public void test_setBoundsLorg_eclipse_swt_graphics_Rectangle() {
-	warnUnimpl("Test test_setBoundsLorg_eclipse_swt_graphics_Rectangle not written");
-}
-
-public void test_toString() {
-	warnUnimpl("Test test_toString not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_widgets_Event((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_Constructor");
-	methodNames.addElement("test_getBounds");
-	methodNames.addElement("test_setBoundsLorg_eclipse_swt_graphics_Rectangle");
-	methodNames.addElement("test_toString");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_Constructor")) test_Constructor();
-	else if (getName().equals("test_getBounds")) test_getBounds();
-	else if (getName().equals("test_setBoundsLorg_eclipse_swt_graphics_Rectangle")) test_setBoundsLorg_eclipse_swt_graphics_Rectangle();
-	else if (getName().equals("test_toString")) test_toString();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_FileDialog.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_FileDialog.java
deleted file mode 100644
index 1513834..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_FileDialog.java
+++ /dev/null
@@ -1,155 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.widgets.FileDialog
- *
- * @see org.eclipse.swt.widgets.FileDialog
- */
-public class Test_org_eclipse_swt_widgets_FileDialog extends Test_org_eclipse_swt_widgets_Dialog {
-
-FileDialog fileDialog;
-
-public Test_org_eclipse_swt_widgets_FileDialog(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-	fileDialog = new FileDialog(shell, SWT.NULL);
-	setDialog(fileDialog);
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_Shell() {
-	// Test FileDialog(Shell)
-	if (fCheckSwtNullExceptions) {
-		FileDialog fd = new FileDialog(shell);
-		try {
-			fd = new FileDialog(null);
-			fail("No exception thrown for parent == null");
-		}
-		catch (IllegalArgumentException e) {
-		}
-	}
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_ShellI() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_ShellI not written");
-}
-
-public void test_getFileName() {
-	warnUnimpl("Test test_getFileName not written");
-}
-
-public void test_getFileNames() {
-	warnUnimpl("Test test_getFileNames not written");
-}
-
-public void test_getFilterExtensions() {
-	warnUnimpl("Test test_getFilterExtensions not written");
-}
-
-public void test_getFilterNames() {
-	warnUnimpl("Test test_getFilterNames not written");
-}
-
-public void test_getFilterPath() {
-	// tested in test_setFilterPathLjava_lang_String
-}
-
-public void test_open() {
-	if (fTestDialogOpen)
-		fileDialog.open();
-}
-
-public void test_setFileNameLjava_lang_String() {
-	warnUnimpl("Test test_setFileNameLjava_lang_String not written");
-}
-
-public void test_setFilterExtensions$Ljava_lang_String() {
-	warnUnimpl("Test test_setFilterExtensions$Ljava_lang_String not written");
-}
-
-public void test_setFilterNames$Ljava_lang_String() {
-	warnUnimpl("Test test_setFilterNames$Ljava_lang_String not written");
-}
-
-public void test_setFilterPathLjava_lang_String() {
-	assertTrue(":1:", fileDialog.getFilterPath() == "");
-	String testStr = "./*";
-	fileDialog.setFilterPath(testStr);
-	assertTrue(":2:", fileDialog.getFilterPath().equals(testStr));
-	fileDialog.setFilterPath("");
-	assertTrue(":3:", fileDialog.getFilterPath().equals(""));
-	if (fCheckSwtNullExceptions) {
-		try {
-			fileDialog.setFilterPath(null);
-			fail("No exception thrown for filterPath == null");
-		}
-		catch (IllegalArgumentException e) {
-		}
-	}
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_widgets_FileDialog((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_Shell");
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_ShellI");
-	methodNames.addElement("test_getFileName");
-	methodNames.addElement("test_getFileNames");
-	methodNames.addElement("test_getFilterExtensions");
-	methodNames.addElement("test_getFilterNames");
-	methodNames.addElement("test_getFilterPath");
-	methodNames.addElement("test_open");
-	methodNames.addElement("test_setFileNameLjava_lang_String");
-	methodNames.addElement("test_setFilterExtensions$Ljava_lang_String");
-	methodNames.addElement("test_setFilterNames$Ljava_lang_String");
-	methodNames.addElement("test_setFilterPathLjava_lang_String");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Dialog.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_Shell")) test_ConstructorLorg_eclipse_swt_widgets_Shell();
-	else if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_ShellI")) test_ConstructorLorg_eclipse_swt_widgets_ShellI();
-	else if (getName().equals("test_getFileName")) test_getFileName();
-	else if (getName().equals("test_getFileNames")) test_getFileNames();
-	else if (getName().equals("test_getFilterExtensions")) test_getFilterExtensions();
-	else if (getName().equals("test_getFilterNames")) test_getFilterNames();
-	else if (getName().equals("test_getFilterPath")) test_getFilterPath();
-	else if (getName().equals("test_open")) test_open();
-	else if (getName().equals("test_setFileNameLjava_lang_String")) test_setFileNameLjava_lang_String();
-	else if (getName().equals("test_setFilterExtensions$Ljava_lang_String")) test_setFilterExtensions$Ljava_lang_String();
-	else if (getName().equals("test_setFilterNames$Ljava_lang_String")) test_setFilterNames$Ljava_lang_String();
-	else if (getName().equals("test_setFilterPathLjava_lang_String")) test_setFilterPathLjava_lang_String();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_FontDialog.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_FontDialog.java
deleted file mode 100644
index cbe1544..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_FontDialog.java
+++ /dev/null
@@ -1,108 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.graphics.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.widgets.FontDialog
- *
- * @see org.eclipse.swt.widgets.FontDialog
- */
-public class Test_org_eclipse_swt_widgets_FontDialog extends Test_org_eclipse_swt_widgets_Dialog {
-
-FontDialog fontDialog;
-
-public Test_org_eclipse_swt_widgets_FontDialog(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-	fontDialog = new FontDialog(shell, SWT.NULL);
-	setDialog(fontDialog);
-}
-
-protected void tearDown() {
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_Shell() {
-	FontDialog fd = new FontDialog(shell);
-	try {
-		new FontDialog(null);
-		fail("No exception thrown for parent == null");
-	}
-	catch (IllegalArgumentException e) {
-	}
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_ShellI() {
-	try {
-		new FontDialog(null, SWT.NULL);
-		fail("No exception thrown for parent == null");
-	}
-	catch (IllegalArgumentException e) {
-	}
-}
-
-public void test_getFontData() {
-	// tested in test_setFontDataLorg_eclipse_swt_graphics_FontData
-}
-
-public void test_open() {
-	warnUnimpl("Test test_open not written");
-}
-
-public void test_setFontDataLorg_eclipse_swt_graphics_FontData() {
-	FontData fontData = new FontData();
-
-	assertNull(fontDialog.getFontData());	
-		
-	fontDialog.setFontData(fontData);
-	assertEquals(fontDialog.getFontData(), fontData);
-
-	fontDialog.setFontData(null);
-	assertNull(fontDialog.getFontData());	
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_widgets_FontDialog((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_Shell");
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_ShellI");
-	methodNames.addElement("test_getFontData");
-	methodNames.addElement("test_open");
-	methodNames.addElement("test_setFontDataLorg_eclipse_swt_graphics_FontData");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Dialog.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_Shell")) test_ConstructorLorg_eclipse_swt_widgets_Shell();
-	else if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_ShellI")) test_ConstructorLorg_eclipse_swt_widgets_ShellI();
-	else if (getName().equals("test_getFontData")) test_getFontData();
-	else if (getName().equals("test_open")) test_open();
-	else if (getName().equals("test_setFontDataLorg_eclipse_swt_graphics_FontData")) test_setFontDataLorg_eclipse_swt_graphics_FontData();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Group.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Group.java
deleted file mode 100644
index 7512b84..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Group.java
+++ /dev/null
@@ -1,115 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.graphics.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.widgets.Group
- *
- * @see org.eclipse.swt.widgets.Group
- */
-public class Test_org_eclipse_swt_widgets_Group extends Test_org_eclipse_swt_widgets_Composite {
-
-Group group;
-
-public Test_org_eclipse_swt_widgets_Group(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-	group = new Group(shell, 0);
-	setWidget(group);
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_CompositeI() {
-	try {
-		group = new Group(null, 0);
-		fail("No exception thrown for parent == null");
-	}
-	catch (IllegalArgumentException e) {
-	}
-
-	int[] cases = {SWT.SHADOW_IN, SWT.SHADOW_OUT, SWT.SHADOW_ETCHED_IN, SWT.SHADOW_ETCHED_OUT};
-	for (int i = 0; i < cases.length; i++)
-		group = new Group(shell, cases[i]);
-}
-
-public void test_checkSubclass() {
-	warnUnimpl("Test test_checkSubclass not written");
-}
-
-public void test_computeSizeIIZ() {
-	warnUnimpl("Test test_computeSizeIIZ not written");
-}
-
-public void test_computeTrimIIII() {
-	warnUnimpl("Test test_computeTrimIIII not written");
-}
-
-public void test_getClientArea() {
-	warnUnimpl("Test test_getClientArea not written");
-}
-
-public void test_getText() {
-	// tested in test_setTextLjava_lang_String
-}
-
-public void test_setTextLjava_lang_String() {
-	String[] cases = {"", "some text", "ldkashdoehufweovcnhslvhregojebckreavbkuhxbiufvcyhbifuyewvbiureyd.,cmnesljliewjfchvbwoifivbeworixuieurvbiuvbohflksjeahfcliureafgyciabelitvyrwtlicuyrtliureybcliuyreuceyvbliureybct"};
-	for (int i = 0; i < cases.length; i++) {
-		group.setText(cases[i]);
-		assertTrue("case: " + String.valueOf(i), group.getText().equals(cases[i]));
-	};
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_widgets_Group((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_CompositeI");
-	methodNames.addElement("test_checkSubclass");
-	methodNames.addElement("test_computeSizeIIZ");
-	methodNames.addElement("test_computeTrimIIII");
-	methodNames.addElement("test_getClientArea");
-	methodNames.addElement("test_getText");
-	methodNames.addElement("test_setTextLjava_lang_String");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Composite.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_CompositeI")) test_ConstructorLorg_eclipse_swt_widgets_CompositeI();
-	else if (getName().equals("test_checkSubclass")) test_checkSubclass();
-	else if (getName().equals("test_computeSizeIIZ")) test_computeSizeIIZ();
-	else if (getName().equals("test_computeTrimIIII")) test_computeTrimIIII();
-	else if (getName().equals("test_getClientArea")) test_getClientArea();
-	else if (getName().equals("test_getText")) test_getText();
-	else if (getName().equals("test_setTextLjava_lang_String")) test_setTextLjava_lang_String();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Item.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Item.java
deleted file mode 100644
index bd6ecbd..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Item.java
+++ /dev/null
@@ -1,119 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.graphics.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.widgets.Item
- *
- * @see org.eclipse.swt.widgets.Item
- */
-public class Test_org_eclipse_swt_widgets_Item extends Test_org_eclipse_swt_widgets_Widget {
-
-Item item;
-protected Image[] images = new Image [3];
-
-public Test_org_eclipse_swt_widgets_Item(String name) {
-	super(name);
-}
-
-protected void setUp() {
-	super.setUp();
-	loadImages();
-}
-
-protected void tearDown() {
-	super.tearDown();
-	freeImages();
-}
-
-// this method must be private or protected so the auto-gen tool keeps it
-private void loadImages() {
-	java.io.InputStream in1 = this.getClass().getResourceAsStream("folder.bmp");
-	java.io.InputStream in2 = this.getClass().getResourceAsStream("folderOpen.bmp");
-	java.io.InputStream in3 = this.getClass().getResourceAsStream("target.bmp");
-	Display display = shell.getDisplay();
-		
-	images [0] = new Image (display, in1);
-	images [1] = new Image (display, in2);
-	images [2] = new Image (display, in3);
-	
-	try {
-		in1.close();
-		in2.close();
-		in3.close();
-	} catch (java.io.IOException e) {
-	}
-}
-protected void setWidget(Widget widget) {
-	item = (Item) widget;
-	super.setWidget(widget);
-}
-// this method must be private or protected so the auto-gen tool keeps it
-private void freeImages() {
-	for (int i=0; i<images.length; i++) {
-		if (images[i] != null)
-			images[i].dispose();
-	}
-}
-
-public void test_getImage() {
-	// tested in test_setImageLorg_eclipse_swt_graphics_Image
-}
-
-public void test_getText() {
-	// tested in test_setTextLjava_lang_String
-}
-
-public void test_setImageLorg_eclipse_swt_graphics_Image() {
-	assertNull(item.getImage());
-	item.setImage(images[0]);
-	assertEquals(images[0], item.getImage());
-	assertTrue(item.getImage() != images[1]);
-	item.setImage(null);
-	assertNull(item.getImage());
-}
-
-public void test_setTextLjava_lang_String() {
-	String testStr = "test string";
-	item.setText(testStr);
-	assertTrue("a", item.getText().equals(testStr));
-	item.setText("");
-	assertTrue("b", item.getText().equals(""));
-	if (fCheckSwtNullExceptions) {
-		try {
-			item.setText(null);
-			fail("No exception thrown for string == null");
-		}
-		catch (IllegalArgumentException e) {
-		}
-	}
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_getImage");
-	methodNames.addElement("test_getText");
-	methodNames.addElement("test_setImageLorg_eclipse_swt_graphics_Image");
-	methodNames.addElement("test_setTextLjava_lang_String");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Widget.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_getImage")) test_getImage();
-	else if (getName().equals("test_getText")) test_getText();
-	else if (getName().equals("test_setImageLorg_eclipse_swt_graphics_Image")) test_setImageLorg_eclipse_swt_graphics_Image();
-	else if (getName().equals("test_setTextLjava_lang_String")) test_setTextLjava_lang_String();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Label.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Label.java
deleted file mode 100644
index 234eb61..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Label.java
+++ /dev/null
@@ -1,207 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.graphics.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.widgets.Label
- *
- * @see org.eclipse.swt.widgets.Label
- */
-public class Test_org_eclipse_swt_widgets_Label extends Test_org_eclipse_swt_widgets_Control {
-
-Label label;
-
-public Test_org_eclipse_swt_widgets_Label(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-	label = new Label(shell, 0);
-	setWidget(label);
-}
-
-protected void tearDown() {
-//	super.tearDown();
-
-	if (label != null) {
-		assertEquals(shell.isDisposed(), false);
-		assertEquals(label.isDisposed(), false);
-	}
-
-	shell.dispose();
-	if (label != null) {
-		assertTrue(shell.isDisposed());
-		assertTrue(label.isDisposed());
-	}
-}
-
-/**
- * Possible exceptions:
- * 
- * @exception IllegalArgumentException <ul>
- *    <li>ERROR_NULL_ARGUMENT - if the parent is null</li>
- * </ul>
- * @exception SWTException <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent</li>
- *    <li>ERROR_INVALID_SUBCLASS - if this class is not an allowed subclass</li>
- * </ul>
- */
-public void test_ConstructorLorg_eclipse_swt_widgets_CompositeI(){
-	try {
-		label = new Label(null, 0);
-		fail("No exception thrown"); //should never get here
-	}
-	catch (IllegalArgumentException e) {
-	}
-
-	label = new Label(shell, 0);
-
-	int[] cases = {SWT.LEFT, SWT.RIGHT, SWT.CENTER, SWT.SEPARATOR, SWT.HORIZONTAL, SWT.VERTICAL, SWT.SHADOW_IN, SWT.SHADOW_OUT};
-	for (int i = 0; i < cases.length; i++)
-		label = new Label(shell, cases[i]);
-}
-
-public void test_computeSizeIIZ() {
-	warnUnimpl("Test test_computeSizeIIZ not written");
-}
-
-/**
- * Returns a value which describes the position of the
- * text or image in the receiver. The value will be one of
- * <code>LEFT</code>, <code>RIGHT</code> or <code>CENTER</code>
- * unless the receiver is a <code>SEPARATOR</code> label, in 
- * which case, <code>NONE</code> is returned.
- */
-public void test_getAlignment(){
-	int[] cases = {SWT.LEFT, SWT.RIGHT, SWT.CENTER};
-	for (int i=0; i<cases.length; i++)
-	{
- 	  label = new Label(shell, cases[i]);
-	  assertEquals(label.getAlignment(), cases[i]);
-	} 
-}
-
-/**
- * Returns the receiver's image if it has one, or null
- * if it does not.
- */
-public void test_getImage(){
-	Image[] cases = {null, new Image(null, 100, 100)};
-	for(int i=0; i<cases.length; i++){
-	 label.setImage(cases[i]);
-	 assertEquals(label.getImage(), cases[i]);
-	 if (cases[i]!=null)
-	  cases[i].dispose();
-	}
-}
-
-/**
- * Returns the receiver's text, which will be an empty
- * string if it has never been set or if the receiver is
- * a <code>SEPARATOR</code> label.
- */
-public void test_getText(){
-	String[] cases = {"", "some name", "sdasdlkjshcdascecoewcwe"};
-	for(int i=0; i<cases.length; i++){
-	 label.setText(cases[i]);
-	 assertEquals(label.getText(), cases[i]);
-	}
-}
-
-/**
- * Controls how text and images will be displayed in the receiver.
- * The argument should be one of <code>LEFT</code>, <code>RIGHT</code>
- * or <code>CENTER</code>.  If the receiver is a <code>SEPARATOR</code>
- * label, the argument is ignored and the alignment is not changed.
- */
-public void test_setAlignmentI(){
-	int[] cases = {SWT.LEFT, SWT.RIGHT, SWT.CENTER};
-	for (int i=0; i<cases.length; i++)
-	{
- 	  label.setAlignment(cases[i]);
-	  assertEquals(label.getAlignment(), cases[i]);
-	} 
-}
-
-public void test_setFocus() {
-	warnUnimpl("Test test_setFocus not written");
-}
-
-public void test_setImageLorg_eclipse_swt_graphics_Image() {
-	warnUnimpl("Test test_setImageLorg_eclipse_swt_graphics_Image not written");
-}
-
-/**
- * Sets the receiver's text.
- * <p>
- * This method sets the widget label.  The label may include
- * the mnemonic characters and line delimiters.
- * </p>
- * 
- * @param string the new text
- *
- * @exception IllegalArgumentException <ul>
- *    <li>ERROR_NULL_ARGUMENT - if the text is null</li>
- * </ul>
- */
-public void test_setTextLjava_lang_String(){
-	try {
-		label.setText(null);
-		fail("No exception thrown for string == null");
-	}
-	catch (IllegalArgumentException e) {
-	}
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_widgets_Label((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_CompositeI");
-	methodNames.addElement("test_computeSizeIIZ");
-	methodNames.addElement("test_getAlignment");
-	methodNames.addElement("test_getImage");
-	methodNames.addElement("test_getText");
-	methodNames.addElement("test_setAlignmentI");
-	methodNames.addElement("test_setFocus");
-	methodNames.addElement("test_setImageLorg_eclipse_swt_graphics_Image");
-	methodNames.addElement("test_setTextLjava_lang_String");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Control.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_CompositeI")) test_ConstructorLorg_eclipse_swt_widgets_CompositeI();
-	else if (getName().equals("test_computeSizeIIZ")) test_computeSizeIIZ();
-	else if (getName().equals("test_getAlignment")) test_getAlignment();
-	else if (getName().equals("test_getImage")) test_getImage();
-	else if (getName().equals("test_getText")) test_getText();
-	else if (getName().equals("test_setAlignmentI")) test_setAlignmentI();
-	else if (getName().equals("test_setFocus")) test_setFocus();
-	else if (getName().equals("test_setImageLorg_eclipse_swt_graphics_Image")) test_setImageLorg_eclipse_swt_graphics_Image();
-	else if (getName().equals("test_setTextLjava_lang_String")) test_setTextLjava_lang_String();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Layout.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Layout.java
deleted file mode 100644
index fc9b598..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Layout.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.widgets.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.widgets.Layout
- *
- * @see org.eclipse.swt.widgets.Layout
- */
-public class Test_org_eclipse_swt_widgets_Layout extends SwtTestCase {
-
-public Test_org_eclipse_swt_widgets_Layout(String name) {
-	super(name);
-}
-
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_Constructor() {
-	warnUnimpl("Test test_Constructor not written");
-}
-
-public void test_computeSizeLorg_eclipse_swt_widgets_CompositeIIZ() {
-	warnUnimpl("Test test_computeSizeLorg_eclipse_swt_widgets_CompositeIIZ not written");
-}
-
-public void test_layoutLorg_eclipse_swt_widgets_CompositeZ() {
-	warnUnimpl("Test test_layoutLorg_eclipse_swt_widgets_CompositeZ not written");
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_Constructor");
-	methodNames.addElement("test_computeSizeLorg_eclipse_swt_widgets_CompositeIIZ");
-	methodNames.addElement("test_layoutLorg_eclipse_swt_widgets_CompositeZ");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_Constructor")) test_Constructor();
-	else if (getName().equals("test_computeSizeLorg_eclipse_swt_widgets_CompositeIIZ")) test_computeSizeLorg_eclipse_swt_widgets_CompositeIIZ();
-	else if (getName().equals("test_layoutLorg_eclipse_swt_widgets_CompositeZ")) test_layoutLorg_eclipse_swt_widgets_CompositeZ();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_List.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_List.java
deleted file mode 100644
index cbd4cbd..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_List.java
+++ /dev/null
@@ -1,2145 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.graphics.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.widgets.List
- *
- * @see org.eclipse.swt.widgets.List
- */
-public class Test_org_eclipse_swt_widgets_List extends Test_org_eclipse_swt_widgets_Scrollable {
-
-List list;
-
-public Test_org_eclipse_swt_widgets_List(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-	list = new List(shell, SWT.MULTI);
-
-	setWidget(list);
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-/**
- * Test if 'deselect(u, v)' is the same as 'for (i=u; i<=v; ++i) deselect(i);'
- */
-protected void deselectII_helper(
-	String[] items,
-	int start,
-	int end,
-	int[] expectedIndices) {
-		
-	list.setItems(items);
-	list.setSelection(items);
-
-	list.deselect(start, end);
-	assertEquals(
-		":(" + start + ", " + end + "):",
-		expectedIndices, list.getSelectionIndices());
-
-	list.setSelection(items);
-	if ( 0 != (list.getStyle() & SWT.MULTI) ) {
-		assertEquals("setSelection(items):", items, list.getSelection());
-	}
-
-	for (int i = start; i <= end; ++i) {
-		list.deselect(i);
-	}
-	assertEquals(
-		":(" + start + ", " + end + "):",
-		expectedIndices, list.getSelectionIndices());
-
-	list.deselectAll();
-}
-/**
- * Dispose of the main list and create a new, single-selection one.
- */
-protected List setSingleList() {
-	list.dispose();
-	list = new List(shell, SWT.SINGLE);
-	setWidget(list);
-	return list;
-}
-/**
- * Similar to deselectII_helper, checks if select(u, v) is the same as
- * for (i=u; i<=v; ++i) select(i)
- */
-protected void selectII_helper(
-	String[] items,
-	int start,
-	int end,
-	int[] expectedIndices) {
-	list.setItems(items);
-	list.select(start, end);
-	assertEquals(
-		":(" + start + ", " + end + "):",
-		expectedIndices, list.getSelectionIndices());
-
-	list.deselectAll();
-	assertEquals("deselectAll:", list.getSelectionIndices(), new int[] {});
-
-	for (int i = start; i <= end; i++) // <= on purpose
-		list.select(i);
-
-	assertEquals(":(" + start + ", " + end + "):",
-		expectedIndices, list.getSelectionIndices());
-
-	list.deselectAll();
-}
-/**
- * Similar to deselectII_helper, checks if select(int []arr) gives the same
- * result as several individual select(int) calls. The int[] used for selection
- * will be filled all integers from start to end inclusive, in order.
- */
-protected void select$I_helper(
-	String[] items,
-	int start,
-	int end,
-	int[] expectedIndices) {
-	int[] selection = new int[end - start + 1];
-	for (int i = 0; i < selection.length; ++i) {
-		selection[i] = i + start;
-	}
-
-	list.select(selection);
-
-	assertEquals(
-		":(" + start + ", " + end + "):",
-		expectedIndices, list.getSelectionIndices());
-
-	list.deselectAll();
-	assertEquals("deselectAll:", list.getSelectionIndices(), new int[] {});
-
-	for (int i = start; i <= end; i++) // <= on purpose
-		list.select(i);
-
-	assertEquals(
-		":(" + start + ", " + end + "):",
-		expectedIndices, list.getSelectionIndices());
-
-	list.deselectAll();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_CompositeI() {
-	try {
-		list = new List(null, 0);
-		fail("No exception thrown"); //should never get here
-	} catch (IllegalArgumentException e) {
-	}
-
-	int[] cases =
-		{
-			0,
-			SWT.SINGLE,
-			SWT.MULTI,
-			SWT.MULTI | SWT.V_SCROLL,
-			SWT.MULTI | SWT.H_SCROLL,
-			SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL };
-	for (int i = 0; i < cases.length; i++)
-		list = new List(shell, cases[i]);
-}
-
-/**
- * Adds the argument to the end of the receiver's list.
- *
- * @param string the new item
- *
- * @exception IllegalArgumentException <ul>
- *    <li>ERROR_NULL_ARGUMENT - if the string is null</li>
- * </ul>
- * @exception SWTException <ul>
- *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- * </ul>
- * @exception SWTError <ul>
- *    <li>ERROR_ITEM_NOT_ADDED - if the operation fails because of an operating system failure</li>
- * </ul>
- *
- */
-public void test_addLjava_lang_String() {
-	try {
-		list.add(null);
-		fail("No exception thrown");
-	} catch (IllegalArgumentException e) {
-	}
-	list.add("");
-	list.add("some \n text");
-	list.add("some text");
-
-	// test single-selection list
-
-	setSingleList();
-
-	try {
-		list.add(null);
-		fail("No exception thrown");
-	} catch (IllegalArgumentException e) {
-	}
-	list.add("");
-	list.add("some \n text");
-	list.add("some text");
-}
-
-/**
- * Adds the argument to the receiver's list at the given
- * zero-relative index.
- * <p>
- * Note: To add an item at the end of the list, use the
- * result of calling <code>getItemCount()</code> as the
- * index or use <code>add(String)</code>.
- * </p>
- *
- * @param string the new item
- * @param index the index for the item
- *
- * @exception IllegalArgumentException <ul>
- *    <li>ERROR_NULL_ARGUMENT - if the string is null</li>
- *    <li>ERROR_INVALID_RANGE - if the index is not between 0 and the number of elements in the list (inclusive)</li>
- * </ul>
- * @exception SWTException <ul>
- *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- * </ul>
- * @exception SWTError <ul>
- *    <li>ERROR_ITEM_NOT_ADDED - if the operation fails because of an operating system failure</li>
- * </ul>
- *
- * @see #add(String)
- */
-public void test_addLjava_lang_StringI() {
-	try {
-		list.add("some text", 2);
-		fail("No exception thrown");
-	} catch (IllegalArgumentException e) {
-	}
-	assertEquals(0, list.getItemCount());
-
-	// test single-selection list
-
-	setSingleList();
-
-	try {
-		list.add("some text", 2);
-		fail("No exception thrown");
-	} catch (IllegalArgumentException e) {
-	}
-
-	assertEquals(0, list.getItemCount());
-}
-
-public void test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener() {
-	warnUnimpl("Test test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener not written");
-}
-
-public void test_computeSizeIIZ() {
-	warnUnimpl("Test test_computeSizeIIZ not written");
-}
-
-public void test_deselect$I() {
-	String[] items = { "item0", "item1", "item2", "item3" };
-	String[] empty = {
-	};
-	list.setItems(items);
-	list.setSelection(items);
-	assertEquals(":a:", list.getSelection(), items);
-	try {
-		list.deselect(null);
-		fail("No exception thrown");
-	} catch (IllegalArgumentException e) {
-	}
-	assertEquals(list.getSelection(), items);
-	list.deselect(new int[] {
-	});
-	assertEquals(list.getSelection(), items);
-	list.deselect(new int[] { 0 });
-	assertEquals(list.isSelected(0), false);
-	assertTrue(list.isSelected(1));
-	list.deselect(new int[] { 2, 0, 0 });
-	assertEquals(list.getSelectionIndices(), new int[] { 1, 3 });
-	/*	assert(":d:", !list.isSelected(0));
-	assert(":dd:", !list.isSelected(2));
-	assert(":ddd:", list.isSelected(1));
-	assert(":ddd:", list.isSelected(1));*/
-
-	
-	setSingleList();
-	list.setItems(items);
-	list.setSelection(items);
-	assertEquals(list.getSelection(), new String[] { "item3" });
-	try {
-		list.deselect(null);
-		fail("No exception thrown");
-	} catch (IllegalArgumentException e) {
-	}
-
-	assertEquals(list.getSelection(), new String[] { "item3" });
-	list.deselect(new int[] {
-	});
-	assertEquals(list.getSelection(), new String[] { "item3" });
-	list.deselect(new int[] { 1 });
-	assertEquals(list.getSelectionIndices(), new int[] { 3 });
-	list.deselect(new int[] { 0 });
-	assertEquals(list.getSelectionIndices(), new int[] { 3 });
-	list.deselect(new int[] { 3 });
-	assertEquals(list.getSelectionIndices(), new int[] {});
-	list.deselect(new int[] { 2, 0, 0 });
-	assertEquals(list.getSelectionIndices(), new int[] {});
-
-}
-
-public void test_deselectI() {
-	int number = 5;
-	String[] items = new String[number];
-	for (int i = 0; i < number; i++)
-		items[i] = "fred" + i;
-	list.setItems(items);
-
-	String[] items2 = { "item0", "item1", "item2", "item3" };
-	String[] empty = {
-	};
-	list.setItems(items2);
-	list.setSelection(items2);
-	assertEquals(items2, list.getSelection());
-	list.deselect(5);
-	assertEquals(items2, list.getSelection());
-	list.deselect(1);
-	assertEquals(false, list.isSelected(1));
-	list.deselect(1);
-	assertEquals(false, list.isSelected(1));
-
-	
-	setSingleList();
-	list.setItems(items2);
-	list.setSelection(items2);
-	assertEquals(new String[] { "item3" }, list.getSelection());
-	list.deselect(5);
-	assertEquals(new String[] { "item3" }, list.getSelection());
-	list.deselect(2);
-	assertEquals(false, list.isSelected(2));
-	list.deselect(1);
-	assertEquals(false, list.isSelected(1));
-	list.deselect(1);
-	assertEquals(false, list.isSelected(1));
-	//	assert(":e:", list.getSe);
-
-}
-
-public void test_deselectII() {
-	int number = 5;
-	String[] items = new String[number];
-	for (int i = 0; i < number; i++)
-		items[i] = "fred" + i;
-	list.setItems(items);
-	list.setSelection(items);
-
-	// tests if deselect(i, j) is the same as for (i=0; i<=j; ++i) deselect(i);
-	int[][] cases = { { 3, 1 }, {
-			-3, -2 }, {
-			-2, -1 }, {
-			-1, -1 }, {
-			10, 1 }
-	};
-
-	for (int i = 0; i < cases.length; ++i) {
-		deselectII_helper(items, cases[i][0], cases[i][1], new int[] { 0, 1, 2, 3, 4 });
-	}
-	if (fCheckSWTPolicy) {
-		deselectII_helper(items, -1, 3, new int[] { 4 });
-		deselectII_helper(items, -1, 30, new int[] {
-		});
-	}
-	deselectII_helper(items, 1, 3, new int[] { 0, 4 });
-	deselectII_helper(items, 1, 1, new int[] { 0, 2, 3, 4 });
-	// done
-
-	String[] items2 = { "item0", "item1", "item2", "item3" };
-	String[] empty = {
-	};
-	list.setItems(items2);
-	list.setSelection(items2);
-	assertEquals(":a:", items2, list.getSelection());
-	list.deselect(0, 0);
-	assertEquals(":b:", list.getSelectionIndices(), new int[] { 1, 2, 3 });
-	list.deselect(0, 0);
-	assertEquals(":bbb:", list.getSelectionIndices(), new int[] { 1, 2, 3 });
-	list.deselect(2, 3);
-	assertEquals(":bb:", list.getSelectionIndices(), new int[] { 1 });
-
-	list.setSelection(items2);
-	list.deselect(0, 2);
-	assertEquals(":dddd:", list.getSelectionIndices(), new int[] { 3 });
-
-	list.setSelection(items2);
-	list.deselect(2, 0);
-	assertEquals(
-		":ddddd:",
-		list.getSelectionIndices(), new int[] { 0, 1, 2, 3 });
-
-	
-	setSingleList();
-	deselectII_helper(items, 3, 1, new int[]{4});
-	deselectII_helper(items, -1, -1, new int[]{4});
-	deselectII_helper(items, 1, 3, new int[]{4});
-	deselectII_helper(items, -1, 3, new int[]{4});
-	deselectII_helper(items, -1, 30, new int[]{});
-	deselectII_helper(items, 1, 1, new int[]{4});
-	deselectII_helper(items, 10, 1, new int[]{4});
-	
-
-	
-	list.setItems(items2);
-	list.deselectAll();
-	
-	list.select(0);
-
-	list.deselect(-3, -2);
-	assertEquals(list.getSelectionIndices(), new int[] { 0 });
-
-	list.deselect(-2, -1);
-	assertEquals(list.getSelectionIndices(), new int[] { 0 });
-
-	list.deselect(-1, -1);
-	assertEquals(":e:", list.getSelectionIndices(), new int[] { 0 });
-
-	
-	list.setSelection(items2);
-	assertEquals(list.getSelection(), new String[] { "item3" });
-
-	list.deselect(1, 1);
-	assertEquals(list.getSelection(), new String[] { "item3" });
-
-	list.deselect(0, 0);
-	assertEquals(list.getSelection(), new String[] { "item3" });
-
-	list.deselect(3, 3);
-	assertEquals(list.getSelection(), new String[] {});
-
-	list.setSelection(items2);
-	list.deselect(1, 2);
-	assertEquals(list.getSelection(), new String[] { "item3" });
-
-	list.setSelection(items2);
-	list.deselect(0, 2);
-	assertEquals(list.getSelectionIndices(), new int[] { 3 });
-
-	list.setSelection(items2);
-	list.deselect(1, 3);
-	assertEquals(list.getSelectionIndices(), new int[] {});
-}
-
-public void test_deselectAll() {
-	String[] items = { "item0", "item1", "item2", "item3" };
-	String[] empty = {
-	};
-	list.setItems(items);
-	list.setSelection(items);
-	assertEquals(items, list.getSelection());
-	list.deselectAll();
-	assertEquals(empty, list.getSelection());
-
-	
-	setSingleList();
-
-	list.setItems(items);
-	list.setSelection(items);
-	assertEquals(new String[] { "item3" }, list.getSelection());
-	list.deselectAll();
-	assertEquals(empty, list.getSelection());
-
-}
-
-public void test_getFocusIndex() {
-	warnUnimpl("Test test_getFocusIndex not written");
-}
-
-/**
- * Returns the item at the given, zero-relative index in the
- * receiver. Throws an exception if the index is out of range.
- *
- * @param index the index of the item to return
- * @return the item at the given index
- *
- * @exception IllegalArgumentException <ul>
- *    <li>ERROR_INVALID_RANGE - if the index is not between 0 and the number of elements in the list minus 1 (inclusive)</li>
- * </ul>
- * @exception SWTException <ul>
- *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- * </ul>
- * @exception SWTError <ul>
- *    <li>ERROR_CANNOT_GET_ITEM - if the operation fails because of an operating system failure</li>
- * </ul>
- */
-public void test_getItemI() {
-	String[] items = { "item0", "item1", "item2", "item3" };
-	String[] empty = {
-	};
-	list.setItems(items);
-	String item = null;
-	try {
-		item = list.getItem(5);
-		fail("No exception thrown");
-	} catch (IllegalArgumentException e) {
-	}
-	assertEquals(list.getItem(3), "item3");
-
-	
-	setSingleList();
-	list.setItems(items);
-	try {
-		item = list.getItem(5);
-		fail("No exception thrown");
-	} catch (IllegalArgumentException e) {
-	}
-	//assert(":a:", list.getItem(5)==null);
-	assertEquals("item3", list.getItem(3));
-
-}
-
-public void test_getItemCount() {
-	String[] items = { "item0", "item1", "item2", "item3" };
-
-	assertEquals(0, list.getItemCount());
-	list.setItems(items);
-	assertEquals(4, list.getItemCount());
-	list.remove(2);
-	assertEquals(3, list.getItemCount());
-	list.removeAll();
-	assertEquals(0, list.getItemCount());
-
-	
-	setSingleList();
-	assertEquals(0, list.getItemCount());
-	list.setItems(items);
-	assertEquals(4, list.getItemCount());
-	list.remove(2);
-	assertEquals(3, list.getItemCount());
-	list.removeAll();
-	assertEquals(0, list.getItemCount());
-
-}
-
-public void test_getItemHeight() {
-	warnUnimpl("Test test_getItemHeight not written");
-}
-
-public void test_getItems() {
-	String[][] cases = { {
-		}, {
-			"" }, {
-			"", "" }, {
-			"text1", "text2" }
-	};
-	for (int i = 0; i < cases.length; i++) {
-		list.setItems(cases[i]);
-		assertEquals("case: " + i, cases[i], list.getItems());
-	}
-}
-
-public void test_getSelection() {
-	String[][] cases = { {
-		}, {
-			"" }, {
-			"", "" }, {
-			"text1", "text2" }
-	};
-	for (int i = 0; i < cases.length; i++) {
-		//		System.out.println("loop:" + i);
-		list.setItems(cases[i]);
-		list.setSelection(cases[i]);
-		//		System.out.println("list:" + list.getSelection());
-		//		System.out.println("case:" + i + cases[i]);
-		assertEquals("case: " + i, cases[i], list.getSelection());
-	}
-
-	for (int i = 1; i < cases.length; i++) {
-		list.setItems(cases[i]);
-		list.setSelection(0);
-		assertEquals(
-			"case: " + String.valueOf(i),
-			list.getSelection(), new String[] { cases[i][0] });
-	}
-
-	String[] items = { "text1", "text2", "text3" };
-	list.setItems(items);
-	int[] sel = { 0, 2 };
-	list.setSelection(sel);
-	assertEquals(list.getSelection().length, 2);
-	assertEquals(list.getSelection()[0], items[0]);
-	assertEquals(list.getSelection()[1], items[2]);
-
-	list.setSelection(0, 1);
-	assertEquals(list.getSelection().length, 2);
-	assertEquals(list.getSelection()[0], items[0]);
-	assertEquals(list.getSelection()[1], items[1]);
-
-	list.setSelection(1, 1);
-	assertEquals(list.getSelection().length, 1);
-	assertEquals(list.getSelection()[0], items[1]);
-
-	list.setSelection(1, 0);
-	String[] empty = {
-	};
-	assertEquals(empty, list.getSelection());
-
-	String[] bogus_items = { "bogus_text1", "bogus_text2", "bogus_text3" };
-	list.setSelection(bogus_items);
-	assertEquals(empty, list.getSelection());
-
-	// test single-selection lists 
-
-	setSingleList();
-
-	list.setItems(items);
-	sel = new int[] { 0, 2 };
-	list.setSelection(sel);
-	assertEquals(1, list.getSelection().length);
-	assertEquals(items[0], list.getSelection()[0]);
-
-	list.setSelection(0, 1);
-	assertEquals(1, list.getSelection().length);
-	assertEquals(items[1], list.getSelection()[0]);
-}
-
-/**
- * Returns the number of selected items contained in the receiver.
- *
- * @return the number of selected items
- *
- * @exception SWTException <ul>
- *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- * </ul>
- * @exception SWTError <ul>
- *    <li>ERROR_CANNOT_GET_COUNT - if the operation fails because of an operating system failure</li>
- * </ul>
- */
-public void test_getSelectionCount() {
-	String[] items = { "text1", "text2", "text3" };
-
-	list.setItems(items);
-	assertEquals(0, list.getSelectionCount());
-
-	list.setSelection(items);
-	assertEquals(3, list.getSelectionCount());
-
-	list.deselectAll();
-	try {
-		list.setSelection((String[]) null);
-		fail("No exception thrown for selection == null");
-	} catch (IllegalArgumentException e) {
-	}
-	assertEquals(list.getSelectionCount(), 0);
-
-	
-	setSingleList();
-
-	list.setItems(items);
-	list.setSelection(items);
-	assertEquals(1, list.getSelectionCount());
-}
-
-public void test_getSelectionIndex() {
-	String[] items = { "text1", "text2", "text3" };
-
-	setSingleList();
-
-	list.setItems(items);
-	list.setSelection(items);
-	assertEquals(items.length - 1, list.getSelectionIndex());
-}
-
-public void test_getSelectionIndices() {
-	String[] items = { "text1", "text2", "text3" };
-
-	list.setItems(items);
-
-	assertEquals(list.getSelectionIndices(), new int[] {});
-
-	list.setSelection(items);
-	int[] sel = { 0, 1, 2 };
-	assertEquals(sel, list.getSelectionIndices());
-
-	
-	setSingleList();
-
-	list.setItems(items);
-	list.setSelection(items);
-	sel = new int[]{ items.length - 1 };
-	assertEquals(sel, list.getSelectionIndices());
-
-	
-	list.setItems(items);
-	assertEquals(new int[] {}, list.getSelectionIndices());
-
-}
-
-public void test_getTopIndex() {
-	String[] items = { "text1", "text2", "text3" };
-
-	list.setItems(items);
-	assertEquals(0, list.getTopIndex());
-
-	
-	setSingleList();
-
-	list.setItems(items);
-	assertEquals(0, list.getTopIndex());
-
-}
-
-/**
- * Gets the index of an item.
- * <p>
- * The list is searched starting at 0 until an
- * item is found that is equal to the search item.
- * If no item is found, -1 is returned.  Indexing
- * is zero based.
- *
- * @param string the search item
- * @return the index of the item
- *
- * @exception IllegalArgumentException <ul>
- *    <li>ERROR_NULL_ARGUMENT - if the string is null</li>
- * </ul>
- */
-public void test_indexOfLjava_lang_String() {
-	String[] items = { "text1", "text2", "text3" };
-
-	list.setItems(items);
-	assertEquals(list.indexOf("text3"), 2);
-	assertEquals(list.indexOf("text4"), -1);
-
-	int ind;
-	try {
-		ind = list.indexOf(null);
-		fail("No exception thrown for item == null");
-	} catch (IllegalArgumentException e) {
-	}
-
-	String[] items2 = { "text1", "text2", "text2" }; //two identical
-
-	list.setItems(items2);
-	assertEquals(list.indexOf("text2"), 1);
-
-	
-	setSingleList();
-
-	list.setItems(items);
-	assertEquals(-1, list.indexOf("text3", 4));
-
-	
-	assertEquals(2, list.indexOf("text3"));
-
-	
-	assertEquals(-1, list.indexOf("text4"));
-
-	
-	try {
-		ind = list.indexOf(null);
-		fail("No exception thrown");
-	} catch (IllegalArgumentException e) {
-	}
-
-	
-	assertEquals(1, list.indexOf("text2"));
-}
-
-public void test_indexOfLjava_lang_StringI() {
-	String[] items = { "text1", "text2", "text3" };
-
-	list.setItems(items);
-	assertEquals(-1, list.indexOf("text3", 4));
-	assertEquals(2, list.indexOf("text3", 2));
-	assertEquals(1, list.indexOf("text2", 0));
-	assertEquals(1, list.indexOf("text2", 1));
-	assertEquals(-1, list.indexOf("text2", 2));
-
-	String[] items2 = { "text1", "text2", "text2" }; //two identical
-	list.setItems(items2);
-	assertEquals(list.indexOf("text2", 2), 2);
-
-	
-	setSingleList();
-
-	list.setItems(items2);
-	//	assert("list.indexOf(\"text2\", -1)==1", list.indexOf("text2", -1)==1);
-	assertEquals(1, list.indexOf("text2", 0));
-	assertEquals(1, list.indexOf("text2", 1));
-	assertEquals(2, list.indexOf("text2", 2));
-}
-
-public void test_isSelectedI() {
-	String[] items = { "text1", "text2", "text2" }; //two identical
-
-	list.setItems(items);
-	list.setSelection(items);
-	assertTrue(list.isSelected(0));
-	assertTrue(list.isSelected(1));
-	assertTrue(list.isSelected(2));
-	assertEquals(false, list.isSelected(3));
-
-	
-	setSingleList();
-
-	list.setItems(items);
-	list.setSelection(items);
-	if (fCheckSWTPolicy) {
-		assertEquals(false, list.isSelected(0));
-		assertTrue(list.isSelected(1));
-		assertEquals(false, list.isSelected(2));
-		assertEquals(false, list.isSelected(3));
-	}
-
-}
-
-/**
- * Removes the items from the receiver which are
- * between the given zero-relative start and end 
- * indices (inclusive).
- *
- * @param start the start of the range
- * @param end the end of the range
- *
- * @exception IllegalArgumentException <ul>
- *    <li>ERROR_INVALID_RANGE - if either the start or end are not between 0 and the number of elements in the list minus 1 (inclusive)</li>
- * </ul>
- * @exception SWTException <ul>
- *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- * </ul>
- * @exception SWTError <ul>
- *    <li>ERROR_ITEM_NOT_REMOVED - if the operation fails because of an operating system failure</li>
- * </ul>
- */
-public void test_remove$I() {
-	String[] items = { "text0", "text1", "text2", "text3" };
-
-	list.setItems(items);
-	assertEquals(list.getItemCount(), 4);
-
-	list.setItems(items);
-	list.remove(new int[] { 1, 0, 1 });
-	assertEquals(list.getItemCount(), 2);
-
-	list.setItems(items);
-
-	try {
-		list.remove(new int[] { 3, 1, -1 });
-		fail("No exception thrown");
-	} catch (IllegalArgumentException e) {
-	}
-	assertEquals(":a:", list.getItems(), new String[] { "text0", "text2" });
-
-	list.setItems(items);
-	assertEquals(list.getItemCount(), 4);
-
-	try {
-		list.remove(new int[] { -1, -1 });
-		fail("No exception thrown");
-	} catch (IllegalArgumentException e) {
-	}
-	assertEquals(":b:", list.getItems(), items);
-
-	try {
-		list.remove(new int[] { -2, -1 });
-		fail("No exception thrown");
-	} catch (IllegalArgumentException e) {
-	}
-	assertEquals(":c:", list.getItems(), items);
-
-	list.setItems(items);
-	assertEquals(list.getItemCount(), 4);
-
-	list.remove(new int[] { 1, 1, 1 });
-	assertEquals(
-		":d:",
-		list.getItems(), new String[] { "text0", "text2", "text3" });
-
-	list.setItems(items);
-	assertEquals(list.getItemCount(), 4);
-
-	list.remove(new int[] { 1, 3 });
-	assertEquals(":e:", list.getItems(), new String[] { "text0", "text2" });
-
-	
-	setSingleList();
-
-	list.setItems(items);
-	assertEquals(4, list.getItemCount());
-
-	list.remove(new int[] { 1, 3 });
-	assertEquals(":f:", list.getItems(), new String[] { "text0", "text2" });
-
-	
-	list.setItems(items);
-	assertEquals(4, list.getItemCount());
-
-	list.remove(new int[] { 3, 1 });
-	assertEquals(":g:", list.getItems(), new String[] { "text0", "text2" });
-
-	
-	list.setItems(items);
-	assertEquals(4, list.getItemCount());
-
-	try {
-		list.remove(new int[] { 3, 1, -1 });
-		fail("No exception thrown");
-	} catch (IllegalArgumentException e) {
-	} 
-	assertEquals(":h:", list.getItems(), new String[] { "text0", "text2" });
-
-	
-	list.setItems(items);
-	assertEquals(4, list.getItemCount());
-
-	try {
-		list.remove(new int[] { -1, -1 });
-		fail("No exception thrown");
-	} catch (IllegalArgumentException e) {
-	}
-
-	assertEquals(":i:", items, list.getItems());
-
-	
-	assertEquals(4, list.getItemCount());
-
-	list.remove(new int[] { 1, 1, 1 });
-	assertEquals(":j:",
-		new String[] { "text0", "text2", "text3" }, list.getItems());
-
-}
-
-/**
- * Removes the item from the receiver at the given
- * zero-relative index.
- *
- * @param index the index for the item
- *
- * @exception IllegalArgumentException <ul>
- *    <li>ERROR_INVALID_RANGE - if the index is not between 0 and the number of elements in the list minus 1 (inclusive)</li>
- * </ul>
- * @exception SWTException <ul>
- *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- * </ul>
- * @exception SWTError <ul>
- *    <li>ERROR_ITEM_NOT_REMOVED - if the operation fails because of an operating system failure</li>
- * </ul>
- */
-public void test_removeI() {
-	String[] items = { "text1", "text2", "text3" };
-
-	list.setItems(items);
-	assertEquals(list.getItemCount(), 3);
-
-	try {
-		list.remove(3);
-		fail("No exception thrown");
-	} catch (IllegalArgumentException e) {
-	}
-	assertEquals(list.getItemCount(), 3);
-
-	try {
-		list.remove(-1);
-		fail("No exception thrown");
-	} catch (IllegalArgumentException e) {
-	}
-	assertEquals(list.getItemCount(), 3);
-
-	list.remove(1);
-	assertEquals(list.getItemCount(), 2);
-	assertEquals(list.getItem(1), "text3");
-
-	list.setItems(items);
-	assertEquals(list.getItemCount(), 3);
-
-	try {
-		list.remove(3, 4);
-		fail("No exception thrown");
-	} catch (IllegalArgumentException e) {
-	}
-
-	assertEquals(list.getItemCount(), 3);
-
-	try {
-		list.remove(3, 3);
-		fail("No exception thrown");
-	} catch (IllegalArgumentException e) {
-	}
-
-	assertEquals(list.getItemCount(), 3);
-
-	list.remove(1, 2);
-	assertEquals(list.getItemCount(), 1);
-	assertEquals(list.getItem(0), "text1");
-
-	
-	setSingleList();
-	list.setItems(items);
-	assertEquals(3, list.getItemCount());
-	try {
-		list.remove(3);
-		fail("No exception thrown");
-	} catch (IllegalArgumentException e) {
-	} 
-	assertEquals(3, list.getItemCount());
-	/////////////////////////////////////////////////
-	try {
-		list.remove(-1);
-		fail("No exception thrown");
-	} catch (IllegalArgumentException e) {
-	}
-	
-	assertEquals(3, list.getItemCount());
-	////////////////////////////////////////////////
-	list.remove(1);
-	assertEquals(2, list.getItemCount());
-	//////////////////////////////////////////////////////
-	assertTrue(list.getItem(1).equals("text3"));
-
-}
-
-/**
- * Removes the items from the receiver which are
- * between the given zero-relative start and end 
- * indices (inclusive).
- *
- * @param start the start of the range
- * @param end the end of the range
- *
- * @exception IllegalArgumentException <ul>
- *    <li>ERROR_INVALID_RANGE - if either the start or end are not between 0 and the number of elements in the list minus 1 (inclusive)</li>
- * </ul>
- * @exception SWTException <ul>
- *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- * </ul>
- * @exception SWTError <ul>
- *    <li>ERROR_ITEM_NOT_REMOVED - if the operation fails because of an operating system failure</li>
- * </ul>
- */
-public void test_removeII() {
-	String[] items = { "text1", "text2", "text3" };
-
-	list.setItems(items);
-	assertEquals(3, list.getItemCount());
-
-	try {
-		list.remove(3, 4);
-		fail("No exception thrown");
-	} catch (IllegalArgumentException e) {
-	}
-
-	assertEquals(3, list.getItemCount());
-
-	try {
-		list.remove(3, 3);
-		fail("No exception thrown");
-	} catch (IllegalArgumentException e) {
-	}
-	assertEquals(3, list.getItemCount());
-
-	list.remove(0, 0);
-	assertEquals(2, list.getItemCount());
-	assertEquals("text3", list.getItem(1));
-
-	list.setItems(items);
-	assertEquals(3, list.getItemCount());
-
-	try {
-		list.remove(3, 4);
-		fail("No exception thrown");
-	} catch (IllegalArgumentException e) {
-	}
-	assertEquals(3, list.getItemCount());
-
-	list.remove(0, 2);
-	assertEquals(0, list.getItemCount());
-
-	list.setItems(items);
-	assertEquals(3, list.getItemCount());
-
-	try {
-		list.remove(3, 3);
-		fail("No exception thrown");
-	} catch (IllegalArgumentException e) {
-	}
-	assertEquals(3, list.getItemCount());
-
-	list.remove(2, 0);
-	assertEquals(3, list.getItemCount());
-
-	
-	setSingleList();
-
-	list.setItems(items);
-	assertEquals(3, list.getItemCount());
-	//////////////////////////////////////////////////////////////
-	try {
-		list.remove(3, 4);
-		fail("No exception thrown");
-	} catch (IllegalArgumentException e) {
-	}
-
-	assertEquals(3, list.getItemCount());
-	/////////////////////////////////////////////////////////
-	try {
-		list.remove(3, 3);
-		fail("No exception thrown");
-	} catch (IllegalArgumentException e) {
-	}
-
-	assertEquals(3, list.getItemCount());
-	//////////////////////////////////////////////////////////////
-	list.remove(1, 2);
-	assertEquals(1, list.getItemCount());
-	assertEquals("text1", list.getItem(0));
-
-	
-	list.setItems(items);
-	assertEquals(3, list.getItemCount());
-
-	try {
-		list.remove(2, 10);
-		fail("No exception thrown");
-	} catch (IllegalArgumentException e) {
-	}
-	assertEquals(2, list.getItemCount());
-	assertEquals("text2", list.getItem(1));
-
-	list.remove(2, 0);
-	assertEquals(2, list.getItemCount());
-}
-
-/**
- * Searches the receiver's list starting at the first item
- * until an item is found that is equal to the argument, 
- * and removes that item from the list.
- *
- * @param string the item to remove
- *
- * @exception IllegalArgumentException <ul>
- *    <li>ERROR_NULL_ARGUMENT - if the string is null</li>
- *    <li>ERROR_INVALID_ARGUMENT - if the string is not found in the list</li>
- * </ul>
- * @exception SWTException <ul>
- *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- * </ul>
- * @exception SWTError <ul>
- *    <li>ERROR_ITEM_NOT_REMOVED - if the operation fails because of an operating system failure</li>
- * </ul>
- */
-public void test_removeLjava_lang_String() {
-	String[] items = { "text1", "text2", "text3", "test2" };
-
-	list.setItems(items);
-	assertEquals(list.getItemCount(), 4);
-
-	try {
-		list.remove((String) null);
-		fail("No exception thrown");
-	} catch (IllegalArgumentException e) {
-	}
-	assertEquals(list.getItemCount(), 4);
-
-	try {
-		list.remove("items989");
-		fail("No exception thrown");
-	} catch (IllegalArgumentException e) {
-	}
-	assertEquals(list.getItemCount(), 4);
-
-	list.setItems(items);
-	assertEquals(list.getItemCount(), 4);
-
-	list.remove("text3");
-	assertEquals(list.getItemCount(), 3);
-
-	list.remove("text2");
-	assertEquals(list.getItemCount(), 2);
-
-	
-	setSingleList();
-	list.setItems(items);
-	assertEquals(4, list.getItemCount());
-
-	try {
-		list.remove((String) null);
-		fail("No exception thrown");
-	} catch (IllegalArgumentException e) {
-	}
-	assertEquals(4, list.getItemCount());
-	////////////////////////////////////////
-	try {
-		list.remove("items989");
-		fail("No exception thrown");
-	} catch (IllegalArgumentException e) {
-	}
-	assertEquals(4, list.getItemCount());
-
-	
-	assertEquals(4, list.getItemCount());
-
-	list.remove("text3");
-	assertEquals(3, list.getItemCount());
-
-	list.remove("text2");
-	assertEquals(2, list.getItemCount());
-
-}
-
-public void test_removeAll() {
-	String[] items = { "text1", "text2", "text3", "test2" };
-
-	list.setItems(items);
-	assertEquals(list.getItemCount(), 4);
-
-	list.removeAll();
-	assertEquals(list.getItemCount(), 0);
-	list.removeAll();
-	assertEquals(list.getItemCount(), 0);
-
-	
-	setSingleList();
-	list.setItems(items);
-	assertEquals(4, list.getItemCount());
-
-	list.removeAll();
-	assertEquals(0, list.getItemCount());
-
-	
-	setSingleList();
-	assertEquals(0, list.getItemCount());
-	list.removeAll();
-	assertEquals(0, list.getItemCount());
-
-}
-
-public void test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener() {
-	warnUnimpl("Test test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener not written");
-}
-
-/**
- * Selects the items at the given zero-relative indices in the receiver.
- * If the item at the given zero-relative index in the receiver 
- * is not selected, it is selected.  If the item at the index
- * was selected, it remains selected. Indices that are out
- * of range and duplicate indices are ignored.
- */
-public void test_select$I() {
-	String[] items = { "item0", "item1", "item2", "item3" };
-	list.setItems(items);
-
-	list.select(new int[] { 0, 2 });
-	assertEquals(list.getSelectionIndices(), new int[] { 0, 2 });
-
-	list.select(new int[] { 1, 3 });
-	assertEquals(list.getSelectionIndices(), new int[] { 0, 1, 2, 3 });
-
-	list.select(new int[] { 1, 3 });
-	assertEquals(list.getSelectionIndices(), new int[] { 0, 1, 2, 3 });
-
-	list.select(new int[] { 1 });
-	assertEquals(list.getSelectionIndices(), new int[] { 0, 1, 2, 3 });
-
-	list.add("item4");
-
-	int[] ind = { -1, 0, 1, 2, 3 };
-	list.select(ind);
-	assertEquals(list.getSelectionIndices(), new int[] { 0, 1, 2, 3 });
-
-	ind = new int[32];
-	for (int i = 0; i < ind.length; i++)
-		ind[i] = i;
-
-	list.select(ind);
-	assertEquals(list.getSelectionIndices(), new int[] { 0, 1, 2, 3, 4 });
-
-	list.setSelection(new int[] {
-	});
-	list.select(new int[] { 1 });
-	assertEquals(list.getSelectionIndices(), new int[] { 1 });
-
-	list.setSelection(new int[] {
-	});
-	list.select(new int[] { -1 });
-	assertEquals(list.getSelectionIndices(), new int[] {});
-
-	list.deselectAll();
-	items = list.getItems();
-
-	select$I_helper(items, 0, 3, new int[] { 0, 1, 2, 3 });
-	select$I_helper(items, -1, 3, new int[] { 0, 1, 2, 3 });
-	select$I_helper(items, -1, 30, new int[] { 0, 1, 2, 3, 4 });
-
-	
-	setSingleList();
-	list.setItems(items);
-	
-	ind = new int[]{ -1, 0, 1, 2, 3 };
-	list.select(ind);
-	assertEquals(list.getSelectionIndices(), new int[] { 0 });
-
-	
-	ind = new int[32];
-	for (int i = 0; i < ind.length; i++)
-		ind[i] = i;
-
-	list.select(ind);
-	assertEquals(list.getSelectionIndices(), new int[] { 0 });
-
-	
-	ind = new int[]{ 1 };
-	list.select(ind);
-	assertEquals(list.getSelectionIndices(), new int[] { 1 });
-	list.deselectAll();
-
-	
-	ind = new int[]{ -1 };
-	list.select(ind);
-	assertEquals(list.getSelectionIndices(), new int[] {});
-
-	
-	setSingleList();
-	list.setItems(items);
-
-	list.select(new int[] { 0, 2 });
-	assertEquals(list.getSelectionIndices(), new int[] { 0 });
-
-	list.select(new int[] { 1, 3 });
-	assertEquals(list.getSelectionIndices(), new int[] { 1 });
-
-	list.select(new int[] { 1, 3 });
-	assertEquals(list.getSelectionIndices(), new int[] { 1 });
-
-	list.select(new int[] { 2, 3 });
-	assertEquals(list.getSelectionIndices(), new int[] { 2 });
-	list.select(new int[] { 1, 3 });
-	assertEquals(list.getSelectionIndices(), new int[] { 1 });
-
-	
-	try {
-		list.select((int[]) null);
-		fail("No exception thrown");
-	} catch (IllegalArgumentException e) {
-	}
-
-	
-	int[] selection = { 0, 1, 2, 3 };
-	list.select(selection);
-	assertEquals(list.getSelectionIndices(), new int[] { 0 });
-
-	
-	selection = new int[]{ -1, 0, 1, 2, 3 };
-	list.select(selection);
-	assertEquals(list.getSelectionIndices(), new int[] { 0 });
-
-	
-	selection = new int[32];
-	for (int i = -1; i <= 30; i++)
-		selection[i + 1] = i;
-
-	list.select(selection);
-	assertEquals(list.getSelectionIndices(), new int[] { 0 });
-
-	
-	selection = new int[]{1};
-	list.select(selection);
-	assertEquals(list.getSelectionIndices(), new int[] { 1 });
-}
-
-/**
- * Selects the item at the given zero-relative index in the receiver's 
- * list.  If the item at the index was already selected, it remains
- * selected. Indices that are out of range are ignored.
- */
-public void test_selectI() {
-	String[] items = { "item0", "item1", "item2", "item3" };
-	list.setItems(items);
-
-	list.select(2);
-	assertEquals("select(2):", list.getSelectionIndices(), new int[] { 2 });
-
-	list.select(1);
-	assertEquals("select(1):", list.getSelectionIndices(), new int[] { 1, 2 });
-
-	list.select(3);
-	assertEquals(
-		"select(3):",
-		list.getSelectionIndices(), new int[] { 1, 2, 3 });
-
-	list.select(5);
-	assertEquals(
-		"select(5):",
-		list.getSelectionIndices(), new int[] { 1, 2, 3 });
-
-	
-	setSingleList();
-	list.setItems(items);
-
-	list.select(2);
-	assertEquals(list.getSelectionIndices(), new int[] { 2 });
-
-	list.select(1);
-	assertEquals(list.getSelectionIndices(), new int[] { 1 });
-
-	list.select(3);
-	assertEquals(list.getSelectionIndices(), new int[] { 3 });
-
-	list.select(5);
-	assertEquals(list.getSelectionIndices(), new int[] { 3 });
-
-}
-
-/**
- * Selects the items at the given zero-relative indices in the receiver.
- * If the item at the index was already selected, it remains
- * selected. The range of the indices is inclusive. Indices that are
- * out of range are ignored.
- */
-public void test_selectII() {
-	int number = 5;
-
-	String[] items = new String[number];
-	int[] empty = {
-	};
-
-	for (int i = 0; i < number; i++)
-		items[i] = "item" + i;
-
-	selectII_helper(items, 10, 1, empty);
-	selectII_helper(items, 3, 1, empty);
-	selectII_helper(items, -1, -1, empty);
-	selectII_helper(items, 2, 4, new int[] { 2, 3, 4 });
-	selectII_helper(items, 0, 3, new int[] { 0, 1, 2, 3 });
-	selectII_helper(items, 1, 1, new int[] { 1 });
-
-	if (fCheckSWTPolicy == true) {
-		selectII_helper(items, -1, 30, new int[] { 0, 1, 2, 3, 4 });
-		selectII_helper(items, -1, 3, new int[] { 0, 1, 2, 3 });
-	}
-
-	list.select(0);
-	assertEquals(list.getSelectionIndices(), new int[] { 0 });
-
-	list.select(-10, -9);
-	assertEquals(list.getSelectionIndices(), new int[] { 0 });
-	list.deselectAll();
-
-	list.select(1000, 2000);
-	assertEquals(list.getSelectionCount(), 0);
-
-	list.deselectAll();
-	list.select(1, 2);
-	assertEquals(list.getSelectionIndices(), new int[] { 1, 2 });
-
-	list.select(1, 3);
-	assertEquals(list.getSelectionIndices(), new int[] { 1, 2, 3 });
-
-	list.select(2, 2);
-	assertEquals(list.getSelectionIndices(), new int[] { 1, 2, 3 });
-
-	list.select(3, 5);
-	assertEquals(list.getSelectionIndices(), new int[] { 1, 2, 3, 4 });
-
-	
-	setSingleList();
-	list.setItems(items);
-	list.select(0);
-	assertEquals(list.getSelectionIndices(), new int[] { 0 });
-	list.select(-10, -9);
-	assertEquals(list.getSelectionIndices(), new int[] { 0 });
-
-	
-	list.deselectAll();
-	assertEquals(0, list.getSelectionCount());
-	
-	list.select(1000, 2000);
-	if (fCheckOutOfRangeBehaviour) {
-		assertEquals(0, list.getSelectionCount());
-	}
-
-	
-	list.deselectAll();
-	assertEquals(0, list.getSelectionCount());
-
-	list.select(1, 2);
-	assertEquals(list.getSelectionIndices(), new int[] { 2 });
-
-	list.select(1, 3);
-	assertEquals(list.getSelectionIndices(), new int[] { 3 });
-
-	list.select(2, 2);
-	assertEquals(list.getSelectionIndices(), new int[] { 2 });
-
-	list.select(3, 5);
-	assertEquals(list.getSelectionIndices(), new int[] { 4 });
-
-	selectII_helper(items, 1, 1, new int[]{1});
-	selectII_helper(items, -1, 30, new int[]{4});
-	selectII_helper(items, 10, 1, new int[]{});
-	selectII_helper(items, 3, 1, new int[]{});
-	selectII_helper(items, -1, -1, new int[]{});
-	selectII_helper(items, 2, 4, new int[]{4});
-	selectII_helper(items, 0, 3, new int[]{3});
-}
-
-public void test_selectAll() {
-	String[] items = { "text1", "text2", "text3", "test2" };
-
-	list.setItems(items);
-	assertEquals(list.getSelectionCount(), 0);
-	list.selectAll();
-	assertEquals(list.getSelectionCount(), 4);
-
-	
-	setSingleList();
-
-	list.setItems(items);
-	assertEquals(0, list.getSelectionCount());
-	list.selectAll();
-	assertEquals(0, list.getSelectionCount());
-
-}
-
-public void test_setFontLorg_eclipse_swt_graphics_Font() {
-	warnUnimpl("Test test_setFontLorg_eclipse_swt_graphics_Font not written");
-}
-
-/**
- * Sets the text of the item in the receiver's list at the given
- * zero-relative index to the string argument. This is equivalent
- * to <code>remove</code>'ing the old item at the index, and then
- * <code>add</code>'ing the new item at that index.
- *
- * @param index the index for the item
- * @param string the new text for the item
- *
- * @exception IllegalArgumentException <ul>
- *    <li>ERROR_INVALID_RANGE - if the index is not between 0 and the number of elements in the list minus 1 (inclusive)</li>
- * </ul>
- * @exception SWTException <ul>
- *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- * </ul>
- * @exception SWTError <ul>
- *    <li>ERROR_ITEM_NOT_REMOVED - if the remove operation fails because of an operating system failure</li>
- *    <li>ERROR_ITEM_NOT_ADDED - if the add operation fails because of an operating system failure</li>
- * </ul>
- */
-public void test_setItemILjava_lang_String() {
-	assertEquals(list.getItemCount(), 0);
-	int[] cases = { -10, 0, 10 };
-	for (int i = 0; i < cases.length; i++) {
-		try {
-			list.setItem(cases[i], null);
-			fail("No exception thrown");
-		} catch (IllegalArgumentException e) {
-		}
-	}
-	assertEquals(list.getItemCount(), 0);
-
-	for (int i = 0; i < cases.length; i++) {
-		try {
-			list.setItem(cases[i], "");
-			fail("No exception thrown");
-		} catch (IllegalArgumentException e) {
-		}
-	}
-	assertEquals(list.getItemCount(), 0);
-
-	int cases2[] = { 10, 15, 0 };
-	for (int i = 0; i < cases2.length; i++) {
-		try {
-			list.setItem(cases2[i], "fred");
-			fail("No exception thrown");
-		} catch (IllegalArgumentException e) {
-		}
-		assertEquals(list.getItemCount(), 0);
-	}
-
-	
-	setSingleList();
-	assertEquals(0, list.getItemCount());
-	for (int i = 0; i < cases.length; i++) {
-		try {
-			list.setItem(cases[i], null);
-			fail("No exception thrown");
-		} catch (IllegalArgumentException e) {
-		}
-
-	}
-
-	
-	setSingleList();
-	for (int i = 0; i < cases.length; i++) {
-		try {
-			list.setItem(cases[i], "");
-			fail("No exception thrown");
-		} catch (IllegalArgumentException e) {
-		}
-	}
-
-	assertEquals(0, list.getItemCount());
-
-	
-	setSingleList();
-	for (int i = 0; i < cases2.length; i++) {
-		try {
-			list.setItem(cases2[i], "fred");
-			fail("No exception thrown");
-		} catch (IllegalArgumentException e) {
-		}
-
-		assertEquals(0, list.getItemCount());
-	}
-
-}
-
-/**
- * Sets the receiver's items to be the given array of items.
- *
- * @param items the array of items
- *
- * @exception SWTException <ul>
- *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- * </ul>
- * @exception SWTError <ul>
- *    <li>ERROR_ITEM_NOT_ADDED - if the operation fails because of an operating system failure</li>
- * </ul>
- */
-public void test_setItems$Ljava_lang_String() {
-	try {
-		list.setItems(null);
-		fail("No exception thrown for items == null");
-	} catch (IllegalArgumentException e) {
-	}
-
-	String[][] cases = { { null }, {
-			"dsada", null, "dsdasdasd" }
-	};
-	for (int i = 0; i < cases.length; i++) {
-		try {
-			list.setItems(cases[i]);
-			fail("No exception thrown for items not found");
-		} catch (SWTError e) {
-		}
-	}
-
-	String[][] itemArr = { {
-		}, {
-			"" }, {
-			"sdasd" }, {
-			"sdasd", "323434" }
-	};
-	for (int i = 0; i < itemArr.length; i++) {
-		list.setItems(itemArr[i]);
-		assertEquals(itemArr[i], list.getItems());
-	}
-
-	try {
-		list.setItems(null);
-		fail("No exception thrown");
-	} catch (IllegalArgumentException e) {
-	}
-
-	
-	setSingleList();
-	for (int i = 0; i < itemArr.length; i++) {
-		list.setItems(itemArr[i]);
-		assertEquals("case:" + i, itemArr[i], list.getItems());
-	}
-
-	
-	try {
-		list.setItems(null);
-		fail("No exception thrown");
-	} catch (IllegalArgumentException e) {
-	}
-}
-
-public void test_setSelection$I() {
-	int number = 5;
-	for (int i = 0; i < number; i++)
-		list.add("fred" + i);
-
-	int[] ind = { 1 };
-	list.setSelection(ind);
-	assertEquals(list.getSelectionIndices(), new int[] { 1 });
-
-	String[][] cases = { { "" }, {
-			"", "" }, {
-			"text1", "text2" }
-	};
-	int[] items = { 0 };
-	for (int i = 0; i < cases.length; i++) {
-		list.setItems(cases[i]);
-		list.setSelection(items);
-		assertEquals(
-			"case: " + String.valueOf(i),
-			list.getSelection(), new String[] { cases[i][0] });
-	}
-
-	String[] items2 = { "item0", "item1", "item2", "item3" };
-	list.setItems(items2);
-
-	list.setSelection(new int[] { 0, 2 });
-	assertEquals("{0, 2}", list.getSelectionIndices(), new int[] { 0, 2 });
-
-	list.setSelection(new int[] { 1, 3 });
-	assertEquals("{1, 3}", list.getSelectionIndices(), new int[] { 1, 3 });
-
-	list.setSelection(new int[] { 0, 1, 2, 3 });
-	assertEquals(
-		"{0, 1, 2, 3}",
-		list.getSelectionIndices(), new int[] { 0, 1, 2, 3 });
-
-	list.setSelection(new int[] { 1 });
-	assertEquals("{1}", list.getSelectionIndices(), new int[] { 1 });
-
-	ind = new int[] { -1, 0, 1, 2, 3 };
-	list.setSelection(ind);
-	assertEquals(
-		"setSelection(" + ind + "):",
-		list.getSelectionIndices(), new int[] { 0, 1, 2, 3 });
-
-	
-	setSingleList();
-	for (int i = 0; i < number; i++)
-		list.add("fred" + i);
-
-	ind = new int[]{ -1, 0, 1, 2, 3 };
-	list.setSelection(ind);
-	assertEquals(list.getSelectionIndices(), new int[] { 0 });
-
-	
-	ind = new int[32];
-	for (int i = 0; i < ind.length; i++)
-		ind[i] = i;
-
-	list.setSelection(ind);
-	assertEquals(list.getSelectionIndices(), new int[] { 0 });
-
-	
-	ind = new int[]{ 1 };
-	list.setSelection(ind);
-	assertEquals(list.getSelectionIndices(), new int[] { 1 });
-
-	
-	list.deselectAll();
-	assertEquals(0, list.getSelectionCount());
-	
-	ind = new int[]{ -1 };
-	list.setSelection(ind);
-	assertEquals(list.getSelectionIndices(), new int[] {});
-
-	
-	list.setSelection(new int[] { 0, 2 });
-	assertEquals(list.getSelectionIndices(), new int[] { 0 });
-
-	list.setSelection(new int[] { 1, 3 });
-	assertEquals(list.getSelectionIndices(), new int[] { 1 });
-
-	list.setSelection(new int[] { 0, 1, 2, 3 });
-	assertEquals(list.getSelectionIndices(), new int[] { 0 });
-
-	list.setSelection(new int[] { 1 });
-	assertEquals(list.getSelectionIndices(), new int[] { 1 });
-
-	try {
-		list.setSelection((int[]) null);
-		fail("No exception thrown");
-	} catch (IllegalArgumentException e) {
-	}
-}
-
-/**
- * Sets the receiver's selection to be the given array of items.
- * The current selected is first cleared, then the new items are
- * selected.
- *
- * @param items the array of items
- *
- * @exception IllegalArgumentException <ul>
- *    <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
- * </ul>
- */
-public void test_setSelection$Ljava_lang_String() {
-	String[] items = { "item0", "item1", "item2", "item3" };
-	list.setItems(items);
-
-	list.setSelection(new String[] {});
-	assertEquals(list.getSelectionIndices(), new int[] {});
-
-	list.setSelection(new String[] { "" });
-	assertEquals(list.getSelectionIndices(), new int[] {});
-
-	list.setSelection(new String[] { "item2" });
-	assertEquals(list.getSelectionIndices(), new int[] { 2 });
-
-	list.setSelection(new String[] { "item2", "item1" });
-	assertEquals(list.getSelectionIndices(), new int[] { 1, 2 });
-
-	list.setSelection(new String[] { "item5", "item1" });
-	assertEquals(list.getSelectionIndices(), new int[] { 1 });
-
-	list.setSelection(new String[] { "item1", "item1" });
-	assertEquals(list.getSelectionIndices(), new int[] { 1 });
-
-	list.setItems(items);
-	try {
-		list.setSelection((int[]) null);
-		fail("No exception thrown for selection == null");
-	} catch (IllegalArgumentException e) {
-	}
-
-	
-	setSingleList();
-	list.setItems(items);
-
-	list.setSelection(new String[] {});
-	assertEquals(list.getSelectionIndices(), new int[] {});
-
-	list.setSelection(new String[] { "" });
-	assertEquals(list.getSelectionIndices(), new int[] {});
-
-	list.setSelection(new String[] { "item2" });
-	assertEquals(1, list.getSelectionCount());
-	assertEquals(list.getSelectionIndices(), new int[] { 2 });
-
-	list.setSelection(new String[] { "item2", "item1" });
-	assertEquals(list.getSelectionIndices(), new int[] { 1 });
-
-	list.setSelection(new String[] { "item5", "item1" });
-	assertEquals(list.getSelectionIndices(), new int[] { 1 });
-
-	list.setSelection(new String[] { "item1", "item1" });
-	assertEquals(list.getSelectionIndices(), new int[] { 1 });
-
-	
-	try {
-		list.setSelection((String[]) null);
-		fail("No exception thrown for selection == null");
-	} catch (IllegalArgumentException e) {
-	}
-}
-
-/**
- * Selects the item at the given zero-relative index in the receiver. 
- * If the item at the index was already selected, it remains selected.
- * The current selected is first cleared, then the new items are selected.
- * Indices that are out of range are ignored.
- */
-public void test_setSelectionI() {
-	int number = 5;
-	for (int i = 0; i < number; i++)
-		list.add("fred" + i);
-
-	int[] ind = new int[32];
-	for (int i = 0, j = 0; i < ind.length; i++, j++)
-		ind[j] = i;
-
-	list.setSelection(ind);
-	assertEquals(
-		"setSelection(" + ind + "):",
-		list.getSelectionIndices(), new int[] { 0, 1, 2, 3, 4 });
-
-	list.deselectAll();
-	int[] ind2 = { -1 };
-	list.setSelection(ind2);
-	assertEquals(
-		"setSelection(" + ind2 + "):",
-		list.getSelectionIndices(), new int[] {});
-
-	list.deselectAll();
-	list.setSelection(2);
-	assertEquals("2", list.getSelectionIndices(), new int[] { 2 });
-
-	list.setSelection(3);
-	assertEquals("3", list.getSelectionIndices(), new int[] { 3 });
-
-	list.setSelection(5);
-	assertEquals("5", list.getSelectionIndices(), new int[] {});
-
-	
-	setSingleList();
-	String[] items = { "item0", "item1", "item2", "item3" };
-	list.setItems(items);
-
-	list.setSelection(2);
-	assertEquals("2", list.getSelectionIndices(), new int[] { 2 });
-
-	list.setSelection(3);
-	assertEquals("3", list.getSelectionIndices(), new int[] { 3 });
-
-	list.setSelection(4);
-	assertEquals("4", list.getSelectionIndices(), new int[] { 3 });
-
-}
-
-/**
- * Selects the items at the given zero-relative indices in the receiver. 
- * The current selected if first cleared, then the new items are selected.
- */
-public void test_setSelectionII() {
-	int number = 5;
-	String[] items = new String[number];
-	for (int i = 0; i < number; i++)
-		items[i] = "fred" + i;
-
-	list.setItems(items);
-	
-	list.setSelection(1, 1);
-	assertEquals(list.getSelectionIndices(), new int[] {1});
-
-	list.setSelection(10, 1);
-	assertEquals(list.getSelectionIndices(), new int[] {});
-
-	list.setSelection(3, 1);
-	assertEquals(list.getSelectionIndices(), new int[] {});
-
-	list.setSelection(-1, -1);
-	assertEquals(list.getSelectionIndices(), new int[] {});
-
-	list.setSelection(1, 3);
-	assertEquals(list.getSelectionIndices(), new int[] {1, 2, 3});
-
-	if (fCheckSWTPolicy == true) {
-		list.setSelection(-1, 3);
-		assertEquals(list.getSelectionIndices(), new int[] {0, 1, 2, 3});
-
-		list.setSelection(-1, 30);
-		assertEquals(list.getSelectionIndices(), new int[] {0, 1, 2, 3, 4});
-	}
-
-	items = new String[] { "item0", "item1", "item2", "item3" };
-	list.setItems(items);
-	list.setSelection(1, 2);
-	assertEquals(list.getSelectionIndices(), new int[] { 1, 2 });
-	list.setSelection(3, 3);
-	assertEquals(list.getSelectionIndices(), new int[] { 3 });
-	list.setSelection(3, 2);
-	assertEquals(list.getSelectionIndices(), new int[] {}); ///IS THAT THE CORRECT ANSWER ??
-
-	list.setSelection(0, 3);
-	assertEquals(list.getSelectionIndices(), new int[] { 0, 1, 2, 3 });
-	list.setSelection(4, 4);
-	assertEquals(list.getSelectionIndices(), new int[] {}); ///IS THAT THE CORRECT ANSWER ??
-
-	list.setSelection(2, 5);
-	assertEquals(list.getSelectionIndices(), new int[] { 2, 3 });
-	list.setSelection(-2, 500);
-	if (fCheckOutOfRangeBehaviour)
-		assertEquals(list.getSelectionIndices(), new int[] { 0, 1, 2, 3 });
-
-	
-	setSingleList();
-
-	list.setItems(items);
-	
-	list.setSelection(1, 2);
-	assertEquals(list.getSelectionIndices(), new int[] {2});
-
-	list.deselectAll();
-	list.setSelection(10, 1);
-	assertEquals(list.getSelectionIndices(), new int[] {});
-
-	list.setSelection(3, 1);
-	assertEquals(list.getSelectionIndices(), new int[] {});
-
-	list.setSelection(-1, -1);
-	assertEquals(list.getSelectionIndices(), new int[] {});
-
-	list.setSelection(1, 3);
-	assertEquals(list.getSelectionIndices(), new int[] {3});
-
-	list.setSelection(-1, 3);
-	assertEquals(list.getSelectionIndices(), new int[] {3});
-
-	list.setSelection(-1, 30);
-	assertEquals(list.getSelectionIndices(), new int[] {3});
-
-	list.setSelection(1, 2);
-	assertEquals(list.getSelectionIndices(), new int[] { 2 });
-
-	list.setSelection(3, 3);
-	assertEquals(list.getSelectionIndices(), new int[] { 3 });
-
-	list.setSelection(3, 2);
-	assertEquals(list.getSelectionIndices(), new int[] { 3 });
-
-	list.setSelection(0, 3);
-	assertEquals(list.getSelectionIndices(), new int[] { 3 });
-
-	list.deselectAll();
-	list.setSelection(4, 4);
-	assertEquals(list.getSelectionIndices(), new int[] {});
-
-	list.setSelection(2, 5);
-	assertEquals(list.getSelectionIndices(), new int[] { 3 });
-
-	list.setSelection(-2, 500);
-	assertEquals(list.getSelectionIndices(), new int[] { 3 });
-}
-
-public void test_setTopIndexI() {
-	list.setTopIndex(3);
-	assertEquals(list.getTopIndex(), 0);
-	String[] items = { "item0", "item1", "item2", "item3" };
-	list.setItems(items);
-	for (int i = 0; i < items.length; i++) {
-		list.setTopIndex(i);
-		assertEquals(list.getTopIndex(), i);
-	}
-
-	
-	setSingleList();
-	list.setTopIndex(3);
-	assertEquals(0, list.getTopIndex());
-
-	list.setItems(items);
-	for (int i = 0; i < items.length; i++) {
-		list.setTopIndex(i);
-		assertEquals(i, list.getTopIndex());
-	}
-
-}
-
-public void test_showSelection() {
-	String[] items = { "item0", "item1", "item2", "item3" };
-	list.setItems(items);
-	list.setSelection(items);
-	list.showSelection();
-
-	
-	setSingleList();
-
-	list.setItems(items);
-	list.setSelection(items);
-	list.showSelection();
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_widgets_List((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_CompositeI");
-	methodNames.addElement("test_addLjava_lang_String");
-	methodNames.addElement("test_addLjava_lang_StringI");
-	methodNames.addElement("test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener");
-	methodNames.addElement("test_computeSizeIIZ");
-	methodNames.addElement("test_deselect$I");
-	methodNames.addElement("test_deselectI");
-	methodNames.addElement("test_deselectII");
-	methodNames.addElement("test_deselectAll");
-	methodNames.addElement("test_getFocusIndex");
-	methodNames.addElement("test_getItemI");
-	methodNames.addElement("test_getItemCount");
-	methodNames.addElement("test_getItemHeight");
-	methodNames.addElement("test_getItems");
-	methodNames.addElement("test_getSelection");
-	methodNames.addElement("test_getSelectionCount");
-	methodNames.addElement("test_getSelectionIndex");
-	methodNames.addElement("test_getSelectionIndices");
-	methodNames.addElement("test_getTopIndex");
-	methodNames.addElement("test_indexOfLjava_lang_String");
-	methodNames.addElement("test_indexOfLjava_lang_StringI");
-	methodNames.addElement("test_isSelectedI");
-	methodNames.addElement("test_remove$I");
-	methodNames.addElement("test_removeI");
-	methodNames.addElement("test_removeII");
-	methodNames.addElement("test_removeLjava_lang_String");
-	methodNames.addElement("test_removeAll");
-	methodNames.addElement("test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener");
-	methodNames.addElement("test_select$I");
-	methodNames.addElement("test_selectI");
-	methodNames.addElement("test_selectII");
-	methodNames.addElement("test_selectAll");
-	methodNames.addElement("test_setFontLorg_eclipse_swt_graphics_Font");
-	methodNames.addElement("test_setItemILjava_lang_String");
-	methodNames.addElement("test_setItems$Ljava_lang_String");
-	methodNames.addElement("test_setSelection$I");
-	methodNames.addElement("test_setSelection$Ljava_lang_String");
-	methodNames.addElement("test_setSelectionI");
-	methodNames.addElement("test_setSelectionII");
-	methodNames.addElement("test_setTopIndexI");
-	methodNames.addElement("test_showSelection");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Scrollable.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_CompositeI")) test_ConstructorLorg_eclipse_swt_widgets_CompositeI();
-	else if (getName().equals("test_addLjava_lang_String")) test_addLjava_lang_String();
-	else if (getName().equals("test_addLjava_lang_StringI")) test_addLjava_lang_StringI();
-	else if (getName().equals("test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener")) test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener();
-	else if (getName().equals("test_computeSizeIIZ")) test_computeSizeIIZ();
-	else if (getName().equals("test_deselect$I")) test_deselect$I();
-	else if (getName().equals("test_deselectI")) test_deselectI();
-	else if (getName().equals("test_deselectII")) test_deselectII();
-	else if (getName().equals("test_deselectAll")) test_deselectAll();
-	else if (getName().equals("test_getFocusIndex")) test_getFocusIndex();
-	else if (getName().equals("test_getItemI")) test_getItemI();
-	else if (getName().equals("test_getItemCount")) test_getItemCount();
-	else if (getName().equals("test_getItemHeight")) test_getItemHeight();
-	else if (getName().equals("test_getItems")) test_getItems();
-	else if (getName().equals("test_getSelection")) test_getSelection();
-	else if (getName().equals("test_getSelectionCount")) test_getSelectionCount();
-	else if (getName().equals("test_getSelectionIndex")) test_getSelectionIndex();
-	else if (getName().equals("test_getSelectionIndices")) test_getSelectionIndices();
-	else if (getName().equals("test_getTopIndex")) test_getTopIndex();
-	else if (getName().equals("test_indexOfLjava_lang_String")) test_indexOfLjava_lang_String();
-	else if (getName().equals("test_indexOfLjava_lang_StringI")) test_indexOfLjava_lang_StringI();
-	else if (getName().equals("test_isSelectedI")) test_isSelectedI();
-	else if (getName().equals("test_remove$I")) test_remove$I();
-	else if (getName().equals("test_removeI")) test_removeI();
-	else if (getName().equals("test_removeII")) test_removeII();
-	else if (getName().equals("test_removeLjava_lang_String")) test_removeLjava_lang_String();
-	else if (getName().equals("test_removeAll")) test_removeAll();
-	else if (getName().equals("test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener")) test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener();
-	else if (getName().equals("test_select$I")) test_select$I();
-	else if (getName().equals("test_selectI")) test_selectI();
-	else if (getName().equals("test_selectII")) test_selectII();
-	else if (getName().equals("test_selectAll")) test_selectAll();
-	else if (getName().equals("test_setFontLorg_eclipse_swt_graphics_Font")) test_setFontLorg_eclipse_swt_graphics_Font();
-	else if (getName().equals("test_setItemILjava_lang_String")) test_setItemILjava_lang_String();
-	else if (getName().equals("test_setItems$Ljava_lang_String")) test_setItems$Ljava_lang_String();
-	else if (getName().equals("test_setSelection$I")) test_setSelection$I();
-	else if (getName().equals("test_setSelection$Ljava_lang_String")) test_setSelection$Ljava_lang_String();
-	else if (getName().equals("test_setSelectionI")) test_setSelectionI();
-	else if (getName().equals("test_setSelectionII")) test_setSelectionII();
-	else if (getName().equals("test_setTopIndexI")) test_setTopIndexI();
-	else if (getName().equals("test_showSelection")) test_showSelection();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Listener.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Listener.java
deleted file mode 100644
index a7dbe48..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Listener.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.widgets.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.widgets.Listener
- *
- * @see org.eclipse.swt.widgets.Listener
- */
-public class Test_org_eclipse_swt_widgets_Listener extends SwtTestCase {
-
-public Test_org_eclipse_swt_widgets_Listener(String name) {
-	super(name);
-}
-
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_handleEventLorg_eclipse_swt_widgets_Event() {
-	warnUnimpl("Test test_handleEventLorg_eclipse_swt_widgets_Event not written");
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_handleEventLorg_eclipse_swt_widgets_Event");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_handleEventLorg_eclipse_swt_widgets_Event")) test_handleEventLorg_eclipse_swt_widgets_Event();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Menu.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Menu.java
deleted file mode 100644
index c8603f7..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Menu.java
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_MenuItem.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_MenuItem.java
deleted file mode 100644
index 403172c..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_MenuItem.java
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_MessageBox.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_MessageBox.java
deleted file mode 100644
index bcf0de2..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_MessageBox.java
+++ /dev/null
@@ -1,135 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.graphics.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.widgets.MessageBox
- *
- * @see org.eclipse.swt.widgets.MessageBox
- */
-public class Test_org_eclipse_swt_widgets_MessageBox extends Test_org_eclipse_swt_widgets_Dialog {
-
-MessageBox messageBox;
-
-public Test_org_eclipse_swt_widgets_MessageBox(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-	messageBox = new MessageBox(shell, SWT.NULL);
-	setDialog(messageBox);
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-/**
- * Possible exceptions:
- * 
- * @exception IllegalArgumentException <ul>
- *    <li>ERROR_NULL_ARGUMENT - if the parent is null</li>
- * </ul>
- * @exception SWTException <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent</li>
- *    <li>ERROR_INVALID_SUBCLASS - if this class is not an allowed subclass</li>
- * </ul>
- */
-public void test_ConstructorLorg_eclipse_swt_widgets_Shell(){
-	if (fCheckSwtNullExceptions) {
-		MessageBox mb = new MessageBox(shell);
-		try {
-			mb = new MessageBox(null);
-			fail("No exception thrown for parent == null");
-		}
-		catch (IllegalArgumentException e) {
-		}
-	}
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_ShellI() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_ShellI not written");
-}
-
-public void test_getMessage() {
-	warnUnimpl("Test test_getMessage not written");
-}
-
-/**
- * Makes the dialog visible and brings it to the front
- * of the display.
- *
- * @return the ID of the button that was selected to dismiss the
- *         message box (e.g. SWT.OK, SWT.CANCEL, etc...)
- */
-public void test_open(){
-	if (fTestDialogOpen)
-		messageBox.open();
-}
-
-/**
- * Sets the dialog's message, which is a description of
- * the purpose for which it was opened. This message will be
- * visible on the dialog while it is open.
- */
-public void test_setMessageLjava_lang_String(){
-	assertEquals(messageBox.getMessage(), "");
-	String testStr = "test string";
-	messageBox.setMessage(testStr);
-	assertEquals(messageBox.getMessage(), testStr);
-	messageBox.setMessage("");
-	assertEquals(messageBox.getMessage(), "");
-	if (fCheckSwtNullExceptions) {
-		try {
-			messageBox.setMessage(null);
-			fail("No exception thrown");
-		} 
-		catch (IllegalArgumentException e) {
-		}
-	}
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_widgets_MessageBox((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_Shell");
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_ShellI");
-	methodNames.addElement("test_getMessage");
-	methodNames.addElement("test_open");
-	methodNames.addElement("test_setMessageLjava_lang_String");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Dialog.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_Shell")) test_ConstructorLorg_eclipse_swt_widgets_Shell();
-	else if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_ShellI")) test_ConstructorLorg_eclipse_swt_widgets_ShellI();
-	else if (getName().equals("test_getMessage")) test_getMessage();
-	else if (getName().equals("test_open")) test_open();
-	else if (getName().equals("test_setMessageLjava_lang_String")) test_setMessageLjava_lang_String();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_ProgressBar.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_ProgressBar.java
deleted file mode 100644
index f252d1c..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_ProgressBar.java
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Sash.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Sash.java
deleted file mode 100644
index e88bccc..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Sash.java
+++ /dev/null
@@ -1,108 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.widgets.Sash
- *
- * @see org.eclipse.swt.widgets.Sash
- */
-public class Test_org_eclipse_swt_widgets_Sash extends Test_org_eclipse_swt_widgets_Control {
-
-Sash sash;
-
-public Test_org_eclipse_swt_widgets_Sash(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-	sash = new Sash(shell, 0);
-	setWidget(sash);
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-/**
- * Possible exceptions:
- * 
- * @exception IllegalArgumentException <ul>
- *    <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
- * </ul>
- * @exception SWTException <ul>
- *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- * </ul>
- */
-public void test_ConstructorLorg_eclipse_swt_widgets_CompositeI(){
-	try {
-		sash = new Sash(null, 0);
-		fail("No exception thrown"); //should never get here
-	}
-	catch (IllegalArgumentException e) {
-	}
-
-	int[] cases = {0, SWT.HORIZONTAL, SWT.VERTICAL};
-	for (int i = 0; i < cases.length; i++)
-		sash = new Sash(shell, cases[i]);
-}
-
-public void test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener() {
-	warnUnimpl("Test test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener not written");
-}
-
-public void test_computeSizeIIZ() {
-	warnUnimpl("Test test_computeSizeIIZ not written");
-}
-
-public void test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener() {
-	warnUnimpl("Test test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener not written");
-}
-
-public void test_setFontLorg_eclipse_swt_graphics_Font() {
-	// overridden from Control because it does not make sense
-	// to set the font of a Sash.
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_widgets_Sash((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_CompositeI");
-	methodNames.addElement("test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener");
-	methodNames.addElement("test_computeSizeIIZ");
-	methodNames.addElement("test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Control.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_CompositeI")) test_ConstructorLorg_eclipse_swt_widgets_CompositeI();
-	else if (getName().equals("test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener")) test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener();
-	else if (getName().equals("test_computeSizeIIZ")) test_computeSizeIIZ();
-	else if (getName().equals("test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener")) test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Scale.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Scale.java
deleted file mode 100644
index f19b299..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Scale.java
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_ScrollBar.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_ScrollBar.java
deleted file mode 100644
index 0c40d5a..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_ScrollBar.java
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Scrollable.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Scrollable.java
deleted file mode 100644
index ae6dce3..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Scrollable.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.widgets.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.widgets.Scrollable
- *
- * @see org.eclipse.swt.widgets.Scrollable
- */
-public class Test_org_eclipse_swt_widgets_Scrollable extends Test_org_eclipse_swt_widgets_Control {
-
-	Scrollable scrollable;
-	
-public Test_org_eclipse_swt_widgets_Scrollable(String name) {
-	super(name);
-}
-
-protected void setUp() {
-	super.setUp();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-protected void setWidget(Widget w) {
-	scrollable = (Scrollable)w;
-	super.setWidget(w);
-}
-
-public void test_computeTrimIIII() {
-	scrollable.computeTrim(0, 0, 0, 0);
-}
-
-public void test_getClientArea() {
-	scrollable.getClientArea();
-}
-
-public void test_getHorizontalBar() {
-	ScrollBar hbar = scrollable.getHorizontalBar();
-}
-
-public void test_getVerticalBar() {
-	ScrollBar vbar = scrollable.getVerticalBar();
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_computeTrimIIII");
-	methodNames.addElement("test_getClientArea");
-	methodNames.addElement("test_getHorizontalBar");
-	methodNames.addElement("test_getVerticalBar");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Control.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_computeTrimIIII")) test_computeTrimIIII();
-	else if (getName().equals("test_getClientArea")) test_getClientArea();
-	else if (getName().equals("test_getHorizontalBar")) test_getHorizontalBar();
-	else if (getName().equals("test_getVerticalBar")) test_getVerticalBar();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Shell.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Shell.java
deleted file mode 100644
index 4ffdb24..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Shell.java
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Slider.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Slider.java
deleted file mode 100644
index b8a4210..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Slider.java
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Synchronizer.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Synchronizer.java
deleted file mode 100644
index 4d71ba8..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Synchronizer.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.widgets.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.widgets.Synchronizer
- *
- * @see org.eclipse.swt.widgets.Synchronizer
- */
-public class Test_org_eclipse_swt_widgets_Synchronizer extends SwtTestCase {
-
-public Test_org_eclipse_swt_widgets_Synchronizer(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_Display() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_Display not written");
-}
-
-public void test_asyncExecLjava_lang_Runnable() {
-	warnUnimpl("Test test_asyncExecLjava_lang_Runnable not written");
-}
-
-public void test_syncExecLjava_lang_Runnable() {
-	warnUnimpl("Test test_syncExecLjava_lang_Runnable not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_widgets_Synchronizer((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_Display");
-	methodNames.addElement("test_asyncExecLjava_lang_Runnable");
-	methodNames.addElement("test_syncExecLjava_lang_Runnable");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_Display")) test_ConstructorLorg_eclipse_swt_widgets_Display();
-	else if (getName().equals("test_asyncExecLjava_lang_Runnable")) test_asyncExecLjava_lang_Runnable();
-	else if (getName().equals("test_syncExecLjava_lang_Runnable")) test_syncExecLjava_lang_Runnable();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_TabFolder.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_TabFolder.java
deleted file mode 100644
index 1de80e1..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_TabFolder.java
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_TabItem.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_TabItem.java
deleted file mode 100644
index 7cfa0f6..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_TabItem.java
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Table.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Table.java
deleted file mode 100644
index 9e4c926..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Table.java
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_TableColumn.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_TableColumn.java
deleted file mode 100644
index eabc7ed..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_TableColumn.java
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_TableItem.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_TableItem.java
deleted file mode 100644
index 759fff5..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_TableItem.java
+++ /dev/null
@@ -1,519 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.graphics.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.widgets.TableItem
- *
- * @see org.eclipse.swt.widgets.TableItem
- */
-public class Test_org_eclipse_swt_widgets_TableItem extends Test_org_eclipse_swt_widgets_Item {
-
-Table table;
-TableItem tableItem;
-
-public Test_org_eclipse_swt_widgets_TableItem(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-	makeCleanEnvironment();
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-// this method must be private or protected so the auto-gen tool keeps it
-private void makeCleanEnvironment() {
-	if ( tableItem != null ) tableItem.dispose();
-	if ( table != null ) table.dispose();
-	table = new Table(shell, 0);
-	tableItem = new TableItem(table, 0);
-	setWidget(tableItem);
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_TableI(){
- 	if (fCheckSwtNullExceptions) {
-		try {
-			TableItem tItem = new TableItem(null, SWT.NULL);
-			fail("No exception thrown for parent == null");
-		}
-		catch (IllegalArgumentException e) {
-		}
-	}
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_TableII() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_TableII not written");
-}
-
-public void test_checkSubclass() {
-	warnUnimpl("Test test_checkSubclass not written");
-}
-
-public void test_getBackground() {
-	// tested in test_setBackgroundLorg_eclipse_swt_graphics_Color
-}
-
-public void test_getBoundsI(){
-	int boundsX;
-	Rectangle bounds;
-	Table table2 = new Table(shell, SWT.CHECK);
-	TableItem tableItem2 = new TableItem(table2, SWT.NULL);
- 	bounds = tableItem.getBounds(0);
-	assertTrue(":a:", bounds.x > 0 && bounds.width > 0);
-	boundsX = bounds.x;
- 	bounds = tableItem.getBounds(-1);
-	assertTrue(":b:", bounds.equals(new Rectangle(0, 0, 0, 0)));	
- 	bounds = tableItem.getBounds(1);
-	assertTrue(":c:", bounds.equals(new Rectangle(0, 0, 0, 0)));
- 	//table2.setWidths(new int[] {30});
-	TableColumn column = new TableColumn(table2, SWT.NONE, 0);
-	column.setWidth(30);
-	bounds = tableItem2.getBounds(0);
-	assertTrue(":d:", bounds.x > boundsX && bounds.width > 0);
- 	bounds = tableItem2.getBounds(-1);
-	assertEquals(new Rectangle(0, 0, 0, 0), bounds);	
- 	bounds = tableItem2.getBounds(1);
-	assertEquals(new Rectangle(0, 0, 0, 0), bounds);			
-
-	
-	//
-	makeCleanEnvironment();
-
-	Image image = images[0];
-	table2.dispose();
-	table2 = new Table(shell, SWT.CHECK);
-	tableItem2.dispose();
-	tableItem2 = new TableItem(table2, SWT.NULL);
-	column.dispose();
-
-	new TableColumn(table, SWT.NULL);
-	new TableColumn(table, SWT.NULL);
-	tableItem.setImage(1, image);
-	bounds = tableItem.getBounds(0);
-	assertTrue(":a:", bounds.x > 0 && bounds.width > 0);
-	boundsX = bounds.x;
- 	bounds = tableItem.getBounds(-1);
-	assertEquals(new Rectangle(0, 0, 0, 0), bounds);	
- 	bounds = tableItem.getBounds(1);
-	//assert(":c:", bounds.x > 0 && bounds.width > 0);  // ?? setting the image in one column does not affect width of other columns
-	assertTrue(":c:", bounds.x > 0 && bounds.height > 0);
- 
-	column = new TableColumn(table2, SWT.NULL);
-	column.setWidth(30);
-	new TableColumn(table2, SWT.NULL);	
-	tableItem2.setImage(1, image);
-	bounds = tableItem2.getBounds(0);
-	assertTrue(":d:", bounds.x > boundsX && bounds.width > 0);
- 	bounds = tableItem2.getBounds(-1);
-	assertEquals(new Rectangle(0, 0, 0, 0), bounds);	
- 	bounds = tableItem2.getBounds(1);
-	//assert(":f:", bounds.x > 0 && bounds.width > 0); // ?? setting the image in one column does not affect width of other columns
-	assertTrue(":f:", bounds.x > 0 && bounds.height > 0);
-}
-
-public void test_getChecked() {
-	warnUnimpl("Test test_getChecked not written");
-}
-
-public void test_getDisplay() {
-	assertEquals(table.getDisplay(), tableItem.getDisplay());
-}
-
-public void test_getForeground() {
-	// tested in test_setForegroundLorg_eclipse_swt_graphics_Color
-}
-
-public void test_getGrayed() {
-	warnUnimpl("Test test_getGrayed not written");
-}
-
-public void test_getImageI() {
-	warnUnimpl("Test test_getImageI not written");
-}
-
-/**
- * Test without item image
- */
-public void test_getImageBoundsI(){
-	Rectangle bounds;
-	Table table2 = new Table(shell, SWT.CHECK);
-	TableItem tableItem2 = new TableItem(table2, SWT.NULL);
-	int imageX;
-	
-	assertEquals(new Rectangle(0, 0, 0, 0), tableItem.getImageBounds(-1));
-	
-	bounds = tableItem.getImageBounds(0);
-	assertTrue(":b:", bounds.x > 0 && bounds.width == 0);
-	imageX = bounds.x;
-	
-	assertEquals(new Rectangle(0, 0, 0, 0), tableItem.getImageBounds(1));
-	
-	assertEquals(new Rectangle(0, 0, 0, 0), tableItem2.getImageBounds(-1));
-	
-	bounds = tableItem2.getImageBounds(0);
-	assertTrue(":e:", bounds.x > imageX && bounds.width == 0);
-	
-	assertEquals(new Rectangle(0, 0, 0, 0), tableItem2.getImageBounds(1));
- 	//
-	makeCleanEnvironment();
-	
-	Image image = images[0];	
-	int imageWidth = image.getBounds().width;
-	int imageHeight;
-	
-	tableItem.setImage(0, image);
-	imageHeight = table.getItemHeight() - table.getGridLineWidth();
-	assertEquals(new Rectangle(0, 0, 0, 0), tableItem.getImageBounds(-1));
-	
-	bounds = tableItem.getImageBounds(0);
-	assertTrue(":b:", bounds.x > 0 && bounds.width == imageWidth && bounds.height == imageHeight);	
- 	assertEquals(new Rectangle(0, 0, 0, 0), tableItem.getImageBounds(1));	
-
-
-	//
-	makeCleanEnvironment();	
-	
-	table2.dispose();
-	table2 = new Table(shell, SWT.CHECK);
-	tableItem2.dispose();
-	tableItem2 = new TableItem(table2, SWT.NULL);
-	Rectangle imageBounds = image.getBounds();
-	imageWidth = imageBounds.width; 	tableItem2.setImage(0, image);
-	imageHeight = table2.getItemHeight() - table2.getGridLineWidth();
-	assertEquals(new Rectangle(0, 0, 0, 0), tableItem2.getImageBounds(-1));
-	
-	bounds = tableItem2.getImageBounds(0);	// bounds.width should be check box width if they are wider than image
-	assertTrue(":b:", bounds.x > 0 && bounds.width > 0 && bounds.height == imageHeight);
- 	assertEquals(new Rectangle(0, 0, 0, 0), tableItem2.getImageBounds(1));	
-
-
-	//
-	makeCleanEnvironment();
-
-	table2.dispose();
-	table2 = new Table(shell, SWT.CHECK);
-	tableItem2.dispose();
-	tableItem2 = new TableItem(table2, SWT.NULL);
-	image = images[1];
-	imageBounds = image.getBounds();
-	imageWidth = imageBounds.width;
- 	tableItem2.setImage(0, image);
-	imageHeight = table2.getItemHeight() - table2.getGridLineWidth();
-	assertEquals(new Rectangle(0, 0, 0, 0), tableItem2.getImageBounds(-1));
- 	bounds = tableItem2.getImageBounds(0);	// bounds.width should be check box width if check box is wider than image
-	assertTrue(":b:", bounds.x > 0 && bounds.width > 0 && bounds.height == imageHeight);
- 	assertEquals(new Rectangle(0, 0, 0, 0), tableItem2.getImageBounds(1));
-}
-
-public void test_getImageIndent() {
-	warnUnimpl("Test test_getImageIndent not written");
-}
-
-public void test_getParent() {
-	assertEquals(table, tableItem.getParent());
-}
-
-public void test_getTextI() {
-	warnUnimpl("Test test_getTextI not written");
-}
-
-public void test_setBackgroundLorg_eclipse_swt_graphics_Color() {
-	Color color = new Color(tableItem.getDisplay(), 255, 0, 0);
-	tableItem.setBackground(color);
-	assertEquals(color, tableItem.getBackground());
-	tableItem.setBackground(null);
-	assertEquals(table.getBackground(),tableItem.getBackground());
-	color.dispose();
-	try { 
-		tableItem.setBackground(color);
-		fail("No exception thrown for color disposed");		
-	} catch (IllegalArgumentException e) {
-	}
-}
-
-public void test_setCheckedZ(){
-	assertEquals(false, tableItem.getChecked());
-	
-	tableItem.setChecked(true);
-	assertEquals(false, tableItem.getChecked());
- 	Table t = new Table(shell, SWT.CHECK);
-	TableItem ti = new TableItem(t, SWT.NULL);
-	ti.setChecked(true);
-	assertTrue(ti.getChecked());
-	
-	ti.setChecked(false);
-	assertEquals(false, ti.getChecked());
-	t.dispose();
-}
-
-public void test_setForegroundLorg_eclipse_swt_graphics_Color() {
-	Color color = new Color(tableItem.getDisplay(), 255, 0, 0);
-	tableItem.setForeground(color);
-	assertEquals(color, tableItem.getForeground());
-	tableItem.setForeground(null);
-	assertEquals(table.getForeground(),tableItem.getForeground());
-	color.dispose();
-	try { 
-		tableItem.setForeground(color);
-		fail("No exception thrown for color disposed");
-	} catch (IllegalArgumentException e) {
-	}
-}
-
-public void test_setGrayedZ() {
-	warnUnimpl("Test test_setGrayedZ not written");
-}
-
-public void test_setImage$Lorg_eclipse_swt_graphics_Image(){
-	assertNull(tableItem.getImage(1));	
- 	tableItem.setImage(-1, null);		
-	assertNull(tableItem.getImage(-1));	
-		
-	tableItem.setImage(0, images[0]);
-	assertEquals(images[0], tableItem.getImage(0));	
- 	String texts[] = new String[images.length];
-	for (int i = 0; i < texts.length; i++) {
-		texts[i] = String.valueOf(i);
-	}
-	
-	//table.setText(texts);				// create enough columns for TableItem.setImage(Image[]) to work
-	int columnCount = table.getColumnCount();
-	if (columnCount < texts.length) {
-		for (int i = columnCount; i < texts.length; i++){
-			TableColumn column = new TableColumn(table, SWT.NONE);
-		}
-	}
-	TableColumn[] columns = table.getColumns();
-	for (int i = 0; i < texts.length; i++) {
-		columns[i].setText(texts[i]);
-	}
-	tableItem.setImage(1, images[1]);
-	assertEquals(images[1], tableItem.getImage(1));	
- 	tableItem.setImage(images);
-	for (int i = 0; i < images.length; i++) {
-		assertEquals(images[i], tableItem.getImage(i));
-	}
-	try {
-		tableItem.setImage((Image []) null);
-		fail("No exception thrown for images == null");
-	}
-	catch (IllegalArgumentException e) {
-	}
-}
-
-public void test_setImageILorg_eclipse_swt_graphics_Image() {
-	warnUnimpl("Test test_setImageILorg_eclipse_swt_graphics_Image not written");
-}
-
-public void test_setImageLorg_eclipse_swt_graphics_Image() {
-	warnUnimpl("Test test_setImageLorg_eclipse_swt_graphics_Image not written");
-}
-
-public void test_setImageIndentI(){
-	assertEquals(0, tableItem.getImageIndent());
- 	tableItem.setImageIndent(1);
-	assertEquals(1, tableItem.getImageIndent());
- 	tableItem.setImageIndent(-1);
-	assertEquals(1, tableItem.getImageIndent());
-}
-
-public void test_setText$Ljava_lang_String(){
-	final String TestString = "test";
-	final String TestStrings[] = new String[] {TestString, TestString + "1", TestString + "2"};
-	
-	try {
-		tableItem.setText((String []) null);
-		fail("No exception thrown for strings == null");
-	}
-	catch (IllegalArgumentException e) {
-	}
-	
-   /*
- 	* Test the getText/setText API with a Table that has only 
- 	* the default column.
- 	*/
-	
-	assertEquals(0, tableItem.getText(1).length());
-	
-	tableItem.setText(TestStrings);
-	assertEquals(TestStrings[0], tableItem.getText(0));
-	for (int i = 1; i < TestStrings.length; i++) {
-		assertEquals(0, tableItem.getText(i).length());
-	}
-	
-	
-   /*
- 	* Test the getText/setText API with a Table that enough 
- 	* columns to fit all test item texts.
- 	*/
- 		
-	int columnCount = table.getColumnCount();
-	if (columnCount < images.length) {
-		for (int i = columnCount; i < images.length; i++){
-			TableColumn column = new TableColumn(table, SWT.NONE);
-		}
-	}
-	TableColumn[] columns = table.getColumns();
-	for (int i = 0; i < TestStrings.length; i++) {
-		columns[i].setText(TestStrings[i]);
-	}
-	assertEquals(0, tableItem.getText(1).length());
-
-}
-
-public void test_setTextILjava_lang_String(){
-	final String TestString = "test";
-	final String TestStrings[] = new String[] {TestString, TestString + "1", TestString + "2"};
-
-   /*
- 	* Test the getText/setText API with a Table that has only 
- 	* the default column.
- 	*/
-	
-	assertEquals(0, tableItem.getText(1).length());	
- 	tableItem.setText(1, TestString);
-	assertEquals(0, tableItem.getText(1).length());	
-	assertEquals(0, tableItem.getText(0).length());
-	
-	tableItem.setText(0, TestString);
-	assertEquals(TestString, tableItem.getText(0));
- 	tableItem.setText(-1, TestStrings[1]);
-	assertEquals(0, tableItem.getText(-1).length());	
-
-   /*
- 	* Test the getText/setText API with a Table that enough 
- 	* columns to fit all test item texts.
- 	*/
-
-	makeCleanEnvironment();
-	
-	//table.setText(TestStrings);				// create anough columns for TableItem.setText(String[]) to work
-	int columnCount = table.getColumnCount();
-	if (columnCount < images.length) {
-		for (int i = columnCount; i < images.length; i++){
-			TableColumn column = new TableColumn(table, SWT.NONE);
-		}
-	}
-	TableColumn[] columns = table.getColumns();
-	for (int i = 0; i < TestStrings.length; i++) {
-		columns[i].setText(TestStrings[i]);
-	}
-	assertEquals(0, tableItem.getText(1).length());	
-
-
-	tableItem.setText(1, TestString);
-	assertEquals(TestString, tableItem.getText(1));	
-	assertEquals(0, tableItem.getText(0).length());
-	
-	tableItem.setText(0, TestString);
-	assertEquals(TestString, tableItem.getText(0));
-
-
-	tableItem.setText(-1, TestStrings[1]);
-	assertEquals(0, tableItem.getText(-1).length());	
-
-
-	try {
-		tableItem.setText(-1, null);		
-		fail("No exception thrown for string == null");
-	}
-	catch (IllegalArgumentException e) {
-	}
-	
-	try {
-		tableItem.setText(0, null);		
-		fail("No exception thrown for string == null");
-	}
-	catch (IllegalArgumentException e) {
-	} 
-
-
-}
-
-public void test_setTextLjava_lang_String() {
-	warnUnimpl("Test test_setTextLjava_lang_String not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_widgets_TableItem((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_TableI");
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_TableII");
-	methodNames.addElement("test_checkSubclass");
-	methodNames.addElement("test_getBoundsI");
-	methodNames.addElement("test_getChecked");
-	methodNames.addElement("test_getDisplay");
-	methodNames.addElement("test_getGrayed");
-	methodNames.addElement("test_getImageI");
-	methodNames.addElement("test_getImageBoundsI");
-	methodNames.addElement("test_getImageIndent");
-	methodNames.addElement("test_getParent");
-	methodNames.addElement("test_getTextI");
-	methodNames.addElement("test_setCheckedZ");
-	methodNames.addElement("test_setGrayedZ");
-	methodNames.addElement("test_setBackgroundLorg_eclipse_swt_graphics_Color");	
-	methodNames.addElement("test_setForegroundLorg_eclipse_swt_graphics_Color");		
-	methodNames.addElement("test_setImage$Lorg_eclipse_swt_graphics_Image");
-	methodNames.addElement("test_setImageILorg_eclipse_swt_graphics_Image");
-	methodNames.addElement("test_setImageLorg_eclipse_swt_graphics_Image");
-	methodNames.addElement("test_setImageIndentI");
-	methodNames.addElement("test_setText$Ljava_lang_String");
-	methodNames.addElement("test_setTextILjava_lang_String");
-	methodNames.addElement("test_setTextLjava_lang_String");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Item.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_TableI")) test_ConstructorLorg_eclipse_swt_widgets_TableI();
-	else if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_TableII")) test_ConstructorLorg_eclipse_swt_widgets_TableII();
-	else if (getName().equals("test_checkSubclass")) test_checkSubclass();
-	else if (getName().equals("test_getBoundsI")) test_getBoundsI();
-	else if (getName().equals("test_getChecked")) test_getChecked();
-	else if (getName().equals("test_getDisplay")) test_getDisplay();
-	else if (getName().equals("test_getGrayed")) test_getGrayed();
-	else if (getName().equals("test_getImageI")) test_getImageI();
-	else if (getName().equals("test_getImageBoundsI")) test_getImageBoundsI();
-	else if (getName().equals("test_getImageIndent")) test_getImageIndent();
-	else if (getName().equals("test_getParent")) test_getParent();
-	else if (getName().equals("test_getTextI")) test_getTextI();
-	else if (getName().equals("test_setBackgroundLorg_eclipse_swt_graphics_Color")) test_setBackgroundLorg_eclipse_swt_graphics_Color();
-	else if (getName().equals("test_setCheckedZ")) test_setCheckedZ();
-	else if (getName().equals("test_setForegroundLorg_eclipse_swt_graphics_Color")) test_setForegroundLorg_eclipse_swt_graphics_Color();
-	else if (getName().equals("test_setGrayedZ")) test_setGrayedZ();
-	else if (getName().equals("test_setImage$Lorg_eclipse_swt_graphics_Image")) test_setImage$Lorg_eclipse_swt_graphics_Image();
-	else if (getName().equals("test_setImageILorg_eclipse_swt_graphics_Image")) test_setImageILorg_eclipse_swt_graphics_Image();
-	else if (getName().equals("test_setImageLorg_eclipse_swt_graphics_Image")) test_setImageLorg_eclipse_swt_graphics_Image();
-	else if (getName().equals("test_setImageIndentI")) test_setImageIndentI();
-	else if (getName().equals("test_setText$Ljava_lang_String")) test_setText$Ljava_lang_String();
-	else if (getName().equals("test_setTextILjava_lang_String")) test_setTextILjava_lang_String();
-	else if (getName().equals("test_setTextLjava_lang_String")) test_setTextLjava_lang_String();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Text.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Text.java
deleted file mode 100644
index 4f0ad44..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Text.java
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_ToolBar.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_ToolBar.java
deleted file mode 100644
index 1e371d0..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_ToolBar.java
+++ /dev/null
@@ -1,208 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.graphics.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.widgets.ToolBar
- *
- * @see org.eclipse.swt.widgets.ToolBar
- */
-public class Test_org_eclipse_swt_widgets_ToolBar extends Test_org_eclipse_swt_widgets_Composite {
-
-protected ToolBar toolBar;
-
-public Test_org_eclipse_swt_widgets_ToolBar(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-	toolBar = new ToolBar(shell, 0);
-	setWidget(toolBar);
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_CompositeI(){
-	if (fCheckSwtNullExceptions) {	
-		ToolBar newToolBar;
-		try {
-			newToolBar = new ToolBar(null, 0);
-			fail("No exception thrown for parent == null");
-		}
-		catch (IllegalArgumentException e) {
-		}
-	}
-}
-
-public void test_checkSubclass() {
-	warnUnimpl("Test test_checkSubclass not written");
-}
-
-public void test_computeSizeIIZ() {
-	warnUnimpl("Test test_computeSizeIIZ not written");
-}
-
-public void test_computeTrimIIII() {
-	warnUnimpl("Test test_computeTrimIIII not written");
-}
-
-public void test_getItemI(){
-	int number = 5;
-	ToolItem[] items = new ToolItem[number];
-	for (int i = 0; i<number ; i++){
-	  	items[i] = new ToolItem(toolBar, 0);
-	}
-	for (int i = 0; i<number ; i++){
-		assertTrue(":a:", toolBar.getItem(i)==items[i]);
-	}
-
-	toolBar = new ToolBar(shell, 0);
-	number = 5;
-	items = new ToolItem[number];
-	for (int i = 0; i<number ; i++){
-	  	items[i] = new ToolItem(toolBar, 0);
-	}
-	try {
-		toolBar.getItem(number);
-		fail("No exception thrown for illegal index argument");
-	}
-	catch (IllegalArgumentException e) {
-	}
-}
-
-public void test_getItemLorg_eclipse_swt_graphics_Point() {
-	warnUnimpl("Test test_getItemLorg_eclipse_swt_graphics_Point not written");
-}
-
-public void test_getItemCount(){
-	int number = 10;
-	ToolItem ti;
-	for (int i = 0; i<number ; i++){
-		assertTrue(":a:" + i, toolBar.getItemCount()==i);
-	  	ti = new ToolItem(toolBar, 0);
-	}
-}
-
-public void test_getItems(){
-	int number = 5;
-	ToolItem[] items = new ToolItem[number];
-	for (int i = 0; i<number ; i++){
-	  	items[i] = new ToolItem(toolBar, 0);
-	}
-	assertEquals(items, toolBar.getItems());
-	
-	toolBar.getItems()[0].dispose();
-	assertEquals(new ToolItem[]{items[1], items[2], items[3], items[4]}, toolBar.getItems());
-
-	toolBar.getItems()[3].dispose();
-	assertEquals(new ToolItem[]{items[1], items[2], items[3]}, toolBar.getItems());
-
-	toolBar.getItems()[1].dispose();
-	assertEquals(new ToolItem[]{items[1], items[3]}, toolBar.getItems());
-}
-
-public void test_getRowCount(){
-	toolBar = new ToolBar(shell, SWT.WRAP);
-	int number = 5;
-	ToolItem[] items = new ToolItem[number];
-	for (int i = 0; i<number ; i++){
-	  	items[i] = new ToolItem(toolBar, 0);
-	}
-	assertTrue(":a:" + toolBar.getRowCount(), toolBar.getRowCount()==number);  //????  because of Size(0, 0)
-
-	toolBar = new ToolBar(shell, 0);
-	number = 5;
-	items = new ToolItem[number];
-	for (int i = 0; i<number ; i++){
-	  	items[i] = new ToolItem(toolBar, 0);
-	}
-	assertTrue(":a:", toolBar.getRowCount()==1);
-}
-
-public void test_indexOfLorg_eclipse_swt_widgets_ToolItem(){
-	int number = 10;
-	ToolItem[] tis = new ToolItem[number];
-	for (int i = 0; i<number ; i++){
-	  	tis[i] = new ToolItem(toolBar, 0);
-	}
-	for (int i = 0; i<number ; i++){
-		assertTrue(":a:" + i, toolBar.indexOf(tis[i])==i);
-	}
-
-	number = 10;
-	tis = new ToolItem[number];
-	for (int i = 0; i<number ; i++){
-	  	tis[i] = new ToolItem(toolBar, 0);
-	}
-	for (int i = 0; i<number ; i++){
-		try {
-			toolBar.indexOf(null);		
-			fail("No exception thrown for toolItem == null");
-		}
-		catch (IllegalArgumentException e) {
-		}
-	}
-}
-
-public void test_setFocus() {
-	warnUnimpl("Test test_setFocus not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_widgets_ToolBar((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_CompositeI");
-	methodNames.addElement("test_checkSubclass");
-	methodNames.addElement("test_computeSizeIIZ");
-	methodNames.addElement("test_computeTrimIIII");
-	methodNames.addElement("test_getItemI");
-	methodNames.addElement("test_getItemLorg_eclipse_swt_graphics_Point");
-	methodNames.addElement("test_getItemCount");
-	methodNames.addElement("test_getItems");
-	methodNames.addElement("test_getRowCount");
-	methodNames.addElement("test_indexOfLorg_eclipse_swt_widgets_ToolItem");
-	methodNames.addElement("test_setFocus");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Composite.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_CompositeI")) test_ConstructorLorg_eclipse_swt_widgets_CompositeI();
-	else if (getName().equals("test_checkSubclass")) test_checkSubclass();
-	else if (getName().equals("test_computeSizeIIZ")) test_computeSizeIIZ();
-	else if (getName().equals("test_computeTrimIIII")) test_computeTrimIIII();
-	else if (getName().equals("test_getItemI")) test_getItemI();
-	else if (getName().equals("test_getItemLorg_eclipse_swt_graphics_Point")) test_getItemLorg_eclipse_swt_graphics_Point();
-	else if (getName().equals("test_getItemCount")) test_getItemCount();
-	else if (getName().equals("test_getItems")) test_getItems();
-	else if (getName().equals("test_getRowCount")) test_getRowCount();
-	else if (getName().equals("test_indexOfLorg_eclipse_swt_widgets_ToolItem")) test_indexOfLorg_eclipse_swt_widgets_ToolItem();
-	else if (getName().equals("test_setFocus")) test_setFocus();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_ToolItem.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_ToolItem.java
deleted file mode 100644
index 9b09dd0..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_ToolItem.java
+++ /dev/null
@@ -1,225 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.graphics.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.widgets.ToolItem
- *
- * @see org.eclipse.swt.widgets.ToolItem
- */
-public class Test_org_eclipse_swt_widgets_ToolItem extends Test_org_eclipse_swt_widgets_Item {
-
-ToolBar toolBar;
-ToolItem toolItem;
-
-public Test_org_eclipse_swt_widgets_ToolItem(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-	toolBar = new ToolBar(shell, 0);
-	toolItem = new ToolItem(toolBar, 0); 
-	setWidget(toolItem);
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_ToolBarI(){
-	if (fCheckSwtNullExceptions) {
-		try {
-			ToolItem tItem = new ToolItem(null, SWT.NULL);
-			fail("No exception thrown for parent == null");
-		}
-		catch (IllegalArgumentException e) {
-		}
-	}
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_ToolBarII() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_ToolBarII not written");
-}
-
-public void test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener() {
-	warnUnimpl("Test test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener not written");
-}
-
-public void test_checkSubclass() {
-	warnUnimpl("Test test_checkSubclass not written");
-}
-
-public void test_getBounds() {
-	warnUnimpl("Test test_getBounds not written");
-}
-
-public void test_getControl() {
-	warnUnimpl("Test test_getControl not written");
-}
-
-public void test_getDisabledImage() {
-	warnUnimpl("Test test_getDisabledImage not written");
-}
-
-public void test_getDisplay() {
-	warnUnimpl("Test test_getDisplay not written");
-}
-
-public void test_getEnabled() {
-	warnUnimpl("Test test_getEnabled not written");
-}
-
-public void test_getHotImage() {
-	warnUnimpl("Test test_getHotImage not written");
-}
-
-public void test_getParent() {
-	warnUnimpl("Test test_getParent not written");
-}
-
-public void test_getSelection(){
-	// Test for method boolean org.eclipse.swt.widgets.ToolItem.getSelection()
-	warnUnimpl( "Test Test_org_eclipse_swt_widgets_ToolItem.test_5_getSelection not written");
-}
-
-public void test_getToolTipText(){
-	toolItem.setToolTipText("fred");
-	assertTrue(":a: ", toolItem.getToolTipText().equals("fred"));
-	toolItem.setToolTipText("fredttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt");
-	assertTrue(":a: ", toolItem.getToolTipText().equals("fredttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt"));
-}
-
-public void test_getWidth() {
-	warnUnimpl("Test test_getWidth not written");
-}
-
-public void test_isEnabled(){
-	// Test for method boolean org.eclipse.swt.widgets.ToolItem.isEnabled()
-	warnUnimpl( "Test Test_org_eclipse_swt_widgets_ToolItem.test_7_isEnabled not written");
-}
-
-public void test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener() {
-	warnUnimpl("Test test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener not written");
-}
-
-public void test_setControlLorg_eclipse_swt_widgets_Control() {
-	warnUnimpl("Test test_setControlLorg_eclipse_swt_widgets_Control not written");
-}
-
-public void test_setEnabledZ(){
-	// Test for method void org.eclipse.swt.widgets.ToolItem.setEnabled(boolean)
-	warnUnimpl( "Test Test_org_eclipse_swt_widgets_ToolItem.test_8_setEnabled not written");
-}
-
-public void test_setDisabledImageLorg_eclipse_swt_graphics_Image() {
-	warnUnimpl("Test test_setDisabledImageLorg_eclipse_swt_graphics_Image not written");
-}
-
-public void test_setHotImageLorg_eclipse_swt_graphics_Image() {
-	warnUnimpl("Test test_setHotImageLorg_eclipse_swt_graphics_Image not written");
-}
-
-public void test_setImageLorg_eclipse_swt_graphics_Image() {
-	warnUnimpl("Test test_setImageLorg_eclipse_swt_graphics_Image not written");
-}
-
-public void test_setSelectionZ() {
-	warnUnimpl("Test test_setSelectionZ not written");
-}
-
-public void test_setTextLjava_lang_String() {
-	warnUnimpl("Test test_setTextLjava_lang_String not written");
-}
-
-public void test_setToolTipTextLjava_lang_String() {
-	warnUnimpl("Test test_setToolTipTextLjava_lang_String not written");
-}
-
-public void test_setWidthI() {
-	warnUnimpl("Test test_setWidthI not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_widgets_ToolItem((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_ToolBarI");
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_ToolBarII");
-	methodNames.addElement("test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener");
-	methodNames.addElement("test_checkSubclass");
-	methodNames.addElement("test_getBounds");
-	methodNames.addElement("test_getControl");
-	methodNames.addElement("test_getDisabledImage");
-	methodNames.addElement("test_getDisplay");
-	methodNames.addElement("test_getEnabled");
-	methodNames.addElement("test_getHotImage");
-	methodNames.addElement("test_getParent");
-	methodNames.addElement("test_getSelection");
-	methodNames.addElement("test_getToolTipText");
-	methodNames.addElement("test_getWidth");
-	methodNames.addElement("test_isEnabled");
-	methodNames.addElement("test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener");
-	methodNames.addElement("test_setControlLorg_eclipse_swt_widgets_Control");
-	methodNames.addElement("test_setEnabledZ");
-	methodNames.addElement("test_setDisabledImageLorg_eclipse_swt_graphics_Image");
-	methodNames.addElement("test_setHotImageLorg_eclipse_swt_graphics_Image");
-	methodNames.addElement("test_setImageLorg_eclipse_swt_graphics_Image");
-	methodNames.addElement("test_setSelectionZ");
-	methodNames.addElement("test_setTextLjava_lang_String");
-	methodNames.addElement("test_setToolTipTextLjava_lang_String");
-	methodNames.addElement("test_setWidthI");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Item.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_ToolBarI")) test_ConstructorLorg_eclipse_swt_widgets_ToolBarI();
-	else if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_ToolBarII")) test_ConstructorLorg_eclipse_swt_widgets_ToolBarII();
-	else if (getName().equals("test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener")) test_addSelectionListenerLorg_eclipse_swt_events_SelectionListener();
-	else if (getName().equals("test_checkSubclass")) test_checkSubclass();
-	else if (getName().equals("test_getBounds")) test_getBounds();
-	else if (getName().equals("test_getControl")) test_getControl();
-	else if (getName().equals("test_getDisabledImage")) test_getDisabledImage();
-	else if (getName().equals("test_getDisplay")) test_getDisplay();
-	else if (getName().equals("test_getEnabled")) test_getEnabled();
-	else if (getName().equals("test_getHotImage")) test_getHotImage();
-	else if (getName().equals("test_getParent")) test_getParent();
-	else if (getName().equals("test_getSelection")) test_getSelection();
-	else if (getName().equals("test_getToolTipText")) test_getToolTipText();
-	else if (getName().equals("test_getWidth")) test_getWidth();
-	else if (getName().equals("test_isEnabled")) test_isEnabled();
-	else if (getName().equals("test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener")) test_removeSelectionListenerLorg_eclipse_swt_events_SelectionListener();
-	else if (getName().equals("test_setControlLorg_eclipse_swt_widgets_Control")) test_setControlLorg_eclipse_swt_widgets_Control();
-	else if (getName().equals("test_setEnabledZ")) test_setEnabledZ();
-	else if (getName().equals("test_setDisabledImageLorg_eclipse_swt_graphics_Image")) test_setDisabledImageLorg_eclipse_swt_graphics_Image();
-	else if (getName().equals("test_setHotImageLorg_eclipse_swt_graphics_Image")) test_setHotImageLorg_eclipse_swt_graphics_Image();
-	else if (getName().equals("test_setImageLorg_eclipse_swt_graphics_Image")) test_setImageLorg_eclipse_swt_graphics_Image();
-	else if (getName().equals("test_setSelectionZ")) test_setSelectionZ();
-	else if (getName().equals("test_setTextLjava_lang_String")) test_setTextLjava_lang_String();
-	else if (getName().equals("test_setToolTipTextLjava_lang_String")) test_setToolTipTextLjava_lang_String();
-	else if (getName().equals("test_setWidthI")) test_setWidthI();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Tracker.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Tracker.java
deleted file mode 100644
index 6f65a2d..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Tracker.java
+++ /dev/null
@@ -1,124 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.widgets.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.widgets.Tracker
- *
- * @see org.eclipse.swt.widgets.Tracker
- */
-public class Test_org_eclipse_swt_widgets_Tracker extends Test_org_eclipse_swt_widgets_Widget {
-
-	Tracker tracker;
-	
-public Test_org_eclipse_swt_widgets_Tracker(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-	tracker = new Tracker(shell, 0);
-	setWidget(tracker);
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_CompositeI() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_CompositeI not written");
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_DisplayI() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_widgets_DisplayI not written");
-}
-
-public void test_addControlListenerLorg_eclipse_swt_events_ControlListener() {
-	warnUnimpl("Test test_addControlListenerLorg_eclipse_swt_events_ControlListener not written");
-}
-
-public void test_close() {
-	warnUnimpl("Test test_close not written");
-}
-
-public void test_getDisplay() {
-	warnUnimpl("Test test_getDisplay not written");
-}
-
-public void test_getRectangles() {
-	warnUnimpl("Test test_getRectangles not written");
-}
-
-public void test_getStippled() {
-	warnUnimpl("Test test_getStippled not written");
-}
-
-public void test_open() {
-	warnUnimpl("Test test_open not written");
-}
-
-public void test_removeControlListenerLorg_eclipse_swt_events_ControlListener() {
-	warnUnimpl("Test test_removeControlListenerLorg_eclipse_swt_events_ControlListener not written");
-}
-
-public void test_setRectangles$Lorg_eclipse_swt_graphics_Rectangle() {
-	warnUnimpl("Test test_setRectangles$Lorg_eclipse_swt_graphics_Rectangle not written");
-}
-
-public void test_setStippledZ() {
-	warnUnimpl("Test test_setStippledZ not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_widgets_Tracker((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_CompositeI");
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_DisplayI");
-	methodNames.addElement("test_addControlListenerLorg_eclipse_swt_events_ControlListener");
-	methodNames.addElement("test_close");
-	methodNames.addElement("test_getDisplay");
-	methodNames.addElement("test_getRectangles");
-	methodNames.addElement("test_getStippled");
-	methodNames.addElement("test_open");
-	methodNames.addElement("test_removeControlListenerLorg_eclipse_swt_events_ControlListener");
-	methodNames.addElement("test_setRectangles$Lorg_eclipse_swt_graphics_Rectangle");
-	methodNames.addElement("test_setStippledZ");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Widget.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_CompositeI")) test_ConstructorLorg_eclipse_swt_widgets_CompositeI();
-	else if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_DisplayI")) test_ConstructorLorg_eclipse_swt_widgets_DisplayI();
-	else if (getName().equals("test_addControlListenerLorg_eclipse_swt_events_ControlListener")) test_addControlListenerLorg_eclipse_swt_events_ControlListener();
-	else if (getName().equals("test_close")) test_close();
-	else if (getName().equals("test_getDisplay")) test_getDisplay();
-	else if (getName().equals("test_getRectangles")) test_getRectangles();
-	else if (getName().equals("test_getStippled")) test_getStippled();
-	else if (getName().equals("test_open")) test_open();
-	else if (getName().equals("test_removeControlListenerLorg_eclipse_swt_events_ControlListener")) test_removeControlListenerLorg_eclipse_swt_events_ControlListener();
-	else if (getName().equals("test_setRectangles$Lorg_eclipse_swt_graphics_Rectangle")) test_setRectangles$Lorg_eclipse_swt_graphics_Rectangle();
-	else if (getName().equals("test_setStippledZ")) test_setStippledZ();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Tree.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Tree.java
deleted file mode 100644
index 551dd8d..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Tree.java
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_TreeItem.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_TreeItem.java
deleted file mode 100644
index 1e336e1..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_TreeItem.java
+++ /dev/null
@@ -1,309 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.graphics.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.widgets.TreeItem
- *
- * @see org.eclipse.swt.widgets.TreeItem
- */
-public class Test_org_eclipse_swt_widgets_TreeItem extends Test_org_eclipse_swt_widgets_Item {
-
-TreeItem treeItem;
-Tree tree;
-
-public Test_org_eclipse_swt_widgets_TreeItem(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-	super.setUp();
-	tree = new Tree(shell, 0);
-	treeItem = new TreeItem(tree, 0);
-	setWidget(treeItem);
-}
-
-protected void tearDown() {
-	super.tearDown();
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_TreeI(){
-	if (fCheckSwtNullExceptions) {
-		try {
-			TreeItem tItem = new TreeItem((TreeItem)null, SWT.NULL);
-			fail("No exception thrown for parent == null");
-		}
-		catch (IllegalArgumentException e) {
-		}
-	}
-
-	for (int i=0; i<10; i++) {
-		new TreeItem(tree, 0);	
-	}
-	assertEquals(11, tree.getItemCount());
-	new TreeItem(tree, 0, 5);	
-	assertEquals(12, tree.getItemCount());
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_TreeII(){
-	try {
-		new TreeItem(tree, 0, 5);
-		fail("No exception thrown for illegal index argument");
-	}
-	catch (IllegalArgumentException e) {
-	}
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_TreeItemI(){
-	for (int i = 0; i < 10; i++) {
-		new TreeItem(treeItem, 0);
-	}
-	assertEquals(10, treeItem.getItemCount());
-	new TreeItem(treeItem, 0, 5);
-	assertEquals(1, tree.getItemCount());
-}
-
-public void test_ConstructorLorg_eclipse_swt_widgets_TreeItemII(){
-	if (fCheckOutOfRangeBehaviour) {
-		try {
-			new TreeItem(treeItem, 0, 5);
-			fail("No exception thrown for illegal index argument");
-		}
-		catch (IllegalArgumentException e) {
-		}
-		assertEquals(1, tree.getItemCount());
-	}
-}
-
-public void test_checkSubclass() {
-	warnUnimpl("Test test_checkSubclass not written");
-}
-
-public void test_getBackground() {
-	// tested in test_setBackgroundLorg_eclipse_swt_graphics_Color
-}
-
-public void test_getBounds() {
-	warnUnimpl("Test test_getBounds not written");
-}
-
-public void test_getChecked(){
-	Tree newTree = new Tree(shell, SWT.CHECK);
-	TreeItem tItem = new TreeItem(newTree,0);
-	assertEquals(false, tItem.getChecked());
-	tItem.setChecked(true);
-	assertTrue(tItem.getChecked());
-	tItem.setChecked(false);
-	assertEquals(false, tItem.getChecked());
-}
-
-public void test_getDisplay() {
-	assertEquals(tree.getDisplay(), treeItem.getDisplay());
-}
-
-public void test_getExpanded(){
-	assertEquals(false, treeItem.getExpanded());
-	// there must be at least one subitem before you can set the treeitem expanded
-	new TreeItem(treeItem, 0);
-	treeItem.setExpanded(true);
-	assertTrue(treeItem.getExpanded());
-	treeItem.setExpanded(false);
-	assertEquals(false, treeItem.getExpanded());
-}
-
-public void test_getForeground() {
-	// tested in test_setForegroundLorg_eclipse_swt_graphics_Color
-}
-
-public void test_getGrayed() {
-	warnUnimpl("Test test_getGrayed not written");
-}
-
-public void test_getItemCount(){
-	for (int i = 0; i < 10; i++) {
-		assertEquals(i, treeItem.getItemCount());
-		new TreeItem(treeItem, 0);
-	}
-	assertTrue("b: ", treeItem.getItemCount() == 10);
-}
-
-public void test_getItems(){
-	if (fCheckBogusTestCases) {
-		int[] cases = {2, 10, 100};
-		for (int j = 0; j < cases.length; j++) {
-			for (int i = 0; i < cases[j]; i++) {
-				TreeItem ti = new TreeItem(tree, 0);
-			}
-			assertEquals(cases[j], tree.getItems().length);
-			tree.removeAll();
-			assertEquals(0, tree.getItemCount());
-		}
-	}
-}
-
-public void test_getParent(){
-	assertEquals(tree, treeItem.getParent());
-}
-
-public void test_getParentItem(){
-	TreeItem tItem = new TreeItem(treeItem, SWT.NULL);
-	assertEquals(treeItem, tItem.getParentItem());
-}
-
-public void test_setBackgroundLorg_eclipse_swt_graphics_Color() {
-	Color color = new Color(treeItem.getDisplay(), 255, 0, 0);
-	treeItem.setBackground(color);
-	assertEquals(color, treeItem.getBackground());
-	treeItem.setBackground(null);
-	assertEquals(tree.getBackground(),treeItem.getBackground());
-	color.dispose();
-	try { 
-		treeItem.setBackground(color);
-		fail("No exception thrown for color disposed");		
-	} catch (IllegalArgumentException e) {
-	}
-}
-
-
-public void test_setCheckedZ(){
-	assertEquals(false, treeItem.getChecked());
-	
-	treeItem.setChecked(true);
-	assertEquals(false, treeItem.getChecked());
-
-	Tree t = new Tree(shell, SWT.CHECK);
-	TreeItem ti = new TreeItem(t, SWT.NULL);
-	ti.setChecked(true);
-	assertTrue(ti.getChecked());
-	
-	ti.setChecked(false);
-	assertEquals(false, ti.getChecked());
-	t.dispose();
-}
-
-public void test_setExpandedZ(){
-	assertEquals(false, treeItem.getExpanded());
-	
-	// there must be at least one subitem before you can set the treeitem expanded
-	treeItem.setExpanded(true);
-	assertEquals(false, treeItem.getExpanded());
-
-
-	new TreeItem(treeItem, SWT.NULL);
-	treeItem.setExpanded(true);
-	assertTrue(treeItem.getExpanded());
-	treeItem.setExpanded(false);
-	assertEquals(false, treeItem.getExpanded());
-		
-	TreeItem ti = new TreeItem(treeItem, SWT.NULL);
-	ti.setExpanded(true);
-	treeItem.setExpanded(false);
-	assertEquals(false, ti.getExpanded());
-}
-
-public void test_setForegroundLorg_eclipse_swt_graphics_Color() {
-	Color color = new Color(treeItem.getDisplay(), 255, 0, 0);
-	treeItem.setForeground(color);
-	assertEquals(color, treeItem.getForeground());
-	treeItem.setForeground(null);
-	assertEquals(tree.getForeground(),treeItem.getForeground());
-	color.dispose();
-	try { 
-		treeItem.setForeground(color);
-		fail("No exception thrown for color disposed");
-	} catch (IllegalArgumentException e) {
-	}
-}
-
-public void test_setGrayedZ() {
-	warnUnimpl("Test test_setGrayedZ not written");
-}
-
-public void test_setImageLorg_eclipse_swt_graphics_Image() {
-	warnUnimpl("Test test_setImageLorg_eclipse_swt_graphics_Image not written");
-}
-
-public void test_setTextLjava_lang_String(){
-	try {
-		treeItem.setText(null);		
-		fail("No exception thrown for string == null");
-	}
-	catch (IllegalArgumentException e) {
-	}
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_widgets_TreeItem((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_TreeI");
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_TreeII");
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_TreeItemI");
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_widgets_TreeItemII");
-	methodNames.addElement("test_checkSubclass");
-	methodNames.addElement("test_getBounds");
-	methodNames.addElement("test_getChecked");
-	methodNames.addElement("test_getDisplay");
-	methodNames.addElement("test_getExpanded");
-	methodNames.addElement("test_getGrayed");
-	methodNames.addElement("test_getItemCount");
-	methodNames.addElement("test_getItems");
-	methodNames.addElement("test_getParent");
-	methodNames.addElement("test_getParentItem");
-	methodNames.addElement("test_setBackgroundLorg_eclipse_swt_graphics_Color");
-	methodNames.addElement("test_setCheckedZ");
-	methodNames.addElement("test_setExpandedZ");
-	methodNames.addElement("test_setForegroundLorg_eclipse_swt_graphics_Color");	
-	methodNames.addElement("test_setGrayedZ");
-	methodNames.addElement("test_setImageLorg_eclipse_swt_graphics_Image");
-	methodNames.addElement("test_setTextLjava_lang_String");
-	methodNames.addAll(Test_org_eclipse_swt_widgets_Item.methodNames()); // add superclass method names
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_TreeI")) test_ConstructorLorg_eclipse_swt_widgets_TreeI();
-	else if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_TreeII")) test_ConstructorLorg_eclipse_swt_widgets_TreeII();
-	else if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_TreeItemI")) test_ConstructorLorg_eclipse_swt_widgets_TreeItemI();
-	else if (getName().equals("test_ConstructorLorg_eclipse_swt_widgets_TreeItemII")) test_ConstructorLorg_eclipse_swt_widgets_TreeItemII();
-	else if (getName().equals("test_checkSubclass")) test_checkSubclass();
-	else if (getName().equals("test_getBounds")) test_getBounds();
-	else if (getName().equals("test_getChecked")) test_getChecked();
-	else if (getName().equals("test_getDisplay")) test_getDisplay();
-	else if (getName().equals("test_getExpanded")) test_getExpanded();
-	else if (getName().equals("test_getGrayed")) test_getGrayed();
-	else if (getName().equals("test_getItemCount")) test_getItemCount();
-	else if (getName().equals("test_getItems")) test_getItems();
-	else if (getName().equals("test_getParent")) test_getParent();
-	else if (getName().equals("test_getParentItem")) test_getParentItem();
-	else if (getName().equals("test_setBackgroundLorg_eclipse_swt_graphics_Color")) test_setBackgroundLorg_eclipse_swt_graphics_Color();		
-	else if (getName().equals("test_setCheckedZ")) test_setCheckedZ();
-	else if (getName().equals("test_setExpandedZ")) test_setExpandedZ();
-	else if (getName().equals("test_setForegroundLorg_eclipse_swt_graphics_Color")) test_setForegroundLorg_eclipse_swt_graphics_Color();	
-	else if (getName().equals("test_setGrayedZ")) test_setGrayedZ();
-	else if (getName().equals("test_setImageLorg_eclipse_swt_graphics_Image")) test_setImageLorg_eclipse_swt_graphics_Image();
-	else if (getName().equals("test_setTextLjava_lang_String")) test_setTextLjava_lang_String();
-	else super.runTest();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_TypedListener.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_TypedListener.java
deleted file mode 100644
index 0d7b8d1..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_TypedListener.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.widgets.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.widgets.TypedListener
- *
- * @see org.eclipse.swt.widgets.TypedListener
- */
-public class Test_org_eclipse_swt_widgets_TypedListener extends SwtTestCase {
-
-public Test_org_eclipse_swt_widgets_TypedListener(String name) {
-	super(name);
-}
-
-public static void main(String[] args) {
-	TestRunner.run(suite());
-}
-
-protected void setUp() {
-}
-
-protected void tearDown() {
-}
-
-public void test_ConstructorLorg_eclipse_swt_internal_SWTEventListener() {
-	warnUnimpl("Test test_ConstructorLorg_eclipse_swt_internal_SWTEventListener not written");
-}
-
-public void test_getEventListener() {
-	warnUnimpl("Test test_getEventListener not written");
-}
-
-public void test_handleEventLorg_eclipse_swt_widgets_Event() {
-	warnUnimpl("Test test_handleEventLorg_eclipse_swt_widgets_Event not written");
-}
-
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	java.util.Vector methodNames = methodNames();
-	java.util.Enumeration e = methodNames.elements();
-	while (e.hasMoreElements()) {
-		suite.addTest(new Test_org_eclipse_swt_widgets_TypedListener((String)e.nextElement()));
-	}
-	return suite;
-}
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_ConstructorLorg_eclipse_swt_internal_SWTEventListener");
-	methodNames.addElement("test_getEventListener");
-	methodNames.addElement("test_handleEventLorg_eclipse_swt_widgets_Event");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_ConstructorLorg_eclipse_swt_internal_SWTEventListener")) test_ConstructorLorg_eclipse_swt_internal_SWTEventListener();
-	else if (getName().equals("test_getEventListener")) test_getEventListener();
-	else if (getName().equals("test_handleEventLorg_eclipse_swt_widgets_Event")) test_handleEventLorg_eclipse_swt_widgets_Event();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Widget.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Widget.java
deleted file mode 100644
index 8d9d546..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Widget.java
+++ /dev/null
@@ -1,193 +0,0 @@
-package org.eclipse.swt.tests.junit;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002. All rights reserved.
- * This file is made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- */
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.graphics.*;
-import junit.framework.*;
-import junit.textui.*;
-
-/**
- * Automated Test Suite for class org.eclipse.swt.widgets.Widget
- *
- * @see org.eclipse.swt.widgets.Widget
- */
-public class Test_org_eclipse_swt_widgets_Widget extends SwtTestCase {
-
-public Shell shell;
-private Widget widget;
-
-public Test_org_eclipse_swt_widgets_Widget(String name) {
-	super(name);
-}
-
-protected void setUp() {
-	shell = new Shell();
-}
-
-protected void tearDown() {
-	if (widget != null) {
-		assertEquals(false, widget.isDisposed());
-	}
-	assertEquals(false, shell.isDisposed());
-	shell.dispose();
-	if (widget != null) {
-		assertTrue(widget.isDisposed());
-	}
-	assertTrue(shell.isDisposed());
-}
-
-protected void setWidget(Widget w) {
-	widget = w;
-}
-
-public void test_addListenerILorg_eclipse_swt_widgets_Listener() {
-	try {
-		widget.addListener(SWT.Dispose, null);
-		fail("No exception thrown for listener == null");
-	}
-	catch (IllegalArgumentException e) {
-	}
-
-	Listener listener = new Listener() {
-		public void handleEvent(Event e) {
-		}
-	};
-	widget.addListener(SWT.Dispose, listener);
-	widget.removeListener(SWT.Dispose, listener);
-}
-
-public void test_addDisposeListenerLorg_eclipse_swt_events_DisposeListener() {
-	DisposeListener listener = new DisposeListener() {
-		public void widgetDisposed(DisposeEvent e) {
-		}
-	};
-	widget.addDisposeListener(listener);
-	widget.removeDisposeListener(listener);
-}
-
-public void test_dispose() {
-	// tested in tearDown
-}
-
-public void test_getData() {
-	// tested in test_setDataLjava_lang_Object
-}
-
-public void test_getDataLjava_lang_String() {
-	// tested in test_setDataLjava_lang_StringLjava_lang_Object
-}
-
-public void test_getDisplay() {
-	assertEquals(widget.getDisplay(), widget.getDisplay());
-}
-
-public void test_getStyle() {
-	// this test should be overridden by leaf subclasses
-}
-
-public void test_isDisposed() {
-	assertEquals(false, widget.isDisposed());
-}
-
-public void test_notifyListenersILorg_eclipse_swt_widgets_Event() {
-	// this method is further tested in many of the addTypedListener tests
-	try {
-		widget.notifyListeners(0, null);
-		fail("No exception thrown for event == null");
-	}
-	catch (IllegalArgumentException e) {
-	}
-
-	widget.notifyListeners(SWT.Paint, new Event());
-}
-
-public void test_removeListenerILorg_eclipse_swt_widgets_Listener() {
-	// this method is further tested by all of the removeTypedListener tests
-	try {
-		widget.removeListener(SWT.Paint, null);
-		fail("No exception thrown for listener == null");
-	}
-	catch (IllegalArgumentException e) {
-	}
-
-	widget.removeListener(SWT.Paint, new Listener() {
-		public void handleEvent(Event e) {
-		}
-	});
-	
-	Listener listener = new Listener() {
-		public void handleEvent(Event e) {
-		}
-	};
-	widget.addListener(SWT.Paint, listener);
-	widget.removeListener(SWT.Paint, listener);
-}
-
-public void test_removeDisposeListenerLorg_eclipse_swt_events_DisposeListener() {
-	// tested in test_addDisposeListenerLorg_eclipse_swt_events_DisposeListener
-}
-
-public void test_setDataLjava_lang_Object(){
-	widget.setData(widget);
-	assertEquals(widget, widget.getData());
-
-	widget.setData(null);
-	assertNull(widget.getData());
-}
-
-public void test_setDataLjava_lang_StringLjava_lang_Object() {
-	widget.setData("the widget", widget);
-	assertEquals(widget, widget.getData("the widget"));
-
-	widget.setData("the widget", null);
-	assertNull(widget.getData("the widget"));
-}
-
-public void test_toString() {
-	assertNotNull(widget.toString());
-	assertEquals(false, widget.toString().equals(""));
-}
-
-public static java.util.Vector methodNames() {
-	java.util.Vector methodNames = new java.util.Vector();
-	methodNames.addElement("test_addListenerILorg_eclipse_swt_widgets_Listener");
-	methodNames.addElement("test_addDisposeListenerLorg_eclipse_swt_events_DisposeListener");
-	methodNames.addElement("test_dispose");
-	methodNames.addElement("test_getData");
-	methodNames.addElement("test_getDataLjava_lang_String");
-	methodNames.addElement("test_getDisplay");
-	methodNames.addElement("test_getStyle");
-	methodNames.addElement("test_isDisposed");
-	methodNames.addElement("test_notifyListenersILorg_eclipse_swt_widgets_Event");
-	methodNames.addElement("test_removeListenerILorg_eclipse_swt_widgets_Listener");
-	methodNames.addElement("test_removeDisposeListenerLorg_eclipse_swt_events_DisposeListener");
-	methodNames.addElement("test_setDataLjava_lang_Object");
-	methodNames.addElement("test_setDataLjava_lang_StringLjava_lang_Object");
-	methodNames.addElement("test_toString");
-	return methodNames;
-}
-protected void runTest() throws Throwable {
-	if (getName().equals("test_addListenerILorg_eclipse_swt_widgets_Listener")) test_addListenerILorg_eclipse_swt_widgets_Listener();
-	else if (getName().equals("test_addDisposeListenerLorg_eclipse_swt_events_DisposeListener")) test_addDisposeListenerLorg_eclipse_swt_events_DisposeListener();
-	else if (getName().equals("test_dispose")) test_dispose();
-	else if (getName().equals("test_getData")) test_getData();
-	else if (getName().equals("test_getDataLjava_lang_String")) test_getDataLjava_lang_String();
-	else if (getName().equals("test_getDisplay")) test_getDisplay();
-	else if (getName().equals("test_getStyle")) test_getStyle();
-	else if (getName().equals("test_isDisposed")) test_isDisposed();
-	else if (getName().equals("test_notifyListenersILorg_eclipse_swt_widgets_Event")) test_notifyListenersILorg_eclipse_swt_widgets_Event();
-	else if (getName().equals("test_removeListenerILorg_eclipse_swt_widgets_Listener")) test_removeListenerILorg_eclipse_swt_widgets_Listener();
-	else if (getName().equals("test_removeDisposeListenerLorg_eclipse_swt_events_DisposeListener")) test_removeDisposeListenerLorg_eclipse_swt_events_DisposeListener();
-	else if (getName().equals("test_setDataLjava_lang_Object")) test_setDataLjava_lang_Object();
-	else if (getName().equals("test_setDataLjava_lang_StringLjava_lang_Object")) test_setDataLjava_lang_StringLjava_lang_Object();
-	else if (getName().equals("test_toString")) test_toString();
-}
-}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/check.bmp b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/check.bmp
deleted file mode 100644
index 72f2360..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/check.bmp
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/dot.gif b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/dot.gif
deleted file mode 100644
index b9ad036..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/dot.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/folder.bmp b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/folder.bmp
deleted file mode 100644
index 574351f..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/folder.bmp
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/folderOpen.bmp b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/folderOpen.bmp
deleted file mode 100644
index 6ba1214..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/folderOpen.bmp
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/push.bmp b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/push.bmp
deleted file mode 100644
index d61c9f4..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/push.bmp
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/radio.bmp b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/radio.bmp
deleted file mode 100644
index 89e0cc3..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/radio.bmp
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/target.bmp b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/target.bmp
deleted file mode 100644
index ec7d509..0000000
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/target.bmp
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.swt.tests/about.html b/tests/org.eclipse.swt.tests/about.html
deleted file mode 100644
index 9db411a..0000000
--- a/tests/org.eclipse.swt.tests/about.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>20th June, 2002</p>	
-<h3>License</h3>
-<p>Eclipse.org makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Common Public License Version 1.0 (&quot;CPL&quot;).  A copy of the CPL is available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>.
-For purposes of the CPL, &quot;Program&quot; will mean the Content.</p>
-
-<h3>Contributions</h3>
-
-<p>If this Content is licensed to you under the terms and conditions of the CPL, any Contributions, as defined in the CPL, uploaded, submitted, or otherwise
-made available to Eclipse.org, members of Eclipse.org and/or the host of Eclipse.org web site, by you that relate to such
-Content are provided under the terms and conditions of the CPL and can be made available to others under the terms of the CPL.</p>
-
-<p>If this Content is licensed to you under license terms and conditions other than the CPL (&quot;Other License&quot;), any modifications, enhancements and/or
-other code and/or documentation (&quot;Modifications&quot;) uploaded, submitted, or otherwise made available to Eclipse.org, members of Eclipse.org and/or the
-host of Eclipse.org, by you that relate to such Content are provided under terms and conditions of the Other License and can be made available
-to others under the terms of the Other License.  In addition, with regard to Modifications for which you are the copyright holder, you are also
-providing the Modifications under the terms and conditions of the CPL and such Modifications can be made available to others under the terms of
-the CPL.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/tests/org.eclipse.swt.tests/build.properties b/tests/org.eclipse.swt.tests/build.properties
deleted file mode 100644
index 2374e5a..0000000
--- a/tests/org.eclipse.swt.tests/build.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-source.swttests.jar=JUnit Tests/
-
-bin.includes=*.jar,plugin.xml,test.xml,about.html
\ No newline at end of file
diff --git a/tests/org.eclipse.swt.tests/plugin.properties b/tests/org.eclipse.swt.tests/plugin.properties
deleted file mode 100644
index 4cc0f3c..0000000
--- a/tests/org.eclipse.swt.tests/plugin.properties
+++ /dev/null
@@ -1 +0,0 @@
-providerName = Eclipse.org
\ No newline at end of file
diff --git a/tests/org.eclipse.swt.tests/plugin.xml b/tests/org.eclipse.swt.tests/plugin.xml
deleted file mode 100644
index 80a1985..0000000
--- a/tests/org.eclipse.swt.tests/plugin.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- File written by PDE 1.0 -->
-<plugin
-   id="org.eclipse.swt.tests"
-   name="Tests"
-   provider-name="%providerName"
-   version="2.1.0">
-
-<requires>
-   <import plugin="org.junit"/>
-   <import plugin="org.eclipse.swt"/>
-</requires>
-
-<runtime>
-    <library name="swttests.jar">
-      <export name="*"/>
-    </library>
-  </runtime>
-</plugin>
diff --git a/tests/org.eclipse.swt.tests/test.xml b/tests/org.eclipse.swt.tests/test.xml
deleted file mode 100644
index 137b447..0000000
--- a/tests/org.eclipse.swt.tests/test.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0"?>
-
-<project name="testsuite" default="run" basedir=".">
-  <!-- This file is intended to be more tightly coupled with the -->
-  <!-- org.eclipse.ui plugin, for testing. -->
-
-  <!-- The property ${eclipse-home} should be passed into this script -->
-
-  <!-- sets the properties eclipse-home, and library-file -->
-  <property name="eclipse-home" value="${basedir}/../.."/>
-  <property name="plugin-name" value="org.eclipse.swt.tests"/>
-  <property name="library-file" value="${eclipse-home}/plugins/org.eclipse.test/library.xml"/>
-
-  <!-- This target holds all initialization code that needs to be done for -->
-  <!-- all tests that are to be run. Initialization for individual tests -->
-  <!-- should be done within the body of the suite target. -->
-  <target name="init">
-    <tstamp/>
-    <delete>
-      <fileset dir="${eclipse-home}" includes="org*.xml"/>
-    </delete>
-  </target>
-
-  <!-- This target defines the tests that need to be run. -->
-  <target name="suite">
-    <property name="data" value="${eclipse-home}/swt_sniff_folder"/>
-    <delete dir="${location1}" quiet="true"/>
-    <ant target="core-test" antfile="${library-file}" dir="${eclipse-home}">
-      <property name="data-dir" value="${data}"/>
-      <property name="plugin-name" value="${plugin-name}"/>
-      <property name="classname" value="org.eclipse.swt.tests.junit.AllTests"/>
-    </ant>
-  </target>
-
-  <!-- This target holds code to cleanup the testing environment after the tests -->
-  <!-- have been run. You can use this to delete temporary files that are created. -->
-  <target name="cleanup">
-  </target>
-
-  <!-- This target runs the test suite. Any actions that need to happen after all -->
-  <!-- the tests have been run should go here. -->
-  <target name="run" depends="init,suite,cleanup">
-    <ant target="collect" antfile="${library-file}" dir="${eclipse-home}">
-      <property name="includes" value="org*.xml"/>
-      <property name="output-file" value="${plugin-name}.xml"/>
-    </ant>
-  </target>
-
-</project>
