tuleap #781 Add reply button in message tab.

Change-Id: I4972e09aa80ebddf2c64929ca0b60969e87dfdb4
Signed-off-by: Jacques Bouthillier <lmcbout@gmail.com>
diff --git a/org.eclipse.egerrit.dashboard.ui/src/org/eclipse/egerrit/internal/dashboard/ui/commands/table/ReplyDialogHandler.java b/org.eclipse.egerrit.dashboard.ui/src/org/eclipse/egerrit/internal/dashboard/ui/commands/table/ReplyDialogHandler.java
index 04d3890..867f705 100644
--- a/org.eclipse.egerrit.dashboard.ui/src/org/eclipse/egerrit/internal/dashboard/ui/commands/table/ReplyDialogHandler.java
+++ b/org.eclipse.egerrit.dashboard.ui/src/org/eclipse/egerrit/internal/dashboard/ui/commands/table/ReplyDialogHandler.java
@@ -32,7 +32,7 @@
 		if (getChangeInfo() != null && getGerritClient() != null) {

 			ReplyProcess replyProcess = new ReplyProcess();

 			replyProcess.handleReplyDialog(HandlerUtil.getActiveShell(event), getChangeInfo(), getGerritClient(),

-					getLatestRevision());

+					getLatestRevision(), null);

 		}

 		return null;

 	}

diff --git a/org.eclipse.egerrit.ui/src/org/eclipse/egerrit/internal/process/ReplyProcess.java b/org.eclipse.egerrit.ui/src/org/eclipse/egerrit/internal/process/ReplyProcess.java
index ab4476c..90818dd 100644
--- a/org.eclipse.egerrit.ui/src/org/eclipse/egerrit/internal/process/ReplyProcess.java
+++ b/org.eclipse.egerrit.ui/src/org/eclipse/egerrit/internal/process/ReplyProcess.java
@@ -23,6 +23,7 @@
 import org.eclipse.egerrit.internal.core.exception.EGerritException;
 import org.eclipse.egerrit.internal.core.rest.ReviewInput;
 import org.eclipse.egerrit.internal.model.ChangeInfo;
+import org.eclipse.egerrit.internal.model.ChangeMessageInfo;
 import org.eclipse.egerrit.internal.model.RevisionInfo;
 import org.eclipse.egerrit.internal.ui.editors.QueryHelpers;
 import org.eclipse.egerrit.internal.ui.utils.Messages;
@@ -47,8 +48,8 @@
 	}
 
 	public void handleReplyDialog(Shell shell, ChangeInfo changeInfo, GerritClient gerritClient,
-			RevisionInfo selectedRevision) {
-		UIUtils.replyToChange(shell, selectedRevision, null, gerritClient, false);
+			RevisionInfo selectedRevision, ChangeMessageInfo messageInfo) {
+		UIUtils.replyToChange(shell, selectedRevision, null, gerritClient, false, messageInfo);
 		CompletableFuture.runAsync(() -> QueryHelpers.loadBasicInformation(gerritClient, changeInfo, false))
 				.thenRun(() -> changeInfo.setUserSelectedRevision(selectedRevision));
 	}
diff --git a/org.eclipse.egerrit.ui/src/org/eclipse/egerrit/internal/ui/compare/ReplyHandler.java b/org.eclipse.egerrit.ui/src/org/eclipse/egerrit/internal/ui/compare/ReplyHandler.java
index 0ae655e..ea78716 100644
--- a/org.eclipse.egerrit.ui/src/org/eclipse/egerrit/internal/ui/compare/ReplyHandler.java
+++ b/org.eclipse.egerrit.ui/src/org/eclipse/egerrit/internal/ui/compare/ReplyHandler.java
@@ -52,7 +52,8 @@
 				UIUtils.displayInformation(Messages.ReplyHandlerTitle, Messages.ReplyHandlerMessage);
 			} else {
 				RevisionInfo revisionInfo = input.getChangeInfo().getRevisions().get(input.getLeftSide());
-				UIUtils.replyToChange(viewer.getControl().getShell(), revisionInfo, null, input.gerritClient, true);
+				UIUtils.replyToChange(viewer.getControl().getShell(), revisionInfo, null, input.gerritClient, true,
+						null);
 				input.fireInputChange();
 			}
 		}
diff --git a/org.eclipse.egerrit.ui/src/org/eclipse/egerrit/internal/ui/editors/ChangeDetailEditor.java b/org.eclipse.egerrit.ui/src/org/eclipse/egerrit/internal/ui/editors/ChangeDetailEditor.java
index 9144fa4..795954e 100644
--- a/org.eclipse.egerrit.ui/src/org/eclipse/egerrit/internal/ui/editors/ChangeDetailEditor.java
+++ b/org.eclipse.egerrit.ui/src/org/eclipse/egerrit/internal/ui/editors/ChangeDetailEditor.java
@@ -649,7 +649,7 @@
 					//Should open directly the reply dialog, no sub-menu

 					ReplyProcess replyProcess = new ReplyProcess();

 					replyProcess.handleReplyDialog(replyButton.getShell(), fChangeInfo, fGerritClient,

-							fChangeInfo.getUserSelectedRevision());

+							fChangeInfo.getUserSelectedRevision(), null);

 				} else {

 					MenuManager mgr = new MenuManager();

 					buildReplyDynamicMenu(adjustedAllowedButton, mgr);

diff --git a/org.eclipse.egerrit.ui/src/org/eclipse/egerrit/internal/ui/editors/ReplyDialog.java b/org.eclipse.egerrit.ui/src/org/eclipse/egerrit/internal/ui/editors/ReplyDialog.java
index ffe5997..a74e933 100644
--- a/org.eclipse.egerrit.ui/src/org/eclipse/egerrit/internal/ui/editors/ReplyDialog.java
+++ b/org.eclipse.egerrit.ui/src/org/eclipse/egerrit/internal/ui/editors/ReplyDialog.java
@@ -18,6 +18,7 @@
 import java.util.Map.Entry;
 
 import org.eclipse.egerrit.internal.core.GerritClient;
+import org.eclipse.egerrit.internal.model.ChangeMessageInfo;
 import org.eclipse.egerrit.internal.model.CommentInfo;
 import org.eclipse.egerrit.internal.model.FileInfo;
 import org.eclipse.egerrit.internal.model.LabelInfo;
@@ -85,14 +86,16 @@
 
 	/**
 	 * The constructor.
+	 *
+	 * @param messageInfo
 	 */
-	public ReplyDialog(Shell shell, String reason, RevisionInfo revisionToReplyTo, GerritClient gerritClient) {
+	public ReplyDialog(Shell shell, String reason, RevisionInfo revisionToReplyTo, GerritClient gerritClient,
+			ChangeMessageInfo messageInfo) {
 		super(shell, Messages.ReplyDialog_0, buildMessage(reason, revisionToReplyTo), null, null);
 		fRevisionInfo = revisionToReplyTo;
 		fGerritClient = gerritClient;
 		permitted_labels = revisionToReplyTo.getChangeInfo().getSortedPermittedLabels();
 		labelsInfo = revisionToReplyTo.getChangeInfo().getLabels();
-
 		boolean isVoteAllowed = revisionToReplyTo.getId()
 				.equals(revisionToReplyTo.getChangeInfo().getCurrent_revision());
 		if (!isVoteAllowed) {
diff --git a/org.eclipse.egerrit.ui/src/org/eclipse/egerrit/internal/ui/editors/ReplyHandler.java b/org.eclipse.egerrit.ui/src/org/eclipse/egerrit/internal/ui/editors/ReplyHandler.java
index c04d8ec..976af46 100644
--- a/org.eclipse.egerrit.ui/src/org/eclipse/egerrit/internal/ui/editors/ReplyHandler.java
+++ b/org.eclipse.egerrit.ui/src/org/eclipse/egerrit/internal/ui/editors/ReplyHandler.java
@@ -56,7 +56,7 @@
 		if (fLabelText.equals(ActionConstants.REPLY.getLiteral())) {
 			//Deal with the reply dialog
 			replyProcess.handleReplyDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), fChangeInfo,
-					fGerritClient, fChangeInfo.getUserSelectedRevision());
+					fGerritClient, fChangeInfo.getUserSelectedRevision(), null);
 			return;
 		} else if (fLabelText.equals(ReplyProcess.REPLY_ALL_BUTTONS)) {
 			//Adjust the list of labels which the current user can set to a maximum value
diff --git a/org.eclipse.egerrit.ui/src/org/eclipse/egerrit/internal/ui/table/provider/HistoryTableMenuBuilder.java b/org.eclipse.egerrit.ui/src/org/eclipse/egerrit/internal/ui/table/provider/HistoryTableMenuBuilder.java
index 77bd3e0..8d62cb7 100644
--- a/org.eclipse.egerrit.ui/src/org/eclipse/egerrit/internal/ui/table/provider/HistoryTableMenuBuilder.java
+++ b/org.eclipse.egerrit.ui/src/org/eclipse/egerrit/internal/ui/table/provider/HistoryTableMenuBuilder.java
@@ -12,6 +12,11 @@
 package org.eclipse.egerrit.internal.ui.table.provider;
 
 import org.eclipse.egerrit.internal.core.GerritClient;
+import org.eclipse.egerrit.internal.model.ActionConstants;
+import org.eclipse.egerrit.internal.model.ChangeInfo;
+import org.eclipse.egerrit.internal.model.ChangeMessageInfo;
+import org.eclipse.egerrit.internal.model.RevisionInfo;
+import org.eclipse.egerrit.internal.process.ReplyProcess;
 import org.eclipse.egerrit.internal.ui.table.filter.AuthorKindFilter;
 import org.eclipse.egerrit.internal.ui.utils.Messages;
 import org.eclipse.jface.action.Action;
@@ -20,10 +25,14 @@
 import org.eclipse.jface.action.MenuManager;
 import org.eclipse.jface.action.Separator;
 import org.eclipse.jface.viewers.ColumnViewer;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.StructuredViewer;
 import org.eclipse.jface.viewers.TableViewer;
 import org.eclipse.jface.viewers.ViewerFilter;
 import org.eclipse.swt.widgets.Menu;
+import org.eclipse.ui.PlatformUI;
 
 public class HistoryTableMenuBuilder {
 	private Menu commonMenu;
@@ -32,6 +41,8 @@
 
 	private FilterSelectionAction machineOnlyfilter = null;
 
+	private ReplyMessageAction replyMessages = null;
+
 	public void addPulldownMenu(ColumnViewer viewer, GerritClient client) {
 		MenuManager menuManager = new MenuManager();
 		if (viewer instanceof TableViewer) {
@@ -40,6 +51,7 @@
 			humanOnlyfilter = new FilterSelectionAction(Messages.UIHistoryTable_0, viewer, new AuthorKindFilter(false));
 			machineOnlyfilter = new FilterSelectionAction(Messages.UIHistoryTable_1, viewer,
 					new AuthorKindFilter(true));
+			replyMessages = new ReplyMessageAction(ActionConstants.REPLY.getLiteral(), viewer, client);
 		}
 		menuManager.addMenuListener(new IMenuListener() {
 			@Override
@@ -75,6 +87,8 @@
 		if (menu.getItemCount() == 0) {
 			if (viewer instanceof TableViewer) {
 				MenuManager menuMgr = new MenuManager();
+				menuMgr.add(replyMessages);
+				menuMgr.add(new Separator());
 				menuMgr.add(humanOnlyfilter);
 				menuMgr.add(machineOnlyfilter);
 				menuMgr.createContextMenu(menu.getShell()).setVisible(true);
@@ -91,4 +105,34 @@
 			}
 		}
 	}
+
+	private class ReplyMessageAction extends Action {
+		private StructuredViewer viewer;
+
+		private GerritClient gerritClient;
+
+		public ReplyMessageAction(String actionName, StructuredViewer viewer, GerritClient client) {
+			super(actionName, AS_PUSH_BUTTON);
+			this.viewer = viewer;
+			this.gerritClient = client;
+		}
+
+		@Override
+		public void run() {
+			ISelection selection = viewer.getSelection();
+			if (!selection.isEmpty() && selection instanceof StructuredSelection) {
+				IStructuredSelection struct = (IStructuredSelection) selection;
+				Object obj = struct.getFirstElement();
+				if (obj instanceof ChangeMessageInfo) {
+					ChangeMessageInfo messageInfo = (ChangeMessageInfo) obj;
+					ReplyProcess replyProcess = new ReplyProcess();
+					ChangeInfo changeInfo = (ChangeInfo) messageInfo.eContainer();
+					RevisionInfo revisionInfo = changeInfo.getRevisionByNumber(messageInfo.get_revision_number());
+					replyProcess.handleReplyDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+							changeInfo, gerritClient, revisionInfo, messageInfo);
+				}
+			}
+		}
+	}
+
 }
\ No newline at end of file
diff --git a/org.eclipse.egerrit.ui/src/org/eclipse/egerrit/internal/ui/utils/ActiveWorkspaceRevision.java b/org.eclipse.egerrit.ui/src/org/eclipse/egerrit/internal/ui/utils/ActiveWorkspaceRevision.java
index 757041b..7807ef7 100644
--- a/org.eclipse.egerrit.ui/src/org/eclipse/egerrit/internal/ui/utils/ActiveWorkspaceRevision.java
+++ b/org.eclipse.egerrit.ui/src/org/eclipse/egerrit/internal/ui/utils/ActiveWorkspaceRevision.java
@@ -311,7 +311,7 @@
 			final Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
 			UIUtils.replyToChange(shell, fRevisionInContext,
 					Messages.ActiveWorkspaceRevision_0 + fRevisionInContext.getChangeInfo().getSubject() + "\"\n\n", //$NON-NLS-1$
-					fGerritClient, false);
+					fGerritClient, false, null);
 		}
 		deactivateQuickDiff();
 		fRevisionInContext = null;
diff --git a/org.eclipse.egerrit.ui/src/org/eclipse/egerrit/internal/ui/utils/UIUtils.java b/org.eclipse.egerrit.ui/src/org/eclipse/egerrit/internal/ui/utils/UIUtils.java
index de6c346..aedd26d 100644
--- a/org.eclipse.egerrit.ui/src/org/eclipse/egerrit/internal/ui/utils/UIUtils.java
+++ b/org.eclipse.egerrit.ui/src/org/eclipse/egerrit/internal/ui/utils/UIUtils.java
@@ -26,6 +26,7 @@
 import org.eclipse.egerrit.internal.core.rest.ReviewInput;
 import org.eclipse.egerrit.internal.core.utils.Utils;
 import org.eclipse.egerrit.internal.model.ChangeInfo;
+import org.eclipse.egerrit.internal.model.ChangeMessageInfo;
 import org.eclipse.egerrit.internal.model.CommentInfo;
 import org.eclipse.egerrit.internal.model.FileInfo;
 import org.eclipse.egerrit.internal.model.ModelFactory;
@@ -120,10 +121,10 @@
 	}
 
 	public static void replyToChange(Shell shell, RevisionInfo revisionInfo, String reason, GerritClient client,
-			boolean waitForDataRefresh) {
+			boolean waitForDataRefresh, ChangeMessageInfo messageInfo) {
 		String current = revisionInfo.getId();
 		QueryHelpers.loadDrafts(client, revisionInfo); //Force load the drafts to make sure they are shown in the dialog.
-		final ReplyDialog replyDialog = new ReplyDialog(shell, reason, revisionInfo, client);
+		final ReplyDialog replyDialog = new ReplyDialog(shell, reason, revisionInfo, client, messageInfo);
 		Display.getDefault().syncExec(new Runnable() {
 			public void run() {
 				int ret = replyDialog.open();