Revert "Bug 436505: Delete TableTreeViewer and related classes / methods"

This reverts commit acc23e29d806cf7d41343e2875138928000c8bff. (partially)
This reverts commit ff96babf6170beb3d09ce75be275d056c395f80c.
This reverts commit 34d2d0feefa3f2f2425263452713a3ce6fe30811.
This reverts commit 818b28b3479a6c0265217b4413cb8991caea2f39.
This reverts commit dd4a2a1bbd9a020f867acfc4c0828677b8a730a3.
This reverts commit 76e603249523a1a322c65f27b6cc3a03cece8c0a.

Change-Id: Ie26616e381b3f25a21cf8e283cca4a410c388699
diff --git a/bundles/org.eclipse.jface/.settings/.api_filters b/bundles/org.eclipse.jface/.settings/.api_filters
deleted file mode 100644
index bd75c42..0000000
--- a/bundles/org.eclipse.jface/.settings/.api_filters
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<component id="org.eclipse.jface" version="2">
-    <resource path="META-INF/MANIFEST.MF" type="org.eclipse.jface.viewers.TableTreeViewer">
-        <filter comment="Bug 475833: Delete TableTree and related items" id="305324134">
-            <message_arguments>
-                <message_argument value="org.eclipse.jface.viewers.TableTreeViewer"/>
-                <message_argument value="org.eclipse.jface_3.12.0"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="META-INF/MANIFEST.MF" type="org.eclipse.swt.custom.TableTree">
-        <filter comment="Bug 475833: Delete TableTree and related items" id="305422471">
-            <message_arguments>
-                <message_argument value="org.eclipse.swt.custom.TableTree"/>
-                <message_argument value="org.eclipse.jface_3.11.0"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="META-INF/MANIFEST.MF" type="org.eclipse.swt.custom.TableTreeEditor">
-        <filter comment="Bug 475833: Delete TableTree and related items" id="305422471">
-            <message_arguments>
-                <message_argument value="org.eclipse.swt.custom.TableTreeEditor"/>
-                <message_argument value="org.eclipse.jface_3.11.0"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="META-INF/MANIFEST.MF" type="org.eclipse.swt.custom.TableTreeItem">
-        <filter comment="Bug 475833: Delete TableTree and related items" id="305422471">
-            <message_arguments>
-                <message_argument value="org.eclipse.swt.custom.TableTreeItem"/>
-                <message_argument value="org.eclipse.jface_3.11.0"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="src/org/eclipse/jface/viewers/StructuredViewer.java" type="org.eclipse.jface.viewers.StructuredViewer$ColorAndFontCollector">
-        <filter comment="Bug 475833: Delete TableTree and related items" id="338792546">
-            <message_arguments>
-                <message_argument value="org.eclipse.jface.viewers.StructuredViewer.ColorAndFontCollector"/>
-                <message_argument value="applyFontsAndColors(TableTreeItem)"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="src/org/eclipse/jface/viewers/StructuredViewer.java" type="org.eclipse.jface.viewers.StructuredViewer$ColorAndFontCollectorWithProviders">
-        <filter comment="Bug 475833: Delete TableTree and related items" id="338792546">
-            <message_arguments>
-                <message_argument value="org.eclipse.jface.viewers.StructuredViewer.ColorAndFontCollectorWithProviders"/>
-                <message_argument value="applyFontsAndColors(TableTreeItem)"/>
-            </message_arguments>
-        </filter>
-    </resource>
-</component>
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/OpenStrategy.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/util/OpenStrategy.java
index d4caa29..6bac384 100644
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/OpenStrategy.java
+++ b/bundles/org.eclipse.jface/src/org/eclipse/jface/util/OpenStrategy.java
@@ -10,8 +10,9 @@
  *******************************************************************************/
 package org.eclipse.jface.util;
 
-import org.eclipse.core.runtime.ListenerList;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.TableTree;
+import org.eclipse.swt.custom.TableTreeItem;
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.graphics.Point;
@@ -25,6 +26,8 @@
 import org.eclipse.swt.widgets.TreeItem;
 import org.eclipse.swt.widgets.Widget;
 
+import org.eclipse.core.runtime.ListenerList;
+
 /**
  * Implementation of single-click and double-click strategies.
  * <p>
@@ -468,6 +471,13 @@
 						table.setSelection(new TableItem[] { item });
 					}
                     selEvent.item = item;
+                } else if (w instanceof TableTree) {
+                    TableTree table = (TableTree) w;
+                    TableTreeItem item = table.getItem(new Point(e.x, e.y));
+                    if (item != null) {
+						table.setSelection(new TableTreeItem[] { item });
+					}
+                    selEvent.item = item;
                 } else {
                     return;
                 }
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColorCellEditor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColorCellEditor.java
index 37a47b3..c6bcee6 100644
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColorCellEditor.java
+++ b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColorCellEditor.java
@@ -11,6 +11,7 @@
 package org.eclipse.jface.viewers;
 
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.TableTree;
 import org.eclipse.swt.graphics.Color;
 import org.eclipse.swt.graphics.FontMetrics;
 import org.eclipse.swt.graphics.GC;
@@ -149,6 +150,8 @@
 			extent = ((Table) w).getItemHeight() - 1;
 		} else if (w instanceof Tree) {
 			extent = ((Tree) w).getItemHeight() - 1;
+		} else if (w instanceof TableTree) {
+			extent = ((TableTree) w).getItemHeight() - 1;
 		}
 
         if (size > extent) {
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColumnViewer.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColumnViewer.java
index 40805d8..6a46885 100644
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColumnViewer.java
+++ b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColumnViewer.java
@@ -83,8 +83,8 @@
 	 * 		the control you want to hook on
 	 */
 	protected void hookEditingSupport(Control control) {
-		// Needed for backwards comp with AbstractTreeViewer
-		// which is not hooked this way others may already overwrite and provide
+		// Needed for backwards comp with AbstractTreeViewer and TableTreeViewer
+		// who are not hooked this way others may already overwrite and provide
 		// their
 		// own impl
 		if (viewerEditor != null) {
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/StructuredViewer.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/StructuredViewer.java
index 02927c5..2738e12 100644
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/StructuredViewer.java
+++ b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/StructuredViewer.java
@@ -26,6 +26,7 @@
 import org.eclipse.jface.util.Policy;
 import org.eclipse.jface.util.SafeRunnable;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.TableTreeItem;
 import org.eclipse.swt.dnd.DragSource;
 import org.eclipse.swt.dnd.DragSourceListener;
 import org.eclipse.swt.dnd.DropTarget;
@@ -269,6 +270,39 @@
 			clear();
 		}
 
+		@Override
+		public void applyFontsAndColors(TableTreeItem control) {
+
+			if(colorProvider == null){
+				if(usedDecorators){
+					//If there is no provider only apply set values
+					if(background != null) {
+						control.setBackground(background);
+					}
+
+					if(foreground != null) {
+						control.setForeground(foreground);
+					}
+				}
+			}
+			else{
+				//Always set the value if there is a provider
+				control.setBackground(background);
+				control.setForeground(foreground);
+			}
+
+			if(fontProvider == null){
+				if(usedDecorators && font != null) {
+					control.setFont(font);
+				}
+			} else {
+				control.setFont(font);
+			}
+
+			clear();
+		}
+
+
 	}
 
 	/**
@@ -370,6 +404,29 @@
 		}
 
 		/**
+		 * Apply the fonts and colors to the control if
+		 * required.
+		 * @param control
+		 */
+		public void applyFontsAndColors(TableTreeItem control) {
+			if(usedDecorators){
+				//If there is no provider only apply set values
+				if(background != null) {
+					control.setBackground(background);
+				}
+
+				if(foreground != null) {
+					control.setForeground(foreground);
+				}
+
+				if(font != null) {
+					control.setFont(font);
+				}
+			}
+			clear();
+		}
+
+		/**
 		 * Set the background color.
 		 * @param background
 		 */
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TableTreeViewer.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TableTreeViewer.java
new file mode 100644
index 0000000..239f469
--- /dev/null
+++ b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TableTreeViewer.java
@@ -0,0 +1,800 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2014 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Tom Schindl <tom.schindl@bestsolution.at> - bug 153993
+ *******************************************************************************/
+
+package org.eclipse.jface.viewers;
+
+import java.util.List;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.TableTree;
+import org.eclipse.swt.custom.TableTreeEditor;
+import org.eclipse.swt.custom.TableTreeItem;
+import org.eclipse.swt.events.FocusAdapter;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.events.TreeListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Item;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Widget;
+
+/**
+ * A concrete viewer based on a SWT <code>TableTree</code> control.
+ * <p>
+ * This class is not intended to be subclassed outside the viewer framework. It
+ * is designed to be instantiated with a pre-existing SWT table tree control and
+ * configured with a domain-specific content provider, label provider, element
+ * filter (optional), and element sorter (optional).
+ * </p>
+ * <p>
+ * Content providers for table tree viewers must implement the
+ * <code>ITreeContentProvider</code> interface.
+ * </p>
+ * <p>
+ * Label providers for table tree viewers must implement either the
+ * <code>ITableLabelProvider</code> or the <code>ILabelProvider</code>
+ * interface (see <code>TableTreeViewer.setLabelProvider</code> for more
+ * details).
+ * </p>
+ *
+ * @deprecated As of 3.1 use {@link TreeViewer} instead
+ * @noextend This class is not intended to be subclassed by clients.
+ */
+@Deprecated
+public class TableTreeViewer extends AbstractTreeViewer {
+	/**
+	 * Internal table viewer implementation.
+	 */
+	private TableTreeEditorImpl tableEditorImpl;
+
+	/**
+	 * This viewer's table tree control.
+	 */
+	private TableTree tableTree;
+
+	/**
+	 * This viewer's table tree editor.
+	 */
+	private TableTreeEditor tableTreeEditor;
+
+	/**
+	 * Copied from original TableEditorImpl and moved here since refactoring
+	 * completely wiped out the original implementation in 3.3
+	 *
+	 * @since 3.1
+	 */
+	class TableTreeEditorImpl {
+
+		private CellEditor cellEditor;
+
+		private CellEditor[] cellEditors;
+
+		private ICellModifier cellModifier;
+
+		private String[] columnProperties;
+
+		private Item tableItem;
+
+		private int columnNumber;
+
+		private ICellEditorListener cellEditorListener;
+
+		private FocusListener focusListener;
+
+		private MouseListener mouseListener;
+
+		private int doubleClickExpirationTime;
+
+		private ColumnViewer viewer;
+
+		private TableTreeEditorImpl(ColumnViewer viewer) {
+			this.viewer = viewer;
+			initCellEditorListener();
+		}
+
+		/**
+		 * Returns this <code>TableViewerImpl</code> viewer
+		 *
+		 * @return the viewer
+		 */
+		public ColumnViewer getViewer() {
+			return viewer;
+		}
+
+		private void activateCellEditor() {
+			if( cellEditors != null ) {
+				if( cellEditors[columnNumber] != null && cellModifier != null ) {
+					Object element = tableItem.getData();
+					String property = columnProperties[columnNumber];
+
+					if( cellModifier.canModify(element, property) ) {
+						cellEditor = cellEditors[columnNumber];
+
+						cellEditor.addListener(cellEditorListener);
+
+						Object value = cellModifier.getValue(element, property);
+						cellEditor.setValue(value);
+						// Tricky flow of control here:
+						// activate() can trigger callback to cellEditorListener
+						// which will clear cellEditor
+						// so must get control first, but must still call activate()
+						// even if there is no control.
+						final Control control = cellEditor.getControl();
+						cellEditor.activate();
+						if (control == null) {
+							return;
+						}
+						setLayoutData(cellEditor.getLayoutData());
+						setEditor(control, tableItem, columnNumber);
+						cellEditor.setFocus();
+						if (focusListener == null) {
+							focusListener = new FocusAdapter() {
+								@Override
+								public void focusLost(FocusEvent e) {
+									applyEditorValue();
+								}
+							};
+						}
+						control.addFocusListener(focusListener);
+						mouseListener = new MouseAdapter() {
+							@Override
+							public void mouseDown(MouseEvent e) {
+								// time wrap?
+								// check for expiration of doubleClickTime
+								if (e.time <= doubleClickExpirationTime) {
+									control.removeMouseListener(mouseListener);
+									cancelEditing();
+									handleDoubleClickEvent();
+								} else if (mouseListener != null) {
+									control.removeMouseListener(mouseListener);
+								}
+							}
+						};
+						control.addMouseListener(mouseListener);
+					}
+				}
+			}
+		}
+
+		/**
+		 * Activate a cell editor for the given mouse position.
+		 */
+		private void activateCellEditor(MouseEvent event) {
+			if (tableItem == null || tableItem.isDisposed()) {
+				// item no longer exists
+				return;
+			}
+			int columnToEdit;
+			int columns = getColumnCount();
+			if (columns == 0) {
+				// If no TableColumn, Table acts as if it has a single column
+				// which takes the whole width.
+				columnToEdit = 0;
+			} else {
+				columnToEdit = -1;
+				for (int i = 0; i < columns; i++) {
+					Rectangle bounds = getBounds(tableItem, i);
+					if (bounds.contains(event.x, event.y)) {
+						columnToEdit = i;
+						break;
+					}
+				}
+				if (columnToEdit == -1) {
+					return;
+				}
+			}
+
+			columnNumber = columnToEdit;
+			activateCellEditor();
+		}
+
+		/**
+		 * Deactivates the currently active cell editor.
+		 */
+		public void applyEditorValue() {
+			CellEditor c = this.cellEditor;
+			if (c != null) {
+				// null out cell editor before calling save
+				// in case save results in applyEditorValue being re-entered
+				// see 1GAHI8Z: ITPUI:ALL - How to code event notification when
+				// using cell editor ?
+				this.cellEditor = null;
+				Item t = this.tableItem;
+				// don't null out table item -- same item is still selected
+				if (t != null && !t.isDisposed()) {
+					saveEditorValue(c, t);
+				}
+				setEditor(null, null, 0);
+				c.removeListener(cellEditorListener);
+				Control control = c.getControl();
+				if (control != null) {
+					if (mouseListener != null) {
+						control.removeMouseListener(mouseListener);
+					}
+					if (focusListener != null) {
+						control.removeFocusListener(focusListener);
+					}
+				}
+				c.deactivate();
+			}
+		}
+
+		/**
+		 * Cancels the active cell editor, without saving the value back to the
+		 * domain model.
+		 */
+		public void cancelEditing() {
+			if (cellEditor != null) {
+				setEditor(null, null, 0);
+				cellEditor.removeListener(cellEditorListener);
+				CellEditor oldEditor = cellEditor;
+				cellEditor = null;
+				oldEditor.deactivate();
+			}
+		}
+
+		/**
+		 * Start editing the given element.
+		 *
+		 * @param element
+		 * @param column
+		 */
+		public void editElement(Object element, int column) {
+			if (cellEditor != null) {
+				applyEditorValue();
+			}
+
+			setSelection(new StructuredSelection(element), true);
+			Item[] selection = getSelection();
+			if (selection.length != 1) {
+				return;
+			}
+
+			tableItem = selection[0];
+
+			// Make sure selection is visible
+			showSelection();
+			columnNumber = column;
+			activateCellEditor();
+
+		}
+
+		/**
+		 * Return the array of CellEditors used in the viewer
+		 *
+		 * @return the cell editors
+		 */
+		public CellEditor[] getCellEditors() {
+			return cellEditors;
+		}
+
+		/**
+		 * Get the cell modifier
+		 *
+		 * @return the cell modifier
+		 */
+		public ICellModifier getCellModifier() {
+			return cellModifier;
+		}
+
+		/**
+		 * Return the properties for the column
+		 *
+		 * @return the array of column properties
+		 */
+		public Object[] getColumnProperties() {
+			return columnProperties;
+		}
+
+		/**
+		 * Handles the mouse down event; activates the cell editor.
+		 *
+		 * @param event
+		 *            the mouse event that should be handled
+		 */
+		public void handleMouseDown(MouseEvent event) {
+			if (event.button != 1) {
+				return;
+			}
+
+			if (cellEditor != null) {
+				applyEditorValue();
+			}
+
+			// activate the cell editor immediately. If a second mouseDown
+			// is received prior to the expiration of the doubleClick time then
+			// the cell editor will be deactivated and a doubleClick event will
+			// be processed.
+			//
+			doubleClickExpirationTime = event.time
+					+ Display.getCurrent().getDoubleClickTime();
+
+			Item[] items = getSelection();
+			// Do not edit if more than one row is selected.
+			if (items.length != 1) {
+				tableItem = null;
+				return;
+			}
+			tableItem = items[0];
+
+			activateCellEditor(event);
+		}
+
+		private void initCellEditorListener() {
+			cellEditorListener = new ICellEditorListener() {
+				@Override
+				public void editorValueChanged(boolean oldValidState,
+						boolean newValidState) {
+					// Ignore.
+				}
+
+				@Override
+				public void cancelEditor() {
+					TableTreeEditorImpl.this.cancelEditing();
+				}
+
+				@Override
+				public void applyEditorValue() {
+					TableTreeEditorImpl.this.applyEditorValue();
+				}
+			};
+		}
+
+		/**
+		 * Return whether there is an active cell editor.
+		 *
+		 * @return <code>true</code> if there is an active cell editor;
+		 *         otherwise <code>false</code> is returned.
+		 */
+		public boolean isCellEditorActive() {
+			return cellEditor != null;
+		}
+
+		/**
+		 * Saves the value of the currently active cell editor, by delegating to
+		 * the cell modifier.
+		 */
+		private void saveEditorValue(CellEditor cellEditor, Item tableItem) {
+			if( cellModifier != null ) {
+				if( ! cellEditor.isValueValid() ) {
+					// Do what????
+				}
+			}
+			String property = null;
+
+			if( columnProperties != null && columnNumber < columnProperties.length ) {
+				property = columnProperties[columnNumber];
+			}
+			cellModifier.modify(tableItem, property, cellEditor.getValue());
+		}
+
+		/**
+		 * Set the cell editors
+		 *
+		 * @param editors
+		 */
+		public void setCellEditors(CellEditor[] editors) {
+			this.cellEditors = editors;
+		}
+
+		/**
+		 * Set the cell modifier
+		 *
+		 * @param modifier
+		 */
+		public void setCellModifier(ICellModifier modifier) {
+			this.cellModifier = modifier;
+		}
+
+		/**
+		 * Set the column properties
+		 *
+		 * @param columnProperties
+		 */
+		public void setColumnProperties(String[] columnProperties) {
+			this.columnProperties = columnProperties;
+		}
+
+		Rectangle getBounds(Item item, int columnNumber) {
+			return ((TableTreeItem) item).getBounds(columnNumber);
+		}
+
+		int getColumnCount() {
+			// getColumnCount() should be a API in TableTree.
+			return getTableTree().getTable().getColumnCount();
+		}
+
+		Item[] getSelection() {
+			return getTableTree().getSelection();
+		}
+
+		void setEditor(Control w, Item item, int columnNumber) {
+			tableTreeEditor.setEditor(w, (TableTreeItem) item, columnNumber);
+		}
+
+		void setSelection(StructuredSelection selection, boolean b) {
+			TableTreeViewer.this.setSelection(selection, b);
+		}
+
+		void showSelection() {
+			getTableTree().showSelection();
+		}
+
+		void setLayoutData(CellEditor.LayoutData layoutData) {
+			tableTreeEditor.horizontalAlignment = layoutData.horizontalAlignment;
+			tableTreeEditor.grabHorizontal = layoutData.grabHorizontal;
+			tableTreeEditor.minimumWidth = layoutData.minimumWidth;
+		}
+
+		void handleDoubleClickEvent() {
+			Viewer viewer = getViewer();
+			fireDoubleClick(new DoubleClickEvent(viewer, viewer.getSelection()));
+			fireOpen(new OpenEvent(viewer, viewer.getSelection()));
+		}
+	}
+
+	/**
+	 * Creates a table tree viewer on the given table tree control. The viewer
+	 * has no input, no content provider, a default label provider, no sorter,
+	 * and no filters.
+	 *
+	 * @param tree
+	 *            the table tree control
+	 */
+	@Deprecated
+	public TableTreeViewer(TableTree tree) {
+		super();
+		tableTree = tree;
+		hookControl(tree);
+		tableTreeEditor = new TableTreeEditor(tableTree);
+		tableEditorImpl = new TableTreeEditorImpl(this);
+	}
+
+	/**
+	 * Creates a table tree viewer on a newly-created table tree control under
+	 * the given parent. The table tree control is created using the SWT style
+	 * bits <code>MULTI, H_SCROLL, V_SCROLL, and BORDER</code>. The viewer
+	 * has no input, no content provider, a default label provider, no sorter,
+	 * and no filters.
+	 *
+	 * @param parent
+	 *            the parent control
+	 */
+	@Deprecated
+	public TableTreeViewer(Composite parent) {
+		this(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
+	}
+
+	/**
+	 * Creates a table tree viewer on a newly-created table tree control under
+	 * the given parent. The table tree control is created using the given SWT
+	 * style bits. The viewer has no input, no content provider, a default label
+	 * provider, no sorter, and no filters.
+	 *
+	 * @param parent
+	 *            the parent control
+	 * @param style
+	 *            the SWT style bits
+	 */
+	@Deprecated
+	public TableTreeViewer(Composite parent, int style) {
+		this(new TableTree(parent, style));
+	}
+
+	@Override
+	protected void addTreeListener(Control c, TreeListener listener) {
+		((TableTree) c).addTreeListener(listener);
+	}
+
+	@Override
+	@Deprecated
+	public void cancelEditing() {
+		tableEditorImpl.cancelEditing();
+	}
+
+	@Override
+	protected void doUpdateItem(Item item, Object element) {
+		// update icon and label
+		// Similar code in TableTreeViewer.doUpdateItem()
+		IBaseLabelProvider prov = getLabelProvider();
+		ITableLabelProvider tprov = null;
+
+		if (prov instanceof ITableLabelProvider) {
+			tprov = (ITableLabelProvider) prov;
+		}
+
+		int columnCount = tableTree.getTable().getColumnCount();
+		TableTreeItem ti = (TableTreeItem) item;
+		// Also enter loop if no columns added. See 1G9WWGZ: JFUIF:WINNT -
+		// TableViewer with 0 columns does not work
+		for (int column = 0; column < columnCount || column == 0; column++) {
+			String text = "";//$NON-NLS-1$
+			Image image = null;
+			if (tprov != null) {
+				text = tprov.getColumnText(element, column);
+				image = tprov.getColumnImage(element, column);
+			} else {
+				if (column == 0) {
+					ViewerLabel updateLabel = new ViewerLabel(item.getText(),
+							item.getImage());
+					buildLabel(updateLabel, element);
+
+					// As it is possible for user code to run the event
+					// loop check here.
+					if (item.isDisposed()) {
+						unmapElement(element, item);
+						return;
+					}
+
+					text = updateLabel.getText();
+					image = updateLabel.getImage();
+				}
+			}
+
+			// Avoid setting text to null
+			if (text == null) {
+				text = ""; //$NON-NLS-1$
+			}
+
+			ti.setText(column, text);
+			// Apparently a problem to setImage to null if already null
+			if (ti.getImage(column) != image) {
+				ti.setImage(column, image);
+			}
+
+			getColorAndFontCollector().setFontsAndColors(element);
+			getColorAndFontCollector().applyFontsAndColors(ti);
+		}
+
+	}
+
+	@Override
+	@Deprecated
+	public void editElement(Object element, int column) {
+		tableEditorImpl.editElement(element, column);
+	}
+
+	@Override
+	@Deprecated
+	public CellEditor[] getCellEditors() {
+		return tableEditorImpl.getCellEditors();
+	}
+
+	@Override
+	@Deprecated
+	public ICellModifier getCellModifier() {
+		return tableEditorImpl.getCellModifier();
+	}
+
+	@Override
+	protected Item[] getChildren(Widget o) {
+		if (o instanceof TableTreeItem) {
+			return ((TableTreeItem) o).getItems();
+		}
+		if (o instanceof TableTree) {
+			return ((TableTree) o).getItems();
+		}
+		return null;
+	}
+
+	@Override
+	protected Item getChild(Widget widget, int index) {
+		if (widget instanceof TableTreeItem) {
+			return ((TableTreeItem) widget).getItem(index);
+		}
+		if (widget instanceof TableTree) {
+			return ((TableTree) widget).getItem(index);
+		}
+		return null;
+	}
+
+	@Override
+	@Deprecated
+	public Object[] getColumnProperties() {
+		return tableEditorImpl.getColumnProperties();
+	}
+
+	@Override
+	@Deprecated
+	public Control getControl() {
+		return tableTree;
+	}
+
+	/**
+	 * Returns the element with the given index from this viewer. Returns
+	 * <code>null</code> if the index is out of range.
+	 * <p>
+	 * This method is internal to the framework.
+	 * </p>
+	 *
+	 * @param index
+	 *            the zero-based index
+	 * @return the element at the given index, or <code>null</code> if the
+	 *         index is out of range
+	 */
+	@Deprecated
+	public Object getElementAt(int index) {
+		// XXX: Workaround for 1GBCSB1: SWT:WIN2000 - TableTree should have
+		// getItem(int index)
+		TableTreeItem i = tableTree.getItems()[index];
+		if (i != null) {
+			return i.getData();
+		}
+		return null;
+	}
+
+	@Override
+	protected boolean getExpanded(Item item) {
+		return ((TableTreeItem) item).getExpanded();
+	}
+
+	@Override
+	protected Item getItemAt(Point p) {
+		return getTableTree().getTable().getItem(p);
+	}
+
+	@Override
+	protected int getItemCount(Control widget) {
+		return ((TableTree) widget).getItemCount();
+	}
+
+	@Override
+	protected int getItemCount(Item item) {
+		return ((TableTreeItem) item).getItemCount();
+	}
+
+	@Override
+	protected org.eclipse.swt.widgets.Item[] getItems(
+			org.eclipse.swt.widgets.Item item) {
+		return ((TableTreeItem) item).getItems();
+	}
+
+	/**
+	 * The table tree viewer implementation of this <code>Viewer</code>
+	 * framework method returns the label provider, which in the case of table
+	 * tree viewers will be an instance of either
+	 * <code>ITableLabelProvider</code> or <code>ILabelProvider</code>. If
+	 * it is an <code>ITableLabelProvider</code>, then it provides a separate
+	 * label text and image for each column. If it is an
+	 * <code>ILabelProvider</code>, then it provides only the label text and
+	 * image for the first column, and any remaining columns are blank.
+	 */
+	@Override
+	@Deprecated
+	public IBaseLabelProvider getLabelProvider() {
+		return super.getLabelProvider();
+	}
+
+	@Override
+	protected Item getParentItem(Item item) {
+		return ((TableTreeItem) item).getParentItem();
+	}
+
+	@Override
+	protected Item[] getSelection(Control widget) {
+		return ((TableTree) widget).getSelection();
+	}
+
+	/**
+	 * Returns this table tree viewer's table tree control.
+	 *
+	 * @return the table tree control
+	 */
+	@Deprecated
+	public TableTree getTableTree() {
+		return tableTree;
+	}
+
+	@Override
+	protected void hookControl(Control control) {
+		super.hookControl(control);
+		tableTree.getTable().addMouseListener(new MouseAdapter() {
+			@Override
+			public void mouseDown(MouseEvent e) {
+				/*
+				 * If user clicked on the [+] or [-], do not activate
+				 * CellEditor.
+				 */
+				// XXX: This code should not be here. SWT should either have
+				// support to see
+				// if the user clicked on the [+]/[-] or manage the table editor
+				// activation
+				org.eclipse.swt.widgets.TableItem[] items = tableTree
+						.getTable().getItems();
+				for (TableItem item : items) {
+					Rectangle rect = item.getImageBounds(0);
+					if (rect.contains(e.x, e.y)) {
+						return;
+					}
+				}
+
+				tableEditorImpl.handleMouseDown(e);
+			}
+		});
+	}
+
+	@Override
+	@Deprecated
+	public boolean isCellEditorActive() {
+		return tableEditorImpl.isCellEditorActive();
+	}
+
+	@Override
+	protected Item newItem(Widget parent, int flags, int ix) {
+		TableTreeItem item;
+		if (ix >= 0) {
+			if (parent instanceof TableTreeItem) {
+				item = new TableTreeItem((TableTreeItem) parent, flags, ix);
+			} else {
+				item = new TableTreeItem((TableTree) parent, flags, ix);
+			}
+		} else {
+			if (parent instanceof TableTreeItem) {
+				item = new TableTreeItem((TableTreeItem) parent, flags);
+			} else {
+				item = new TableTreeItem((TableTree) parent, flags);
+			}
+		}
+		return item;
+	}
+
+	@Override
+	protected void removeAll(Control widget) {
+		((TableTree) widget).removeAll();
+	}
+
+	@Override
+	@Deprecated
+	public void setCellEditors(CellEditor[] editors) {
+		tableEditorImpl.setCellEditors(editors);
+	}
+
+	@Override
+	@Deprecated
+	public void setCellModifier(ICellModifier modifier) {
+		tableEditorImpl.setCellModifier(modifier);
+	}
+
+	@Override
+	@Deprecated
+	public void setColumnProperties(String[] columnProperties) {
+		tableEditorImpl.setColumnProperties(columnProperties);
+	}
+
+	@Override
+	@Deprecated
+	protected void setExpanded(Item node, boolean expand) {
+		((TableTreeItem) node).setExpanded(expand);
+	}
+
+	@Override
+	@Deprecated
+	protected void setSelection(List items) {
+		TableTreeItem[] newItems = new TableTreeItem[items.size()];
+		items.toArray(newItems);
+		getTableTree().setSelection(newItems);
+	}
+
+	@Override
+	@Deprecated
+	protected void showItem(Item item) {
+		getTableTree().showItem((TableTreeItem) item);
+	}
+}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/package.html b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/package.html
index 1e5c6d5..b2608b4 100644
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/package.html
+++ b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/package.html
@@ -34,7 +34,7 @@
 <tt>AbstractTreeViewer</tt>) together with concrete viewer classes (<tt>ListViewer</tt>,
 <tt>TreeViewer</tt>,
 <tt>TableViewer</tt>,
-<tt>CheckboxTreeViewer</tt>,
+<tt>TableTreeViewer</tt>, <tt>CheckboxTreeViewer</tt>,
 and <tt>CheckboxTableViewer</tt>),
 and various lesser support classes. The concrete structured viewer classes
 are ready-to-use and have built-in support for drag-and-drop, filtering
diff --git a/bundles/org.eclipse.ui/.settings/.api_filters b/bundles/org.eclipse.ui/.settings/.api_filters
deleted file mode 100644
index 5feb39f..0000000
--- a/bundles/org.eclipse.ui/.settings/.api_filters
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<component id="org.eclipse.ui" version="2">
-    <resource path="META-INF/MANIFEST.MF" type="org.eclipse.jface.viewers.TableTreeViewer">
-        <filter comment="Bug 436505: Delete TableTreeViewer and related classes / methods" id="305422471">
-            <message_arguments>
-                <message_argument value="org.eclipse.jface.viewers.TableTreeViewer"/>
-                <message_argument value="org.eclipse.ui_3.107.0"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="META-INF/MANIFEST.MF" type="org.eclipse.swt.custom.TableTree">
-        <filter comment="Bug 475833: Delete TableTree and related items" id="305422471">
-            <message_arguments>
-                <message_argument value="org.eclipse.swt.custom.TableTree"/>
-                <message_argument value="org.eclipse.ui_3.107.0"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="META-INF/MANIFEST.MF" type="org.eclipse.swt.custom.TableTreeEditor">
-        <filter comment="Bug 475833: Delete TableTree and related items" id="305422471">
-            <message_arguments>
-                <message_argument value="org.eclipse.swt.custom.TableTreeEditor"/>
-                <message_argument value="org.eclipse.ui_3.107.0"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="META-INF/MANIFEST.MF" type="org.eclipse.swt.custom.TableTreeItem">
-        <filter comment="Bug 475833: Delete TableTree and related items" id="305422471">
-            <message_arguments>
-                <message_argument value="org.eclipse.swt.custom.TableTreeItem"/>
-                <message_argument value="org.eclipse.ui_3.107.0"/>
-            </message_arguments>
-        </filter>
-    </resource>
-</component>
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/AllTests.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/AllTests.java
index 5ed5c87..72043a7 100644
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/AllTests.java
+++ b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/AllTests.java
@@ -37,6 +37,7 @@
 		addTestSuite(TreeViewerColumnTest.class);
 		addTestSuite(VirtualTableViewerTest.class);
 		addTestSuite(VirtualLazyTableViewerTest.class);
+		addTestSuite(TableTreeViewerTest.class);
 		addTestSuite(TableColorProviderTest.class);
 		addTestSuite(TableFontProviderTest.class);
 		addTestSuite(ListViewerTest.class);
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/StructuredViewerTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/StructuredViewerTest.java
index 5575466..1ad9052 100644
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/StructuredViewerTest.java
+++ b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/StructuredViewerTest.java
@@ -19,6 +19,7 @@
 import org.eclipse.jface.viewers.LabelProvider;
 import org.eclipse.jface.viewers.LabelProviderChangedEvent;
 import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TableTreeViewer;
 import org.eclipse.jface.viewers.TableViewer;
 import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.jface.viewers.ViewerFilter;
@@ -377,6 +378,9 @@
     }
 
     public void testLabelProvider() {
+        // BUG: non-polymorphic behaviour
+        // if (fViewer instanceof TableViewer || fViewer instanceof TableTreeViewer)
+        // 	return;
         fViewer.setLabelProvider(getTestLabelProvider());
         TestElement first = fRootElement.getFirstChild();
         String newLabel = providedString(first);
@@ -391,6 +395,9 @@
     }
 
     public void testLabelProviderStateChange() {
+        // BUG: non-polymorphic behaviour
+        // if (fViewer instanceof TableViewer || fViewer instanceof TableTreeViewer)
+        // 	return;
         TestLabelProvider provider = new TestLabelProvider();
         fViewer.setLabelProvider(provider);
         provider.setSuffix("added suffix");
@@ -420,7 +427,8 @@
     }
 
     public void testRenameWithLabelProvider() {
-		if (fViewer instanceof TableViewer) {
+        if (fViewer instanceof TableViewer
+                || fViewer instanceof TableTreeViewer) {
 			return;
 		}
         fViewer.setLabelProvider(new TestLabelProvider());
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TableTreeViewerTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TableTreeViewerTest.java
new file mode 100644
index 0000000..4e2b5a4
--- /dev/null
+++ b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TableTreeViewerTest.java
@@ -0,0 +1,144 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jface.tests.viewers;
+
+import org.eclipse.jface.viewers.ColumnLayoutData;
+import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.TableLayout;
+import org.eclipse.jface.viewers.TableTreeViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.TableTree;
+import org.eclipse.swt.custom.TableTreeItem;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.TableColumn;
+
+public class TableTreeViewerTest extends AbstractTreeViewerTest {
+
+    public static class TableTreeTestLabelProvider extends TestLabelProvider
+            implements ITableLabelProvider {
+        public boolean fExtended = false;
+
+        @Override
+		public String getText(Object element) {
+            if (fExtended) {
+				return providedString((String) element);
+			}
+
+            return element.toString();
+        }
+
+        @Override
+		public String getColumnText(Object element, int index) {
+            if (fExtended) {
+				return providedString((TestElement) element);
+			}
+            return element.toString();
+        }
+
+        @Override
+		public Image getColumnImage(Object element, int columnIndex) {
+            return null;
+        }
+    }
+
+    public TableTreeViewerTest(String name) {
+        super(name);
+    }
+
+    @Override
+	protected StructuredViewer createViewer(Composite parent) {
+        TableTreeViewer viewer = new TableTreeViewer(parent);
+        viewer.setContentProvider(new TestModelContentProvider());
+        viewer.setLabelProvider(new TableTreeTestLabelProvider());
+        viewer.getTableTree().getTable().setLinesVisible(true);
+
+        TableLayout layout = new TableLayout();
+        viewer.getTableTree().getTable().setLayout(layout);
+        viewer.getTableTree().getTable().setHeaderVisible(true);
+        String headers[] = { "column 1 header", "column 2 header" };
+
+        ColumnLayoutData layouts[] = { new ColumnWeightData(100),
+                new ColumnWeightData(100) };
+
+        final TableColumn columns[] = new TableColumn[headers.length];
+
+        for (int i = 0; i < headers.length; i++) {
+            layout.addColumnData(layouts[i]);
+            TableColumn tc = new TableColumn(viewer.getTableTree().getTable(),
+                    SWT.NONE, i);
+            tc.setResizable(layouts[i].resizable);
+            tc.setText(headers[i]);
+            columns[i] = tc;
+        }
+        fTreeViewer = viewer;
+        return viewer;
+    }
+
+    @Override
+	protected int getItemCount() {
+        TestElement first = fRootElement.getFirstChild();
+        TableTreeItem ti = (TableTreeItem) fViewer.testFindItem(first);
+        TableTree table = ti.getParent();
+        return table.getItemCount();
+    }
+
+    @Override
+	protected int getItemCount(TestElement element) {
+        TableTreeItem ti = (TableTreeItem) fViewer.testFindItem(element);
+        return ti.getItemCount();
+    }
+
+    @Override
+	protected String getItemText(int at) {
+        TableTree table = (TableTree) fViewer.getControl();
+        return table.getItems()[at].getText();
+    }
+
+    public static void main(String args[]) {
+        junit.textui.TestRunner.run(TableTreeViewerTest.class);
+    }
+
+    @Override
+	public void testLabelProvider() {
+        TableTreeViewer viewer = (TableTreeViewer) fViewer;
+        TableTreeTestLabelProvider provider = (TableTreeTestLabelProvider) viewer
+                .getLabelProvider();
+        provider.fExtended = true;
+        // BUG 1FZ5SDC: JFUIF:WINNT - TableViewerColumn should listen for LabelProvider changes
+        fViewer.refresh();
+        TestElement first = fRootElement.getFirstChild();
+        String newLabel = providedString(first);
+        assertEquals("rendered label", newLabel, getItemText(0));
+        provider.fExtended = false;
+        // BUG 1FZ5SDC: JFUIF:WINNT - TableViewerColumn should listen for LabelProvider changes
+        fViewer.refresh();
+    }
+
+    @Override
+	public void testLabelProviderStateChange() {
+        TableTreeViewer viewer = (TableTreeViewer) fViewer;
+        TableTreeTestLabelProvider provider = (TableTreeTestLabelProvider) viewer
+                .getLabelProvider();
+        provider.fExtended = true;
+        provider.setSuffix("added suffix");
+        // BUG 1FZ5SDC: JFUIF:WINNT - TableViewerColumn should listen for LabelProvider changes
+        fViewer.refresh();
+        TestElement first = fRootElement.getFirstChild();
+        String newLabel = providedString(first);
+        assertEquals("rendered label", newLabel, getItemText(0));
+        provider.fExtended = false;
+        // BUG 1FZ5SDC: JFUIF:WINNT - TableViewerColumn should listen for LabelProvider changes
+        fViewer.refresh();
+    }
+}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/TestTableTree.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/TestTableTree.java
new file mode 100644
index 0000000..0a58972
--- /dev/null
+++ b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/TestTableTree.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jface.tests.viewers.interactive;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.tests.viewers.TestElement;
+import org.eclipse.jface.tests.viewers.TestModelContentProvider;
+import org.eclipse.jface.viewers.ColumnLayoutData;
+import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.TableLayout;
+import org.eclipse.jface.viewers.TableTreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.TableColumn;
+
+public class TestTableTree extends TestBrowser {
+
+    TableTreeViewer fViewer;
+
+    Action fExpandAllAction;
+
+    public TestTableTree() {
+        super();
+        fExpandAllAction = new ExpandAllAction("Expand All", this);
+    }
+
+    @Override
+	public Viewer createViewer(Composite parent) {
+        TableTreeViewer viewer = new TableTreeViewer(parent);
+        viewer.setContentProvider(new TestModelContentProvider());
+        viewer.setLabelProvider(new TestTableTreeLabelProvider());
+        viewer.getTableTree().getTable().setLinesVisible(true);
+
+        TableLayout layout = new TableLayout();
+        viewer.getTableTree().getTable().setLayout(layout);
+        viewer.getTableTree().getTable().setHeaderVisible(true);
+        String headers[] = { "First Column", "Second Column" };
+
+        ColumnLayoutData layouts[] = { new ColumnWeightData(100),
+                new ColumnWeightData(100) };
+
+        final TableColumn columns[] = new TableColumn[headers.length];
+
+        for (int i = 0; i < headers.length; i++) {
+            layout.addColumnData(layouts[i]);
+            TableColumn tc = new TableColumn(viewer.getTableTree().getTable(),
+                    SWT.NONE, i);
+            tc.setResizable(layouts[i].resizable);
+            tc.setText(headers[i]);
+            columns[i] = tc;
+        }
+        if (fViewer == null) {
+			fViewer = viewer;
+		}
+
+        return viewer;
+    }
+
+    public static void main(String[] args) {
+        TestBrowser browser = new TestTableTree();
+        if (args.length > 0 && args[0].equals("-twopanes")) {
+			browser.show2Panes();
+		}
+        browser.setBlockOnOpen(true);
+        browser.open(TestElement.createModel(3, 10));
+    }
+
+    /**
+     * Adds the expand all action to the tests menu.
+     */
+    @Override
+	protected void viewerFillMenuBar(MenuManager mgr) {
+        MenuManager testMenu = (MenuManager) (mgr.findMenuUsingPath("tests"));
+        testMenu.add(new Separator());
+        testMenu.add(fExpandAllAction);
+    }
+}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorTableTreeTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorTableTreeTest.java
new file mode 100644
index 0000000..75e2ef0
--- /dev/null
+++ b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorTableTreeTest.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.tests.decorators;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.swt.custom.TableTreeItem;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+
+/**
+ * The DecoratorTableTreeTest is the test for table
+ * trees.
+ */
+public class DecoratorTableTreeTest extends DecoratorViewerTest {
+
+	/**
+	 * Create a new instance of the receiver.
+	 * @param testName
+	 */
+	public DecoratorTableTreeTest(String testName) {
+		super(testName);
+	}
+	@Override
+	protected void backgroundCheck(IViewPart view) {
+		TableTreeItem first = ((DecoratorTableTreeView) view).viewer.getTableTree().getItems()[0];
+		Assert.isTrue(first.getBackground().getRGB()
+				.equals(BackgroundColorDecorator.color.getRGB()));
+
+	}
+
+	@Override
+	protected void foregroundCheck(IViewPart view) {
+		TableTreeItem first = ((DecoratorTableTreeView) view).viewer.getTableTree().getItems()[0];
+		Assert.isTrue(first.getForeground().getRGB()
+				.equals(ForegroundColorDecorator.color.getRGB()));
+
+	}
+
+	@Override
+	protected IViewPart openView(IWorkbenchPage page) throws PartInitException {
+		return page.showView("org.eclipse.ui.tests.decorator.TableTreeTest");
+	}
+
+	@Override
+	protected void fontCheck(IViewPart view) {
+		TableTreeItem first = ((DecoratorTableTreeView) view).viewer.getTableTree().getItems()[0];
+		Assert.isTrue(first.getFont().getFontData()[0]
+				.equals(FontDecorator.font.getFontData()[0]));
+
+	}
+
+}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorTableTreeView.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorTableTreeView.java
new file mode 100644
index 0000000..e7b3003
--- /dev/null
+++ b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorTableTreeView.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.tests.decorators;
+
+import org.eclipse.jface.viewers.TableTreeViewer;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * The DecoratorTableTreeView is the view that tests decorators
+ * for table trees.
+ */
+public class DecoratorTableTreeView extends DecoratorTestPart {
+
+	TableTreeViewer viewer;
+
+	/**
+	 * Create a new instance of the receiver.
+	 */
+	public DecoratorTableTreeView() {
+		super();
+	}
+
+	@Override
+	public void createPartControl(Composite parent) {
+		viewer = new TableTreeViewer(parent);
+
+		viewer.setLabelProvider(getLabelProvider());
+
+		viewer.setContentProvider(new TestTreeContentProvider());
+		viewer.setInput(this);
+
+		GridData data = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL
+				| GridData.FILL_BOTH);
+
+		viewer.getControl().setLayoutData(data);
+
+	}
+
+	@Override
+	public void setFocus() {
+		// XXX Auto-generated method stub
+
+	}
+
+}
diff --git a/tests/org.eclipse.ui.tests/plugin.xml b/tests/org.eclipse.ui.tests/plugin.xml
index 727562e..7378dbf 100644
--- a/tests/org.eclipse.ui.tests/plugin.xml
+++ b/tests/org.eclipse.ui.tests/plugin.xml
@@ -401,6 +401,11 @@
             name="Table View Test"
             id="org.eclipse.ui.tests.decorator.TableViewTest"/>
       <view
+            class="org.eclipse.ui.tests.decorators.DecoratorTableTreeView"
+            category="org.eclipse.ui.tests.decoratorCategory"
+            name="Table Tree Test"
+            id="org.eclipse.ui.tests.decorator.TableTreeTest"/>
+      <view
             class="org.eclipse.jface.tests.viewers.interactive.VirtualTableView"
             category="org.eclipse.ui.tests.tableViewerViews"
             name="Virtual Table View test"