Просмотр исходного кода

refactored decorator infrastructure for state chart editor...

terfloth@itemis.de 13 лет назад
Родитель
Сommit
7300d30fd9

+ 0 - 1
plugins/org.yakindu.sct.model.sgraph/.settings/org.eclipse.core.resources.prefs

@@ -1,4 +1,3 @@
-#Mon Nov 21 12:16:46 CET 2011
 eclipse.preferences.version=1
 eclipse.preferences.version=1
 encoding//model/emf/sgraph.ecorediag=UTF-8
 encoding//model/emf/sgraph.ecorediag=UTF-8
 encoding/<project>=UTF-8
 encoding/<project>=UTF-8

+ 36 - 80
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/submachine/SubStateDecorator.java

@@ -11,115 +11,71 @@
 package org.yakindu.sct.ui.editor.submachine;
 package org.yakindu.sct.ui.editor.submachine;
 
 
 import org.eclipse.core.runtime.Assert;
 import org.eclipse.core.runtime.Assert;
+import org.eclipse.draw2d.IFigure;
 import org.eclipse.draw2d.ImageFigure;
 import org.eclipse.draw2d.ImageFigure;
-import org.eclipse.draw2d.MouseEvent;
-import org.eclipse.draw2d.MouseListener;
-import org.eclipse.draw2d.MouseMotionListener;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EObject;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IPrimaryEditPart;
 import org.eclipse.gmf.runtime.diagram.ui.render.util.DiagramRenderUtil;
 import org.eclipse.gmf.runtime.diagram.ui.render.util.DiagramRenderUtil;
 import org.eclipse.gmf.runtime.diagram.ui.services.decorator.Decoration;
 import org.eclipse.gmf.runtime.diagram.ui.services.decorator.Decoration;
 import org.eclipse.gmf.runtime.diagram.ui.services.decorator.IDecoratorTarget;
 import org.eclipse.gmf.runtime.diagram.ui.services.decorator.IDecoratorTarget;
-import org.eclipse.gmf.runtime.diagram.ui.services.decorator.IDecoratorTarget.Direction;
 import org.eclipse.gmf.runtime.notation.Diagram;
 import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.GC;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Display;
 import org.yakindu.sct.model.sgraph.State;
 import org.yakindu.sct.model.sgraph.State;
 
 
 import de.itemis.gmf.runtime.commons.decorators.BaseDecorator;
 import de.itemis.gmf.runtime.commons.decorators.BaseDecorator;
+import de.itemis.gmf.runtime.commons.decorators.InteractiveDecorator;
 
 
 /**
 /**
  * 
  * 
  * @author andreas muelder - Initial contribution and API
  * @author andreas muelder - Initial contribution and API
  * 
  * 
  */
  */
-public abstract class SubStateDecorator extends BaseDecorator {
-
-	protected abstract boolean shouldDecorate(State state);
-
-	protected abstract Image getDecorationImage(State state);
-
-	protected abstract Diagram getTooltipDiagramToRender(State state);
-
-	protected abstract void mouseClicked(Decoration decoration,
-			State semanticElement);
-
-	protected abstract Direction getDecoratorPosition();
+public abstract class SubStateDecorator extends InteractiveDecorator {
 
 
 	public SubStateDecorator(IDecoratorTarget decoratorTarget) {
 	public SubStateDecorator(IDecoratorTarget decoratorTarget) {
 		super(decoratorTarget);
 		super(decoratorTarget);
 	}
 	}
 
 
-	public void refresh() {
-		removeDecoration();
-		if (getDecoratorTarget().getAdapter(EditPart.class) instanceof IPrimaryEditPart) {
-			EObject semanticElement = (EObject) getDecoratorTarget()
-					.getAdapter(EObject.class);
-			if (semanticElement instanceof State) {
-				final State state = (State) semanticElement;
-				if (shouldDecorate(state)) {
-					final Decoration decoration = (Decoration) getDecoratorTarget()
-							.addShapeDecoration(getDecorationImage(state),
-									getDecoratorPosition(), -5, false);
-					renderToolTip(decoration, state);
-					decoration.addMouseListener(new MouseListener() {
-						public void mousePressed(MouseEvent me) {
-							mouseClicked(decoration, state);
-						}
-
-						public void mouseReleased(MouseEvent me) {
-						}
+	protected abstract boolean shouldDecorate(State state);
 
 
-						public void mouseDoubleClicked(MouseEvent me) {
-						}
-					});
-					setDecoration(decoration);
-				}
-			}
-		}
+	@Override
+	public boolean shouldDecorate(EObject element) {
+		return (element instanceof State) ? shouldDecorate((State)element) : false;
 	}
 	}
 
 
-	protected Image resize(Image image, int width, int height) {
-		Image scaled = new Image(Display.getDefault(), width, height);
-		GC gc = new GC(scaled);
-		gc.setAntialias(SWT.ON);
-		gc.setInterpolation(SWT.HIGH);
-		gc.drawImage(image, 0, 0, image.getBounds().width,
-				image.getBounds().height, 0, 0, width, height);
-		gc.dispose();
-		image.dispose();
-		return scaled;
+	protected abstract Image getDecorationImage(State state);
+	
+	@Override
+	public Image getDecorationImage(EObject element) {
+		return (element instanceof State) ? getDecorationImage((State)element) : null;
 	}
 	}
 
 
-	protected void renderToolTip(final Decoration decoration,
-			final State semanticElement) {
-		decoration.addMouseMotionListener(new MouseMotionListener() {
-			public void mouseDragged(MouseEvent me) {
-			}
-
-			public void mouseEntered(MouseEvent me) {
-				Diagram diagram = getTooltipDiagramToRender(semanticElement);
-				if (diagram != null) {
-					Image renderImage = renderImage(diagram);
-					ImageFigure toolTip = new ImageFigure(renderImage);
-					decoration.setToolTip(toolTip);
-				}
-			}
-
-			public void mouseExited(MouseEvent me) {
-			}
-
-			public void mouseHover(MouseEvent me) {
-			}
+	protected abstract Diagram getTooltipDiagramToRender(State state);
 
 
-			public void mouseMoved(MouseEvent me) {
+	
+	@Override
+	protected IFigure getToolTipFigure(EObject element) {
+		if (element instanceof State) {
+			Diagram diagram = getTooltipDiagramToRender((State)element);
+			if (diagram != null) {
+				Image renderImage = renderImage(diagram);
+				return  new ImageFigure(renderImage);
 			}
 			}
-		});
+		}
+		return null;
 	}
 	}
-
+	
+	
+//	protected abstract void mouseClicked(Decoration decoration, State semanticElement);
+//	
+//
+//	@Override
+//	protected void mousePressed(Decoration decoration, EObject element) {
+//		if (element instanceof State) {
+//			mouseClicked(decoration, (State) element);
+//		}
+//	}
+
+	
 	protected Image renderImage(Diagram diagram) {
 	protected Image renderImage(Diagram diagram) {
 		Assert.isNotNull(diagram);
 		Assert.isNotNull(diagram);
 		Image renderImage = DiagramRenderUtil.renderToSWTImage(diagram);
 		Image renderImage = DiagramRenderUtil.renderToSWTImage(diagram);

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

@@ -10,14 +10,9 @@
  */
  */
 package org.yakindu.sct.ui.editor.submachine;
 package org.yakindu.sct.ui.editor.submachine;
 
 
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.Path;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.gmf.runtime.diagram.ui.services.decorator.Decoration;
 import org.eclipse.gmf.runtime.diagram.ui.services.decorator.Decoration;
 import org.eclipse.gmf.runtime.diagram.ui.services.decorator.IDecoratorProvider;
 import org.eclipse.gmf.runtime.diagram.ui.services.decorator.IDecoratorProvider;
 import org.eclipse.gmf.runtime.diagram.ui.services.decorator.IDecoratorTarget;
 import org.eclipse.gmf.runtime.diagram.ui.services.decorator.IDecoratorTarget;
@@ -25,15 +20,11 @@ import org.eclipse.gmf.runtime.diagram.ui.services.decorator.IDecoratorTarget.Di
 import org.eclipse.gmf.runtime.notation.Diagram;
 import org.eclipse.gmf.runtime.notation.Diagram;
 import org.eclipse.gmf.runtime.notation.NotationPackage;
 import org.eclipse.gmf.runtime.notation.NotationPackage;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.part.FileEditorInput;
 import org.eclipse.xtext.EcoreUtil2;
 import org.eclipse.xtext.EcoreUtil2;
 import org.yakindu.sct.model.sgraph.State;
 import org.yakindu.sct.model.sgraph.State;
 import org.yakindu.sct.model.sgraph.Statechart;
 import org.yakindu.sct.model.sgraph.Statechart;
 import org.yakindu.sct.ui.editor.StatechartImages;
 import org.yakindu.sct.ui.editor.StatechartImages;
-import org.yakindu.sct.ui.editor.editor.StatechartDiagramEditor;
+import org.yakindu.sct.ui.editor.utils.InteractionUtil;
 
 
 import de.itemis.gmf.runtime.commons.decorators.AbstractDecoratorProvider;
 import de.itemis.gmf.runtime.commons.decorators.AbstractDecoratorProvider;
 
 
@@ -90,19 +81,8 @@ public class SubmachineDecorationProvider extends AbstractDecoratorProvider
 		}
 		}
 
 
 		@Override
 		@Override
-		protected void mouseClicked(Decoration decoration, State semanticElement) {
-			URI uri = EcoreUtil.getURI(semanticElement.getSubstatechart());
-			IFile file = ResourcesPlugin.getWorkspace().getRoot()
-					.getFile(new Path(uri.toPlatformString(true)));
-			try {
-				final IWorkbenchPage page = PlatformUI.getWorkbench()
-						.getActiveWorkbenchWindow().getActivePage();
-				page.openEditor(new FileEditorInput(file),
-						StatechartDiagramEditor.ID);
-				// BreadcrumbEditorUtil.openEditor(file);
-			} catch (PartInitException e) {
-				e.printStackTrace();
-			}
+		protected void mousePressed(Decoration decoration, EObject semanticElement) {
+			InteractionUtil.openElement(((State)semanticElement).getSubstatechart());
 		}
 		}
 
 
 		@Override
 		@Override
@@ -110,6 +90,11 @@ public class SubmachineDecorationProvider extends AbstractDecoratorProvider
 			return IDecoratorTarget.Direction.SOUTH_EAST;
 			return IDecoratorTarget.Direction.SOUTH_EAST;
 		}
 		}
 
 
+		
+		State asState(EObject o) {
+			return (o instanceof State) ? (State)o : null;
+		}
+
 	}
 	}
 
 
 }
 }

+ 55 - 0
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/utils/InteractionUtil.java

@@ -0,0 +1,55 @@
+package org.yakindu.sct.ui.editor.utils;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.ui.IEditorDescriptor;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.part.FileEditorInput;
+import org.eclipse.xtext.nodemodel.INode;
+import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
+import org.eclipse.xtext.ui.editor.XtextEditor;
+
+public class InteractionUtil {
+
+	public InteractionUtil() {
+		// TODO Auto-generated constructor stub
+	}
+
+	static public void openElement(EObject obj) {
+		if (obj != null) {
+			URI uri = EcoreUtil.getURI(obj);
+			IFile file = ResourcesPlugin.getWorkspace().getRoot()
+					.getFile(new Path(uri.toPlatformString(true)));
+			IEditorPart editor = null;
+			try {
+				IEditorDescriptor desc = PlatformUI.getWorkbench()
+						.getEditorRegistry().getDefaultEditor(file.getName());
+
+				final IWorkbenchPage wbPage = PlatformUI.getWorkbench()
+						.getActiveWorkbenchWindow().getActivePage();
+				editor = wbPage.openEditor(new FileEditorInput(file),
+						desc.getId());
+
+				if (editor instanceof XtextEditor) {
+					INode node = NodeModelUtils.findActualNodeFor(obj);
+					if (node != null) {
+						((XtextEditor) editor).selectAndReveal(
+								node.getOffset(), node.getLength());
+					}
+				}
+
+				// BreadcrumbEditorUtil.openEditor(file);
+			} catch (PartInitException e) {
+				e.printStackTrace();
+			}
+		}
+	}
+
+}