From 5588d3781bfaadf760ea4386c2d319fa5dc411d7 Mon Sep 17 00:00:00 2001
From: Lukas Ladenberger <lukas.ladenberger@googlemail.com>
Date: Fri, 4 Jan 2013 12:49:08 +0100
Subject: [PATCH] implemented control panel for managing open simulations

---
 de.bmotionstudio.gef.editor/plugin.xml        |  18 +-
 .../gef/editor/BMSPerspectiveFactory.java     |  22 +-
 .../gef/editor/BMotionEditorPlugin.java       |  22 +
 .../gef/editor/BMotionOutlinePage.java        |   2 +-
 .../gef/editor/BMotionStudioEditor.java       |  14 +-
 .../gef/editor/VisualizationViewPart.java     | 578 +++++++-----------
 .../gef/editor/model/Simulation.java          |  42 ++
 7 files changed, 321 insertions(+), 377 deletions(-)

diff --git a/de.bmotionstudio.gef.editor/plugin.xml b/de.bmotionstudio.gef.editor/plugin.xml
index d44d7914..4db1b733 100644
--- a/de.bmotionstudio.gef.editor/plugin.xml
+++ b/de.bmotionstudio.gef.editor/plugin.xml
@@ -13,17 +13,15 @@
    <extension
          point="org.eclipse.ui.editors">
       <editor
-            class="de.bmotionstudio.gef.editor.BMotionStudioEditor"
-            contributorClass="de.bmotionstudio.gef.editor.BMotionStudioContributor"
             default="true"
             extensions="bmso"
             icon="icons/logo_bmotion.png"
             id="de.bmotionstudio.gef.editor.BMotionStudioEditor"
+            launcher="de.bmotionstudio.gef.editor.BMotionStudioLauncher"
             name="BMotion Studio">
-      </editor>
-   </extension>
-   <extension
-         point="org.eclipse.ui.newWizards">
+            </editor>
+            </extension>
+         <extension point="org.eclipse.ui.newWizards">
       <category
             id="de.bmotionstudio.gef.editor.wizards"
             name="BMotion Studio">
@@ -85,6 +83,14 @@
             name="Outline"
             restorable="true">
       </view>
+      <view
+            allowMultiple="false"
+            category="de.bmotionstudio.views"
+            class="de.bmotionstudio.gef.editor.controlpanel.ControlPanel"
+            id="de.bmotionstudio.gef.editor.ControlPanel"
+            name="Control Panel"
+            restorable="true">
+      </view>
    </extension>
    <extension
          point="org.eclipse.ui.menus">
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMSPerspectiveFactory.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMSPerspectiveFactory.java
index 0c2eb123..c62ac993 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMSPerspectiveFactory.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMSPerspectiveFactory.java
@@ -4,6 +4,7 @@ import org.eclipse.ui.IFolderLayout;
 import org.eclipse.ui.IPageLayout;
 import org.eclipse.ui.IPerspectiveFactory;
 
+import de.bmotionstudio.gef.editor.controlpanel.ControlPanel;
 import de.bmotionstudio.gef.editor.library.LibraryView;
 import de.bmotionstudio.gef.editor.observer.view.ObserverView;
 
@@ -14,6 +15,8 @@ public class BMSPerspectiveFactory implements IPerspectiveFactory {
 	@Override
 	public void createInitialLayout(IPageLayout layout) {
 
+		layout.setEditorAreaVisible(false);
+		
 		String editorArea = layout.getEditorArea();
 
 		// ProB Event View (Top-Left)
@@ -27,42 +30,29 @@ public class BMSPerspectiveFactory implements IPerspectiveFactory {
 		leftb.addView("de.prob.ui.HistoryView");
 		leftb.addView("de.prob.ui.EventErrorView");
 
-		// Navigator + Rodin Problem View (Bottom-Left)
-		// IFolderLayout leftb = layout.createFolder("leftb",
-		// IPageLayout.BOTTOM,
-		// 0.6f, "left");
-		// leftb.addView("fr.systerel.explorer.navigator.view");
-
 		// Outline View + Palette View + Library View (Right)
 		IFolderLayout right1 = layout.createFolder("right1", IPageLayout.RIGHT,
 				0.80f, editorArea);
 		right1.addView(BMSPaletteView.ID);
 		right1.addView(BMotionOutlineView.ID);
 
+		// Library View + Event-B Explorer
 		IFolderLayout right2 = layout.createFolder("right2",
 				IPageLayout.BOTTOM, 0.60f, "right1");
 		right2.addView(LibraryView.ID);
 		right2.addView("fr.systerel.explorer.navigator.view");
 
-		// ProB State View + ProB History + ProB Event Error View (Right)
-		// IFolderLayout right2 = layout.createFolder("right2",
-		// IPageLayout.RIGHT,
-		// 0.6f, "right1");
-		// right2.addView("de.prob.ui.StateView");
-		// right2.addView("de.prob.ui.HistoryView");
-		// right2.addView("de.prob.ui.EventErrorView");
-
 		// Placeholder for new visualization views
 		IFolderLayout top = layout.createFolder("bottom1", IPageLayout.BOTTOM,
 				0.20f, IPageLayout.ID_EDITOR_AREA);
 		top.addPlaceholder(VisualizationViewPart.ID + ":*");
 
-		// Properties view + observer view + placeholder for new visualization
-		// views
+		// Properties view + observer view + control panel
 		IFolderLayout bottom = layout.createFolder("bottom2",
 				IPageLayout.BOTTOM, 0.65f, "bottom1");
 		bottom.addView(IPageLayout.ID_PROP_SHEET);
 		bottom.addView(ObserverView.ID);
+		bottom.addView(ControlPanel.ID);
 		
 	}
 
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionEditorPlugin.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionEditorPlugin.java
index 5317ce24..6e958334 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionEditorPlugin.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionEditorPlugin.java
@@ -8,6 +8,8 @@ package de.bmotionstudio.gef.editor;
 
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 import org.eclipse.core.runtime.IConfigurationElement;
 import org.eclipse.core.runtime.IExtension;
@@ -40,6 +42,8 @@ public class BMotionEditorPlugin extends AbstractUIPlugin {
 
 	public static final String FILEEXT_STUDIO = "bmso";
 
+	public static List<ISimulationListener> openSimulationListeners = new ArrayList<ISimulationListener>();
+
 	// The shared instance
 	private static BMotionEditorPlugin plugin;
 
@@ -55,6 +59,8 @@ public class BMotionEditorPlugin extends AbstractUIPlugin {
 
 	static BMotionStudioEditorPage activeBMotionStudioEditor = null;
 
+	public static Map<String, Simulation> openSimulations = new HashMap<String, Simulation>();
+
 	/**
 	 * The constructor
 	 */
@@ -222,4 +228,20 @@ public class BMotionEditorPlugin extends AbstractUIPlugin {
 		xstream.alias("children", BControlList.class);
 	}
 
+	public static void openSimulation(Simulation simulation) {
+		openSimulations.put(simulation.getProjectFile().getName(), simulation);
+		for (ISimulationListener l : openSimulationListeners)
+			l.openSimulation(simulation);
+	}
+
+	public static void closeSimulation(Simulation simulation) {
+		openSimulations.remove(simulation.getProjectFile().getName());
+		for (ISimulationListener l : openSimulationListeners)
+			l.closeSimulation(simulation);
+	}
+
+	public static Map<String, Simulation> getOpenSimulations() {
+		return openSimulations;
+	}
+
 }
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionOutlinePage.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionOutlinePage.java
index 4ec90be5..d9afc560 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionOutlinePage.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionOutlinePage.java
@@ -100,7 +100,7 @@ public class BMotionOutlinePage extends ContentOutlinePage {
 	}
 
 	private void initializeOutlineViewer() {
-		getViewer().setContents(viewPart.getVisualization());
+		// getViewer().setContents(viewPart.getVisualization());
 	}
 
 	/**
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionStudioEditor.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionStudioEditor.java
index 05ca297d..8dd24ca4 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionStudioEditor.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionStudioEditor.java
@@ -292,7 +292,6 @@ public class BMotionStudioEditor extends EditorPart implements
 						"New Visualization View", visualization);
 
 				String secId = UUID.randomUUID().toString();
-				createVisualizationViewPart(secId, visualizationView);
 
 				simulation.getVisualizationViews()
 						.put(secId, visualizationView);
@@ -317,7 +316,10 @@ public class BMotionStudioEditor extends EditorPart implements
 					// if (viewReference != null) {
 					// } else {
 					// If not, create a new one
-					createVisualizationViewPart(secId, visView);
+					VisualizationViewPart visualizationViewPart = createVisualizationViewPart(
+							secId, visView);
+					visualizationViewPart.init(simulation, visView);
+
 					// }
 
 				}
@@ -348,17 +350,13 @@ public class BMotionStudioEditor extends EditorPart implements
 
 		setSite(site);
 		setInput(input);
-
+		
 		// getCommandStack().addCommandStackListener(getCommandStackListener());
 
 	}
 
 	private VisualizationViewPart createVisualizationViewPart(String secId,
-			VisualizationView visualizationView)
-			throws PartInitException {
-
-		System.out.println("CREATE VISUALIZATION PART: " + secId);
-
+			VisualizationView visualizationView) throws PartInitException {
 		IWorkbenchWindow window = PlatformUI.getWorkbench()
 				.getActiveWorkbenchWindow();
 		IWorkbenchPage activePage = window.getActivePage();
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/VisualizationViewPart.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/VisualizationViewPart.java
index d1713e10..e3dad235 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/VisualizationViewPart.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/VisualizationViewPart.java
@@ -4,7 +4,6 @@ import java.util.ArrayList;
 import java.util.EventObject;
 import java.util.Iterator;
 import java.util.List;
-import java.util.Map;
 
 import org.eclipse.core.runtime.IConfigurationElement;
 import org.eclipse.core.runtime.IExtension;
@@ -46,17 +45,11 @@ import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
 import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IViewSite;
 import org.eclipse.ui.IWorkbenchPart;
 import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.part.IPage;
-import org.eclipse.ui.part.IPageSite;
-import org.eclipse.ui.part.MessagePage;
-import org.eclipse.ui.part.Page;
-import org.eclipse.ui.part.PageBook;
-import org.eclipse.ui.part.PageBookView;
+import org.eclipse.ui.part.ViewPart;
 import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
 import org.eclipse.ui.views.properties.IPropertySheetPage;
 
@@ -72,7 +65,7 @@ import de.bmotionstudio.gef.editor.model.Visualization;
 import de.bmotionstudio.gef.editor.model.VisualizationView;
 import de.bmotionstudio.gef.editor.part.BMSEditPartFactory;
 
-public class VisualizationViewPart extends PageBookView implements
+public class VisualizationViewPart extends ViewPart implements
 		CommandStackListener {
 
 	public static String ID = "de.bmotionstudio.gef.editor.VisualizationView";
@@ -81,18 +74,22 @@ public class VisualizationViewPart extends PageBookView implements
 
 	private VisualizationView visualizationView;
 
-	private VisualizationViewPage page;
-
 	private ActionRegistry actionRegistry;
 
-	private Composite container;
-
-	private Simulation simulation;
-
 	private BMotionStudioEditor editor;
 
 	private BMotionSelectionSynchronizer selectionSynchronizer;
 
+	private RulerComposite container;
+
+	private GraphicalViewer graphicalViewer;
+
+	private ScalableRootEditPart rootEditPart;
+
+	private Simulation simulation;
+
+	private boolean isInitialized = false;
+
 	private List<String> selectionActions = new ArrayList<String>();
 	private List<String> stackActions = new ArrayList<String>();
 	private List<String> propertyActions = new ArrayList<String>();
@@ -137,76 +134,8 @@ public class VisualizationViewPart extends PageBookView implements
 		return selectionSynchronizer;
 	}
 
-	// Workaround for prevent recursive activation of part
-	@Override
-	public void setFocus() {
-		this.container.setFocus();
-		super.setFocus();
-	}
-
-	public Visualization getVisualization() {
-		if (this.visualizationView != null)
-			return this.visualizationView.getVisualization();
-		return null;
-	}
-
 	public GraphicalViewer getGraphicalViewer() {
-		if (page != null)
-			return page.getGraphicalViewer();
-		return null;
-	}
-
-	@Override
-	protected IPage createDefaultPage(PageBook book) {
-		MessagePage page = new MessagePage();
-		initPage(page);
-		page.createControl(book);
-		page.setMessage("NA");
-		return page;
-	}
-
-	@Override
-	public void createPartControl(Composite parent) {
-		this.container = parent;
-		super.createPartControl(parent);
-	}
-
-	@Override
-	protected PageRec doCreatePage(IWorkbenchPart part) {
-
-		if (part instanceof BMotionStudioEditor) {
-
-			BMotionStudioEditor cEditor = (BMotionStudioEditor) part;
-
-			this.simulation = cEditor.getSimulation();
-			if (this.simulation == null)
-				return null;
-
-			Map<String, VisualizationView> visualizationViews = this.simulation
-					.getVisualizationViews();
-
-			this.visualizationView = visualizationViews
-					.get(getViewSite().getSecondaryId());
-
-			if (visualizationView == null)
-				return null;
-
-			this.editor = cEditor;
-			this.editDomain = new EditDomain();
-			this.editDomain.getCommandStack().addCommandStackListener(this);
-
-			createActions();
-
-			page = new VisualizationViewPage();
-			initPage(page);
-			page.createControl(getPageBook());
-
-			return new PageRec(part, page);
-
-		}
-
-		return null;
-
+		return graphicalViewer;
 	}
 
 	/**
@@ -220,28 +149,6 @@ public class VisualizationViewPart extends PageBookView implements
 		return actionRegistry;
 	}
 
-	@Override
-	protected void doDestroyPage(IWorkbenchPart part, PageRec rec) {
-		unregister();
-		VisualizationViewPage page = (VisualizationViewPage) rec.page;
-		page.dispose();
-		rec.dispose();
-	}
-
-	@Override
-	protected IWorkbenchPart getBootstrapPart() {
-		IWorkbenchPage page = getSite().getPage();
-		if (page != null) {
-			return page.getActiveEditor();
-		}
-		return null;
-	}
-
-	@Override
-	protected boolean isImportant(IWorkbenchPart part) {
-		return part instanceof BMotionStudioEditor;
-	}
-
 	public EditDomain getEditDomain() {
 		return editDomain;
 	}
@@ -288,6 +195,47 @@ public class VisualizationViewPart extends PageBookView implements
 		action = new SelectAllAction(this);
 		registry.registerAction(action);
 
+		ZoomManager manager = rootEditPart.getZoomManager();
+		getActionRegistry().registerAction(new ZoomInAction(manager));
+		getActionRegistry().registerAction(new ZoomOutAction(manager));
+
+		double[] zoomLevels = new double[] { 0.25, 0.5, 0.75, 1.0, 1.5, 2.0,
+				2.5, 3.0, 4.0, 5.0, 10.0, 20.0 };
+		manager.setZoomLevels(zoomLevels);
+		ArrayList<String> zoomContributions = new ArrayList<String>();
+		zoomContributions.add(ZoomManager.FIT_ALL);
+		zoomContributions.add(ZoomManager.FIT_HEIGHT);
+		zoomContributions.add(ZoomManager.FIT_WIDTH);
+		manager.setZoomLevelContributions(zoomContributions);
+
+		getActionRegistry().registerAction(
+				new ToggleRulerVisibilityAction(getGraphicalViewer()) {
+					@Override
+					public void run() {
+						super.run();
+						setChecked(!isChecked());
+						editor.setDirty(true);
+					}
+				});
+		getActionRegistry().registerAction(
+				new ToggleSnapToGeometryAction(getGraphicalViewer()) {
+					@Override
+					public void run() {
+						super.run();
+						setChecked(!isChecked());
+						editor.setDirty(true);
+					}
+				});
+		getActionRegistry().registerAction(
+				new ToggleGridAction(getGraphicalViewer()) {
+					@Override
+					public void run() {
+						super.run();
+						setChecked(!isChecked());
+						editor.setDirty(true);
+					}
+				});
+
 		installObserverActions();
 		installSchedulerActions();
 
@@ -363,244 +311,6 @@ public class VisualizationViewPart extends PageBookView implements
 
 	}
 
-	private class VisualizationViewPage extends Page {
-
-		private RulerComposite container;
-
-		private GraphicalViewer graphicalViewer;
-
-		private ScalableRootEditPart rootEditPart;
-
-		@Override
-		public void init(IPageSite site) {
-			super.init(site);
-		}
-
-		private void createActions() {
-
-			ZoomManager manager = rootEditPart.getZoomManager();
-			getActionRegistry().registerAction(new ZoomInAction(manager));
-			getActionRegistry().registerAction(new ZoomOutAction(manager));
-
-			double[] zoomLevels = new double[] { 0.25, 0.5, 0.75, 1.0, 1.5,
-					2.0, 2.5, 3.0, 4.0, 5.0, 10.0, 20.0 };
-			manager.setZoomLevels(zoomLevels);
-			ArrayList<String> zoomContributions = new ArrayList<String>();
-			zoomContributions.add(ZoomManager.FIT_ALL);
-			zoomContributions.add(ZoomManager.FIT_HEIGHT);
-			zoomContributions.add(ZoomManager.FIT_WIDTH);
-			manager.setZoomLevelContributions(zoomContributions);
-
-			getActionRegistry().registerAction(
-					new ToggleRulerVisibilityAction(getGraphicalViewer()) {
-						@Override
-						public void run() {
-							super.run();
-							setChecked(!isChecked());
-							editor.setDirty(true);
-						}
-					});
-			getActionRegistry().registerAction(
-					new ToggleSnapToGeometryAction(getGraphicalViewer()) {
-						@Override
-						public void run() {
-							super.run();
-							setChecked(!isChecked());
-							editor.setDirty(true);
-						}
-					});
-			getActionRegistry().registerAction(
-					new ToggleGridAction(getGraphicalViewer()) {
-						@Override
-						public void run() {
-							super.run();
-							setChecked(!isChecked());
-							editor.setDirty(true);
-						}
-					});
-
-		}
-
-		private void buildActions() {
-
-			IActionBars bars = getSite().getActionBars();
-			ActionRegistry ar = getActionRegistry();
-
-			bars.setGlobalActionHandler(ActionFactory.UNDO.getId(),
-					ar.getAction(ActionFactory.UNDO.getId()));
-			bars.setGlobalActionHandler(ActionFactory.REDO.getId(),
-					ar.getAction(ActionFactory.REDO.getId()));
-
-			bars.setGlobalActionHandler(ActionFactory.COPY.getId(),
-					ar.getAction(ActionFactory.COPY.getId()));
-			bars.setGlobalActionHandler(ActionFactory.PASTE.getId(),
-					ar.getAction(ActionFactory.PASTE.getId()));
-
-			bars.setGlobalActionHandler(ActionFactory.DELETE.getId(),
-					ar.getAction(ActionFactory.DELETE.getId()));
-
-			bars.updateActionBars();
-
-		}
-
-		private void createMenu(final IPageSite pageSite) {
-
-			pageSite.getActionBars()
-					.getToolBarManager()
-					.add(getActionRegistry().getAction(
-							ActionFactory.UNDO.getId()));
-			pageSite.getActionBars()
-					.getToolBarManager()
-					.add(getActionRegistry().getAction(
-							ActionFactory.REDO.getId()));
-			pageSite.getActionBars()
-					.getToolBarManager()
-					.add(getActionRegistry().getAction(
-							ActionFactory.COPY.getId()));
-			pageSite.getActionBars()
-					.getToolBarManager()
-					.add(getActionRegistry().getAction(
-							ActionFactory.PASTE.getId()));
-			pageSite.getActionBars()
-					.getToolBarManager()
-					.add(getActionRegistry().getAction(
-							ActionFactory.DELETE.getId()));
-
-			pageSite.getActionBars().getToolBarManager().add(new Separator());
-
-			pageSite.getActionBars()
-					.getToolBarManager()
-					.add(getActionRegistry().getAction(
-							GEFActionConstants.ZOOM_IN));
-			pageSite.getActionBars()
-					.getToolBarManager()
-					.add(getActionRegistry().getAction(
-							GEFActionConstants.ZOOM_OUT));
-
-			pageSite.getActionBars()
-					.getMenuManager()
-					.add(getActionRegistry().getAction(
-							GEFActionConstants.TOGGLE_GRID_VISIBILITY));
-			pageSite.getActionBars()
-					.getMenuManager()
-					.add(getActionRegistry().getAction(
-							GEFActionConstants.TOGGLE_SNAP_TO_GEOMETRY));
-			pageSite.getActionBars()
-					.getMenuManager()
-					.add(getActionRegistry().getAction(
-							GEFActionConstants.TOGGLE_RULER_VISIBILITY));
-
-			pageSite.getActionBars().updateActionBars();
-
-			// TODO Reimplement me!
-			// pageSite.getActionBars().getToolBarManager()
-			// .add(new ZoomComboContributionItem(pageSite.getPage()));
-
-		}
-
-		@Override
-		public void createControl(Composite parent) {
-			container = new RulerComposite(parent, SWT.NONE);
-			graphicalViewer = new ScrollingGraphicalViewer();
-			graphicalViewer.createControl(container);
-			configureGraphicalViewer();
-			initGraphicalViewer();
-			hookGraphicalViewer();
-			loadProperties();
-			buildActions();
-			createActions();
-			createMenu(getSite());
-			setPartName(getVisualizationView().getName());
-		}
-
-		protected void hookGraphicalViewer() {
-			getSelectionSynchronizer().addViewer(getGraphicalViewer());
-			getSite().setSelectionProvider(getGraphicalViewer());
-		}
-
-		public void configureGraphicalViewer() {
-
-			rootEditPart = new ScalableRootEditPart();
-			rootEditPart.setViewer(graphicalViewer);
-			graphicalViewer.setRootEditPart(rootEditPart);
-			graphicalViewer.setEditPartFactory(new BMSEditPartFactory());
-			graphicalViewer.getControl().setBackground(ColorConstants.red);
-			container
-					.setGraphicalViewer((ScrollingGraphicalViewer) graphicalViewer);
-			graphicalViewer.setEditDomain(getEditDomain());
-			graphicalViewer
-					.addDropTargetListener(new BControlTransferDropTargetListener(
-							graphicalViewer, getVisualization()));
-			graphicalViewer.getControl().setBackground(ColorConstants.white);
-			
-			graphicalViewer
-					.addSelectionChangedListener(new ISelectionChangedListener() {
-						@Override
-						public void selectionChanged(SelectionChangedEvent event) {
-							updateActions(selectionActions);
-						}
-					});
-
-			ContextMenuProvider provider = new BMSContextMenuProvider(
-					graphicalViewer, getActionRegistry());
-			graphicalViewer.setContextMenu(provider);
-
-		}
-
-		public GraphicalViewer getGraphicalViewer() {
-			return graphicalViewer;
-		}
-
-		public void initGraphicalViewer() {
-			graphicalViewer.setContents(getVisualization());
-		}
-
-		@Override
-		public Control getControl() {
-			return container;
-		}
-
-		@Override
-		public void setFocus() {
-		}
-
-		protected void loadProperties() {
-
-			// Ruler properties
-			BMotionRuler ruler = getVisualization().getRuler(
-					PositionConstants.WEST);
-			RulerProvider provider = null;
-			if (ruler != null) {
-				provider = new BMotionRulerProvider(ruler);
-			}
-			getGraphicalViewer().setProperty(
-					RulerProvider.PROPERTY_VERTICAL_RULER, provider);
-			ruler = getVisualization().getRuler(PositionConstants.NORTH);
-			provider = null;
-			if (ruler != null) {
-				provider = new BMotionRulerProvider(ruler);
-			}
-			getGraphicalViewer().setProperty(
-					RulerProvider.PROPERTY_HORIZONTAL_RULER, provider);
-			getGraphicalViewer().setProperty(
-					RulerProvider.PROPERTY_RULER_VISIBILITY,
-					getVisualization().getRulerVisibility());
-			getGraphicalViewer().setProperty(
-					SnapToGeometry.PROPERTY_SNAP_ENABLED,
-					getVisualization().isSnapToGeometryEnabled());
-			getGraphicalViewer().setProperty(SnapToGrid.PROPERTY_GRID_ENABLED,
-					getVisualization().isGridEnabled());
-			getGraphicalViewer().setProperty(SnapToGrid.PROPERTY_GRID_VISIBLE,
-					getVisualization().isGridEnabled());
-
-			getGraphicalViewer().setProperty(
-					MouseWheelHandler.KeyGenerator.getKey(SWT.NONE),
-					MouseWheelZoomHandler.SINGLETON);
-
-		}
-
-	}
-
 	@Override
 	public void dispose() {
 		unregister();
@@ -617,7 +327,7 @@ public class VisualizationViewPart extends PageBookView implements
 	@Override
 	public void commandStackChanged(EventObject event) {
 		updateActions(stackActions);
-		this.editor.setDirty(getCommandStack().isDirty());
+		simulation.setDirty(getCommandStack().isDirty());
 	}
 
 	/**
@@ -652,4 +362,180 @@ public class VisualizationViewPart extends PageBookView implements
 		return selectionActions;
 	}
 
+	@Override
+	public void createPartControl(Composite parent) {
+		container = new RulerComposite(parent, SWT.NONE);
+	}
+
+	@Override
+	public void setFocus() {
+	}
+
+	public void init(Simulation simulation, VisualizationView visualizationView) {
+		this.simulation = simulation;
+		this.graphicalViewer = new ScrollingGraphicalViewer();
+		this.graphicalViewer.createControl(this.container);
+		Visualization visualization = visualizationView.getVisualization();
+		this.editDomain = new EditDomain();
+		this.editDomain.getCommandStack().addCommandStackListener(this);
+		configureGraphicalViewer(visualization);
+		hookGraphicalViewer();
+		loadProperties(visualization);
+		buildActions();
+		createActions();
+		createMenu(getViewSite());
+		setPartName(visualizationView.getName());
+		getGraphicalViewer().setContents(visualization);
+		setInitialized(true);
+	}
+
+	protected void hookGraphicalViewer() {
+		getSelectionSynchronizer().addViewer(getGraphicalViewer());
+		getSite().setSelectionProvider(getGraphicalViewer());
+	}
+
+	public void configureGraphicalViewer(Visualization visualization) {
+
+		rootEditPart = new ScalableRootEditPart();
+		rootEditPart.setViewer(graphicalViewer);
+		graphicalViewer.setRootEditPart(rootEditPart);
+		graphicalViewer.setEditPartFactory(new BMSEditPartFactory());
+		container
+				.setGraphicalViewer((ScrollingGraphicalViewer) graphicalViewer);
+		graphicalViewer.setEditDomain(getEditDomain());
+		graphicalViewer
+				.addDropTargetListener(new BControlTransferDropTargetListener(
+						graphicalViewer, visualization));
+		graphicalViewer.getControl().setBackground(ColorConstants.white);
+
+		graphicalViewer
+				.addSelectionChangedListener(new ISelectionChangedListener() {
+					@Override
+					public void selectionChanged(SelectionChangedEvent event) {
+						updateActions(selectionActions);
+					}
+				});
+
+		ContextMenuProvider provider = new BMSContextMenuProvider(
+				graphicalViewer, getActionRegistry());
+		graphicalViewer.setContextMenu(provider);
+
+	}
+
+	private void buildActions() {
+
+		IActionBars bars = getViewSite().getActionBars();
+		ActionRegistry ar = getActionRegistry();
+
+		bars.setGlobalActionHandler(ActionFactory.UNDO.getId(),
+				ar.getAction(ActionFactory.UNDO.getId()));
+		bars.setGlobalActionHandler(ActionFactory.REDO.getId(),
+				ar.getAction(ActionFactory.REDO.getId()));
+
+		bars.setGlobalActionHandler(ActionFactory.COPY.getId(),
+				ar.getAction(ActionFactory.COPY.getId()));
+		bars.setGlobalActionHandler(ActionFactory.PASTE.getId(),
+				ar.getAction(ActionFactory.PASTE.getId()));
+
+		bars.setGlobalActionHandler(ActionFactory.DELETE.getId(),
+				ar.getAction(ActionFactory.DELETE.getId()));
+
+		bars.updateActionBars();
+
+	}
+
+	private void createMenu(final IViewSite iViewSite) {
+
+		iViewSite.getActionBars().getToolBarManager()
+				.add(getActionRegistry().getAction(ActionFactory.UNDO.getId()));
+		iViewSite.getActionBars().getToolBarManager()
+				.add(getActionRegistry().getAction(ActionFactory.REDO.getId()));
+		iViewSite.getActionBars().getToolBarManager()
+				.add(getActionRegistry().getAction(ActionFactory.COPY.getId()));
+		iViewSite
+				.getActionBars()
+				.getToolBarManager()
+				.add(getActionRegistry().getAction(ActionFactory.PASTE.getId()));
+		iViewSite
+				.getActionBars()
+				.getToolBarManager()
+				.add(getActionRegistry()
+						.getAction(ActionFactory.DELETE.getId()));
+
+		iViewSite.getActionBars().getToolBarManager().add(new Separator());
+
+		iViewSite.getActionBars().getToolBarManager()
+				.add(getActionRegistry().getAction(GEFActionConstants.ZOOM_IN));
+		iViewSite
+				.getActionBars()
+				.getToolBarManager()
+				.add(getActionRegistry().getAction(GEFActionConstants.ZOOM_OUT));
+
+		iViewSite
+				.getActionBars()
+				.getMenuManager()
+				.add(getActionRegistry().getAction(
+						GEFActionConstants.TOGGLE_GRID_VISIBILITY));
+		iViewSite
+				.getActionBars()
+				.getMenuManager()
+				.add(getActionRegistry().getAction(
+						GEFActionConstants.TOGGLE_SNAP_TO_GEOMETRY));
+		iViewSite
+				.getActionBars()
+				.getMenuManager()
+				.add(getActionRegistry().getAction(
+						GEFActionConstants.TOGGLE_RULER_VISIBILITY));
+
+		iViewSite.getActionBars().updateActionBars();
+
+		// TODO Reimplement me!
+		// pageSite.getActionBars().getToolBarManager()
+		// .add(new ZoomComboContributionItem(pageSite.getPage()));
+
+	}
+
+	protected void loadProperties(Visualization visualization) {
+
+		// Ruler properties
+		BMotionRuler ruler = visualization.getRuler(
+				PositionConstants.WEST);
+		RulerProvider provider = null;
+		if (ruler != null) {
+			provider = new BMotionRulerProvider(ruler);
+		}
+		getGraphicalViewer().setProperty(
+				RulerProvider.PROPERTY_VERTICAL_RULER, provider);
+		ruler = visualization.getRuler(PositionConstants.NORTH);
+		provider = null;
+		if (ruler != null) {
+			provider = new BMotionRulerProvider(ruler);
+		}
+		getGraphicalViewer().setProperty(
+				RulerProvider.PROPERTY_HORIZONTAL_RULER, provider);
+		getGraphicalViewer().setProperty(
+				RulerProvider.PROPERTY_RULER_VISIBILITY,
+				visualization.getRulerVisibility());
+		getGraphicalViewer().setProperty(
+				SnapToGeometry.PROPERTY_SNAP_ENABLED,
+				visualization.isSnapToGeometryEnabled());
+		getGraphicalViewer().setProperty(SnapToGrid.PROPERTY_GRID_ENABLED,
+				visualization.isGridEnabled());
+		getGraphicalViewer().setProperty(SnapToGrid.PROPERTY_GRID_VISIBLE,
+				visualization.isGridEnabled());
+
+		getGraphicalViewer().setProperty(
+				MouseWheelHandler.KeyGenerator.getKey(SWT.NONE),
+				MouseWheelZoomHandler.SINGLETON);
+
+	}
+
+	public boolean isInitialized() {
+		return isInitialized;
+	}
+
+	public void setInitialized(boolean isInitialized) {
+		this.isInitialized = isInitialized;
+	}
+
 }
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/Simulation.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/Simulation.java
index f99cec3d..bb59e02e 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/Simulation.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/Simulation.java
@@ -1,12 +1,22 @@
 package de.bmotionstudio.gef.editor.model;
 
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.eclipse.core.resources.IFile;
+
 public class Simulation {
 
+	private transient PropertyChangeSupport listeners;
+	
 	private Map<String, VisualizationView> views;
 
+	private transient IFile projectFile;
+
+	private transient boolean dirty;
+
 	public Simulation() {
 		this.views = new HashMap<String, VisualizationView>();
 	}
@@ -20,4 +30,36 @@ public class Simulation {
 		this.views = visualizationViews;
 	}
 
+	public IFile getProjectFile() {
+		return projectFile;
+	}
+
+	public void setProjectFile(IFile projectFile) {
+		this.projectFile = projectFile;
+	}
+
+	public boolean isDirty() {
+		return dirty;
+	}
+
+	public void setDirty(boolean dirty) {
+		boolean oldVal = this.dirty;
+		this.dirty = dirty;		
+		listeners.firePropertyChange("dirty", oldVal, dirty);
+	}
+
+	public void addPropertyChangeListener(PropertyChangeListener listener) {
+		getListeners().addPropertyChangeListener(listener);
+	}
+
+	public PropertyChangeSupport getListeners() {
+		if (listeners == null)
+			listeners = new PropertyChangeSupport(this);
+		return listeners;
+	}
+
+	public void removePropertyChangeListener(PropertyChangeListener listener) {
+		getListeners().removePropertyChangeListener(listener);
+	}
+
 }
-- 
GitLab