Browse Source

Ask to close an opened subdiagram editor before inline refactoring is executed

Andreas Mülder 12 years ago
parent
commit
d1b6de265c

BIN
plugins/org.yakindu.sct.refactoring/documentation/refactoring_catalog.odt


BIN
plugins/org.yakindu.sct.refactoring/documentation/refactoring_catalog.pdf


+ 45 - 1
plugins/org.yakindu.sct.refactoring/src/org/yakindu/sct/refactoring/handlers/impl/InlineSubdiagramHandler.java

@@ -10,11 +10,23 @@
  */
 package org.yakindu.sct.refactoring.handlers.impl;
 
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramEditorInput;
+import org.eclipse.gmf.runtime.notation.Diagram;
 import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IEditorReference;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.handlers.HandlerUtil;
 import org.yakindu.sct.refactoring.handlers.AbstractViewRefactoringHandler;
 import org.yakindu.sct.refactoring.refactor.AbstractRefactoring;
 import org.yakindu.sct.refactoring.refactor.impl.InlineSubdiagramRefactoring;
-
+import org.yakindu.sct.ui.editor.breadcrumb.DiagramPartitioningUtil;
+import org.yakindu.sct.ui.editor.editparts.StateEditPart;
 
 /**
  * 
@@ -27,4 +39,36 @@ public class InlineSubdiagramHandler extends AbstractViewRefactoringHandler {
 	public AbstractRefactoring<View> createRefactoring() {
 		return new InlineSubdiagramRefactoring();
 	}
+
+	@Override
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		if (allEditorsAreClosed(event))
+			return super.execute(event);
+		return null;
+	}
+
+	private boolean allEditorsAreClosed(ExecutionEvent event) {
+		StateEditPart firstElement = (StateEditPart) getFirstElement(HandlerUtil.getCurrentSelection(event));
+		Diagram diagram = DiagramPartitioningUtil.getSubDiagram(firstElement.resolveSemanticElement());
+		IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+		IEditorReference[] refs = activePage.getEditorReferences();
+		for (IEditorReference ref : refs) {
+			try {
+				if (ref.getEditorInput() instanceof IDiagramEditorInput) {
+					IDiagramEditorInput diagramInput = (IDiagramEditorInput) ref.getEditorInput();
+					if (diagramInput.getDiagram().equals(diagram)) {
+						boolean close = MessageDialog.openQuestion(new Shell(), "Close subdiagram editor?",
+								"The subdiagram is still open in another editor. Do you want to close it?");
+						if (close) {
+							activePage.closeEditor(ref.getEditor(false), false);
+						}
+						return close;
+					}
+				}
+			} catch (PartInitException e) {
+				e.printStackTrace();
+			}
+		}
+		return true;
+	}
 }

+ 2 - 2
plugins/org.yakindu.sct.refactoring/src/org/yakindu/sct/refactoring/refactor/impl/InlineSubdiagramRefactoring.java

@@ -16,7 +16,7 @@ import org.eclipse.gmf.runtime.notation.BooleanValueStyle;
 import org.eclipse.gmf.runtime.notation.Diagram;
 import org.eclipse.gmf.runtime.notation.View;
 import org.yakindu.sct.model.sgraph.State;
-import org.yakindu.sct.ui.editor.breadcrumb.BreadcrumbViewerUtil;
+import org.yakindu.sct.ui.editor.breadcrumb.DiagramPartitioningUtil;
 import org.yakindu.sct.ui.editor.providers.SemanticHints;
 
 /**
@@ -42,7 +42,7 @@ public class InlineSubdiagramRefactoring extends SubdiagramRefactoring {
 		inlineStyle.setBooleanValue(true);
 		View contextView = getContextObject();
 		State contextElement = (State) contextView.getElement();
-		Diagram inlineDiagram = BreadcrumbViewerUtil.getSubDiagram(contextElement);
+		Diagram inlineDiagram = DiagramPartitioningUtil.getSubDiagram(contextElement);
 		View figureCompartment = ViewUtil.getChildBySemanticHint(contextView, SemanticHints.STATE_FIGURE_COMPARTMENT);
 
 		EList<View> children = inlineDiagram.getChildren();

+ 12 - 18
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/breadcrumb/BreadcrumbDiagramEditor.java

@@ -10,11 +10,9 @@
  */
 package org.yakindu.sct.ui.editor.breadcrumb;
 
-import static org.yakindu.sct.ui.editor.breadcrumb.BreadcrumbViewerUtil.openEditor;
+import static org.yakindu.sct.ui.editor.breadcrumb.DiagramPartitioningUtil.openEditor;
 
-import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 
 import org.eclipse.core.resources.IFile;
@@ -38,7 +36,6 @@ import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.ui.IEditorInput;
 import org.yakindu.base.base.NamedElement;
-import org.yakindu.sct.model.sgraph.State;
 import org.yakindu.sct.model.sgraph.Statechart;
 import org.yakindu.sct.model.sgraph.provider.SGraphItemProviderAdapterFactory;
 import org.yakindu.sct.ui.editor.StatechartImages;
@@ -51,6 +48,7 @@ import org.yakindu.sct.ui.editor.StatechartImages;
 public abstract class BreadcrumbDiagramEditor extends DiagramDocumentEditor implements ISelectionChangedListener {
 
 	private static final String SUBDIAGRAM = "Subdiagram - ";
+	private SCTBreadcrumbViewer viewer;
 
 	public BreadcrumbDiagramEditor(boolean hasFlyoutPalette) {
 		super(hasFlyoutPalette);
@@ -63,6 +61,14 @@ public abstract class BreadcrumbDiagramEditor extends DiagramDocumentEditor impl
 		super.createPartControl(parent);
 	}
 
+	@Override
+	protected void sanityCheckState(IEditorInput input) {
+		super.sanityCheckState(input);
+		// Refresh viewer input since the context may have changed
+		viewer.setInput(DiagramPartitioningUtil.getDiagramContainerHierachy(getDiagram()));
+
+	}
+
 	@Override
 	public void setInput(IEditorInput input) {
 		super.setInput(input);
@@ -81,24 +87,12 @@ public abstract class BreadcrumbDiagramEditor extends DiagramDocumentEditor impl
 
 	}
 
-	protected List<Diagram> getViewerInput() {
-		List<Diagram> result = new ArrayList<Diagram>();
-		Diagram diagram = getDiagram();
-		result.add(getDiagram());
-		while (diagram.getElement() instanceof State) {
-			diagram = BreadcrumbViewerUtil.getDiagramContaining((State) diagram.getElement());
-			result.add(diagram);
-		}
-		Collections.reverse(result);
-		return result;
-	}
-
 	private void createBreadcrumbViewer(Composite parent) {
-		SCTBreadcrumbViewer viewer = new SCTBreadcrumbViewer(parent, SWT.READ_ONLY);
+		viewer = new SCTBreadcrumbViewer(parent, SWT.READ_ONLY);
 		viewer.addSelectionChangedListener(this);
 		viewer.setContentProvider(new BreadcrumbViewerContentProvider());
 		viewer.setLabelProvider(new BreadcrumbViewerLabelProvider());
-		viewer.setInput(getViewerInput());
+		viewer.setInput(DiagramPartitioningUtil.getDiagramContainerHierachy(getDiagram()));
 		parent.pack(true);
 	}
 

+ 26 - 1
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/breadcrumb/BreadcrumbViewerUtil.java

@@ -10,7 +10,10 @@
  */
 package org.yakindu.sct.ui.editor.breadcrumb;
 
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
 
 import org.eclipse.core.resources.IFile;
 import org.eclipse.emf.common.util.TreeIterator;
@@ -34,7 +37,7 @@ import org.yakindu.sct.model.sgraph.Statechart;
  * @author andreas muelder - Initial contribution and API
  * 
  */
-public class BreadcrumbViewerUtil {
+public class DiagramPartitioningUtil {
 
 	public static Diagram getDiagramContaining(EObject element) {
 		Resource eResource = element.eResource();
@@ -90,4 +93,26 @@ public class BreadcrumbViewerUtil {
 			e.printStackTrace();
 		}
 	}
+
+	public static List<Diagram> getDiagramContainerHierachy(Diagram diagram) {
+		List<Diagram> result = new ArrayList<Diagram>();
+		result.add(diagram);
+		while (diagram.getElement() instanceof State) {
+			diagram = DiagramPartitioningUtil.getDiagramContaining((State) diagram.getElement());
+			result.add(diagram);
+		}
+		Collections.reverse(result);
+		return result;
+	}
+
+	public static List<Diagram> getSubDiagramHierachy(Diagram diagram) {
+		List<Diagram> result = new ArrayList<Diagram>();
+		result.add(diagram);
+		while (diagram.getElement() instanceof State) {
+			diagram = DiagramPartitioningUtil.getSubDiagram(diagram.getElement());
+			result.add(diagram);
+		}
+		Collections.reverse(result);
+		return result;
+	}
 }

+ 3 - 3
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/breadcrumb/SCTBreadcrumbViewer.java

@@ -10,7 +10,7 @@
  */
 package org.yakindu.sct.ui.editor.breadcrumb;
 
-import static org.yakindu.sct.ui.editor.breadcrumb.BreadcrumbViewerUtil.openEditor;
+import static org.yakindu.sct.ui.editor.breadcrumb.DiagramPartitioningUtil.openEditor;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -146,7 +146,7 @@ public class SCTBreadcrumbViewer extends BreadcrumbViewer implements ISelectionC
 	public void selectionChanged(SelectionChangedEvent event) {
 		Object selection = ((IStructuredSelection) event.getSelection()).getFirstElement();
 		if (selection instanceof State || selection instanceof Statechart) {
-			Diagram diagram = BreadcrumbViewerUtil.getSubDiagram((EObject) selection);
+			Diagram diagram = DiagramPartitioningUtil.getSubDiagram((EObject) selection);
 			openEditor(diagram);
 		} else if (selection instanceof IFile) {
 			openEditor((IFile) selection);
@@ -230,7 +230,7 @@ public class SCTBreadcrumbViewer extends BreadcrumbViewer implements ISelectionC
 			for (Region region : regions) {
 				EList<Vertex> vertices = region.getVertices();
 				for (Vertex vertex : vertices) {
-					if (vertex instanceof State && BreadcrumbViewerUtil.getSubDiagram(vertex) != null) {
+					if (vertex instanceof State && DiagramPartitioningUtil.getSubDiagram(vertex) != null) {
 						result.add(vertex);
 					}
 				}

+ 13 - 21
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/editor/StatechartDiagramEditor.java

@@ -59,8 +59,7 @@ import de.itemis.xtext.utils.gmf.resource.DirtyStateListener;
  * @author andreas muelder - Initial contribution and API
  * @author martin esser
  */
-public class StatechartDiagramEditor extends BreadcrumbDiagramEditor implements
-		IGotoMarker {
+public class StatechartDiagramEditor extends BreadcrumbDiagramEditor implements IGotoMarker {
 
 	public static final String ID = "org.yakindu.sct.ui.editor.editor.StatechartDiagramEditor";
 	private static final int DELAY = 200; // ms
@@ -78,8 +77,7 @@ public class StatechartDiagramEditor extends BreadcrumbDiagramEditor implements
 						validationJob.cancel();
 						validationJob.schedule(DELAY);
 					} else
-						for (EClass eClass : eObject.eClass()
-								.getEAllSuperTypes()) {
+						for (EClass eClass : eObject.eClass().getEAllSuperTypes()) {
 							if (SGraphPackage.eINSTANCE == eClass.getEPackage()) {
 								validationJob.cancel();
 								validationJob.schedule(DELAY);
@@ -100,8 +98,7 @@ public class StatechartDiagramEditor extends BreadcrumbDiagramEditor implements
 	}
 
 	@Override
-	public void init(IEditorSite site, IEditorInput input)
-			throws PartInitException {
+	public void init(IEditorSite site, IEditorInput input) throws PartInitException {
 		super.init(site, input);
 		getEditingDomain().addResourceSetListener(validationListener);
 		checkXtextNature();
@@ -118,9 +115,8 @@ public class StatechartDiagramEditor extends BreadcrumbDiagramEditor implements
 	private void initValidationJob() {
 		final IFile file = ((IFileEditorInput) getEditorInput()).getFile();
 		validationJob = new SCTValidationJob(getDiagram());
-		IExpressionLanguageProvider registeredProvider = ExpressionLanguageProviderExtensions
-				.getRegisteredProvider(SemanticTarget.StatechartSpecification,
-						file.getFileExtension());
+		IExpressionLanguageProvider registeredProvider = ExpressionLanguageProviderExtensions.getRegisteredProvider(
+				SemanticTarget.StatechartSpecification, file.getFileExtension());
 		Injector injector = registeredProvider.getInjector();
 		injector.injectMembers(validationJob);
 		validationJob.setRule(file);
@@ -129,8 +125,7 @@ public class StatechartDiagramEditor extends BreadcrumbDiagramEditor implements
 	private void checkXtextNature() {
 		IFileEditorInput editorInput = (IFileEditorInput) getEditorInput();
 		IProject project = editorInput.getFile().getProject();
-		if (project != null && !XtextProjectHelper.hasNature(project)
-				&& project.isAccessible() && !project.isHidden()) {
+		if (project != null && !XtextProjectHelper.hasNature(project) && project.isAccessible() && !project.isHidden()) {
 			addNature(project);
 		}
 	}
@@ -169,10 +164,8 @@ public class StatechartDiagramEditor extends BreadcrumbDiagramEditor implements
 	@Override
 	protected void createGraphicalViewer(Composite parent) {
 		super.createGraphicalViewer(parent);
-		IWorkbenchHelpSystem helpSystem = PlatformUI.getWorkbench()
-				.getHelpSystem();
-		helpSystem.setHelp(getGraphicalViewer().getControl(),
-				HelpContextIds.SC_EDITOR_GRAPHICAL_VIEWER);
+		IWorkbenchHelpSystem helpSystem = PlatformUI.getWorkbench().getHelpSystem();
+		helpSystem.setHelp(getGraphicalViewer().getControl(), HelpContextIds.SC_EDITOR_GRAPHICAL_VIEWER);
 	}
 
 	@Override
@@ -183,14 +176,11 @@ public class StatechartDiagramEditor extends BreadcrumbDiagramEditor implements
 	@Override
 	protected void configureGraphicalViewer() {
 		super.configureGraphicalViewer();
-		RootEditPart rootEditPart = getDiagramGraphicalViewer()
-				.getRootEditPart();
+		RootEditPart rootEditPart = getDiagramGraphicalViewer().getRootEditPart();
 		if (rootEditPart instanceof LayerManager) {
 			ConnectionLayer connectionLayer = (ConnectionLayer) ((LayerManager) rootEditPart)
 					.getLayer(LayerConstants.CONNECTION_LAYER);
-			connectionLayer
-					.setClippingStrategy(new ViewportAwareConnectionLayerClippingStrategy(
-							connectionLayer));
+			connectionLayer.setClippingStrategy(new ViewportAwareConnectionLayerClippingStrategy(connectionLayer));
 		}
 	}
 
@@ -199,7 +189,9 @@ public class StatechartDiagramEditor extends BreadcrumbDiagramEditor implements
 		validationJob.cancel();
 		getEditingDomain().removeResourceSetListener(validationListener);
 		getEditingDomain().removeResourceSetListener(domainAdapter);
-		domainAdapter.dispose();
+		//TODO: check why this can be null
+		if (domainAdapter != null)
+			domainAdapter.dispose();
 		IFileEditorInput editorInput = (IFileEditorInput) getEditorInput();
 		try {
 			// Touch the file for revalidation, when the user did not save

+ 2 - 2
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/submachine/SubmachineDecorationProvider.java

@@ -26,7 +26,7 @@ import org.eclipse.swt.graphics.Image;
 import org.eclipse.xtext.EcoreUtil2;
 import org.yakindu.sct.model.sgraph.State;
 import org.yakindu.sct.ui.editor.StatechartImages;
-import org.yakindu.sct.ui.editor.breadcrumb.BreadcrumbViewerUtil;
+import org.yakindu.sct.ui.editor.breadcrumb.DiagramPartitioningUtil;
 import org.yakindu.sct.ui.editor.utils.GMFNotationUtil;
 
 import de.itemis.gmf.runtime.commons.decorators.AbstractDecoratorProvider;
@@ -86,7 +86,7 @@ public class SubmachineDecorationProvider extends AbstractDecoratorProvider impl
 		@Override
 		protected void mousePressed(Decoration decoration, EObject semanticElement) {
 			Diagram diagramToOpen = getDiagramForSemanticElement(semanticElement);
-			BreadcrumbViewerUtil.openEditor(diagramToOpen);
+			DiagramPartitioningUtil.openEditor(diagramToOpen);
 
 		}