Add Picto multiview and editor pinning support
diff --git a/plugins/org.eclipse.epsilon.picto/icons/newPictoView.png b/plugins/org.eclipse.epsilon.picto/icons/newPictoView.png
new file mode 100644
index 0000000..4eff4c9
--- /dev/null
+++ b/plugins/org.eclipse.epsilon.picto/icons/newPictoView.png
Binary files differ
diff --git a/plugins/org.eclipse.epsilon.picto/icons/pin.png b/plugins/org.eclipse.epsilon.picto/icons/pin.png
new file mode 100644
index 0000000..fd0ad18
--- /dev/null
+++ b/plugins/org.eclipse.epsilon.picto/icons/pin.png
Binary files differ
diff --git a/plugins/org.eclipse.epsilon.picto/src/org/eclipse/epsilon/picto/PictoView.java b/plugins/org.eclipse.epsilon.picto/src/org/eclipse/epsilon/picto/PictoView.java
index 32176e0..214a7ca 100644
--- a/plugins/org.eclipse.epsilon.picto/src/org/eclipse/epsilon/picto/PictoView.java
+++ b/plugins/org.eclipse.epsilon.picto/src/org/eclipse/epsilon/picto/PictoView.java
@@ -65,6 +65,7 @@
 	protected int[] sashFormWeights = null;
 	protected IEditorPart renderedEditor = null;
 	protected boolean locked = false;
+	protected boolean pinned = false;
 	protected ToggleTreeViewerAction hideTreeAction;
 	protected HashMap<IEditorPart, ViewTree> activeViewHistory = new HashMap<>();
 	protected ViewTree activeView = null;
@@ -175,7 +176,7 @@
 			
 			@Override
 			public void partActivated(IWorkbenchPartReference partRef) {
-				if (locked) return;
+				if (locked || pinned) return;
 				Display.getCurrent().asyncExec(() -> {
 					IWorkbenchPart part = partRef.getPart(false);
 					
@@ -203,7 +204,7 @@
 				IEditorPart editorPart = (IEditorPart) workbenchPart;
 				activeViewHistory.remove(editorPart);
 				
-				if (locked) {
+				if (locked || pinned) {
 					if (editor == editorPart) editor = null;
 					return;
 				}
@@ -229,11 +230,14 @@
 		toolbar.add(new RefreshAction(this));
 		toolbar.add(new LockAction(this));
 		toolbar.add(new Separator());
+		toolbar.add(new PinAction(this));
+		toolbar.add(new NewPictoViewAction());
+		toolbar.add(new Separator());
 		toolbar.add(hideTreeAction);
 		toolbar.add(new MoveTreeAction());
 		toolbar.add(new Separator());
 		toolbar.add(new ViewContentsMenuAction(this));
-		
+
 		IMenuManager dropDownMenu = getViewSite().getActionBars().getMenuManager();
 		dropDownMenu.add(new ClearViewTreeLabelProviderIconCacheAction());
 		dropDownMenu.add(new ToggleVerbatimSourcesAction());
@@ -603,4 +607,12 @@
 		return viewTreeSelectionHistory;
 	}
 
+	public boolean isPinned() {
+		return pinned;
+	}
+
+	public void setPinned(boolean pinned) {
+		this.pinned = pinned;
+	}
+
 }
diff --git a/plugins/org.eclipse.epsilon.picto/src/org/eclipse/epsilon/picto/actions/NewPictoViewAction.java b/plugins/org.eclipse.epsilon.picto/src/org/eclipse/epsilon/picto/actions/NewPictoViewAction.java
new file mode 100644
index 0000000..156bf9d
--- /dev/null
+++ b/plugins/org.eclipse.epsilon.picto/src/org/eclipse/epsilon/picto/actions/NewPictoViewAction.java
@@ -0,0 +1,30 @@
+package org.eclipse.epsilon.picto.actions;
+
+import org.eclipse.epsilon.picto.PictoPlugin;
+import org.eclipse.epsilon.picto.PictoView;
+import org.eclipse.jface.action.Action;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PlatformUI;
+
+public class NewPictoViewAction extends Action {
+
+	protected boolean running = false;
+
+	public NewPictoViewAction() {
+		this.setText("New Picto View");
+		this.setImageDescriptor(PictoPlugin.getDefault().getImageDescriptor("icons/newPictoView.png"));
+	}
+
+	@Override
+	public void run() {
+
+		IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+		try {
+			activePage.showView(PictoView.ID, Math.random() * 1000 + "", IWorkbenchPage.VIEW_ACTIVATE);
+		}
+		catch (Exception ex) {
+			ex.printStackTrace();
+		}
+	}
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.epsilon.picto/src/org/eclipse/epsilon/picto/actions/PinAction.java b/plugins/org.eclipse.epsilon.picto/src/org/eclipse/epsilon/picto/actions/PinAction.java
new file mode 100644
index 0000000..eb97dde
--- /dev/null
+++ b/plugins/org.eclipse.epsilon.picto/src/org/eclipse/epsilon/picto/actions/PinAction.java
@@ -0,0 +1,30 @@
+/*********************************************************************
+* Copyright (c) 2008 The University of York.
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+**********************************************************************/
+package org.eclipse.epsilon.picto.actions;
+
+import org.eclipse.epsilon.picto.PictoPlugin;
+import org.eclipse.epsilon.picto.PictoView;
+import org.eclipse.jface.action.Action;
+
+public class PinAction extends Action {
+	
+	protected PictoView pictoView;
+	
+	public PinAction(PictoView pictoView) {
+		super("Pin to current editor", AS_CHECK_BOX);
+		setImageDescriptor(PictoPlugin.getDefault().getImageDescriptor("icons/pin.png"));
+		this.pictoView = pictoView;
+	}
+	
+	@Override
+	public void run() {
+		pictoView.setPinned(!pictoView.isPinned());
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.epsilon.picto/src/org/eclipse/epsilon/picto/source/EglPictoSource.java b/plugins/org.eclipse.epsilon.picto/src/org/eclipse/epsilon/picto/source/EglPictoSource.java
index 7bb830a..8f860d7 100644
--- a/plugins/org.eclipse.epsilon.picto/src/org/eclipse/epsilon/picto/source/EglPictoSource.java
+++ b/plugins/org.eclipse.epsilon.picto/src/org/eclipse/epsilon/picto/source/EglPictoSource.java
@@ -90,8 +90,11 @@
 			//}
 			//else {
 			if (resource != null) {
-				model = new InMemoryEmfModel("M", resource);
-				((InMemoryEmfModel) model).setExpand(true);
+				// synchronization prevents races when using multiple Picto views
+				synchronized (resource) {
+					model = new InMemoryEmfModel("M", resource);
+					((InMemoryEmfModel) model).setExpand(true);
+				}
 			}
 			//}