package org.eclipse.uml2.diagram.common.tool; import java.util.Collections; import junit.framework.TestCase; import org.eclipse.draw2d.geometry.Point; import org.eclipse.emf.ecore.EObject; import org.eclipse.gef.EditDomain; import org.eclipse.gef.Tool; import org.eclipse.gef.commands.Command; import org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionEditPart; import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart; import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart; import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles; import org.eclipse.gmf.runtime.diagram.ui.editpolicies.SemanticEditPolicy; import org.eclipse.gmf.runtime.diagram.ui.requests.EditCommandRequestWrapper; import org.eclipse.gmf.runtime.diagram.ui.tools.ConnectionCreationTool; import org.eclipse.gmf.runtime.diagram.ui.tools.UnspecifiedTypeCreationTool; import org.eclipse.gmf.runtime.emf.type.core.IElementType; import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientReferenceRelationshipRequest; import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientRequest; import org.eclipse.gmf.runtime.notation.View; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.widgets.Event; import org.eclipse.ui.IViewReference; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.internal.intro.IIntroConstants; import org.eclipse.uml2.diagram.common.tests.UMLDiagramFacade; import org.eclipse.uml2.diagram.common.tests.UMLProjectFacade; public abstract class CreationToolTestBase extends TestCase { private UMLDiagramFacade myDiagramFacade; private UMLProjectFacade myProject; protected EditDomain myEditDomain; protected org.eclipse.gef.EditPartViewer myDiagramViewer; private DiagramEditPart myDiagramEditPart; public CreationToolTestBase(String name) { super(name); } @Override protected void setUp() throws Exception { super.setUp(); skipIntro(); myProject = new UMLProjectFacade(); myDiagramFacade = getDiagram(myProject.getFullPath()); myDiagramFacade.create(getName()); myDiagramFacade.open(); myEditDomain = (EditDomain) myDiagramFacade.getDiagramEditDomain(); myDiagramEditPart = myDiagramFacade.getDiagramEditPart(); myDiagramViewer = myDiagramEditPart.getViewer(); } @Override protected void tearDown() throws Exception { myDiagramFacade.close(); myDiagramFacade = null; myDiagramEditPart = null; myEditDomain = null; myDiagramViewer = null; try { myProject.close(); } catch (Exception e) { e.printStackTrace(); } myProject = null; super.tearDown(); } protected DiagramEditPart getDiagramEditPart() { return myDiagramEditPart; } protected IWorkbenchPage getWorkbenchPage() { return myDiagramFacade.getDiagramWorkbenchPart().getSite().getPage(); } protected ISelection getSelection() { return getDiagramEditPart().getViewer().getSelection(); } protected abstract UMLDiagramFacade getDiagram(String projectPath); protected IGraphicalEditPart getSelectedEP() { return (IGraphicalEditPart)((IStructuredSelection)getSelection()).getFirstElement(); } protected void createConnectionByToolDoubleClick(ConnectionCreationTool tool) { tool.setEditDomain(myEditDomain); tool.activate(); tool.mouseDoubleClick(createMouseEvent(0, 0), myDiagramViewer); tool.deactivate(); } protected void createConnectionByTool(ConnectionCreationTool tool, IGraphicalEditPart sourceEditPart, IGraphicalEditPart targetEditPart) { Point source = sourceEditPart.getFigure().getBounds().getTopLeft(); Point target = targetEditPart.getFigure().getBounds().getTopLeft(); createConnectionByTool(tool, source.x, source.y, target.x, target.y); } protected void createConnectionByTool(ConnectionCreationTool tool, int x1, int y1, int x2, int y2) { tool.setEditDomain(myEditDomain); tool.activate(); tool.mouseMove(createMouseEvent(x1, y1), myDiagramViewer); tool.mouseDown(createMouseEvent(x1, y1), myDiagramViewer); tool.mouseDrag(createMouseEvent(x2, y2), myDiagramViewer); tool.mouseUp(createMouseEvent(x2, y2), myDiagramViewer); tool.deactivate(); } protected void reorientReferenceConnectionTarget(ConnectionEditPart connection, IGraphicalEditPart newTargetEP) { EObject source = getConnectionSource(connection); EObject oldTarget = getConnectionTarget(connection); EObject newTarget = newTargetEP.getNotationView().getElement(); ReorientReferenceRelationshipRequest request = new ReorientReferenceRelationshipRequest(getDiagramEditPart().getEditingDomain(), source, newTarget, oldTarget, ReorientRequest.REORIENT_TARGET); request.setParameter(VISUAL_ID_KEY, Integer.valueOf(connection.getNotationView().getType())); Command cmd = ((SemanticEditPolicy)newTargetEP.getEditPolicy(EditPolicyRoles.SEMANTIC_ROLE)).getCommand(new EditCommandRequestWrapper(request)); if (!cmd.canExecute()) { fail(); } cmd.execute(); } protected void reorientReferenceConnectionSource(ConnectionEditPart connection, IGraphicalEditPart newSourceEP) { EObject oldSource = getConnectionSource(connection); EObject target = getConnectionTarget(connection); EObject newSource = newSourceEP.getNotationView().getElement(); ReorientReferenceRelationshipRequest request = new ReorientReferenceRelationshipRequest(getDiagramEditPart().getEditingDomain(), oldSource, newSource, target, ReorientRequest.REORIENT_SOURCE); request.setParameter(VISUAL_ID_KEY, Integer.valueOf(connection.getNotationView().getType())); Command cmd = ((SemanticEditPolicy)newSourceEP.getEditPolicy(EditPolicyRoles.SEMANTIC_ROLE)).getCommand(new EditCommandRequestWrapper(request)); if (!cmd.canExecute()) { fail(); } cmd.execute(); } protected static EObject getConnectionSource(ConnectionEditPart connection) { return ((View)connection.getSource().getModel()).getElement(); } protected static EObject getConnectionTarget(ConnectionEditPart connection) { return ((View)connection.getTarget().getModel()).getElement(); } protected void createNodeByTool(IElementType elementType) { createNodeByTool(elementType, 70, 70); } protected void createNodeByTool(Tool tool, int x, int y) { tool.setEditDomain(myEditDomain); tool.activate(); tool.mouseMove(createMouseEvent(x, y), myDiagramViewer); tool.mouseDown(createMouseEvent(x, y), myDiagramViewer); tool.mouseUp(createMouseEvent(x, y), myDiagramViewer); tool.deactivate(); } protected void createNodeByTool(IElementType elementType, int x, int y) { UnspecifiedTypeCreationTool tool = new UnspecifiedTypeCreationTool(Collections.singletonList(elementType)); createNodeByTool(tool, x, y); } protected void createNodeByTool(IElementType elementType, Point p) { createNodeByTool(elementType, p.x, p.y); } protected void createNodeByTool(Tool tool, Point p) { createNodeByTool(tool, p.x, p.y); } private MouseEvent createMouseEvent(int x, int y) { Event e = new Event(); e.widget = myDiagramViewer.getControl(); e.display = e.widget.getDisplay(); e.button = 1; // left button e.x = x; e.y = y; return new MouseEvent(e); } private static void skipIntro() { IWorkbench workbench = PlatformUI.getWorkbench(); IWorkbenchWindow workbenchWindow = workbench.getActiveWorkbenchWindow(); IWorkbenchPage page = workbenchWindow.getActivePage(); IViewReference reference = page.findViewReference(IIntroConstants.INTRO_VIEW_ID); if (reference != null) { page.hideView(reference.getView(false)); } } public static final String VISUAL_ID_KEY = "visual_id"; }