Initial AMP Contribution per CQ 3295.
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/.classpath b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/.classpath
new file mode 100644
index 0000000..2d1a430
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<classpath>

+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>

+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>

+	<classpathentry kind="src" path="src"/>

+	<classpathentry kind="output" path="bin"/>

+</classpath>

diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/.project b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/.project
new file mode 100644
index 0000000..d35e31b
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.amp.axf.ide</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/META-INF/MANIFEST.MF b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..cceb2b5
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/META-INF/MANIFEST.MF
@@ -0,0 +1,39 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-Vendor: %providerName
+Bundle-SymbolicName: org.eclipse.amp.axf.ide;singleton:=true
+Bundle-Version: 0.2.0.qualifier
+Bundle-Activator: org.eclipse.amp.axf.ide.AXFWorkbenchPlugin
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.core.commands;bundle-version="3.4.0",
+ org.eclipse.ui;bundle-version="3.4.0",
+ org.eclipse.core.expressions;bundle-version="3.4.0",
+ org.eclipse.ui.views;bundle-version="3.3.0",
+ org.eclipse.pde.runtime;bundle-version="3.4.100",
+ org.eclipse.pde.ui;bundle-version="3.5.0",
+ org.eclipse.amp.axf.core,
+ org.eclipse.amp.axf.views
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Export-Package: org.eclipse.amp.axf.ide;
+  uses:="org.eclipse.core.runtime,
+   org.eclipse.ui,
+   org.eclipse.ui.plugin,
+   org.eclipse.amp.axf.core,
+   org.eclipse.ui.part,
+   org.eclipse.amp.axf.ide.view,
+   org.eclipse.amp.axf.ide.handlers,
+   org.eclipse.swt.graphics,
+   org.eclipse.jface.viewers,
+   org.osgi.framework,
+   org.eclipse.swt.widgets",
+ org.eclipse.amp.axf.ide.handlers;uses:="org.eclipse.core.runtime,org.eclipse.amp.axf.core,org.eclipse.core.commands",
+ org.eclipse.amp.axf.ide.view;
+  uses:="org.eclipse.core.runtime,
+   org.eclipse.swt.events,
+   org.eclipse.ui,
+   org.eclipse.ui.menus,
+   org.eclipse.amp.axf.view,
+   org.eclipse.amp.axf.core,
+   org.eclipse.swt.widgets"
+Bundle-ActivationPolicy: lazy
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/build.properties b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/build.properties
new file mode 100644
index 0000000..79785ac
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/build.properties
@@ -0,0 +1,6 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               icons/,\
+               plugin.xml
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/dtool16/run_close.gif b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/dtool16/run_close.gif
new file mode 100755
index 0000000..9e14298
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/dtool16/run_close.gif
Binary files differ
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/dtool16/run_exc.gif b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/dtool16/run_exc.gif
new file mode 100755
index 0000000..010581b
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/dtool16/run_exc.gif
Binary files differ
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/dtool16/run_pause.gif b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/dtool16/run_pause.gif
new file mode 100755
index 0000000..e47777b
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/dtool16/run_pause.gif
Binary files differ
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/dtool16/run_resume.gif b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/dtool16/run_resume.gif
new file mode 100755
index 0000000..8652797
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/dtool16/run_resume.gif
Binary files differ
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/dtool16/run_step.gif b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/dtool16/run_step.gif
new file mode 100755
index 0000000..319fe8d
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/dtool16/run_step.gif
Binary files differ
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/dtool16/run_stop.gif b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/dtool16/run_stop.gif
new file mode 100755
index 0000000..4f3dcba
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/dtool16/run_stop.gif
Binary files differ
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/etool16/generic_agent.gif b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/etool16/generic_agent.gif
new file mode 100644
index 0000000..0f07692
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/etool16/generic_agent.gif
Binary files differ
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/etool16/listener.gif b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/etool16/listener.gif
new file mode 100644
index 0000000..7d1ece1
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/etool16/listener.gif
Binary files differ
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/etool16/model_mananger.gif b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/etool16/model_mananger.gif
new file mode 100644
index 0000000..0a1fa96
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/etool16/model_mananger.gif
Binary files differ
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/etool16/model_paused.gif b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/etool16/model_paused.gif
new file mode 100644
index 0000000..45c23a9
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/etool16/model_paused.gif
Binary files differ
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/etool16/model_running.gif b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/etool16/model_running.gif
new file mode 100644
index 0000000..b8ca14a
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/etool16/model_running.gif
Binary files differ
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/etool16/model_stopped.gif b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/etool16/model_stopped.gif
new file mode 100644
index 0000000..a7302ed
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/etool16/model_stopped.gif
Binary files differ
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/etool16/run_close.gif b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/etool16/run_close.gif
new file mode 100755
index 0000000..b6922ac
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/etool16/run_close.gif
Binary files differ
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/etool16/run_exc.gif b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/etool16/run_exc.gif
new file mode 100644
index 0000000..ec477ea
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/etool16/run_exc.gif
Binary files differ
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/etool16/run_pause.gif b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/etool16/run_pause.gif
new file mode 100644
index 0000000..161e3f5
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/etool16/run_pause.gif
Binary files differ
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/etool16/run_restart.gif b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/etool16/run_restart.gif
new file mode 100644
index 0000000..88276ce
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/etool16/run_restart.gif
Binary files differ
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/etool16/run_resume.gif b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/etool16/run_resume.gif
new file mode 100644
index 0000000..16f4e25
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/etool16/run_resume.gif
Binary files differ
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/etool16/run_step.gif b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/etool16/run_step.gif
new file mode 100755
index 0000000..e3a7cc7
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/etool16/run_step.gif
Binary files differ
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/etool16/run_stop.gif b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/etool16/run_stop.gif
new file mode 100644
index 0000000..69c31f4
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/icons/etool16/run_stop.gif
Binary files differ
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/plugin.properties b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/plugin.properties
new file mode 100644
index 0000000..b7890d5
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/plugin.properties
@@ -0,0 +1,32 @@
+# /**

+#  * <copyright>

+#  *

+#  * Copyright (c) 2009 Metascape, LLC.

+#  * 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: 

+#  *   Metascape - Initial API and Implementation

+#  *

+#  * </copyright>

+#  *

+#  * $Id: plugin.properties

+#  */

+

+

+# ====================================================================

+# To code developer:

+#   Do NOT change the properties between this line and the

+#   "%%% END OF TRANSLATED PROPERTIES %%%" line.

+#   Make a new property name, append to the end of the file and change

+#   the code to use the new property.

+# ====================================================================

+

+# ====================================================================

+# %%% END OF TRANSLATED PROPERTIES %%%

+# ====================================================================

+

+pluginName = Agent Execution Framework IDE Integration

+providerName = Eclipse.org

diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/plugin.xml b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/plugin.xml
new file mode 100644
index 0000000..08aea84
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/plugin.xml
@@ -0,0 +1,477 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+
+<!--
+ <copyright>
+ </copyright>
+
+ $Id: plugin.xml,v 1.1 2009/06/24 03:17:07 mparker Exp $
+-->
+
+<plugin>
+    <extension

+          point="org.eclipse.ui.commands">

+       <category

+             description="Running and Exploring Models"

+             id="org.eclipse.amp.axf.ui"

+             name="Model Execution Engine">

+       </category>

+       <command

+             categoryId="org.eclipse.amp.axf.ui"

+             id="org.eclipse.amp.axf.ui.start"

+             name="Start">

+       </command>

+       <command

+             categoryId="org.eclipse.amp.axf.ui"

+             id="org.eclipse.amp.axf.ui.pause"

+             name="Pause">

+       </command>

+       <command

+             categoryId="org.eclipse.amp.axf.ui"

+             id="org.eclipse.amp.axf.ui.step"

+             name="Step">

+       </command>
+       <command
+             categoryId="org.eclipse.amp.axf.ui"
+             id="org.eclipse.amp.axf.ui.resume"
+             name="Resume">
+       </command>

+       <command

+             categoryId="org.eclipse.amp.axf.ui"

+             id="org.eclipse.amp.axf.ui.stop"

+             name="Stop">

+       </command>

+       <command

+             categoryId="org.eclipse.amp.axf.ui"

+             id="org.eclipse.amp.axf.ui.restart"

+             name="Restart">

+       </command>

+       <command

+             categoryId="org.eclipse.amp.axf.ui"

+             id="org.eclipse.amp.axf.ui.close"

+             name="Close">

+       </command>

+    </extension>

+    <extension

+          point="org.eclipse.ui.menus">

+       <menuContribution

+             locationURI="toolbar:org.eclipse.ui.main.toolbar?after=additions">

+                <toolbar

+                      id="org.eclipse.amp.axf.ui.execute">
+
+                </toolbar>

+       </menuContribution>

+       <menuContribution

+             locationURI="menu:org.eclipse.ui.main.menu?after=additions">

+             <menu

+                   id="org.eclipse.amp.axf.ui.menu"

+                   label="Control">

+             <command
+                   commandId="org.eclipse.amp.axf.ui.start"
+                   disabledIcon="icons/dtool16/run_exc.gif"
+                   icon="icons/etool16/run_exc.gif"
+                   label="Start"
+                   style="push">

+                <visibleWhen

+                      checkEnabled="false">

+                   <reference

+                         definitionId="org.eclipse.amp.axf.ui.active">

+                   </reference>

+                </visibleWhen>

+             </command>

+             <command
+                   commandId="org.eclipse.amp.axf.ui.restart"
+                   icon="icons/etool16/run_restart.gif"
+                   label="Restart"
+                   style="push">

+                <visibleWhen

+                      checkEnabled="false">

+                   <reference

+                         definitionId="org.eclipse.amp.axf.ui.active">

+                   </reference>

+                </visibleWhen>

+             </command>

+             <command
+                   commandId="org.eclipse.amp.axf.ui.pause"
+                   disabledIcon="icons/dtool16/run_pause.gif"
+                   icon="icons/etool16/run_pause.gif"
+                   label="Pause"
+                   style="push"
+                   tooltip="Pause the model.">

+                <visibleWhen

+                      checkEnabled="false">

+                   <reference

+                         definitionId="org.eclipse.amp.axf.ui.active">

+                   </reference>

+                </visibleWhen>

+             </command>
+             <command
+                   commandId="org.eclipse.amp.axf.ui.step"
+                   disabledIcon="icons/dtool16/run_step.gif"
+                   icon="icons/etool16/run_step.gif"
+                   label="Step"
+                   style="push"
+                   tooltip="Move forward one step.">
+                <visibleWhen
+                      checkEnabled="false">
+                   <reference
+                         definitionId="org.eclipse.amp.axf.ui.active">
+                   </reference>
+                </visibleWhen>
+             </command>

+             <command
+                   commandId="org.eclipse.amp.axf.ui.resume"
+                   disabledIcon="icons/dtool16/run_resume.gif"
+                   icon="icons/etool16/run_resume.gif"
+                   label="Resume"
+                   style="push"
+                   tooltip="Resume the active model.">

+                <visibleWhen

+                      checkEnabled="false">

+                   <reference

+                         definitionId="org.eclipse.amp.axf.ui.active">

+                   </reference>

+                </visibleWhen>

+             </command>

+             <command
+                   commandId="org.eclipse.amp.axf.ui.stop"
+                   disabledIcon="icons/dtool16/run_stop.gif"
+                   icon="icons/etool16/run_stop.gif"
+                   label="Stop"
+                   style="push">

+                <visibleWhen

+                      checkEnabled="false">

+                   <reference

+                         definitionId="org.eclipse.amp.axf.ui.active">

+                   </reference>

+                </visibleWhen>

+             </command>

+             <command
+                   commandId="org.eclipse.amp.axf.ui.close"
+                   disabledIcon="icons/dtool16/run_close.gif"
+                   icon="icons/etool16/run_close.gif"
+                   label="Close"
+                   style="push">

+                <visibleWhen

+                      checkEnabled="false">

+                   <reference

+                         definitionId="org.eclipse.amp.axf.ui.active">

+                   </reference>

+                </visibleWhen>

+             </command>

+             </menu>

+       </menuContribution>
+       <menuContribution
+             locationURI="toolbar:org.eclipse.amp.axf.ui.execute">
+                   <separator
+                         name="org.eclipse.amp.axf.ide.separator2">
+                   </separator>
+                   <command
+                         commandId="org.eclipse.amp.axf.ui.start"
+                         disabledIcon="icons/dtool16/run_exc.gif"
+                         icon="icons/etool16/run_exc.gif"
+                         label="Start"
+                         style="push">
+                      <visibleWhen
+                            checkEnabled="false">
+                         <reference
+                               definitionId="org.eclipse.amp.axf.ui.active">
+                         </reference>
+                      </visibleWhen>
+                   </command>
+                   <command
+                         commandId="org.eclipse.amp.axf.ui.restart"
+                         icon="icons/etool16/run_restart.gif"
+                         label="Restart"
+                         style="push">
+                      <visibleWhen
+                            checkEnabled="false">
+                         <reference
+                               definitionId="org.eclipse.amp.axf.ui.active">
+                         </reference>
+                      </visibleWhen>
+                   </command>
+                   <command
+                         commandId="org.eclipse.amp.axf.ui.pause"
+                         disabledIcon="icons/dtool16/run_pause.gif"
+                         icon="icons/etool16/run_pause.gif"
+                         label="Pause"
+                         style="push">
+                      <visibleWhen
+                            checkEnabled="false">
+                         <reference
+                               definitionId="org.eclipse.amp.axf.ui.active">
+                         </reference>
+                      </visibleWhen>
+                   </command>
+                   <command
+                         commandId="org.eclipse.amp.axf.ui.step"
+                         disabledIcon="icons/dtool16/run_step.gif"
+                         icon="icons/etool16/run_step.gif"
+                         label="Step"
+                         style="push">
+                      <visibleWhen
+                            checkEnabled="false">
+                         <reference
+                               definitionId="org.eclipse.amp.axf.ui.active">
+                         </reference>
+                      </visibleWhen>
+                   </command>
+                   <command
+                         commandId="org.eclipse.amp.axf.ui.resume"
+                         disabledIcon="icons/dtool16/run_resume.gif"
+                         icon="icons/etool16/run_resume.gif"
+                         label="Resume"
+                         style="push">
+                      <visibleWhen
+                            checkEnabled="false">
+                         <reference
+                               definitionId="org.eclipse.amp.axf.ui.active">
+                         </reference>
+                      </visibleWhen>
+                   </command>
+                   <command
+                         commandId="org.eclipse.amp.axf.ui.stop"
+                         disabledIcon="icons/dtool16/run_stop.gif"
+                         icon="icons/etool16/run_stop.gif"
+                         label="Stop"
+                         style="push">
+                      <visibleWhen
+                            checkEnabled="false">
+                         <reference
+                               definitionId="org.eclipse.amp.axf.ui.active">
+                         </reference>
+                      </visibleWhen>
+                   </command>
+                   <command
+                         commandId="org.eclipse.amp.axf.ui.close"
+                         disabledIcon="icons/dtool16/run_close.gif"
+                         icon="icons/etool16/run_close.gif"
+                         label="Close"
+                         style="push">
+                      <visibleWhen
+                            checkEnabled="false">
+                         <reference
+                               definitionId="org.eclipse.amp.axf.ui.active">
+                         </reference>
+                      </visibleWhen>
+                   </command>
+<!--                <control
+                      class="org.eclipse.amp.axf.ide.view.ScaleGranularityControl"
+                      id="org.eclipse.amp.axf.view.ui.slider">
+                   <visibleWhen
+                         checkEnabled="false">
+                      <reference
+                            definitionId="org.eclipse.amp.axf.ui.active">
+                      </reference>
+                   </visibleWhen>
+                </control>-->
+                       </menuContribution>

+    </extension>

+ <extension point="org.eclipse.core.expressions.definitions">

+      <definition

+            id="org.eclipse.amp.axf.ui.active">

+         <with

+               variable="activeContexts">

+            <iterate

+                  operator="or">

+               <equals

+                     value="org.eclipse.amp.axf.executionContext">

+               </equals>

+            </iterate>

+         </with>

+      </definition>

+   </extension> 

+  <extension

+         point="org.eclipse.ui.bindings">
+      <key
+            commandId="org.eclipse.amp.axf.ui.start"
+            contextId="org.eclipse.amp.axf.activeEditorContext"
+            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+            sequence="M2+M3+.">
+      </key>

+      <key

+            commandId="org.eclipse.amp.axf.ui.restart"

+            contextId="org.eclipse.amp.axf.activeEditorContext"

+            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"

+            sequence="M2+M3+,">

+      </key>
+      <key
+            commandId="org.eclipse.amp.axf.ui.pause"
+            contextId="org.eclipse.amp.axf.activeEditorContext"
+            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+            sequence="M2+M3+K">
+      </key>

+      <key

+            commandId="org.eclipse.amp.axf.ui.resume"

+            contextId="org.eclipse.amp.axf.activeEditorContext"

+            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"

+            sequence="M2+M3+L">

+      </key>
+      <key
+            commandId="org.eclipse.amp.axf.ui.step"
+            contextId="org.eclipse.amp.axf.activeEditorContext"
+            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+            sequence="M2+M3+SPACE">
+      </key>
+    </extension>

+  <extension

+        point="org.eclipse.ui.contexts">

+     <context

+           description="Executing model within Eclipse"

+           id="org.eclipse.amp.axf.executionContext"

+           name="Model Executing"

+           parentId="org.eclipse.ui.contexts.window">

+     </context>

+     <context

+           id="org.eclipse.amp.axf.activeEditorContext"

+           name="Model View">

+     </context>

+  </extension>
+
+  <extension
+        point="org.eclipse.ui.views">
+     <category
+           id="org.eclipse.amp.execution"
+           name="Model Execution">
+     </category>
+     <view
+           allowMultiple="false"
+           category="org.eclipse.amp.execution"
+           class="org.eclipse.amp.axf.ide.ModelManagerViewPart"
+           icon="icons/etool16/model_mananger.gif"
+           id="org.eclipse.amp.view.ModelManager"
+           name="Model Manager"
+           restorable="false">
+     </view>
+  </extension>
+  <extension
+        point="org.eclipse.ui.perspectives">
+     <perspective
+           class="org.eclipse.amp.axf.ide.ExecutionPerspectiveFactory"
+           icon="icons/etool16/generic_agent.gif"
+           id="org.eclipse.amp.axf.ExecutionPerspective"
+           name="Agent Execution">
+        <description>
+           Executing Escape models.
+        </description>
+     </perspective>
+  </extension>
+    <extension point="org.eclipse.ui.perspectiveExtensions"> 
+        <perspectiveExtension
+             targetID="org.eclipse.amp.axf.ExecutionPerspective"> 
+           <view
+                 id="org.eclipse.jdt.ui.PackageExplorer"
+                 minimized="false"
+                 ratio=".25"
+                 relationship="left"
+                 relative="org.eclipse.ui.editorss"
+                 standalone="false"
+                 visible="true">
+           </view>
+           <view
+                 id="org.eclipse.ui.views.ContentOutline"
+                 minimized="true"
+                 relationship="stack"
+                 relative="org.eclipse.jdt.ui.PackageExplorer"
+                 visible="true">
+           </view>
+           <view
+                 id="org.eclipse.ui.views.PropertySheet"
+                 minimized="false"
+                 ratio=".70"
+                 relationship="bottom"
+                 relative="org.eclipse.jdt.ui.PackageExplorer"
+                 visible="true">
+           </view>
+           <view
+                 id="org.eclipse.ui.views.ProblemView"
+                 minimized="true"
+                 ratio=".8"
+                 relationship="bottom"
+                 relative="org.eclipse.ui.editorss"
+                 visible="true">
+           </view>
+           <view
+                 id="org.eclipse.ui.console.ConsoleView"
+                 minimized="true"
+                 relationship="stack"
+                 relative="org.eclipse.ui.views.ProblemView"
+                 visible="true">
+           </view>
+           <view
+                 id="org.eclipse.pde.runtime.LogView"
+                 minimized="true"
+                 relationship="stack"
+                 relative="org.eclipse.ui.views.ProblemView"
+                 visible="true">
+           </view>
+           <view
+                 id="org.eclipse.ui.views.ProgressView"
+                 minimized="false"
+                 relationship="stack"
+                 relative="org.eclipse.ui.views.ProblemView">
+           </view>
+           <view
+                 id="org.eclipse.amp.view.ModelManager"
+                 relationship="stack"
+                 relative="org.eclipse.jdt.ui.PackageExplorer"
+                 visible="true">
+           </view>
+           <viewShortcut
+                 id="org.eclipse.ui.views.PropertySheet">
+           </viewShortcut>
+           <viewShortcut
+                 id="org.eclipse.ui.views.ProblemView">
+           </viewShortcut>
+           <viewShortcut
+                 id="org.eclipse.ui.console.ConsoleView">
+           </viewShortcut>
+           <viewShortcut
+                 id="org.eclipse.pde.runtime.LogView">
+           </viewShortcut>
+           <viewShortcut
+                 id="org.eclipse.jdt.ui.SourceView">
+           </viewShortcut>
+           <viewShortcut
+                 id="org.eclipse.ui.views.ProgressView">
+           </viewShortcut>
+           <newWizardShortcut
+                 id="org.eclipse.amp.escape.wizards.newParameters">
+           </newWizardShortcut>
+           <newWizardShortcut
+                 id="org.eclipse.amp.escape.wizards.newTest">
+           </newWizardShortcut>
+           <viewShortcut
+                 id="org.eclipse.amp.view.ModelManager">
+           </viewShortcut>
+           </perspectiveExtension>
+<!--       <perspectiveExtension
+             targetID="???">
+          <perspectiveShortcut
+                id="org.eclipse.amp.axf.ExecutionPerspective">
+          </perspectiveShortcut>
+          <newWizardShortcut
+                id="org.eclipse.amp.escape.wizards.newProject">
+          </newWizardShortcut>
+          <newWizardShortcut
+                id="org.eclipse.amp.escape.wizards.newParameters">
+          </newWizardShortcut>
+          <newWizardShortcut
+                id="org.eclipse.amp.escape.wizards.newTest">
+          </newWizardShortcut>
+       </perspectiveExtension> -->
+       <perspectiveExtension
+             targetID="org.eclipse.jdt.ui.JavaPerspective">
+          <perspectiveShortcut
+                id="org.eclipse.amp.axf.ExecutionPerspective">
+          </perspectiveShortcut>
+       </perspectiveExtension>
+    </extension>
+    <extension
+          point="org.eclipse.ui.startup">
+       <startup>
+       </startup>
+    </extension>
+ </plugin>
+
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/AXFWorkbenchPlugin.java b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/AXFWorkbenchPlugin.java
new file mode 100644
index 0000000..e065aca
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/AXFWorkbenchPlugin.java
@@ -0,0 +1,94 @@
+/**
+ * <copyright>
+ *
+ * Copyright (c) 2009 Metascape, LLC.
+ * 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:
+ *   Metascape - Initial API and Implementation
+ *
+ * </copyright>
+ *
+ */
+package org.eclipse.amp.axf.ide;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.IStartup;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+// TODO: Auto-generated Javadoc
+/**
+ * The activator class controls the plug-in life cycle.
+ */
+public class AXFWorkbenchPlugin extends AbstractUIPlugin implements IStartup {
+
+    // The plug-in ID
+    public static final String PLUGIN_ID = "org.eclipse.amp.axf.ide";
+
+    // The shared instance
+    private static AXFWorkbenchPlugin plugin;
+
+
+    private ModelViewManager manager;
+
+    /**
+     * The constructor.
+     */
+    public AXFWorkbenchPlugin() {
+    }
+
+
+    private Image loadImage(String name) {
+        ImageDescriptor desc = AbstractUIPlugin.imageDescriptorFromPlugin(PLUGIN_ID,
+                                                                          "icons/etool16/" + name);
+        return JFaceResources.getResources().createImageWithDefault(desc);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext)
+     */
+    /**
+     * @param context
+     * @throws Exception
+     * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+     */
+    public void stop(BundleContext context) throws Exception {
+        plugin = null;
+        super.stop(context);
+    }
+
+    /**
+     * Returns the shared instance.
+     * 
+     * @return the shared instance
+     */
+    public static AXFWorkbenchPlugin getDefault() {
+        return plugin;
+    }
+
+    /**
+     * Gets the manager.
+     * 
+     * @return the manager
+     */
+    public ModelViewManager getManager() {
+        return manager;
+    }
+
+    /**
+     * 
+     * @see org.eclipse.ui.IStartup#earlyStartup()
+     */
+    public void earlyStartup() {
+        manager = new ModelViewManager();
+        plugin = this;
+    }
+}
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/ExecutionPerspectiveFactory.java b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/ExecutionPerspectiveFactory.java
new file mode 100644
index 0000000..c13ad77
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/ExecutionPerspectiveFactory.java
@@ -0,0 +1,35 @@
+/**

+ * 

+ */

+package org.eclipse.amp.axf.ide;

+

+import org.eclipse.ui.IPageLayout;

+import org.eclipse.ui.IPerspectiveFactory;

+

+

+// TODO: Auto-generated Javadoc

+/**

+ * The Class ExecutionPerspectiveFactory.

+ * 

+ * @author Miles Parker

+ */

+public class ExecutionPerspectiveFactory implements IPerspectiveFactory {

+

+    /*

+     * (non-Javadoc)

+     * @see

+     * org.eclipse.ui.IPerspectiveFactory#createInitialLayout(org.eclipse.ui

+     * .IPageLayout)

+     */

+    /**

+     * @param layout

+     * @see org.eclipse.ui.IPerspectiveFactory#createInitialLayout(org.eclipse.ui.IPageLayout)

+     */

+    public void createInitialLayout(IPageLayout layout) {

+        layout.setEditorAreaVisible(false);

+//        layout.addPlaceholder("org.eclipse.amp.escape.view.GraphicsView:S0", IPageLayout.RIGHT, .5f, "org.eclipse.jdt.ui.PackageExplorer");

+//        layout.addPlaceholder("org.eclipse.amp.view.GEFView:S0", IPageLayout.RIGHT, .5f, "org.eclipse.jdt.ui.PackageExplorer");

+//        layout.addPlaceholder("org.eclipse.amp.view.GEFView:S1", IPageLayout.RIGHT, .5f, "org.eclipse.jdt.ui.PackageExplorer");

+//        layout.addPlaceholder("org.eclipse.amp.view.GEFView:S2", IPageLayout.RIGHT, .5f, "org.eclipse.jdt.ui.PackageExplorer");

+    }

+}

diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/HandlerManager.java b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/HandlerManager.java
new file mode 100644
index 0000000..c96134b
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/HandlerManager.java
@@ -0,0 +1,76 @@
+/**

+ * <copyright>

+ *

+ * Copyright (c) 2009 Metascape, LLC.

+ * 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:

+ *   Metascape - Initial API and Implementation

+ *

+ * </copyright>

+ *

+ */

+

+package org.eclipse.amp.axf.ide;

+

+import java.util.ArrayList;

+import java.util.List;

+

+import org.eclipse.amp.axf.ide.handlers.ModelRunHandler;

+import org.eclipse.swt.widgets.Display;

+import org.eclipse.ui.handlers.IHandlerActivation;

+import org.eclipse.ui.handlers.IHandlerService;

+

+/**

+ * 

+ * @author mparker

+ *

+ */

+public class HandlerManager {

+

+    private IHandlerService handlerService;

+

+    private List<IHandlerActivation> handlerActivations;

+

+    private List<ModelRunHandler> handlers;

+

+    public synchronized void activate() {

+        handlerService = (IHandlerService) AXFWorkbenchPlugin.getDefault().getWorkbench()

+        .getService(IHandlerService.class);

+        handlerActivations = new ArrayList<IHandlerActivation>();

+        handlers = new ArrayList<ModelRunHandler>();

+    }

+

+    public synchronized void deactivate() {

+        if (handlerService != null) {

+            handlerService.deactivateHandlers(handlerActivations);

+        }

+    }

+

+    /**

+     * Adds the handler.

+     * 

+     * @param id the id

+     * @param handler the handler

+     */

+    protected synchronized void addHandler(String id, final ModelRunHandler handler) {

+        handlers.add(handler);

+        handlerActivations.add(handlerService.activateHandler(id, handler));

+        ModelViewManager manager = AXFWorkbenchPlugin.getDefault().getManager();

+        manager.getWorkbenchListeners().addListener(handler);

+        manager.getManagerListeners().addModelManagerListener(handler);

+    }

+

+    public synchronized void notifyHandlers() {

+        Display.getDefault().asyncExec(new Runnable() {

+            public void run() {

+                for (ModelRunHandler handler : handlers) {

+                    handler.notifyChange();

+                }

+            }

+        });

+    }

+}

diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/IModelWorkbenchListener.java b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/IModelWorkbenchListener.java
new file mode 100644
index 0000000..f517c2f
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/IModelWorkbenchListener.java
@@ -0,0 +1,80 @@
+/**
+ * <copyright>
+ *
+ * Copyright (c) 2009 Metascape, LLC.
+ * 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:
+ *   Metascape - Initial API and Implementation
+ *
+ * </copyright>
+ *
+ */
+package org.eclipse.amp.axf.ide;
+
+import org.eclipse.amp.axf.core.IObservationProvider;
+import org.eclipse.ui.IWorkbenchPart;
+
+// TODO: Auto-generated Javadoc
+/**
+ * The listener interface for receiving IModelManager events. The class that is interested in processing a IModelManager
+ * event implements this interface, and the object created with that class is registered with a component using the
+ * component's <code>addIModelManagerListener<code> method. When
+ * the IModelManager event occurs, that object's appropriate
+ * method is invoked.
+ * 
+ * @see IModelManagerEvent
+ */
+public interface IModelWorkbenchListener {
+
+    /**
+     * Model added.
+     * 
+     * @param model the model
+     */
+    void modelAdded(IObservationProvider model);
+
+    /**
+     * Model removed.
+     * 
+     * @param model the model
+     */
+    void modelRemoved(IObservationProvider model);
+
+    /**
+     * Notifies the listener that the given model has been activated, that is in foreground and controllable. The model
+     * is not necessarily focused, nor even visible. Models can be executing but not activated. Note that this assumes
+     * that any already activated model is now deactivated, and it the listener's responsibility to keep a reference to
+     * that prior model as appropriate.
+     * 
+     * Only one model may be active at any one time.
+     * 
+     * @param model The model that is currently activated, or null if no models are now active. This usually indicates
+     *        that no models exist.
+     */
+    void modelActivated(IObservationProvider model);
+
+    /**
+     * View added.
+     * 
+     * @param part the part
+     */
+    void viewAdded(IWorkbenchPart part);
+
+    /**
+     * View removed.
+     * 
+     * @param part the part
+     */
+    void viewRemoved(IWorkbenchPart part);
+
+    /**
+     * View activated.
+     * 
+     * @param part the part
+     */
+    void viewActivated(IWorkbenchPart part);
+}
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/LifeCycleListeners.java b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/LifeCycleListeners.java
new file mode 100644
index 0000000..0e7ed06
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/LifeCycleListeners.java
@@ -0,0 +1,65 @@
+/**

+ * <copyright>

+ *

+ * Copyright (c) 2009 Metascape, LLC.

+ * 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:

+ *   Metascape - Initial API and Implementation

+ *

+ * </copyright>

+ *

+ */

+

+package org.eclipse.amp.axf.ide;

+

+import java.util.ArrayList;

+import java.util.List;

+

+import org.eclipse.amp.axf.core.ILifeCycleListener;

+import org.eclipse.amp.axf.core.IModel;

+

+/**

+ * 

+ * @author mparker

+ *

+ */

+public class LifeCycleListeners {

+

+    List<ILifeCycleListener> workbenchListeners = new ArrayList<ILifeCycleListener>();

+

+    public synchronized void replaceModel(IModel oldModel, IModel newModel) {

+        if (oldModel != null) {

+            for (final ILifeCycleListener listener : workbenchListeners) {

+                oldModel.removeModelListener(listener);

+            }

+        }

+        if (newModel != null) {

+            for (final ILifeCycleListener listener : workbenchListeners) {

+                newModel.addModelListener(listener);

+                // listener.modelAdded(newModel);

+            }

+        }

+    }

+

+    /**

+     * Adds the workbench listener.

+     * 

+     * @param listener the listener

+     */

+    public synchronized void addListener(ILifeCycleListener listener) {

+        workbenchListeners.add(listener);

+    }

+

+    /**

+     * Removes the workbench listener.

+     * 

+     * @param listener the listener

+     */

+    public synchronized void removeListener(ILifeCycleListener listener) {

+        workbenchListeners.remove(listener);

+    }

+}

diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/ModelManagerLabelProvider.java b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/ModelManagerLabelProvider.java
new file mode 100644
index 0000000..d1739fe
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/ModelManagerLabelProvider.java
@@ -0,0 +1,125 @@
+/**
+ * <copyright>
+ *
+ * Copyright (c) 2009 Metascape, LLC.
+ * 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:
+ *   Metascape - Initial API and Implementation
+ *
+ * </copyright>
+ *
+ */
+package org.eclipse.amp.axf.ide;
+
+import org.eclipse.amp.axf.core.ILifeCycleListener;
+import org.eclipse.amp.axf.core.IModel;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+
+// TODO: Auto-generated Javadoc
+/**
+ * The Class ModelManagerLabelProvider.
+ */
+public class ModelManagerLabelProvider implements ILabelProvider {
+
+    public static Image RUN_IMAGE = AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.amp.axf.ide",
+    "icons/etool16/model_running.gif").createImage();
+
+    public static Image PAUSE_IMAGE = AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.amp.axf.ide",
+    "icons/etool16/model_paused.gif")
+    .createImage();
+
+    public static Image STOP_IMAGE = AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.amp.axf.ide",
+    "icons/etool16/model_stopped.gif")
+    .createImage();
+
+    public static Image LISTENER_IMAGE = AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.amp.axf.ide",
+    "icons/etool16/listener.gif")
+    .createImage();
+
+    /**
+     * @param element
+     * @return
+     * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
+     */
+    public Image getImage(Object element) {
+        if (element instanceof IModel) {
+            if (((IModel) element).getEngine().isPaused()) {
+                return PAUSE_IMAGE;
+            }
+            if (((IModel) element).getEngine().isRunning()) {
+                return RUN_IMAGE;
+            }
+            return STOP_IMAGE;
+        }
+        if (element instanceof ILifeCycleListener) {
+            if (element instanceof IAdaptable) {
+                IViewPart view = (IViewPart) ((IAdaptable) element).getAdapter(IViewPart.class);
+                if (view != null) {
+                    return view.getTitleImage();
+                }
+            }
+            return LISTENER_IMAGE;
+        }
+        return null;
+    }
+
+    /**
+     * @param element
+     * @return
+     * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
+     */
+    public String getText(Object element) {
+        if (element instanceof IModel) {
+            ((IModel) element).getName();
+        }
+        return element.toString();
+    }
+
+    /**
+     * @param listener
+     * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
+     */
+    public void addListener(ILabelProviderListener listener) {
+        // TODO Auto-generated method stub
+
+    }
+
+    /**
+     * 
+     * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
+     */
+    public void dispose() {
+        // TODO Auto-generated method stub
+
+    }
+
+    /**
+     * @param element
+     * @param property
+     * @return
+     * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
+     */
+    public boolean isLabelProperty(Object element, String property) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    /**
+     * @param listener
+     * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
+     */
+    public void removeListener(ILabelProviderListener listener) {
+        // TODO Auto-generated method stub
+
+    }
+
+}
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/ModelManagerListeners.java b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/ModelManagerListeners.java
new file mode 100644
index 0000000..f9f884b
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/ModelManagerListeners.java
@@ -0,0 +1,106 @@
+/**

+ * <copyright>

+ *

+ * Copyright (c) 2009 Metascape, LLC.

+ * 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:

+ *   Metascape - Initial API and Implementation

+ *

+ * </copyright>

+ *

+ */

+

+package org.eclipse.amp.axf.ide;

+

+import java.util.ArrayList;

+import java.util.List;

+

+import org.eclipse.amp.axf.core.IModel;

+import org.eclipse.ui.IViewPart;

+

+public class ModelManagerListeners {

+

+    List<IModelWorkbenchListener> manangerListeners = new ArrayList<IModelWorkbenchListener>();

+    /**

+     * @param modelViewManager

+     */

+    ModelManagerListeners() {

+    }

+

+    /**

+     * Adds the model manager listener.

+     * 

+     * @param listener the listener

+     */

+    public synchronized void addModelManagerListener(IModelWorkbenchListener listener) {

+        manangerListeners.add(listener);

+    }

+

+    /**

+     * Removes the model manager listener.

+     * 

+     * @param listener the listener

+     */

+    public synchronized void removeModelManagerListener(IModelWorkbenchListener listener) {

+        manangerListeners.remove(listener);

+    }

+

+    /**

+     * Notify view added.

+     * 

+     * @param showViewPart the show view part

+     */

+    protected synchronized void notifyViewAdded(final IViewPart showViewPart) {

+        for (IModelWorkbenchListener viewListener : manangerListeners) {

+            viewListener.viewAdded(showViewPart);

+        }

+    };

+

+    /**

+     * Notify view removed.

+     * 

+     * @param showViewPart the show view part

+     */

+    protected synchronized void notifyViewRemoved(final IViewPart showViewPart) {

+        for (IModelWorkbenchListener viewListener : manangerListeners) {

+            viewListener.viewRemoved(showViewPart);

+        }

+    };

+

+    /**

+     * Notify view removed.

+     * 

+     * @param showViewPart the show view part

+     */

+    protected synchronized void notifyModelActivated(final IModel model) {

+        for (IModelWorkbenchListener viewListener : manangerListeners) {

+            viewListener.modelActivated(model);

+        }

+    };

+

+    /**

+     * Notify view removed.

+     * 

+     * @param showViewPart the show view part

+     */

+    protected synchronized void notifyModelAdded(final IModel model) {

+        for (IModelWorkbenchListener viewListener : manangerListeners) {

+            viewListener.modelAdded(model);

+        }

+    };

+

+    /**

+     * Notify view removed.

+     * 

+     * @param showViewPart the show view part

+     */

+    protected synchronized void notifyModelRemoved(final IModel model) {

+        for (IModelWorkbenchListener viewListener : manangerListeners) {

+            viewListener.modelRemoved(model);

+        }

+    };

+}
\ No newline at end of file
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/ModelManagerViewPart.java b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/ModelManagerViewPart.java
new file mode 100644
index 0000000..0a558b1
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/ModelManagerViewPart.java
@@ -0,0 +1,175 @@
+/**
+ * <copyright>
+ *
+ * Copyright (c) 2009 Metascape, LLC.
+ * 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:
+ *   Metascape - Initial API and Implementation
+ *
+ * </copyright>
+ *
+ */
+package org.eclipse.amp.axf.ide;
+
+import org.eclipse.amp.axf.core.AbstractLifecycleListener;
+import org.eclipse.amp.axf.core.ILifeCycleListener;
+import org.eclipse.amp.axf.core.IModel;
+import org.eclipse.amp.axf.core.IObservationProvider;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.part.ViewPart;
+
+// TODO: Auto-generated Javadoc
+/**
+ * The Class ModelManagerViewPart.
+ */
+public class ModelManagerViewPart extends ViewPart {
+
+    private final class ModelContents implements ITreeContentProvider {
+        public Object[] getChildren(Object parentElement) {
+            if (parentElement instanceof IModel) {
+                return ((IObservationProvider) parentElement).getModelListeners().toArray();
+            }
+            return new Object[0];
+        }
+
+        public Object getParent(Object element) {
+            // if (element instanceof IModelObserver) {
+            // ((IModelObserver) element).getModel();
+            // }
+            return null;
+        }
+
+        public boolean hasChildren(Object element) {
+            return element instanceof IModel && getChildren(element).length > 0;
+        }
+
+        public Object[] getElements(Object inputElement) {
+            return ((ModelViewManager) inputElement).getModels().toArray();
+        }
+
+        public void dispose() {
+        }
+
+        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+        }
+    }
+
+    ILifeCycleListener genericModelListener = new AbstractLifecycleListener() {
+        @Override
+        public void observeStart(IObservationProvider model) {
+            refreshViewer();
+        }
+
+        @Override
+        public void observeStop(IObservationProvider model) {
+            refreshViewer();
+        }
+
+        boolean wasPaused;
+
+        @Override
+        public void stateChange(Object key, Object updated) {
+            super.stateChange(key, updated);
+            boolean pauseState = ((IModel) updated).getEngine().isPaused();
+            if (wasPaused != pauseState) {
+                refreshViewer();
+                wasPaused = pauseState;
+            }
+        }
+
+        public void observeUpdate(IObservationProvider model) {
+            if (((IModel) model).getPeriod() % 10 == 0) {
+                refreshViewer();
+            }
+        };
+    };
+
+    private class ManagerListener implements IModelWorkbenchListener {
+
+        public void modelActivated(IObservationProvider model) {
+            refreshViewer();
+        }
+
+        public void modelAdded(IObservationProvider model) {
+            refreshViewer();
+            model.addModelListener(genericModelListener);
+        }
+
+        public void modelRemoved(IObservationProvider model) {
+            refreshViewer();
+            model.removeModelListener(genericModelListener);
+        }
+
+        public void viewActivated(IWorkbenchPart part) {
+        }
+
+        public void viewAdded(IWorkbenchPart part) {
+        }
+
+        public void viewRemoved(IWorkbenchPart part) {
+        }
+    }
+
+    private TreeViewer viewer;
+
+    private void refreshViewer() {
+        viewer.getControl().getDisplay().asyncExec(new Runnable() {
+            public void run() {
+                viewer.refresh(true);
+            }
+        });
+    }
+
+    /**
+     * @param parent
+     * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
+     */
+    @Override
+    public void createPartControl(Composite parent) {
+        viewer = new TreeViewer(parent);
+        viewer.setContentProvider(new ModelContents());
+        assignManager();
+    }
+
+    private void assignManager() {
+        final ModelViewManager manager = AXFWorkbenchPlugin.getDefault().getManager();
+        ILabelProvider labelProvider = (ILabelProvider) Platform.getAdapterManager().getAdapter(manager,
+                                                                                                ILabelProvider.class);
+        if (labelProvider == null) {
+            throw new RuntimeException("Label Provider not found for Model Manager.");
+        }
+        viewer.setLabelProvider(labelProvider);
+        viewer.setInput(manager);
+        manager.getManagerListeners().addModelManagerListener(new ManagerListener());
+        viewer.addSelectionChangedListener(new ISelectionChangedListener() {
+            public void selectionChanged(SelectionChangedEvent event) {
+                IStructuredSelection sel = (IStructuredSelection) event.getSelection();
+                if (sel.getFirstElement() instanceof IModel) {
+                    manager.setActiveModel((IModel) sel.getFirstElement());
+                }
+            }
+        });
+    }
+
+    /**
+     * 
+     * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
+     */
+    @Override
+    public void setFocus() {
+    }
+
+}
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/ModelViewManager.java b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/ModelViewManager.java
new file mode 100644
index 0000000..728e6a3
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/ModelViewManager.java
@@ -0,0 +1,623 @@
+/**
+ * <copyright>
+ *
+ * Copyright (c) 2009 Metascape, LLC.
+ * 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:
+ *   Metascape - Initial API and Implementation
+ *
+ * </copyright>
+ *
+ */
+package org.eclipse.amp.axf.ide;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.eclipse.amp.axf.core.IEngine;
+import org.eclipse.amp.axf.core.IModel;
+import org.eclipse.amp.axf.core.IObservationProvider;
+import org.eclipse.amp.axf.ide.handlers.CloseHandler;
+import org.eclipse.amp.axf.ide.handlers.PauseHandler;
+import org.eclipse.amp.axf.ide.handlers.RestartHandler;
+import org.eclipse.amp.axf.ide.handlers.ResumeHandler;
+import org.eclipse.amp.axf.ide.handlers.StartHandler;
+import org.eclipse.amp.axf.ide.handlers.StepHandler;
+import org.eclipse.amp.axf.ide.handlers.StopHandler;
+import org.eclipse.amp.axf.ide.view.StatusLineView;
+import org.eclipse.amp.axf.view.IModelPart;
+import org.eclipse.amp.axf.view.ModelInput;
+import org.eclipse.amp.axf.view.ModelViewPart;
+import org.eclipse.amp.axf.view.SelectionSynchronizer;
+import org.eclipse.core.runtime.IAdapterFactory;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IPartListener;
+import org.eclipse.ui.IPerspectiveDescriptor;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchListener;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.contexts.IContextActivation;
+import org.eclipse.ui.contexts.IContextService;
+import org.eclipse.ui.internal.ErrorViewPart;
+import org.eclipse.ui.statushandlers.StatusManager;
+
+// TODO: Auto-generated Javadoc
+/**
+ * The Class ModelViewManager.
+ */
+@SuppressWarnings("restriction")
+public class ModelViewManager implements IAdapterFactory {
+
+    public static final String EXECUTION_PERSPECTIVE_ID = "org.eclipse.amp.axf.ExecutionPerspective";
+
+    private IContextService contextService;
+
+    private IContextActivation ideContext;
+
+    private IContextActivation partContext;
+
+    List<IModel> models = new ArrayList<IModel>();
+
+    List<IViewPart> views = new ArrayList<IViewPart>();
+
+    Map<IEngine, IModel> runnerForModel = new HashMap<IEngine, IModel>();
+
+    Map<IModel, IEngine> modelForRunner = new HashMap<IModel, IEngine>();
+
+    Map<Object, IModel> modelForArbitrary = new HashMap<Object, IModel>();
+
+    Map<IModel, List<IViewPart>> viewsForModel = new HashMap<IModel, List<IViewPart>>();
+
+    LifeCycleListeners workbenchListeners = new LifeCycleListeners();
+
+    ModelManagerListeners managerListeners = new ModelManagerListeners();
+
+    HandlerManager handlers = new HandlerManager();
+
+    IModel activeModel;
+
+    IPartListener modelActivationListener;
+
+    private int updateCount;
+
+    private IObservationProvider[] modelSlots = new IObservationProvider[16];
+
+    private SelectionSynchronizer editSelection;
+
+    private String priorPerspectiveID;
+
+    /**
+     * Instantiates a new model view manager.
+     */
+    public ModelViewManager() {
+    }
+
+    /**
+     * Gets the active model.
+     * 
+     * @return the active model
+     */
+    public IObservationProvider getActiveModel() {
+        return activeModel;
+    }
+
+    /**
+     * Sets the active model.
+     * 
+     * @param newModel the new active model
+     */
+    public synchronized void setActiveModel(final IModel newModel) {
+        if (newModel != null && !models.contains(newModel)) {
+            // We have an unattached view..do nothing
+            return;
+        }
+        final IModel oldModel = this.activeModel;
+        this.activeModel = newModel;
+        if (newModel != oldModel) {
+            workbenchListeners.replaceModel(oldModel, newModel);
+            if (newModel != null) {
+                managerListeners.notifyModelActivated(newModel);
+            }
+        }
+
+    }
+
+    /**
+     * Gets the models.
+     * 
+     * @return the models
+     */
+    public List<IModel> getModels() {
+        return models;
+    }
+
+    /**
+     * Gets the slot.
+     * 
+     * @param model the model
+     * 
+     * @return the slot
+     */
+    public int getSlot(IObservationProvider model) {
+        int i = 0;
+        for (IObservationProvider slot : modelSlots) {
+            if (slot == model) {
+                return i;
+            }
+            i++;
+        }
+        return -1;
+    }
+
+    /**
+     * Assign slot.
+     * 
+     * @param model the model
+     * 
+     * @return the int
+     */
+    public int assignSlot(IObservationProvider model) {
+        int i = 0;
+        for (IObservationProvider slot : modelSlots) {
+            if (slot == null) {
+                modelSlots[i] = model;
+                return i;
+            }
+            i++;
+        }
+        StatusManager.getManager().handle(
+                                          new Status(Status.WARNING, "org.eclipse.amp.axf.ui",
+                                                     "Currently, the execution engine only supports " + modelSlots.length
+                                                     + " slots. The UI may not perform properly."));
+        return -1;
+    }
+
+    /**
+     * Release slot.
+     * 
+     * @param model the model
+     * 
+     * @return the int
+     */
+    public int releaseSlot(IObservationProvider model) {
+        int i = 0;
+        for (IObservationProvider slot : modelSlots) {
+            if (slot == model) {
+                modelSlots[i] = null;
+                return i;
+            }
+            i++;
+        }
+        throw new RuntimeException(model + " has not been assigned to a slot.");
+    }
+
+    /**
+     * Register.
+     * 
+     * @param model the model
+     * @param executor the executor
+     * @param modelObject the model object
+     */
+    public synchronized void register(final IModel model, IEngine executor, Object modelObject) {
+        if (model == null) {
+            throw new RuntimeException("Tried to register a null model.");
+        }
+        if (executor == null) {
+            throw new RuntimeException("Tried to register a null executor.");
+        }
+        if (modelActivationListener == null) {
+            activate();
+        }
+        models.add(model);
+        modelForRunner.put(model, executor);
+        runnerForModel.put(executor, model);
+        assignSlot(model);
+        if (modelObject != null) {
+            modelForArbitrary.put(modelObject, model);
+        }
+        managerListeners.notifyModelAdded(model);
+        viewsForModel.put(model, new ArrayList<IViewPart>());
+        setActiveModel(model);
+    }
+
+    /**
+     * Register.
+     * 
+     * @param model the model
+     * @param executor the executor
+     */
+    public void register(final IModel model, IEngine executor) {
+        register(model, executor, null);
+    }
+
+    /**
+     * Register.
+     * 
+     * @param part the part
+     */
+    public synchronized void register(IViewPart part) {
+        views.add(part);
+    }
+
+    /**
+     * Removes the.
+     * 
+     * @param part the part
+     */
+    public synchronized void removed(IViewPart part) {
+        views.remove(part);
+        List<IViewPart> modelViews = getViews(activeModel);
+        if (modelViews != null) {
+            modelViews.remove(part);
+        }
+        managerListeners.notifyViewRemoved(part);
+    }
+
+    public List<IViewPart> getViews(IModel model) {
+        return viewsForModel.get(model);
+    }
+
+    private boolean updated;
+
+    /**
+     * Creates the view part.
+     * 
+     * @param id the id
+     * @param editorInput the editor input
+     * @param name the name
+     */
+    public void createViewPart(final String id, final ModelInput editorInput, final String name) {
+        updated = false;
+        PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+
+            public void run() {
+                try {
+                    IWorkbenchWindow workbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+                    IWorkbenchPage page = workbenchWindow.getActivePage();
+                    int slot = getSlot(editorInput.getModel());
+                    String secondaryID = slot + "";
+                    int viewCount = 0;
+                    for (IViewPart part : viewsForModel.get(editorInput.getModel())) {
+                        if (part.getViewSite().getId().equals(id)) {
+                            viewCount++;
+                        }
+                    }
+                    secondaryID += "-" + viewCount;
+                    final IViewPart showViewPart = page.showView(id, secondaryID, IWorkbenchPage.VIEW_VISIBLE);
+                    if (showViewPart instanceof ModelViewPart) {
+                        register(showViewPart);
+                        ((ModelViewPart) showViewPart).setInput(editorInput);
+                        ((ModelViewPart) showViewPart).setPartName(editorInput.getName() + " " + name);
+                        ((ModelViewPart) showViewPart).createModelListeners();
+                        getViews(editorInput.getModel()).add(showViewPart);
+                        new Thread() {
+                            public void run() {
+                                managerListeners.notifyViewAdded(showViewPart);
+                            }
+                        }.start();
+                    } else if (showViewPart instanceof ErrorViewPart) {
+                    } else {
+                        throw new RuntimeException("Couldn't create model view part.");
+                    }
+                } catch (org.eclipse.ui.PartInitException e) {
+                    throw new RuntimeException("Couldn't instantiate model view " + this, e);
+                } finally {
+                    updated = true;
+                }
+            }
+        });
+        while (!updated) {
+            try {
+                Thread.sleep(50);
+
+            } catch (InterruptedException e) {
+            }
+        }
+    }
+
+    /**
+     * Close view.
+     * 
+     * @param part the part
+     */
+    public void closeView(final IViewPart part) {
+        if (PlatformUI.getWorkbench() != null) {
+            Display display = PlatformUI.getWorkbench().getDisplay();
+            if (!display.isDisposed()) {
+                display.syncExec(new Runnable() {
+                    public void run() {
+                        IWorkbench workbench = PlatformUI.getWorkbench();
+                        IWorkbenchWindow workbenchWindow = workbench.getActiveWorkbenchWindow();
+                        if (workbenchWindow != null && workbenchWindow.getActivePage() != null) {
+                            workbenchWindow.getActivePage().hideView(part);
+                        }
+                    }
+                });
+            }
+        } else {
+            new Thread() {
+                public void run() {
+                    removed(part);
+                };
+            }.start();
+        }
+    }
+
+    /**
+     * Removes the.
+     * 
+     * @param model the model
+     */
+    public synchronized void remove(final IModel model) {
+        if (models.remove(model)) {
+            modelForRunner.remove(model);
+            runnerForModel.remove(model.getEngine());
+            managerListeners.notifyModelRemoved(model);
+            for (IViewPart part : viewsForModel.get(model)) {
+                closeView(part);
+            }
+            viewsForModel.remove(model);
+            List<Object> arbitraries = new ArrayList<Object>();
+            for (Entry<Object, IModel> entry : modelForArbitrary.entrySet()) {
+                if (entry.getValue() == model) {
+                    arbitraries.add(entry.getKey());
+                }
+            }
+            for (Object object : arbitraries) {
+                modelForArbitrary.remove(object);
+            }
+            releaseSlot(model);
+            if (!model.getEngine().isCloseRequested()) {
+                model.getEngine().close();
+            }
+            if (models.size() > 0) {
+                setActiveModel(models.get(models.size() - 1));
+            } else {
+                setActiveModel(null);
+                deactivate();
+            }
+        } else {
+            StatusManager.getManager().handle(
+                                              new Status(Status.WARNING, "org.eclipse.amp.axf.ui",
+                                                         "Removing a model that no longer exists:" + model));
+        }
+    }
+
+    private IWorkbenchPage getPage() {
+        // TODO this is a quick hack and assumed we only have one workbench window and one page
+        final IWorkbench wb = AXFWorkbenchPlugin.getDefault().getWorkbench();
+        return wb.getWorkbenchWindows()[0].getPages()[0];
+    }
+
+    private void activate() {
+        final IWorkbench wb = AXFWorkbenchPlugin.getDefault().getWorkbench();
+
+        if (wb != null) {
+            wb.addWorkbenchListener(new IWorkbenchListener() {
+                public void postShutdown(IWorkbench workbench) {
+                }
+
+                public boolean preShutdown(IWorkbench workbench, boolean forced) {
+                    if (!forced) {
+                        synchronized (ModelViewManager.this) {
+                            for (IModel model : new ArrayList<IModel>(getModels())) {
+                                remove(model);
+                            }
+                        }
+                    }
+                    return true;
+                }
+            });
+
+            modelActivationListener = new IPartListener() {
+                public void partActivated(final IWorkbenchPart part) {
+                    assignPart(part);
+                    // if (updated != null) {
+                    // }
+                }
+
+                private void assignPart(final IWorkbenchPart part) {
+                    if (part instanceof IModelPart && ((IModelPart) part).getAdapter(IModel.class) != null) {
+                        new Thread() {
+                            public void run() {
+                                IModel model = (IModel) ((IModelPart) part).getAdapter(IModel.class);
+                                setActiveModel(model);
+                            }
+                        }.start();
+                    }
+                }
+
+                public void partBroughtToTop(IWorkbenchPart part) {
+                    assignPart(part);
+                }
+
+                public void partClosed(final IWorkbenchPart part) {
+                    new Thread() {
+                        public void run() {
+                            removed((IViewPart) part);
+                        }
+                    }.start();
+                }
+
+                public void partDeactivated(IWorkbenchPart part) {
+                }
+
+                public void partOpened(IWorkbenchPart part) {
+                    assignPart(part);
+                }
+
+                // private SpeedSliderWindowControl getSpeedControl(final IWorkbenchPart part) {
+                // IViewSite site = (IViewSite) part.getSite();
+                // IActionBars actionBars = site.getActionBars();
+                // return (SpeedSliderWindowControl) actionBars.getMenuManager()
+                // .find("org.eclipse.amp.axf.view.ui.slider");
+                // };
+            };
+            getPage().addPartListener(modelActivationListener);
+            activatePerspective(wb, EXECUTION_PERSPECTIVE_ID, false);
+            wb.getDisplay().syncExec(new Runnable() {
+                private StatusLineView statusView;
+
+                public void run() {
+                    try {
+                        contextService = (IContextService) wb.getService(IContextService.class);
+                        ideContext = contextService.activateContext("org.eclipse.amp.axf.executionContext");
+                        partContext = contextService.activateContext("org.eclipse.amp.axf.activeEditorContext");
+
+                        handlers.activate();
+                        handlers.addHandler("org.eclipse.amp.axf.ui.start", new StartHandler());
+                        handlers.addHandler("org.eclipse.amp.axf.ui.stop", new StopHandler());
+                        handlers.addHandler("org.eclipse.amp.axf.ui.pause", new PauseHandler());
+                        handlers.addHandler("org.eclipse.amp.axf.ui.resume", new ResumeHandler());
+                        handlers.addHandler("org.eclipse.amp.axf.ui.restart", new RestartHandler());
+                        handlers.addHandler("org.eclipse.amp.axf.ui.close", new CloseHandler());
+                        handlers.addHandler("org.eclipse.amp.axf.ui.step", new StepHandler());
+                        // if (statusView == null) {
+                        // statusView = new StatusLineView();
+                        // new Thread() {
+                        // public void run() {
+                        // workbenchListeners.addListener(statusView);
+                        // addModelManagerListener(statusView);
+                        // };
+                        // }.start();
+                        // }
+                    } catch (Exception e) {
+                        throw new RuntimeException("Couldn't activate services.", e);
+                    }
+                }
+            });
+        } else {
+            throw new RuntimeException("Attempted to activate a service with no workbench available.");
+        }
+    }
+
+    private void activatePerspective(final IWorkbench wb, final String perspectiveID, final boolean editors) {
+        wb.getDisplay().syncExec(new Runnable() {
+            public void run() {
+                IPerspectiveDescriptor perspective = wb.getPerspectiveRegistry().findPerspectiveWithId(perspectiveID);
+                if (perspective != null) {
+                    IWorkbenchPage activePage = wb.getActiveWorkbenchWindow() != null ? wb.getActiveWorkbenchWindow()
+                        .getActivePage() : null;
+                        if (activePage != null && priorPerspectiveID == null
+                                || !activePage.getPerspective().getId().equals(EXECUTION_PERSPECTIVE_ID)) {
+                            priorPerspectiveID = activePage.getPerspective().getId();
+                        }
+                        activePage.setPerspective(perspective);
+                        activePage.setEditorAreaVisible(editors);
+                }
+                updateCount++;
+            }
+        });
+    }
+
+    private void deactivate() {
+        final IWorkbench wb = AXFWorkbenchPlugin.getDefault().getWorkbench();
+        if (wb != null) {
+            workbenchListeners = new LifeCycleListeners();
+            wb.getDisplay().syncExec(new Runnable() {
+                public void run() {
+                    if (contextService != null) {
+                        contextService.deactivateContext(ideContext);
+                        contextService.deactivateContext(partContext);
+                    }
+                    handlers.deactivate();
+                }
+            });
+            getPage().removePartListener(modelActivationListener);
+            // while (views.size() > 0) {
+            // try {
+            // Thread.sleep(50);
+            // } catch (InterruptedException e) {
+            // }
+            // }
+            if (priorPerspectiveID != null) {
+                activatePerspective(wb, priorPerspectiveID, true);
+            }
+            modelActivationListener = null;
+        }
+    }
+
+    private void waitForUpdate(int count) {
+        while (updateCount < count) {
+            try {
+                Thread.sleep(50);
+            } catch (InterruptedException e) {
+            }
+        }
+        updateCount = 0;
+    }
+
+    /**
+     * @param adaptableObject
+     * @param adapterType
+     * @return
+     * @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object, java.lang.Class)
+     */
+    public Object getAdapter(Object adaptableObject, Class adapterType) {
+        if (adapterType == IEngine.class) {
+            return runnerForModel.get(adaptableObject);
+        } else if (adapterType == IModel.class) {
+            if (adaptableObject instanceof IEngine) {
+                return modelForRunner.get(adaptableObject);
+            } else {
+                return modelForArbitrary.get(adaptableObject);
+            }
+        }
+        return null;
+    }
+
+    /**
+     * @return
+     * @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()
+     */
+    public Class[] getAdapterList() {
+        return new Class[] { IEngine.class, IModel.class };
+    }
+
+    /**
+     * Gets the selection synchronizer.
+     * 
+     * @return the selection synchronizer
+     */
+    public SelectionSynchronizer getSelectionSynchronizer() {
+        return editSelection;
+    }
+
+    /**
+     * Sets the selection synchronizer.
+     * 
+     * @param editSelection the new selection synchronizer
+     */
+    public void setSelectionSynchronizer(SelectionSynchronizer editSelection) {
+        if (this.editSelection != null) {
+            editSelection.replace(this.editSelection);
+        }
+        this.editSelection = editSelection;
+    }
+
+
+    public ModelManagerListeners getManagerListeners() {
+        return managerListeners;
+    }
+
+    public LifeCycleListeners getWorkbenchListeners() {
+        return workbenchListeners;
+    }
+
+    public HandlerManager getHandlers() {
+        return handlers;
+    }
+
+}
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/handlers/CloseHandler.java b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/handlers/CloseHandler.java
new file mode 100644
index 0000000..8b3454f
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/handlers/CloseHandler.java
@@ -0,0 +1,40 @@
+/**

+ * <copyright>

+ *

+ * Copyright (c) 2009 Metascape, LLC.

+ * 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: 

+ *   Metascape - Initial API and Implementation

+ *

+ * </copyright>

+ *

+*/

+package org.eclipse.amp.axf.ide.handlers;

+

+import org.eclipse.amp.axf.core.EngineControl;

+

+// TODO: Auto-generated Javadoc

+/**

+ * The Class CloseHandler.

+ */

+public class CloseHandler extends ModelRunHandler {

+

+    /**

+     * Instantiates a new close handler.

+     */

+    public CloseHandler() {

+        super(EngineControl.CLOSE);

+    }

+

+    /**

+     * @return

+     * @see org.eclipse.amp.axf.ide.handlers.ModelRunHandler#isEnabled()

+     */

+    public boolean isEnabled() {

+        return super.isEnabled() || getRunner().getModelThread().isAlive();

+    }

+}

diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/handlers/ModelRunHandler.java b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/handlers/ModelRunHandler.java
new file mode 100644
index 0000000..2903dbd
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/handlers/ModelRunHandler.java
@@ -0,0 +1,153 @@
+/**

+ * <copyright>

+ *

+ * Copyright (c) 2009 Metascape, LLC.

+ * 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:

+ *   Metascape - Initial API and Implementation

+ *

+ * </copyright>

+ *

+ */

+package org.eclipse.amp.axf.ide.handlers;

+

+import org.eclipse.amp.axf.core.EngineControl;

+import org.eclipse.amp.axf.core.IEngine;

+import org.eclipse.amp.axf.core.ILifeCycleListener;

+import org.eclipse.amp.axf.core.IModel;

+import org.eclipse.amp.axf.core.IObservationProvider;

+import org.eclipse.amp.axf.core.IStateListener;

+import org.eclipse.amp.axf.core.LifecycleObservationAdapter;

+import org.eclipse.amp.axf.ide.AXFWorkbenchPlugin;

+import org.eclipse.amp.axf.ide.IModelWorkbenchListener;

+import org.eclipse.core.commands.AbstractHandler;

+import org.eclipse.core.commands.ExecutionEvent;

+import org.eclipse.core.commands.ExecutionException;

+import org.eclipse.core.commands.HandlerEvent;

+import org.eclipse.ui.IWorkbench;

+import org.eclipse.ui.IWorkbenchPart;

+

+// TODO: Auto-generated Javadoc

+/**

+ * The Class ModelRunHandler.

+ */

+public abstract class ModelRunHandler extends AbstractHandler implements ILifeCycleListener, IModelWorkbenchListener {

+

+

+    private IModel model;

+

+    private EngineControl control;

+

+    private IStateListener delegate;

+

+    /**

+     * Instantiates a new model run handler.

+     * 

+     * @param control the control

+     */

+    public ModelRunHandler(EngineControl control) {

+        this.control = control;

+        delegate = new LifecycleObservationAdapter(this);

+    }

+

+    /**

+     * @param event

+     * @return

+     * @throws ExecutionException

+     * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)

+     */

+    public Object execute(ExecutionEvent event) throws ExecutionException {

+        getRunner().control(control);

+        AXFWorkbenchPlugin.getDefault().getManager().getHandlers().notifyHandlers();

+        return null;

+    }

+

+    /**

+     * Gets the runner.

+     * 

+     * @return the runner

+     */

+    public IEngine getRunner() {

+        return model != null ? model.getEngine() : null;

+    }

+

+    /**

+     * @return

+     * @see org.eclipse.core.commands.AbstractHandler#isEnabled()

+     */

+    public boolean isEnabled() {

+        return getRunner() != null && !getRunner().isCloseRequested();

+    }

+

+    /**

+     * Notify change.

+     */

+    public void notifyChange() {

+        // its possible we've already left workbench

+        if (AXFWorkbenchPlugin.getDefault() != null) {

+            IWorkbench workbench = AXFWorkbenchPlugin.getDefault().getWorkbench();

+            if (model != null && workbench.getDisplay() != null && !workbench.getDisplay().isDisposed()) {

+                workbench.getDisplay().asyncExec(new Runnable() {

+                    public void run() {

+                        fireHandlerChanged(new HandlerEvent(ModelRunHandler.this, true, false));

+                    }

+                });

+            }

+        }

+    }

+

+    public void observing(IObservationProvider model) {

+        this.model = (IModel) model;

+    }

+

+    public void observationEnd(IObservationProvider model) {

+        this.model = null;

+    }

+

+    public void stateChange(Object key, Object updated) {

+        delegate.stateChange(key, updated);

+        notifyChange();

+    }

+

+    public void modelActivated(IObservationProvider model) {

+        this.model = (IModel) model;

+        notifyChange();

+    }

+

+    public void modelAdded(IObservationProvider model) {

+    }

+

+    public void modelRemoved(IObservationProvider model) {

+    }

+

+    public void viewActivated(IWorkbenchPart part) {

+    }

+

+    public void viewAdded(IWorkbenchPart part) {

+    }

+

+    public void viewRemoved(IWorkbenchPart part) {

+    }

+

+    public void observationEnding(IObservationProvider observed) {

+    }

+

+    public void observeCreate(IObservationProvider observed) {

+    }

+

+    public void observeInitialize(IObservationProvider observed) {

+    }

+

+    public void observeStart(IObservationProvider observed) {

+    }

+

+    public void observeStop(IObservationProvider observed) {

+    }

+

+    public void observeUpdate(IObservationProvider observed) {

+    }

+}

diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/handlers/PauseHandler.java b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/handlers/PauseHandler.java
new file mode 100644
index 0000000..96b24f5
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/handlers/PauseHandler.java
@@ -0,0 +1,41 @@
+/**

+ * <copyright>

+ *

+ * Copyright (c) 2009 Metascape, LLC.

+ * 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: 

+ *   Metascape - Initial API and Implementation

+ *

+ * </copyright>

+ *

+*/

+package org.eclipse.amp.axf.ide.handlers;

+

+import org.eclipse.amp.axf.core.EngineControl;

+

+// TODO: Auto-generated Javadoc

+/**

+ * The Class PauseHandler.

+ */

+public class PauseHandler extends ModelRunHandler {

+

+    /**

+     * Instantiates a new pause handler.

+     */

+    public PauseHandler() {

+        super(EngineControl.PAUSE);

+    }

+

+    /**

+     * @return

+     * @see org.eclipse.amp.axf.ide.handlers.ModelRunHandler#isEnabled()

+     */

+    @Override

+    public boolean isEnabled() {

+        return super.isEnabled() && !getRunner().isPaused();

+    }

+}

diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/handlers/RestartHandler.java b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/handlers/RestartHandler.java
new file mode 100644
index 0000000..750b98f
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/handlers/RestartHandler.java
@@ -0,0 +1,41 @@
+/**

+ * <copyright>

+ *

+ * Copyright (c) 2009 Metascape, LLC.

+ * 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:

+ *   Metascape - Initial API and Implementation

+ *

+ * </copyright>

+ *

+ */

+package org.eclipse.amp.axf.ide.handlers;

+

+import org.eclipse.amp.axf.core.EngineControl;

+

+// TODO: Auto-generated Javadoc

+/**

+ * The Class RestartHandler.

+ */

+public class RestartHandler extends ModelRunHandler {

+

+    /**

+     * Instantiates a new restart handler.

+     */

+    public RestartHandler() {

+        super(EngineControl.RESTART);

+    }

+

+    /**

+     * @return

+     * @see org.eclipse.amp.axf.ide.handlers.ModelRunHandler#isEnabled()

+     */

+    public boolean isEnabled() {

+        // TODO Auto-generated method stub

+        return super.isEnabled() && getRunner().isRunning();

+    }

+}

diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/handlers/ResumeHandler.java b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/handlers/ResumeHandler.java
new file mode 100644
index 0000000..7f3e3d6
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/handlers/ResumeHandler.java
@@ -0,0 +1,42 @@
+/**

+ * <copyright>

+ *

+ * Copyright (c) 2009 Metascape, LLC.

+ * 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: 

+ *   Metascape - Initial API and Implementation

+ *

+ * </copyright>

+ *

+*/

+package org.eclipse.amp.axf.ide.handlers;

+

+import org.eclipse.amp.axf.core.EngineControl;

+

+// TODO: Auto-generated Javadoc

+/**

+ * The Class ResumeHandler.

+ */

+public class ResumeHandler extends ModelRunHandler {

+

+    /**

+     * Instantiates a new resume handler.

+     */

+    public ResumeHandler() {

+        super(EngineControl.RESUME);

+    }

+

+    /**

+     * @return

+     * @see org.eclipse.amp.axf.ide.handlers.ModelRunHandler#isEnabled()

+     */

+    @Override

+    public boolean isEnabled() {

+        // TODO Auto-generated method stub

+        return super.isEnabled() && getRunner().isPaused();

+    }

+}

diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/handlers/StartHandler.java b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/handlers/StartHandler.java
new file mode 100644
index 0000000..a473cfa
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/handlers/StartHandler.java
@@ -0,0 +1,40 @@
+/**

+ * <copyright>

+ *

+ * Copyright (c) 2009 Metascape, LLC.

+ * 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: 

+ *   Metascape - Initial API and Implementation

+ *

+ * </copyright>

+ *

+*/

+package org.eclipse.amp.axf.ide.handlers;

+

+import org.eclipse.amp.axf.core.EngineControl;

+

+// TODO: Auto-generated Javadoc

+/**

+ * The Class StartHandler.

+ */

+public class StartHandler extends ModelRunHandler {

+

+    /**

+     * Instantiates a new start handler.

+     */

+    public StartHandler() {

+        super(EngineControl.START);

+    }

+

+    /**

+     * @return

+     * @see org.eclipse.amp.axf.ide.handlers.ModelRunHandler#isEnabled()

+     */

+    public boolean isEnabled() {

+        return super.isEnabled() && !getRunner().isRunning();

+    }

+}

diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/handlers/StepHandler.java b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/handlers/StepHandler.java
new file mode 100644
index 0000000..c9b3698
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/handlers/StepHandler.java
@@ -0,0 +1,40 @@
+/**

+ * <copyright>

+ *

+ * Copyright (c) 2009 Metascape, LLC.

+ * 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: 

+ *   Metascape - Initial API and Implementation

+ *

+ * </copyright>

+ *

+*/

+package org.eclipse.amp.axf.ide.handlers;

+

+import org.eclipse.amp.axf.core.EngineControl;

+

+// TODO: Auto-generated Javadoc

+/**

+ * The Class StepHandler.

+ */

+public class StepHandler extends ModelRunHandler {

+

+    /**

+     * Instantiates a new step handler.

+     */

+    public StepHandler() {

+        super(EngineControl.STEP);

+    }

+

+    /**

+     * @return

+     * @see org.eclipse.amp.axf.ide.handlers.ModelRunHandler#isEnabled()

+     */

+    public boolean isEnabled() {

+        return super.isEnabled() && getRunner().isRunning() && getRunner().isPaused();

+    }

+}

diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/handlers/StopHandler.java b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/handlers/StopHandler.java
new file mode 100644
index 0000000..925d8ed
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/handlers/StopHandler.java
@@ -0,0 +1,40 @@
+/**

+ * <copyright>

+ *

+ * Copyright (c) 2009 Metascape, LLC.

+ * 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: 

+ *   Metascape - Initial API and Implementation

+ *

+ * </copyright>

+ *

+*/

+package org.eclipse.amp.axf.ide.handlers;

+

+import org.eclipse.amp.axf.core.EngineControl;

+

+// TODO: Auto-generated Javadoc

+/**

+ * The Class StopHandler.

+ */

+public class StopHandler extends ModelRunHandler {

+

+    /**

+     * Instantiates a new stop handler.

+     */

+    public StopHandler() {

+        super(EngineControl.STOP);

+    }

+

+    /**

+     * @return

+     * @see org.eclipse.amp.axf.ide.handlers.ModelRunHandler#isEnabled()

+     */

+    public boolean isEnabled() {

+        return super.isEnabled() && getRunner().isRunning();

+    }

+}

diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/view/DelayView.java b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/view/DelayView.java
new file mode 100644
index 0000000..96b1a00
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/view/DelayView.java
@@ -0,0 +1,44 @@
+/**

+ * <copyright>

+ *

+ * Copyright (c) 2009 Metascape, LLC.

+ * 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:

+ *   Metascape - Initial API and Implementation

+ *

+ * </copyright>

+ *

+ */

+

+package org.eclipse.amp.axf.ide.view;

+

+import org.eclipse.amp.axf.core.AbstractLifecycleListener;

+import org.eclipse.amp.axf.core.IModel;

+import org.eclipse.amp.axf.core.IObservationProvider;

+import org.eclipse.amp.axf.core.TimeGranularity;

+

+/**

+ * 

+ * @author mparker

+ *

+ */

+public class DelayView extends AbstractLifecycleListener {

+

+    /**

+     * @param observed

+     * @see org.eclipse.amp.axf.core.AbstractLifecycleListener#observeUpdate(org.eclipse.amp.axf.core.IObservationProvider)

+     */

+    public void observeUpdate(IObservationProvider observed) {

+        long delayPeriod = ((TimeGranularity) ((IModel) observed).getEngine().getUpdateGranularity()).getUpdateDelay();

+        if (delayPeriod > 0) {

+            try {

+                Thread.sleep(delayPeriod);

+            } catch (InterruptedException e) {

+            }

+        }

+    }

+}

diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/view/MonitorView.java b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/view/MonitorView.java
new file mode 100644
index 0000000..e6572c3
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/view/MonitorView.java
@@ -0,0 +1,54 @@
+/**

+ * <copyright>

+ *

+ * Copyright (c) 2009 Metascape, LLC.

+ * 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: 

+ *   Metascape - Initial API and Implementation

+ *

+ * </copyright>

+ *

+*/

+package org.eclipse.amp.axf.ide.view;

+

+import org.eclipse.amp.axf.core.AbstractLifecycleListener;

+import org.eclipse.amp.axf.core.IModel;

+import org.eclipse.amp.axf.core.IObservationProvider;

+import org.eclipse.core.runtime.IProgressMonitor;

+

+// TODO: Auto-generated Javadoc

+/**

+ * The Class MonitorView.

+ */

+public abstract class MonitorView extends AbstractLifecycleListener {

+

+    protected final IProgressMonitor monitor;

+

+    protected String modelDesc;

+

+    /**

+     * Instantiates a new monitor view.

+     * 

+     * @param monitor the monitor

+     * @param name the name

+     */

+    public MonitorView(IProgressMonitor monitor, String name) {

+        super(name);

+        this.monitor = monitor;

+    }

+

+    /**

+     * @param model

+     * @see org.eclipse.amp.axf.core.AbstractLifecycleListener#observing(org.eclipse.amp.axf.core.IObservationProvider)

+     */

+    @Override

+    public void observing(IObservationProvider model) {

+        super.observing(model);

+        // TODO change to label provider

+        modelDesc = ((IModel) model).getName() + " [" + model.getClass() + "]";

+    }

+}

diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/view/RunMonitorView.java b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/view/RunMonitorView.java
new file mode 100644
index 0000000..624bdb0
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/view/RunMonitorView.java
@@ -0,0 +1,97 @@
+/**

+ * <copyright>

+ *

+ * Copyright (c) 2009 Metascape, LLC.

+ * 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: 

+ *   Metascape - Initial API and Implementation

+ *

+ * </copyright>

+ *

+*/

+package org.eclipse.amp.axf.ide.view;

+

+import org.eclipse.amp.axf.core.IModel;

+import org.eclipse.amp.axf.core.IObservationProvider;

+import org.eclipse.core.runtime.IProgressMonitor;

+

+// TODO: Auto-generated Javadoc

+/**

+ * The Class RunMonitorView.

+ */

+public class RunMonitorView extends MonitorView {

+

+    /**

+     * Instantiates a new run monitor view.

+     * 

+     * @param monitor the monitor

+     */

+    public RunMonitorView(IProgressMonitor monitor) {

+        super(monitor, "Run Monitor View");

+    }

+

+    /**

+     * @param model

+     * @see org.eclipse.amp.axf.ide.view.MonitorView#observing(org.eclipse.amp.axf.core.IObservationProvider)

+     */

+    @Override

+    public void observing(IObservationProvider model) {

+        super.observing(model);

+        String mainDesc = "Run " + modelDesc;

+        monitor.setTaskName(mainDesc);

+    }

+

+    /**

+     * @param key

+     * @param model

+     * @see org.eclipse.amp.axf.core.AbstractLifecycleListener#stateChange(java.lang.Object, java.lang.Object)

+     */

+    @Override

+    public void stateChange(Object key, Object model) {

+        super.stateChange(key, model);

+        if (monitor.isCanceled() && ((IModel) model).getEngine().isRunning()) {

+            ((IModel) model).getEngine().stop();

+        }

+    }

+

+    /**

+     * @param model

+     * @see org.eclipse.amp.axf.core.AbstractLifecycleListener#observeUpdate(org.eclipse.amp.axf.core.IObservationProvider)

+     */

+    @Override

+    public void observeUpdate(IObservationProvider model) {

+        if (((IModel) model).getPeriod() % 10 == 0) {

+            monitor.subTask("Period " + ((IModel) model).getPeriod()

+                + (((IModel) model).getStopPeriod() > 0 ? " of " + ((IModel) model).getStopPeriod() : ""));

+            monitor.worked(10);

+        }

+    }

+

+    /**

+     * @param observed

+     * @see org.eclipse.amp.axf.core.AbstractLifecycleListener#observeStart(org.eclipse.amp.axf.core.IObservationProvider)

+     */

+    @Override

+    public void observeStart(IObservationProvider observed) {

+        IModel model = (IModel) observed;

+        monitor.beginTask("Run " + model.getName(), model.getStopPeriod() > 0 ? model.getStopPeriod()

+            : IProgressMonitor.UNKNOWN);

+        monitor.subTask("Started");

+        monitor.worked(1);

+    }

+

+    /**

+     * @param model

+     * @see org.eclipse.amp.axf.core.AbstractLifecycleListener#observeStop(org.eclipse.amp.axf.core.IObservationProvider)

+     */

+    @Override

+    public void observeStop(IObservationProvider model) {

+        monitor.subTask("Stopped");

+        monitor.done();

+    }

+

+}

diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/view/ScaleGranularityControl.java b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/view/ScaleGranularityControl.java
new file mode 100644
index 0000000..3ca50dd
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/view/ScaleGranularityControl.java
@@ -0,0 +1,183 @@
+/**

+ * <copyright>

+ *

+ * Copyright (c) 2009 Metascape, LLC.

+ * 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:

+ *   Metascape - Initial API and Implementation

+ *

+ * </copyright>

+ *

+ */

+

+package org.eclipse.amp.axf.ide.view;

+

+import org.eclipse.amp.axf.core.IEngine;

+import org.eclipse.amp.axf.core.IModel;

+import org.eclipse.amp.axf.core.IObservationProvider;

+import org.eclipse.amp.axf.core.TimeGranularity;

+import org.eclipse.amp.axf.ide.AXFWorkbenchPlugin;

+import org.eclipse.amp.axf.ide.IModelWorkbenchListener;

+import org.eclipse.swt.SWT;

+import org.eclipse.swt.events.SelectionEvent;

+import org.eclipse.swt.events.SelectionListener;

+import org.eclipse.swt.widgets.Composite;

+import org.eclipse.swt.widgets.Control;

+import org.eclipse.swt.widgets.Display;

+import org.eclipse.swt.widgets.Scale;

+import org.eclipse.ui.IWorkbenchPart;

+import org.eclipse.ui.menus.WorkbenchWindowControlContribution;

+

+/**

+ * 

+ * @author mparker

+ *

+ */

+public class ScaleGranularityControl extends WorkbenchWindowControlContribution implements IModelWorkbenchListener {

+

+    IEngine engine;

+

+    Scale scale;

+

+    private static int SCALE_MID = 50;

+

+    private static int SCALE_MAX = 110;

+

+    // Around the center area we want to have scale snap to middle.

+    private static int CENTER_RANGE = 5;

+

+    /**

+     * @param parent

+     * @return

+     * @see org.eclipse.jface.action.ControlContribution#createControl(org.eclipse.swt.widgets.Composite)

+     */

+    protected Control createControl(Composite parent) {

+        scale = new Scale(parent, SWT.HORIZONTAL);

+        scale.setMaximum(SCALE_MAX);

+        scale.setSelection(SCALE_MID);

+        scale.addSelectionListener(new SelectionListener() {

+            public void widgetSelected(SelectionEvent e) {

+                scaleToEngineGranularity();

+            }

+

+            public void widgetDefaultSelected(SelectionEvent e) {

+            }

+        });

+        new Thread() {

+            public void run() {

+                AXFWorkbenchPlugin.getDefault().getManager().getManagerListeners()

+                        .addModelManagerListener(ScaleGranularityControl.this);

+            };

+        }.start();

+        return scale;

+    }

+

+    private void scaleToEngineGranularity() {

+        if (Math.abs(scale.getSelection() - SCALE_MID) > CENTER_RANGE) {

+            if (scale.getSelection() > SCALE_MID) {

+                engine.setUpdateGranularity(TimeGranularity.createFrequencyGranularity((scale

+                        .getSelection()

+                        - SCALE_MID - CENTER_RANGE) * 2));

+            } else {

+                if (scale.getSelection() > 0) {

+                    engine.setUpdateGranularity(TimeGranularity.createDelayGranularity((SCALE_MID - scale

+                            .getSelection()) * 50));

+                }

+            }

+        } else {

+            if (scale.getSelection() != SCALE_MID) {

+                // recursive call w/o blocking

+                setScaleSelection(SCALE_MID);

+            } else {

+                engine.setUpdateGranularity(TimeGranularity.DEFAULT_GRANULARITY);

+            }

+        }

+    }

+

+    /**

+     * 

+     */

+    private void engineGranularityToScale() {

+        if (engine.getUpdateGranularity() instanceof TimeGranularity) {

+            TimeGranularity granularity = (TimeGranularity) engine.getUpdateGranularity();

+            if (granularity.getUpdateDelay() > 0) {

+                setScaleSelection((int) (granularity.getUpdateDelay() / 50));

+            } else if (granularity.getUpdateFrequency() > 1) {

+                setScaleSelection((granularity.getUpdateFrequency() / 2 + SCALE_MID));

+            } else {

+                setScaleSelection(SCALE_MID);

+            }

+        }

+    }

+

+    protected void setScaleSelection(final int value) {

+        Display.getDefault().asyncExec(new Runnable() {

+            public void run() {

+                scale.setSelection(value);

+            }

+        });

+    }

+

+    /**

+     * @param model

+     * @see org.eclipse.amp.axf.ide.IModelWorkbenchListener#modelActivated(org.eclipse.amp.axf.core.IObservationProvider)

+     */

+    public void modelActivated(IObservationProvider model) {

+        if (model != null) {

+            Display.getDefault().asyncExec(new Runnable() {

+                public void run() {

+                    scale.setEnabled(true);

+                }

+            });

+            engine = ((IModel) model).getEngine();

+            engineGranularityToScale();

+        } else {

+            engine = null;

+            Display.getDefault().asyncExec(new Runnable() {

+                public void run() {

+                    scale.setEnabled(false);

+                }

+            });

+        }

+

+    }

+

+    /**

+     * @param model

+     * @see org.eclipse.amp.axf.ide.IModelWorkbenchListener#modelAdded(org.eclipse.amp.axf.core.IObservationProvider)

+     */

+    public void modelAdded(IObservationProvider model) {

+    }

+

+    /**

+     * @param model

+     * @see org.eclipse.amp.axf.ide.IModelWorkbenchListener#modelRemoved(org.eclipse.amp.axf.core.IObservationProvider)

+     */

+    public void modelRemoved(IObservationProvider model) {

+    }

+

+    /**

+     * @param part

+     * @see org.eclipse.amp.axf.ide.IModelWorkbenchListener#viewActivated(org.eclipse.ui.IWorkbenchPart)

+     */

+    public void viewActivated(IWorkbenchPart part) {

+    }

+

+    /**

+     * @param part

+     * @see org.eclipse.amp.axf.ide.IModelWorkbenchListener#viewAdded(org.eclipse.ui.IWorkbenchPart)

+     */

+    public void viewAdded(IWorkbenchPart part) {

+    }

+

+    /**

+     * @param part

+     * @see org.eclipse.amp.axf.ide.IModelWorkbenchListener#viewRemoved(org.eclipse.ui.IWorkbenchPart)

+     */

+    public void viewRemoved(IWorkbenchPart part) {

+    }

+}

diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/view/StatusLineView.java b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/view/StatusLineView.java
new file mode 100644
index 0000000..0550450
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/view/StatusLineView.java
@@ -0,0 +1,151 @@
+/**

+ * <copyright>

+ *

+ * Copyright (c) 2009 Metascape, LLC.

+ * 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:

+ *   Metascape - Initial API and Implementation

+ *

+ * </copyright>

+ *

+ */

+package org.eclipse.amp.axf.ide.view;

+

+import org.eclipse.amp.axf.core.IModel;

+import org.eclipse.amp.axf.core.IObservationProvider;

+import org.eclipse.amp.axf.ide.IModelWorkbenchListener;

+import org.eclipse.amp.axf.view.SWTAsyncModelListener;

+import org.eclipse.ui.IActionBars;

+import org.eclipse.ui.IViewPart;

+import org.eclipse.ui.IViewSite;

+import org.eclipse.ui.IWorkbenchPart;

+

+// TODO: Auto-generated Javadoc

+/**

+ * The Class StatusLineView.

+ */

+public class StatusLineView extends SWTAsyncModelListener implements IModelWorkbenchListener {

+

+    IViewPart part;

+

+    /**

+     * Instantiates a new status line view.

+     */

+    public StatusLineView() {

+        super(null, "Status Line View", 100);

+    }

+

+    /**

+     * @param model

+     * @see org.eclipse.amp.axf.core.AbstractLifecycleListener#observeStart(org.eclipse.amp.axf.core.IObservationProvider)

+     */

+    public void observeStart(IObservationProvider model) {

+        updateMessage("Started");

+    }

+

+    /**

+     * @param model

+     * @see org.eclipse.amp.axf.core.AbstractLifecycleListener#observeStop(org.eclipse.amp.axf.core.IObservationProvider)

+     */

+    public void observeStop(IObservationProvider model) {

+        updateMessage("Stopped");

+    }

+

+    /**

+     * @param model

+     * @see org.eclipse.amp.axf.view.SWTThreadModelListener#update(org.eclipse.amp.axf.core.IModel)

+     */

+    public void update(IModel model) {

+        // IViewPart viewPart = (IViewPart) part.getAdapter(IViewPart.class);

+

+        String msg = model.getName();

+        msg += " " + model.getTimeDescription();

+        if (model.getEngine().isPaused()) {

+            msg += " [PAUSED]";

+        } else {

+            msg += " " + model.getEngine().getUpdateGranularity();

+        }

+        updateMessage(msg);

+    }

+

+    private void updateMessage(String msg) {

+        if (part instanceof IViewPart) {

+            IViewSite site = (IViewSite) part.getSite();

+            IActionBars actionBars = site.getActionBars();

+            actionBars.getStatusLineManager().setMessage(msg);

+            actionBars.updateActionBars();

+        }

+    }

+

+    /**

+     * Sets the part.

+     * 

+     * @param part the new part

+     */

+    public void setPart(IViewPart part) {

+        this.part = part;

+    }

+

+    /**

+     * Gets the part.

+     * 

+     * @return the part

+     */

+    public IViewPart getPart() {

+        return part;

+    }

+

+    /**

+     * @param model

+     * @see org.eclipse.amp.axf.ide.IModelWorkbenchListener#modelActivated(org.eclipse.amp.axf.core.IObservationProvider)

+     */

+    public void modelActivated(IObservationProvider model) {

+    }

+

+    /**

+     * @param model

+     * @see org.eclipse.amp.axf.ide.IModelWorkbenchListener#modelAdded(org.eclipse.amp.axf.core.IObservationProvider)

+     */

+    public void modelAdded(IObservationProvider model) {

+    }

+

+    /**

+     * @param model

+     * @see org.eclipse.amp.axf.ide.IModelWorkbenchListener#modelRemoved(org.eclipse.amp.axf.core.IObservationProvider)

+     */

+    public void modelRemoved(IObservationProvider model) {

+    }

+

+    /**

+     * @param part

+     * @see org.eclipse.amp.axf.ide.IModelWorkbenchListener#viewActivated(org.eclipse.ui.IWorkbenchPart)

+     */

+    public void viewActivated(IWorkbenchPart part) {

+        if (part instanceof IViewPart) {

+            this.part = (IViewPart) part;

+        } else {

+            this.part = null;

+        }

+    }

+

+    /**

+     * @param part

+     * @see org.eclipse.amp.axf.ide.IModelWorkbenchListener#viewAdded(org.eclipse.ui.IWorkbenchPart)

+     */

+    public void viewAdded(IWorkbenchPart part) {

+    }

+

+    /**

+     * @param part

+     * @see org.eclipse.amp.axf.ide.IModelWorkbenchListener#viewRemoved(org.eclipse.ui.IWorkbenchPart)

+     */

+    public void viewRemoved(IWorkbenchPart part) {

+        if (part == this.part) {

+            this.part = null;

+        }

+    }

+}