feature[ats_ATS328836]: Add some common ui message stuff

Change-Id: I3ef39593e50f10063ac074b97e43558cfb80d773
diff --git a/org.eclipse.ote.ui.message.util/META-INF/MANIFEST.MF b/org.eclipse.ote.ui.message.util/META-INF/MANIFEST.MF
index 39d86a9..9ac3415 100644
--- a/org.eclipse.ote.ui.message.util/META-INF/MANIFEST.MF
+++ b/org.eclipse.ote.ui.message.util/META-INF/MANIFEST.MF
@@ -15,6 +15,7 @@
 Export-Package: org.eclipse.ote.ui.message.util
 Import-Package: org.eclipse.osee.framework.jdk.core.persistence,
  org.eclipse.osee.framework.plugin.core.util,
+ org.eclipse.osee.framework.ui.swt,
  org.eclipse.osee.ote.messaging.dds.service,
  org.eclipse.ote.message.lookup
 Bundle-Vendor: Eclipse Open System Engineering Environment
diff --git a/org.eclipse.ote.ui.message.util/build.properties b/org.eclipse.ote.ui.message.util/build.properties
index 34d2e4d..c6baffa 100644
--- a/org.eclipse.ote.ui.message.util/build.properties
+++ b/org.eclipse.ote.ui.message.util/build.properties
@@ -1,4 +1,5 @@
 source.. = src/
 output.. = bin/
 bin.includes = META-INF/,\
-               .
+               .,\
+               icons/
diff --git a/org.eclipse.ote.ui.message.util/icons/add.png b/org.eclipse.ote.ui.message.util/icons/add.png
new file mode 100644
index 0000000..5b051f6
--- /dev/null
+++ b/org.eclipse.ote.ui.message.util/icons/add.png
Binary files differ
diff --git a/org.eclipse.ote.ui.message.util/icons/deleteAll.gif b/org.eclipse.ote.ui.message.util/icons/deleteAll.gif
new file mode 100644
index 0000000..28a3785
--- /dev/null
+++ b/org.eclipse.ote.ui.message.util/icons/deleteAll.gif
Binary files differ
diff --git a/org.eclipse.ote.ui.message.util/icons/remove.png b/org.eclipse.ote.ui.message.util/icons/remove.png
new file mode 100644
index 0000000..7fb4e90
--- /dev/null
+++ b/org.eclipse.ote.ui.message.util/icons/remove.png
Binary files differ
diff --git a/org.eclipse.ote.ui.message.util/src/org/eclipse/ote/ui/message/util/AddMessagesAction.java b/org.eclipse.ote.ui.message.util/src/org/eclipse/ote/ui/message/util/AddMessagesAction.java
new file mode 100644
index 0000000..4f53bf3
--- /dev/null
+++ b/org.eclipse.ote.ui.message.util/src/org/eclipse/ote/ui/message/util/AddMessagesAction.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ote.ui.message.util;
+
+import java.util.ArrayList;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.window.Window;
+import org.eclipse.osee.framework.ui.swt.Displays;
+import org.eclipse.ote.message.lookup.MessageLookupResult;
+import org.eclipse.ote.ui.message.util.MessageSelectionDialog;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class AddMessagesAction extends Action {
+
+
+	private final MessageSelectComposite composite;
+	
+   public AddMessagesAction(MessageSelectComposite composite) {
+      super("Select Messages", IAction.AS_PUSH_BUTTON);
+      setToolTipText("Select messages to append to the list of messages that will be recorded");
+      this.composite = composite;
+      setImageDescriptor(Images.ADD.getImageDescriptor());
+      
+   }
+
+   @Override
+   public void run() {
+      Shell shell = Displays.getActiveShell();
+      MessageSelectionDialog msgSelectionDialog = new MessageSelectionDialog(shell);
+      msgSelectionDialog.setMultipleSelection(true);
+      if (msgSelectionDialog.open() == Window.OK) {
+         Object[] result = (Object[])msgSelectionDialog.getResult();
+         ArrayList<MessageLookupResult> list = new ArrayList<MessageLookupResult>(result.length);
+         for (Object item : result) {
+        	 MessageLookupResult lookupResult = (MessageLookupResult) item;
+        	 list.add(lookupResult);
+         }
+         composite.addMessages(list);
+      }
+
+   }
+
+}
diff --git a/org.eclipse.ote.ui.message.util/src/org/eclipse/ote/ui/message/util/DeleteAllMessagesAction.java b/org.eclipse.ote.ui.message.util/src/org/eclipse/ote/ui/message/util/DeleteAllMessagesAction.java
new file mode 100644
index 0000000..b13a3a1
--- /dev/null
+++ b/org.eclipse.ote.ui.message.util/src/org/eclipse/ote/ui/message/util/DeleteAllMessagesAction.java
@@ -0,0 +1,20 @@
+package org.eclipse.ote.ui.message.util;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+
+public class DeleteAllMessagesAction extends Action{
+	private final MessageSelectComposite composite;
+
+	public DeleteAllMessagesAction(MessageSelectComposite composite) {
+		super("Delete All Messages", IAction.AS_PUSH_BUTTON);
+		setToolTipText("Delete all messages from the recording list");
+		this.composite = composite;
+		setImageDescriptor(Images.DELETE_ALL.getImageDescriptor());
+
+	}
+
+	public void run() {
+		composite.deleteAll();
+	}
+}
diff --git a/org.eclipse.ote.ui.message.util/src/org/eclipse/ote/ui/message/util/DeleteMessagesAction.java b/org.eclipse.ote.ui.message.util/src/org/eclipse/ote/ui/message/util/DeleteMessagesAction.java
new file mode 100644
index 0000000..a61f5d9
--- /dev/null
+++ b/org.eclipse.ote.ui.message.util/src/org/eclipse/ote/ui/message/util/DeleteMessagesAction.java
@@ -0,0 +1,19 @@
+package org.eclipse.ote.ui.message.util;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+
+public class DeleteMessagesAction extends Action{
+	private final MessageSelectComposite composite;
+	
+	public DeleteMessagesAction(MessageSelectComposite composite) {
+		super("Delete Selected Messages", IAction.AS_PUSH_BUTTON);
+		setToolTipText("Delete all selected from the recording list");
+		setImageDescriptor(Images.DELETE.getImageDescriptor());
+		this.composite = composite;
+	}
+
+	public void run() {
+		composite.deleteSelection();
+	}
+}
diff --git a/org.eclipse.ote.ui.message.util/src/org/eclipse/ote/ui/message/util/Images.java b/org.eclipse.ote.ui.message.util/src/org/eclipse/ote/ui/message/util/Images.java
new file mode 100644
index 0000000..7904a3b
--- /dev/null
+++ b/org.eclipse.ote.ui.message.util/src/org/eclipse/ote/ui/message/util/Images.java
@@ -0,0 +1,64 @@
+package org.eclipse.ote.ui.message.util;
+
+import java.io.IOException;
+import java.net.URL;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.swt.graphics.Image;
+import org.osgi.framework.FrameworkUtil;
+
+public enum Images {
+	ADD("icons/add.png"),
+	DELETE_ALL("icons/deleteAll.gif"),
+	DELETE("icons/remove.png"),
+	RECORD("icons/record_action.png");
+	
+	private final String path;
+
+	private static ImageRegistry ir = new ImageRegistry();
+	/**
+	 * @param path
+	 */
+	private Images(String path) {
+		this.path = path;
+	}
+
+	/**
+	 * @return the path
+	 */
+	public String getPath() {
+		return path;
+	}
+	
+	public Image getImage() {
+		Image image = ir.get(path);
+		if (image == null) {
+			image = ImageDescriptor.createFromURL(getFile(path)).createImage();
+			ir.put(path, image);
+		}
+		return image;
+	}
+	
+	public ImageDescriptor getImageDescriptor() {
+		ImageDescriptor descriptor = ir.getDescriptor(path);
+		if (descriptor == null) {
+			descriptor = ImageDescriptor.createFromURL(getFile(path));
+			ir.put(path, descriptor);
+		}
+		return descriptor;
+	}
+	
+	private static URL getFile(String path) {
+		URL url = FrameworkUtil.getBundle(Images.class).getEntry(path);
+		if (url == null) {
+			return null;
+		}
+		try {
+			return FileLocator.resolve(url);
+		} catch (IOException e) {
+			throw new RuntimeException("could not resolve URL from path: " + path, e);
+		}
+	}
+}
diff --git a/org.eclipse.ote.ui.message.util/src/org/eclipse/ote/ui/message/util/MessageSelectComposite.java b/org.eclipse.ote.ui.message.util/src/org/eclipse/ote/ui/message/util/MessageSelectComposite.java
new file mode 100644
index 0000000..5abf523
--- /dev/null
+++ b/org.eclipse.ote.ui.message.util/src/org/eclipse/ote/ui/message/util/MessageSelectComposite.java
@@ -0,0 +1,224 @@
+package org.eclipse.ote.ui.message.util;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+
+import org.eclipse.jface.action.ActionContributionItem;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.osee.framework.ui.swt.Widgets;
+import org.eclipse.ote.message.lookup.MessageLookupResult;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Menu;
+
+public class MessageSelectComposite extends Composite{
+
+	
+	private final TableViewer viewer;
+
+	private final HashSet<MessageLookupResult> items = new HashSet<MessageLookupResult>();
+
+	private final AddMessagesAction addMessageAction;
+	private final DeleteMessagesAction deleteMessageAction;
+	private final DeleteAllMessagesAction deleteAllMessagesAction;
+	
+//	private Button browseBtn;
+
+	public MessageSelectComposite(Composite parent, int style) {
+		super(parent, style);
+		Widgets.setFormLayout(this, 5, 5);
+//		Label label = new Label(this, SWT.RIGHT);
+//		label.setText("Output File:");
+		
+//		outputFilePathTxt = new Text(this, SWT.SINGLE | SWT.BORDER);
+//		outputFilePathTxt.addModifyListener(new ModifyListener() {
+//			
+//			@Override
+//			public void modifyText(ModifyEvent e) {
+////				updateUiStatus();
+//			}
+//		});
+//		browseBtn = new Button(this, SWT.PUSH);
+//		browseBtn.setText("Browse");
+//		browseBtn.addSelectionListener(new SelectionAdapter() {
+//
+//			@Override
+//			public void widgetSelected(SelectionEvent e) {
+//				doBrowseForFile();
+//			}
+//		});
+		addMessageAction = new AddMessagesAction(this);
+      deleteMessageAction = new DeleteMessagesAction(this);
+      deleteAllMessagesAction = new DeleteAllMessagesAction(this);
+      
+		Label titleLabel = new Label(this, SWT.LEFT);
+		titleLabel.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT));
+		titleLabel.setText("Selected Messages");		
+		titleLabel.setBackground(getBackground());
+		viewer = new TableViewer(this, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL);
+		viewer.setContentProvider(new ArrayContentProvider());
+		viewer.setLabelProvider(new LabelProvider() {
+			
+			@Override
+			public String getText(Object element) {
+			   MessageLookupResult item = (MessageLookupResult) element;
+				return String.format("%s [%s]", item.getMessageName(), item.getMessageType());
+			}
+			
+			
+		});
+		
+		
+		ActionContributionItem addItem = new ActionContributionItem(addMessageAction);
+		addItem.fill(this);
+		Button addButton = (Button)addItem.getWidget();
+		
+		ActionContributionItem delItem = new ActionContributionItem(deleteMessageAction);
+		delItem.fill(this);
+      Button delButton = (Button)delItem.getWidget();
+      
+      ActionContributionItem delAllItem = new ActionContributionItem(deleteAllMessagesAction);
+      delAllItem.fill(this);
+      Button delAllButton = (Button)delAllItem.getWidget();
+		
+		
+//		Label statusLabel = new Label(this, SWT.RIGHT);
+//		statusLabel.setText("Status:");
+//		
+//		statusValueLabel = new Label(this, SWT.LEFT);
+//		statusValueLabel.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT));
+		
+//		Widgets.attachToParent(outputFilePathTxt, SWT.TOP, 0, 5);
+//		Widgets.attachToControl(label, outputFilePathTxt, SWT.TOP, SWT.CENTER, 0);
+//		Widgets.attachToControl(browseBtn, outputFilePathTxt, SWT.TOP, SWT.CENTER, 0);
+//		
+//		Widgets.attachToParent(label, SWT.LEFT, 0, 0);
+//		Widgets.attachToControl(outputFilePathTxt, label, SWT.LEFT, SWT.RIGHT, 5);
+//		Widgets.attachToControl(outputFilePathTxt, browseBtn, SWT.RIGHT, SWT.LEFT, -5);
+
+//		Widgets.attachToParent(browseBtn, SWT.RIGHT, 100, 0);
+//
+//		Widgets.attachToControl(titleLabel, browseBtn, SWT.TOP, SWT.BOTTOM, 5);
+		Widgets.attachToParent(titleLabel, SWT.LEFT, 0, 0);
+		Widgets.attachToParent(titleLabel, SWT.RIGHT, 100, 0);
+
+		Widgets.attachToControl(viewer.getControl(), titleLabel, SWT.TOP, SWT.BOTTOM, 0);
+		Widgets.attachToParent(viewer.getControl(), SWT.LEFT, 0, 0, 400, 600);
+//		final Object ld = viewer.getControl().getLayoutData();
+//		final FormData fd = ld != null ? (FormData) ld : new FormData();
+//      fd.bottom = new FormAttachment(100, 100, 0);
+      
+      Widgets.attachToParent(viewer.getControl(), SWT.BOTTOM, 100, 0);
+		
+		Widgets.attachToParent(addButton, SWT.RIGHT, 100, 0, 400, 600);
+		Widgets.attachToParent(delButton, SWT.RIGHT, 100, 0, 400, 600);
+		Widgets.attachToParent(delAllButton, SWT.RIGHT, 100, 0, 400, 600);
+		
+		Widgets.attachToControl(viewer.getControl(), addButton, SWT.RIGHT, SWT.LEFT, 0);
+		Widgets.attachToControl(viewer.getControl(), delButton, SWT.RIGHT, SWT.LEFT, 0);
+		Widgets.attachToControl(viewer.getControl(), delAllButton, SWT.RIGHT, SWT.LEFT, 0);
+
+		Widgets.attachToControl(addButton, titleLabel, SWT.TOP, SWT.BOTTOM, 0);
+		Widgets.attachToControl(delButton, addButton, SWT.TOP, SWT.BOTTOM, 0);
+		Widgets.attachToControl(delAllButton, delButton, SWT.TOP, SWT.BOTTOM, 0);
+		
+		hookContextMenu();
+	}
+	
+	private void hookContextMenu() {
+      MenuManager menuMgr = new MenuManager("#PopupMenu");
+      menuMgr.setRemoveAllWhenShown(true);
+      menuMgr.addMenuListener(new IMenuListener() {
+         @Override
+         public void menuAboutToShow(IMenuManager manager) {
+            manager.add(addMessageAction);
+            manager.add(deleteMessageAction);
+            manager.add(deleteAllMessagesAction);
+         }
+      });
+      Menu menu = menuMgr.createContextMenu(this.getViewer().getControl());
+      this.getViewer().getControl().setMenu(menu);
+   }
+
+	
+//	private void doBrowseForFile() {
+//		FileDialog dialog = new FileDialog(Display.getDefault().getActiveShell(), SWT.SAVE);
+//		dialog.setFilterExtensions(new String[]{"*.bmr"});
+//		dialog.setFilterIndex(0);
+//		dialog.setOverwrite(false);
+//		String path = dialog.open();
+//		if (path != null) {
+//			outputFilePathTxt.setText(path);
+//		}
+//	}
+	
+	TableViewer getViewer() {
+		return viewer;
+	}
+
+	void addMessages(Collection<MessageLookupResult> messages) {
+		items.addAll(messages);
+		setInput();
+	}
+	
+	void deleteAll() {
+		items.clear();
+		setInput();
+	}
+	
+	void deleteSelection() {
+		items.removeAll(Arrays.asList(((IStructuredSelection)viewer.getSelection()).toArray()));
+		setInput();
+	}
+	
+	private void setInput() {
+		viewer.setInput(items.toArray());
+	}
+	
+//	private static boolean isValidPath(String string) {
+//		if (string == null || string.isEmpty()) {
+//			return false;
+//		}
+//		File file = new File(string);
+//		// check parent directory
+//		File dir = file.getParentFile();
+//		return dir != null && dir.isDirectory() && dir.exists();
+//	}
+	
+	public AddMessagesAction getAddMessageAction() {
+		return addMessageAction;
+	}
+
+	public DeleteMessagesAction getDeleteMessageAction() {
+		return deleteMessageAction;
+	}
+
+	public DeleteAllMessagesAction getDeleteAllMessagesAction() {
+		return deleteAllMessagesAction;
+	}
+
+   public HashSet<MessageLookupResult> getMessages() {
+      return items;
+   }
+
+   public void setMessages(HashSet<MessageLookupResult> messages) {
+      if(messages != null){
+         items.addAll(messages);
+         setInput();
+      }
+   }
+
+}