fix incorrect copyright headers
diff --git a/org.eclipse.mylyn.context.tasks.ui/src/org/eclipse/mylyn/internal/context/tasks/ui/messages.properties b/org.eclipse.mylyn.context.tasks.ui/src/org/eclipse/mylyn/internal/context/tasks/ui/messages.properties
index f97ba16..058240c 100644
--- a/org.eclipse.mylyn.context.tasks.ui/src/org/eclipse/mylyn/internal/context/tasks/ui/messages.properties
+++ b/org.eclipse.mylyn.context.tasks.ui/src/org/eclipse/mylyn/internal/context/tasks/ui/messages.properties
@@ -1,12 +1,15 @@
-###############################################################################
-# Copyright (c) 2015 Tasktop Technologies.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Tasktop EULA
-# which accompanies this distribution, and is available at
-# http://tasktop.com/legal
-###############################################################################
-ContextMementoMigrator_0=Migrating context information
-TaskActivityMonitor_Deactivate_and_Save_Some=Deactivate and Save Some...
-TaskActivityMonitor_Deactivate_Task_and_Save_All=Deactivate Task and Save All
-TaskActivityMonitor_Task_Deactivation=Task Deactivation
-TaskActivityMonitor_Task_Deactivation_Message=The following editors have unsaved changes. Do you still want to deactivate the task?\n\n{0}
+###############################################################################

+# Copyright (c) 2015 Tasktop Technologies 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:

+#      Tasktop Technologies - initial API and implementation

+###############################################################################

+ContextMementoMigrator_0=Migrating context information

+TaskActivityMonitor_Deactivate_and_Save_Some=Deactivate and Save Some...

+TaskActivityMonitor_Deactivate_Task_and_Save_All=Deactivate Task and Save All

+TaskActivityMonitor_Task_Deactivation=Task Deactivation

+TaskActivityMonitor_Task_Deactivation_Message=The following editors have unsaved changes. Do you still want to deactivate the task?\n\n{0}

diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/FilteredChildrenDecorationDrawer.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/FilteredChildrenDecorationDrawer.java
index f271e0f..99a6438 100644
--- a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/FilteredChildrenDecorationDrawer.java
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/FilteredChildrenDecorationDrawer.java
@@ -1,362 +1,365 @@
-/*******************************************************************************
- * Copyright (c) 2015 Tasktop Technologies.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Tasktop EULA
- * which accompanies this distribution, and is available at
- * http://tasktop.com/legal
- *******************************************************************************/
-package org.eclipse.mylyn.internal.context.ui;
-
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.mylyn.commons.ui.CommonImages;
-import org.eclipse.mylyn.commons.ui.PlatformUiUtil;
-import org.eclipse.mylyn.commons.workbench.WorkbenchUtil;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.events.MouseMoveListener;
-import org.eclipse.swt.events.MouseTrackListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.ToolTip;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * @author Mik Kersten
- */
-
-public class FilteredChildrenDecorationDrawer implements Listener {
-
-	private final class MoveListener implements MouseMoveListener, MouseListener, MouseTrackListener {
-
-		private TreeItem lastItem;
-
-		private TreeItem currentItem;
-
-		private long lastMoveTime;
-
-		private long startMoveTime;
-
-		private final TreeViewer viewer;
-
-		private final BrowseFilteredListener browseFilteredListener;
-
-		private ToolTip toolTip;
-
-		public MoveListener(TreeViewer viewer, BrowseFilteredListener browseFilteredListener) {
-			this.viewer = viewer;
-			this.browseFilteredListener = browseFilteredListener;
-		}
-
-		public void mouseEnter(MouseEvent e) {
-			mouseMove(e);
-		}
-
-		public void mouseExit(MouseEvent e) {
-			if (lastItem != null && !lastItem.isDisposed()) {
-				lastItem.setData(ID_HOVER, NodeState.LESS);
-			}
-			if (toolTip != null && !toolTip.isDisposed()) {
-				toolTip.setVisible(false);
-				toolTip.dispose();
-				toolTip = null;
-			}
-
-			redrawTree(lastItem);
-			lastItem = null;
-			currentItem = null;
-		}
-
-		private void redrawTree(TreeItem item) {
-			if (viewer.getTree() != null && !viewer.getTree().isDisposed()) {
-				if (item != null && !item.isDisposed()) {
-					Rectangle bounds = item.getBounds();
-					Rectangle treeBounds = viewer.getTree().getBounds();
-					viewer.getTree().redraw(0, bounds.y, treeBounds.width, bounds.height, true);
-				} else {
-					viewer.getTree().redraw();
-				}
-			}
-		}
-
-		public void mouseHover(MouseEvent e) {
-
-			if (toolTip == null || toolTip.isDisposed()) {
-				toolTip = new ToolTip(WorkbenchUtil.getShell(), PlatformUiUtil.getSwtTooltipStyle());
-			}
-
-			if (toolTip != null && !toolTip.isDisposed()) {
-				Tree tree = (Tree) e.widget;
-				TreeItem item = findItem(tree, e.y);
-				if (item != null && !item.isDisposed()) {
-					Object data = item.getData(ID_HOVER);
-					if (data == NodeState.MORE) {
-						toolTip.setMessage(Messages.FilteredChildrenDecorationDrawer_Show_Filtered_Children);
-					} else {
-						toolTip.setMessage(Messages.FilteredChildrenDecorationDrawer_No_Filtered_Children);
-					}
-					if (inImageBounds(tree, item, e)) {
-						toolTip.setVisible(true);
-					}
-				}
-			}
-		}
-
-		private boolean inImageBounds(Tree tree, TreeItem item, MouseEvent e) {
-			int selectedX = e.x;
-
-			int imageStartX = getImageStartX(item.getBounds().x, item.getBounds().width, tree);
-
-			int imageEndX = imageStartX + moreImage.getBounds().width;
-
-			return selectedX > imageStartX && selectedX < imageEndX;
-		}
-
-		public void mouseMove(MouseEvent e) {
-			if (toolTip != null && !toolTip.isDisposed()) {
-				toolTip.setVisible(false);
-				toolTip.dispose();
-				toolTip = null;
-			}
-
-			if (!(e.widget instanceof Tree) || e.widget.isDisposed()) {
-				return;
-			}
-			Tree tree = (Tree) e.widget;
-			final TreeItem item = findItem(tree, e.y);
-			if (item != null && !item.isDisposed()) {
-				if (lastItem != null && !lastItem.isDisposed() && !lastItem.equals(item)) {
-					boolean redraw = lastItem.getData(ID_HOVER) != NodeState.LESS;
-					lastItem.setData(ID_HOVER, NodeState.LESS);
-					if (redraw) {// hide the + immediately
-						redrawTree(lastItem);
-					}
-				}
-
-				currentItem = item;
-				long currentTime = System.currentTimeMillis();
-				if (currentTime - lastMoveTime > 250) {// user paused movement
-					startMoveTime = currentTime;
-				}
-
-				lastMoveTime = currentTime;
-				// be responsive for small moves but delay more for bigger ones
-				int delay = Math.min(100, (int) ((currentTime - startMoveTime) / 4.0));
-				PlatformUI.getWorkbench().getDisplay().timerExec(delay, new Runnable() {
-					public void run() {// do nothing if we aren't using the most recent item
-						if (currentItem == item && !item.isDisposed()) {
-							if (item.getData(ID_HOVER) != NodeState.MORE_ERROR) {
-								item.setData(ID_HOVER, NodeState.MORE);
-							}
-							if (lastItem == null || (!lastItem.isDisposed() && !lastItem.equals(item))) {
-								redrawTree(lastItem);
-								redrawTree(item);
-							}
-							lastItem = item;
-						}
-					}
-				});
-			} else {
-				if (lastItem != null && !lastItem.isDisposed() && !lastItem.equals(item)) {
-					lastItem.setData(ID_HOVER, NodeState.LESS);
-					redrawTree(lastItem);
-				}
-				lastItem = item;
-			}
-		}
-
-		public void dispose() {
-			if (toolTip != null && !toolTip.isDisposed()) {
-				toolTip.dispose();
-			}
-		}
-
-		public void mouseDoubleClick(MouseEvent e) {
-			// ignore
-
-		}
-
-		public void mouseDown(MouseEvent e) {
-			if (toolTip != null && !toolTip.isDisposed()) {
-				toolTip.setVisible(false);
-				toolTip.dispose();
-				toolTip = null;
-			}
-
-			if (!(e.widget instanceof Tree) || e.widget.isDisposed()) {
-				// we only handle tree's
-				return;
-			}
-
-			Tree tree = (Tree) e.widget;
-			TreeItem item = findItem(tree, e.y);
-
-			if (item == null || item.isDisposed() || e.button != 1) {
-				// we can't do anything if we cant find the tree items
-				return;
-			}
-
-			int prevNumberItems = item.getItemCount();
-			boolean prevHasData = true;
-			if (prevNumberItems > 0) {
-				prevHasData = item.getItem(0).getData() != null;
-			}
-			if (inImageBounds(tree, item, e)) {
-				browseFilteredListener.setWasExternalClick(true);
-				browseFilteredListener.unfilterSelection(viewer, new StructuredSelection(item.getData()));
-
-				int newNumItems = item.getItemCount();
-				if (newNumItems == prevNumberItems && prevHasData) {
-					item.setData(ID_HOVER, NodeState.MORE_ERROR);
-					redrawTree(item);
-				}
-			}
-		}
-
-		public void mouseUp(MouseEvent e) {
-			// ignore
-
-		}
-	}
-
-	private static final int IMAGE_PADDING = 5;
-
-	// XXX Update Images
-	private final Image moreImage = CommonImages.getImage(CommonImages.EXPAND);
-
-	private final Image moreErrorImage = CommonImages.getImage(CommonImages.REMOVE);
-
-	enum NodeState {
-		MORE, LESS, MORE_ERROR
-	};
-
-	private static final String ID_HOVER = "mylyn-context-hover"; //$NON-NLS-1$
-
-	private final TreeViewer treeViewer;
-
-	private MoveListener listener;
-
-	private final BrowseFilteredListener browseFilteredListener;
-
-	public FilteredChildrenDecorationDrawer(TreeViewer treeViewer, BrowseFilteredListener browseFilteredListener) {
-		this.treeViewer = treeViewer;
-		this.browseFilteredListener = browseFilteredListener;
-	}
-
-	public boolean applyToTreeViewer() {
-		Object data = treeViewer.getData(FilteredChildrenDecorationDrawer.class.getName());
-		if (data == null || Boolean.FALSE.equals(data)) {
-			treeViewer.setData(FilteredChildrenDecorationDrawer.class.getName(), Boolean.TRUE);
-			if (treeViewer.getTree() != null && !treeViewer.getTree().isDisposed()) {
-				treeViewer.getTree().addListener(SWT.PaintItem, this);
-
-				listener = new MoveListener(treeViewer, browseFilteredListener);
-				treeViewer.getTree().addMouseMoveListener(listener);
-				treeViewer.getTree().addMouseListener(listener);
-				treeViewer.getTree().addMouseTrackListener(listener);
-				return true;
-			}
-		}
-		return false;
-	}
-
-	public void dispose() {
-		if (treeViewer.getTree() == null || treeViewer.getTree().isDisposed()) {
-			return;
-		}
-		treeViewer.setData(FilteredChildrenDecorationDrawer.class.getName(), Boolean.FALSE);
-		treeViewer.getTree().removeListener(SWT.PaintItem, this);
-
-		if (listener != null) {
-			treeViewer.getTree().removeMouseMoveListener(listener);
-			treeViewer.getTree().removeMouseListener(listener);
-			treeViewer.getTree().removeMouseTrackListener(listener);
-			listener.dispose();
-		}
-	}
-
-	/*
-	 * NOTE: MeasureItem, PaintItem and EraseItem are called repeatedly.
-	 * Therefore, it is critical for performance that these methods be as
-	 * efficient as possible.
-	 */
-	public void handleEvent(Event event) {
-
-		if (!(event.widget instanceof Tree)) {
-			// we only handle tree's
-			return;
-		}
-
-		switch (event.type) {
-		case SWT.PaintItem: {
-			Tree tree = (Tree) event.widget;
-			if (tree.isDisposed() || event.index != 0) {
-				return;
-			}
-			TreeItem item = findItem(tree, event.y);
-			if (item == null || item.isDisposed()) {
-				return;
-			}
-
-			int imageStartX = getImageStartX(event.x, event.width, tree);
-
-			NodeState value = (NodeState) item.getData(ID_HOVER);
-
-			int imageStartY = event.y;
-			int imageHeight = moreImage.getBounds().height;
-			if (value != null && value.equals(NodeState.MORE_ERROR)) {
-				imageHeight = moreErrorImage.getBounds().height;
-			}
-
-			int offset = Math.round(((float) event.height) / 2 - ((float) imageHeight) / 2);
-			imageStartY += offset;
-			Rectangle clipping = event.gc.getClipping();
-			if (clipping.width < imageStartX && clipping.width > 0) {
-				clipping.width += IMAGE_PADDING + moreImage.getBounds().width;
-				event.gc.setClipping(clipping);
-			}
-			if (value != null && value.equals(NodeState.MORE)) {
-				event.gc.drawImage(moreImage, imageStartX, imageStartY);
-			} else if (value != null && value.equals(NodeState.MORE_ERROR)) {
-				event.gc.drawImage(moreErrorImage, imageStartX, imageStartY);
-			}
-			break;
-		}
-		}
-	}
-
-	private int getImageStartX(int x, int width, Tree tree) {
-		int imageStartX = x + width + IMAGE_PADDING;
-
-		int imageEndX = imageStartX + moreImage.getBounds().width;
-
-		Rectangle clientArea = tree.getClientArea();
-		int currentTreeBounds = clientArea.x + clientArea.width;
-		if (imageStartX > currentTreeBounds) {
-			imageStartX = currentTreeBounds - moreImage.getBounds().width;
-		}
-
-		float tolerance = 0;//moreImage.getBounds().width - (((float) moreImage.getBounds().width) / 3 * 2); // draw over item if more than 33% of the image is hidden 
-		if (imageEndX > currentTreeBounds && imageEndX - currentTreeBounds > tolerance) {
-			imageStartX = currentTreeBounds - moreImage.getBounds().width;
-		}
-		return imageStartX;
-	}
-
-	private TreeItem findItem(Tree tree, int y) {
-		TreeItem item = null;
-		Point size = tree.getSize();
-		final int RATE = 17;
-		for (int i = 0; i <= RATE && item == null; i++) {
-			int position = size.x / RATE + (i * size.x / RATE);
-			item = tree.getItem(new Point(position, y));
-		}
-		return item;
-	}
-}
+/*******************************************************************************

+ * Copyright (c) 2015 Tasktop Technologies 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:

+ *     Tasktop Technologies - initial API and implementation

+ *******************************************************************************/

+package org.eclipse.mylyn.internal.context.ui;

+

+import org.eclipse.jface.viewers.StructuredSelection;

+import org.eclipse.jface.viewers.TreeViewer;

+import org.eclipse.mylyn.commons.ui.CommonImages;

+import org.eclipse.mylyn.commons.ui.PlatformUiUtil;

+import org.eclipse.mylyn.commons.workbench.WorkbenchUtil;

+import org.eclipse.swt.SWT;

+import org.eclipse.swt.events.MouseEvent;

+import org.eclipse.swt.events.MouseListener;

+import org.eclipse.swt.events.MouseMoveListener;

+import org.eclipse.swt.events.MouseTrackListener;

+import org.eclipse.swt.graphics.Image;

+import org.eclipse.swt.graphics.Point;

+import org.eclipse.swt.graphics.Rectangle;

+import org.eclipse.swt.widgets.Event;

+import org.eclipse.swt.widgets.Listener;

+import org.eclipse.swt.widgets.ToolTip;

+import org.eclipse.swt.widgets.Tree;

+import org.eclipse.swt.widgets.TreeItem;

+import org.eclipse.ui.PlatformUI;

+

+/**

+ * @author Mik Kersten

+ */

+

+public class FilteredChildrenDecorationDrawer implements Listener {

+

+	private final class MoveListener implements MouseMoveListener, MouseListener, MouseTrackListener {

+

+		private TreeItem lastItem;

+

+		private TreeItem currentItem;

+

+		private long lastMoveTime;

+

+		private long startMoveTime;

+

+		private final TreeViewer viewer;

+

+		private final BrowseFilteredListener browseFilteredListener;

+

+		private ToolTip toolTip;

+

+		public MoveListener(TreeViewer viewer, BrowseFilteredListener browseFilteredListener) {

+			this.viewer = viewer;

+			this.browseFilteredListener = browseFilteredListener;

+		}

+

+		public void mouseEnter(MouseEvent e) {

+			mouseMove(e);

+		}

+

+		public void mouseExit(MouseEvent e) {

+			if (lastItem != null && !lastItem.isDisposed()) {

+				lastItem.setData(ID_HOVER, NodeState.LESS);

+			}

+			if (toolTip != null && !toolTip.isDisposed()) {

+				toolTip.setVisible(false);

+				toolTip.dispose();

+				toolTip = null;

+			}

+

+			redrawTree(lastItem);

+			lastItem = null;

+			currentItem = null;

+		}

+

+		private void redrawTree(TreeItem item) {

+			if (viewer.getTree() != null && !viewer.getTree().isDisposed()) {

+				if (item != null && !item.isDisposed()) {

+					Rectangle bounds = item.getBounds();

+					Rectangle treeBounds = viewer.getTree().getBounds();

+					viewer.getTree().redraw(0, bounds.y, treeBounds.width, bounds.height, true);

+				} else {

+					viewer.getTree().redraw();

+				}

+			}

+		}

+

+		public void mouseHover(MouseEvent e) {

+

+			if (toolTip == null || toolTip.isDisposed()) {

+				toolTip = new ToolTip(WorkbenchUtil.getShell(), PlatformUiUtil.getSwtTooltipStyle());

+			}

+

+			if (toolTip != null && !toolTip.isDisposed()) {

+				Tree tree = (Tree) e.widget;

+				TreeItem item = findItem(tree, e.y);

+				if (item != null && !item.isDisposed()) {

+					Object data = item.getData(ID_HOVER);

+					if (data == NodeState.MORE) {

+						toolTip.setMessage(Messages.FilteredChildrenDecorationDrawer_Show_Filtered_Children);

+					} else {

+						toolTip.setMessage(Messages.FilteredChildrenDecorationDrawer_No_Filtered_Children);

+					}

+					if (inImageBounds(tree, item, e)) {

+						toolTip.setVisible(true);

+					}

+				}

+			}

+		}

+

+		private boolean inImageBounds(Tree tree, TreeItem item, MouseEvent e) {

+			int selectedX = e.x;

+

+			int imageStartX = getImageStartX(item.getBounds().x, item.getBounds().width, tree);

+

+			int imageEndX = imageStartX + moreImage.getBounds().width;

+

+			return selectedX > imageStartX && selectedX < imageEndX;

+		}

+

+		public void mouseMove(MouseEvent e) {

+			if (toolTip != null && !toolTip.isDisposed()) {

+				toolTip.setVisible(false);

+				toolTip.dispose();

+				toolTip = null;

+			}

+

+			if (!(e.widget instanceof Tree) || e.widget.isDisposed()) {

+				return;

+			}

+			Tree tree = (Tree) e.widget;

+			final TreeItem item = findItem(tree, e.y);

+			if (item != null && !item.isDisposed()) {

+				if (lastItem != null && !lastItem.isDisposed() && !lastItem.equals(item)) {

+					boolean redraw = lastItem.getData(ID_HOVER) != NodeState.LESS;

+					lastItem.setData(ID_HOVER, NodeState.LESS);

+					if (redraw) {// hide the + immediately

+						redrawTree(lastItem);

+					}

+				}

+

+				currentItem = item;

+				long currentTime = System.currentTimeMillis();

+				if (currentTime - lastMoveTime > 250) {// user paused movement

+					startMoveTime = currentTime;

+				}

+

+				lastMoveTime = currentTime;

+				// be responsive for small moves but delay more for bigger ones

+				int delay = Math.min(100, (int) ((currentTime - startMoveTime) / 4.0));

+				PlatformUI.getWorkbench().getDisplay().timerExec(delay, new Runnable() {

+					public void run() {// do nothing if we aren't using the most recent item

+						if (currentItem == item && !item.isDisposed()) {

+							if (item.getData(ID_HOVER) != NodeState.MORE_ERROR) {

+								item.setData(ID_HOVER, NodeState.MORE);

+							}

+							if (lastItem == null || (!lastItem.isDisposed() && !lastItem.equals(item))) {

+								redrawTree(lastItem);

+								redrawTree(item);

+							}

+							lastItem = item;

+						}

+					}

+				});

+			} else {

+				if (lastItem != null && !lastItem.isDisposed() && !lastItem.equals(item)) {

+					lastItem.setData(ID_HOVER, NodeState.LESS);

+					redrawTree(lastItem);

+				}

+				lastItem = item;

+			}

+		}

+

+		public void dispose() {

+			if (toolTip != null && !toolTip.isDisposed()) {

+				toolTip.dispose();

+			}

+		}

+

+		public void mouseDoubleClick(MouseEvent e) {

+			// ignore

+

+		}

+

+		public void mouseDown(MouseEvent e) {

+			if (toolTip != null && !toolTip.isDisposed()) {

+				toolTip.setVisible(false);

+				toolTip.dispose();

+				toolTip = null;

+			}

+

+			if (!(e.widget instanceof Tree) || e.widget.isDisposed()) {

+				// we only handle tree's

+				return;

+			}

+

+			Tree tree = (Tree) e.widget;

+			TreeItem item = findItem(tree, e.y);

+

+			if (item == null || item.isDisposed() || e.button != 1) {

+				// we can't do anything if we cant find the tree items

+				return;

+			}

+

+			int prevNumberItems = item.getItemCount();

+			boolean prevHasData = true;

+			if (prevNumberItems > 0) {

+				prevHasData = item.getItem(0).getData() != null;

+			}

+			if (inImageBounds(tree, item, e)) {

+				browseFilteredListener.setWasExternalClick(true);

+				browseFilteredListener.unfilterSelection(viewer, new StructuredSelection(item.getData()));

+

+				int newNumItems = item.getItemCount();

+				if (newNumItems == prevNumberItems && prevHasData) {

+					item.setData(ID_HOVER, NodeState.MORE_ERROR);

+					redrawTree(item);

+				}

+			}

+		}

+

+		public void mouseUp(MouseEvent e) {

+			// ignore

+

+		}

+	}

+

+	private static final int IMAGE_PADDING = 5;

+

+	// XXX Update Images

+	private final Image moreImage = CommonImages.getImage(CommonImages.EXPAND);

+

+	private final Image moreErrorImage = CommonImages.getImage(CommonImages.REMOVE);

+

+	enum NodeState {

+		MORE, LESS, MORE_ERROR

+	};

+

+	private static final String ID_HOVER = "mylyn-context-hover"; //$NON-NLS-1$

+

+	private final TreeViewer treeViewer;

+

+	private MoveListener listener;

+

+	private final BrowseFilteredListener browseFilteredListener;

+

+	public FilteredChildrenDecorationDrawer(TreeViewer treeViewer, BrowseFilteredListener browseFilteredListener) {

+		this.treeViewer = treeViewer;

+		this.browseFilteredListener = browseFilteredListener;

+	}

+

+	public boolean applyToTreeViewer() {

+		Object data = treeViewer.getData(FilteredChildrenDecorationDrawer.class.getName());

+		if (data == null || Boolean.FALSE.equals(data)) {

+			treeViewer.setData(FilteredChildrenDecorationDrawer.class.getName(), Boolean.TRUE);

+			if (treeViewer.getTree() != null && !treeViewer.getTree().isDisposed()) {

+				treeViewer.getTree().addListener(SWT.PaintItem, this);

+

+				listener = new MoveListener(treeViewer, browseFilteredListener);

+				treeViewer.getTree().addMouseMoveListener(listener);

+				treeViewer.getTree().addMouseListener(listener);

+				treeViewer.getTree().addMouseTrackListener(listener);

+				return true;

+			}

+		}

+		return false;

+	}

+

+	public void dispose() {

+		if (treeViewer.getTree() == null || treeViewer.getTree().isDisposed()) {

+			return;

+		}

+		treeViewer.setData(FilteredChildrenDecorationDrawer.class.getName(), Boolean.FALSE);

+		treeViewer.getTree().removeListener(SWT.PaintItem, this);

+

+		if (listener != null) {

+			treeViewer.getTree().removeMouseMoveListener(listener);

+			treeViewer.getTree().removeMouseListener(listener);

+			treeViewer.getTree().removeMouseTrackListener(listener);

+			listener.dispose();

+		}

+	}

+

+	/*

+	 * NOTE: MeasureItem, PaintItem and EraseItem are called repeatedly.

+	 * Therefore, it is critical for performance that these methods be as

+	 * efficient as possible.

+	 */

+	public void handleEvent(Event event) {

+

+		if (!(event.widget instanceof Tree)) {

+			// we only handle tree's

+			return;

+		}

+

+		switch (event.type) {

+		case SWT.PaintItem: {

+			Tree tree = (Tree) event.widget;

+			if (tree.isDisposed() || event.index != 0) {

+				return;

+			}

+			TreeItem item = findItem(tree, event.y);

+			if (item == null || item.isDisposed()) {

+				return;

+			}

+

+			int imageStartX = getImageStartX(event.x, event.width, tree);

+

+			NodeState value = (NodeState) item.getData(ID_HOVER);

+

+			int imageStartY = event.y;

+			int imageHeight = moreImage.getBounds().height;

+			if (value != null && value.equals(NodeState.MORE_ERROR)) {

+				imageHeight = moreErrorImage.getBounds().height;

+			}

+

+			int offset = Math.round(((float) event.height) / 2 - ((float) imageHeight) / 2);

+			imageStartY += offset;

+			Rectangle clipping = event.gc.getClipping();

+			if (clipping.width < imageStartX && clipping.width > 0) {

+				clipping.width += IMAGE_PADDING + moreImage.getBounds().width;

+				event.gc.setClipping(clipping);

+			}

+			if (value != null && value.equals(NodeState.MORE)) {

+				event.gc.drawImage(moreImage, imageStartX, imageStartY);

+			} else if (value != null && value.equals(NodeState.MORE_ERROR)) {

+				event.gc.drawImage(moreErrorImage, imageStartX, imageStartY);

+			}

+			break;

+		}

+		}

+	}

+

+	private int getImageStartX(int x, int width, Tree tree) {

+		int imageStartX = x + width + IMAGE_PADDING;

+

+		int imageEndX = imageStartX + moreImage.getBounds().width;

+

+		Rectangle clientArea = tree.getClientArea();

+		int currentTreeBounds = clientArea.x + clientArea.width;

+		if (imageStartX > currentTreeBounds) {

+			imageStartX = currentTreeBounds - moreImage.getBounds().width;

+		}

+

+		float tolerance = 0;//moreImage.getBounds().width - (((float) moreImage.getBounds().width) / 3 * 2); // draw over item if more than 33% of the image is hidden

+		if (imageEndX > currentTreeBounds && imageEndX - currentTreeBounds > tolerance) {

+			imageStartX = currentTreeBounds - moreImage.getBounds().width;

+		}

+		return imageStartX;

+	}

+

+	private TreeItem findItem(Tree tree, int y) {

+		TreeItem item = null;

+		Point size = tree.getSize();

+		final int RATE = 17;

+		for (int i = 0; i <= RATE && item == null; i++) {

+			int position = size.x / RATE + (i * size.x / RATE);

+			item = tree.getItem(new Point(position, y));

+		}

+		return item;

+	}

+}

diff --git a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/history/messages.properties b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/history/messages.properties
index 42d1ae0..ece1630 100644
--- a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/history/messages.properties
+++ b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/history/messages.properties
@@ -1,15 +1,18 @@
-###############################################################################
-# Copyright (c) 2015 Tasktop Technologies.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Tasktop EULA
-# which accompanies this distribution, and is available at
-# http://tasktop.com/legal
-###############################################################################
-TaskHistoryPage_Added_Column_Label=Added
-TaskHistoryPage_Author_Column_Label=Author
-TaskHistoryPage_Field_Column_Label=Field
-TaskHistoryPage_New_Value_Label=New Value
-TaskHistoryPage_Old_Value_Label=Old Value
-TaskHistoryPage_Removed_Column_Label=Removed
-TaskHistoryPage_Task_history_for_X_Desscription_Label=Task history for {0}
-TaskHistoryPage_Time_Column_Label=Time
+###############################################################################

+# Copyright (c) 2015 Tasktop Technologies 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:

+#      Tasktop Technologies - initial API and implementation

+###############################################################################

+TaskHistoryPage_Added_Column_Label=Added

+TaskHistoryPage_Author_Column_Label=Author

+TaskHistoryPage_Field_Column_Label=Field

+TaskHistoryPage_New_Value_Label=New Value

+TaskHistoryPage_Old_Value_Label=Old Value

+TaskHistoryPage_Removed_Column_Label=Removed

+TaskHistoryPage_Task_history_for_X_Desscription_Label=Task history for {0}

+TaskHistoryPage_Time_Column_Label=Time