Bug 517209 - Only show infos with specific tag in HistoryView

* add filter action to view
* show indication in top of view when the filter is active

Change-Id: Iccbbb78370df3ef14d87f8cab2726a30460e8786
Signed-off-by: Johannes Faltermeier <jfaltermeier@eclipsesource.com>
diff --git a/bundles/org.eclipse.emf.emfstore.client.ui/icons/find.png b/bundles/org.eclipse.emf.emfstore.client.ui/icons/find.png
new file mode 100644
index 0000000..1cd7d7e
--- /dev/null
+++ b/bundles/org.eclipse.emf.emfstore.client.ui/icons/find.png
Binary files differ
diff --git a/bundles/org.eclipse.emf.emfstore.client.ui/src/org/eclipse/emf/emfstore/internal/client/ui/views/historybrowserview/HistoryBrowserView.java b/bundles/org.eclipse.emf.emfstore.client.ui/src/org/eclipse/emf/emfstore/internal/client/ui/views/historybrowserview/HistoryBrowserView.java
index 8f65050..2a94f30 100644
--- a/bundles/org.eclipse.emf.emfstore.client.ui/src/org/eclipse/emf/emfstore/internal/client/ui/views/historybrowserview/HistoryBrowserView.java
+++ b/bundles/org.eclipse.emf.emfstore.client.ui/src/org/eclipse/emf/emfstore/internal/client/ui/views/historybrowserview/HistoryBrowserView.java
@@ -10,6 +10,7 @@
  ******************************************************************************/
 package org.eclipse.emf.emfstore.internal.client.ui.views.historybrowserview;
 
+import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -54,6 +55,7 @@
 import org.eclipse.emf.emfstore.internal.server.model.versioning.ModelElementQuery;
 import org.eclipse.emf.emfstore.internal.server.model.versioning.PrimaryVersionSpec;
 import org.eclipse.emf.emfstore.internal.server.model.versioning.RangeQuery;
+import org.eclipse.emf.emfstore.internal.server.model.versioning.TagVersionSpec;
 import org.eclipse.emf.emfstore.internal.server.model.versioning.VersionSpec;
 import org.eclipse.emf.emfstore.internal.server.model.versioning.VersioningFactory;
 import org.eclipse.emf.emfstore.internal.server.model.versioning.Versions;
@@ -80,6 +82,8 @@
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.TreeViewer;
 import org.eclipse.jface.viewers.TreeViewerColumn;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
 import org.eclipse.jface.window.Window;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionEvent;
@@ -150,6 +154,9 @@
 	private ExpandCollapseAction expandAndCollapse;
 	private boolean isUnlinkedFromNavigator;
 	private Action showAllBranches;
+	private Action filterTagAction;
+
+	private String filteredTag;
 
 	// changes can be transferred with historyInfos. However, this must be avoided if the server sends
 	// FileBasedChangePackages which the client can not open
@@ -186,6 +193,24 @@
 
 		// init viewer
 		viewer = new TreeViewerWithModelElementSelectionProvider(parent);
+		viewer.setFilters(new ViewerFilter[] { new ViewerFilter() {
+
+			@Override
+			public boolean select(Viewer viewer, Object parentElement, Object element) {
+				if (filteredTag == null || filteredTag.length() == 0) {
+					return true;
+				}
+				if (!HistoryInfo.class.isInstance(element)) {
+					return true;
+				}
+				for (final TagVersionSpec tagVersionSpec : HistoryInfo.class.cast(element).getTagSpecs()) {
+					if (filteredTag.equalsIgnoreCase(tagVersionSpec.getName())) {
+						return true;
+					}
+				}
+				return false;
+			}
+		} });
 		GridDataFactory.fillDefaults().grab(true, true).applyTo(viewer.getControl());
 		final Tree tree = viewer.getTree();
 		tree.setHeaderVisible(true);
@@ -344,6 +369,10 @@
 		} else {
 			label += adapterFactoryLabelProvider.getText(modelElement);
 		}
+		if (filteredTag != null && filteredTag.length() > 0) {
+			label += MessageFormat.format(" [{0}]", //$NON-NLS-1$
+				MessageFormat.format(Messages.HistoryBrowserView_TaggedWithOnly, filteredTag));
+		}
 		showNoProjectHint(false);
 		setContentDescription(label);
 	}
@@ -608,6 +637,7 @@
 		addExpandAllAndCollapseAllAction(menuManager);
 		addNextAndPreviousAction(menuManager);
 		addJumpToRevisionAction(menuManager);
+		addFilterTagAction(menuManager);
 		addLinkWithNavigatorAction(menuManager);
 	}
 
@@ -758,6 +788,35 @@
 		menuManager.add(showAllBranches);
 	}
 
+	private void addFilterTagAction(IToolBarManager menuManager) {
+		filterTagAction = new Action("", SWT.TOGGLE) { //$NON-NLS-1$
+
+			@Override
+			public void run() {
+				if (filterTagAction.isChecked()) {
+					final InputDialog inputDialog = new InputDialog(getSite().getShell(),
+						Messages.HistoryBrowserView_FilterByTagDialog,
+						Messages.HistoryBrowserView_TagDialog,
+						StringUtils.EMPTY,
+						null);
+					if (inputDialog.open() == Window.OK) {
+						filteredTag = inputDialog.getValue();
+					} else {
+						filterTagAction.setChecked(false);
+					}
+				} else {
+					filteredTag = null;
+				}
+				refresh();
+			}
+
+		};
+		filterTagAction.setImageDescriptor(Activator.getImageDescriptor("icons/find.png")); //$NON-NLS-1$
+		filterTagAction.setToolTipText(Messages.HistoryBrowserView_FilterByTagAction);
+		filterTagAction.setChecked(false);
+		menuManager.add(filterTagAction);
+	}
+
 	private void addJumpToRevisionAction(IToolBarManager menuManager) {
 		final Action jumpTo = new Action() {
 			@Override
diff --git a/bundles/org.eclipse.emf.emfstore.client.ui/src/org/eclipse/emf/emfstore/internal/client/ui/views/historybrowserview/Messages.java b/bundles/org.eclipse.emf.emfstore.client.ui/src/org/eclipse/emf/emfstore/internal/client/ui/views/historybrowserview/Messages.java
index a53739b..14eebca 100644
--- a/bundles/org.eclipse.emf.emfstore.client.ui/src/org/eclipse/emf/emfstore/internal/client/ui/views/historybrowserview/Messages.java
+++ b/bundles/org.eclipse.emf.emfstore.client.ui/src/org/eclipse/emf/emfstore/internal/client/ui/views/historybrowserview/Messages.java
@@ -27,6 +27,8 @@
 	public static String HistoryBrowserView_ExpandCollapseToggle;
 	public static String HistoryBrowserView_ExpandToggle;
 	public static String HistoryBrowserView_FetchingHistory;
+	public static String HistoryBrowserView_FilterByTagAction;
+	public static String HistoryBrowserView_FilterByTagDialog;
 	public static String HistoryBrowserView_GoToRevision;
 	public static String HistoryBrowserView_GoToRevisionToolTip;
 	public static String HistoryBrowserView_HistoryFor;
@@ -41,6 +43,8 @@
 	public static String HistoryBrowserView_SelectProjectOrCallHistory;
 	public static String HistoryBrowserView_SelectProjectTitle;
 	public static String HistoryBrowserView_ShowAllBranches;
+	public static String HistoryBrowserView_TagDialog;
+	public static String HistoryBrowserView_TaggedWithOnly;
 	public static String HistoryBrowserView_VersionDoesNotExist;
 	static {
 		// initialize resource bundle
diff --git a/bundles/org.eclipse.emf.emfstore.client.ui/src/org/eclipse/emf/emfstore/internal/client/ui/views/historybrowserview/messages.properties b/bundles/org.eclipse.emf.emfstore.client.ui/src/org/eclipse/emf/emfstore/internal/client/ui/views/historybrowserview/messages.properties
index 01eff3e..07547d8 100644
--- a/bundles/org.eclipse.emf.emfstore.client.ui/src/org/eclipse/emf/emfstore/internal/client/ui/views/historybrowserview/messages.properties
+++ b/bundles/org.eclipse.emf.emfstore.client.ui/src/org/eclipse/emf/emfstore/internal/client/ui/views/historybrowserview/messages.properties
@@ -6,6 +6,8 @@
 HistoryBrowserView_ExpandCollapseToggle=Use this toggle to expand or collapse all elements
 HistoryBrowserView_ExpandToggle=Use this toggle to expand or collapse all elements
 HistoryBrowserView_FetchingHistory=Fetching history form server
+HistoryBrowserView_FilterByTagAction=Filter by Tag
+HistoryBrowserView_FilterByTagDialog=Filter by Tag
 HistoryBrowserView_GoToRevision=Go to revision
 HistoryBrowserView_GoToRevisionToolTip=Go to revision...
 HistoryBrowserView_HistoryFor=History for 
@@ -20,4 +22,6 @@
 HistoryBrowserView_SelectProjectOrCallHistory=Select a <a>project</a> or call 'Show history' from the context menu of an element in the navigator.
 HistoryBrowserView_SelectProjectTitle=Select a project from the workspace
 HistoryBrowserView_ShowAllBranches=Show All Branches
+HistoryBrowserView_TagDialog=Tag
+HistoryBrowserView_TaggedWithOnly=tagged with \"{0}\" only
 HistoryBrowserView_VersionDoesNotExist=Error: The version you requested does not exist.