浏览代码

Terminate running simulation when project is closed that contains target resource

Andreas Mülder 13 年之前
父节点
当前提交
9b8aa439a5

+ 5 - 0
plugins/org.yakindu.sct.simulation.core/src/org/yakindu/sct/simulation/core/debugmodel/SCTDebugTarget.java

@@ -290,4 +290,9 @@ public class SCTDebugTarget extends SCTDebugElement implements IDebugTarget,
 				|| trace instanceof TraceStateExited)
 			fireChangeEvent(DebugEvent.CONTENT);
 	}
+
+	public Statechart getStatechart() {
+		return statechart;
+	}
+
 }

+ 25 - 1
plugins/org.yakindu.sct.simulation.core/src/org/yakindu/sct/simulation/core/hmr/SCTHotModelReplacementManager.java

@@ -14,6 +14,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.IResourceChangeEvent;
 import org.eclipse.core.resources.IResourceChangeListener;
@@ -23,6 +24,7 @@ import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IAdaptable;
 import org.eclipse.debug.core.DebugEvent;
+import org.eclipse.debug.core.DebugException;
 import org.eclipse.debug.core.DebugPlugin;
 import org.eclipse.debug.core.IDebugEventSetListener;
 import org.eclipse.debug.core.ILaunch;
@@ -30,6 +32,7 @@ import org.eclipse.debug.core.ILaunchListener;
 import org.eclipse.debug.core.model.IDebugTarget;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
 import org.yakindu.sct.model.sgraph.Statechart;
 import org.yakindu.sct.simulation.core.debugmodel.SCTDebugTarget;
 import org.yakindu.sct.simulation.core.util.ResourceUtil;
@@ -138,10 +141,14 @@ public class SCTHotModelReplacementManager implements IResourceChangeListener,
 	private List<IFile> changedFiles = new ArrayList<IFile>();
 
 	public synchronized void resourceChanged(IResourceChangeEvent event) {
+		if (event.getType() == IResourceChangeEvent.PRE_CLOSE)
+			handleCloseEvent(event);
+
 		IResourceDelta delta = event.getDelta();
 		try {
 			changedFiles.clear();
-			delta.accept(this);
+			if (delta != null)
+				delta.accept(this);
 			if (changedFiles.size() > 0) {
 				handleHotModelReplacement();
 			}
@@ -151,6 +158,23 @@ public class SCTHotModelReplacementManager implements IResourceChangeListener,
 		}
 	}
 
+	private void handleCloseEvent(IResourceChangeEvent event) {
+		if (event.getResource() instanceof IProject) {
+			IProject project = ((IProject) event.getResource());
+			for (SCTDebugTarget target : activeTargets) {
+				IFile file = WorkspaceSynchronizer.getFile(target
+						.getStatechart().eResource());
+				if (project.equals(file.getProject())) {
+					try {
+						target.terminate();
+					} catch (DebugException e) {
+						e.printStackTrace();
+					}
+				}
+			}
+		}
+	}
+
 	private void handleHotModelReplacement() {
 		// first implementation: If the underlying model does not change
 		// semantically, no notification is required...