| /****************************************************************************** |
| * Copyright (c) 2007 IBM Corporation and others. |
| * 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: |
| * IBM Corporation - initial API and implementation |
| ****************************************************************************/ |
| |
| package org.eclipse.gmf.tests.runtime.diagram.ui.logic; |
| |
| import java.util.LinkedList; |
| import java.util.List; |
| |
| import junit.framework.Test; |
| import junit.framework.TestSuite; |
| |
| import org.eclipse.draw2d.PositionConstants; |
| import org.eclipse.draw2d.geometry.Dimension; |
| import org.eclipse.draw2d.geometry.Point; |
| import org.eclipse.draw2d.geometry.Rectangle; |
| import org.eclipse.gef.EditDomain; |
| import org.eclipse.gef.EditPart; |
| import org.eclipse.gef.EditPartViewer; |
| import org.eclipse.gef.Request; |
| import org.eclipse.gef.Tool; |
| import org.eclipse.gef.commands.Command; |
| import org.eclipse.gef.palette.ToolEntry; |
| import org.eclipse.gef.requests.ChangeBoundsRequest; |
| import org.eclipse.gef.requests.GroupRequest; |
| import org.eclipse.gef.ui.palette.PaletteViewer; |
| import org.eclipse.gmf.examples.runtime.diagram.logic.internal.LogicDiagramPlugin; |
| import org.eclipse.gmf.runtime.diagram.ui.actions.ActionIds; |
| import org.eclipse.gmf.runtime.diagram.ui.actions.internal.GroupAction; |
| import org.eclipse.gmf.runtime.diagram.ui.actions.internal.SelectAllAction; |
| import org.eclipse.gmf.runtime.diagram.ui.actions.internal.UngroupAction; |
| import org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionEditPart; |
| import org.eclipse.gmf.runtime.diagram.ui.editparts.GroupEditPart; |
| import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart; |
| import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeEditPart; |
| import org.eclipse.gmf.runtime.diagram.ui.geoshapes.internal.providers.GeoshapeType; |
| import org.eclipse.gmf.runtime.diagram.ui.internal.util.DiagramNotationType; |
| import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramEditor; |
| import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants; |
| import org.eclipse.gmf.runtime.notation.View; |
| import org.eclipse.gmf.tests.runtime.diagram.ui.AbstractTestBase; |
| import org.eclipse.gmf.tests.runtime.diagram.ui.util.ITestActionCallback; |
| import org.eclipse.jface.viewers.StructuredSelection; |
| import org.eclipse.swt.events.MouseEvent; |
| import org.eclipse.swt.widgets.Event; |
| import org.eclipse.ui.IEditorReference; |
| import org.eclipse.ui.IWorkbenchPage; |
| |
| /** |
| * Tests for group and ungroup functionality. |
| * |
| * @author crevells |
| */ |
| public class GroupTests |
| extends AbstractTestBase { |
| |
| public static Test suite() { |
| TestSuite s = new TestSuite(GroupTests.class); |
| return s; |
| } |
| |
| public GroupTests() { |
| super("Group Tests");//$NON-NLS-1$ |
| } |
| |
| public class GroupTestFixture |
| extends LogicTestFixture { |
| |
| protected void createShapesAndConnectors() |
| throws Exception { |
| // do nothing, each test will create the shapes it wants |
| } |
| |
| public void openDiagram() |
| throws Exception { |
| super.openDiagram(); |
| |
| // Expand the diagram since these tests simulate mouse clicks |
| // and it is necessary that the diagram be completely visible in |
| // the viewport. |
| IEditorReference[] editors = getWorkbenchPage().findEditors( |
| ((DiagramEditor) getDiagramWorkbenchPart()).getEditorInput(), |
| LogicDiagramPlugin.EDITOR_ID, IWorkbenchPage.MATCH_ID); |
| getWorkbenchPage().setPartState(editors[0], |
| IWorkbenchPage.STATE_MAXIMIZED); |
| } |
| } |
| |
| protected void setTestFixture() { |
| testFixture = new GroupTestFixture(); |
| } |
| |
| protected LogicTestFixture getFixture() { |
| return (LogicTestFixture) testFixture; |
| } |
| |
| protected View note1View; |
| |
| protected View note2View; |
| |
| protected View geoshape1View; |
| |
| protected View geoshape2View; |
| |
| /** |
| * Adds two notes and two geoshapes and some connections between them. Look |
| * at the details of the method to see what gets created. |
| */ |
| protected void setupShapes() { |
| ShapeEditPart note1EP = getFixture().createShapeUsingTool( |
| DiagramNotationType.NOTE, new Point(10, 10), getContainerEP(), |
| new Dimension(50, 50)); |
| |
| ShapeEditPart note2EP = getFixture().createShapeUsingTool( |
| DiagramNotationType.NOTE, new Point(100, 10), getContainerEP(), |
| new Dimension(50, 50)); |
| |
| ShapeEditPart geoshape1EP = getFixture().createShapeUsingTool( |
| GeoshapeType.CYLINDER, new Point(10, 100), getContainerEP(), |
| new Dimension(50, 50)); |
| |
| ShapeEditPart geoshape2EP = getFixture().createShapeUsingTool( |
| GeoshapeType.DIAMOND, new Point(100, 100), getContainerEP(), |
| new Dimension(50, 50)); |
| |
| flushEventQueue(); |
| |
| // Cache the views so we can find the editparts again later. |
| note1View = (View) note1EP.getModel(); |
| note2View = (View) note2EP.getModel(); |
| geoshape1View = (View) geoshape1EP.getModel(); |
| geoshape2View = (View) geoshape2EP.getModel(); |
| |
| // Create some connections just to make things more complicated. |
| getFixture().createConnectorUsingTool(note1EP, geoshape1EP, |
| GeoshapeType.LINE); |
| getFixture().createConnectorUsingTool(note2EP, geoshape1EP, |
| DiagramNotationType.NOTE_ATTACHMENT); |
| getFixture().createConnectorUsingTool(note2EP, geoshape2EP, |
| DiagramNotationType.NOTE_ATTACHMENT); |
| getFixture().createConnectorUsingTool(geoshape1EP, geoshape2EP, |
| GeoshapeType.LINE); |
| |
| flushEventQueue(); |
| } |
| |
| protected IGraphicalEditPart getContainerEP() { |
| return getDiagramEditPart(); |
| } |
| |
| protected ShapeEditPart getNote1EP() { |
| return (ShapeEditPart) findEditPart(note1View); |
| } |
| |
| protected ShapeEditPart getNote2EP() { |
| return (ShapeEditPart) findEditPart(note2View); |
| } |
| |
| protected ShapeEditPart getGeoshape1EP() { |
| return (ShapeEditPart) findEditPart(geoshape1View); |
| } |
| |
| protected ShapeEditPart getGeoshape2EP() { |
| return (ShapeEditPart) findEditPart(geoshape2View); |
| } |
| |
| protected void setupShapesAndGroups() { |
| setupShapes(); |
| |
| List shapes = new LinkedList(); |
| shapes.add(getNote1EP()); |
| shapes.add(getGeoshape1EP()); |
| |
| GroupEditPart groupEP = groupShapes(shapes); |
| |
| shapes.clear(); |
| shapes.add(groupEP); |
| shapes.add(getNote2EP()); |
| |
| groupShapes(shapes); |
| |
| assertEquals(2, getContainerEP().getChildren().size()); |
| assertEquals(2, getOuterGroupEP().getChildren().size()); |
| assertEquals(2, getInnerGroupEP().getChildren().size()); |
| } |
| |
| protected GroupEditPart getInnerGroupEP() { |
| return (GroupEditPart) getNote1EP().getParent(); |
| } |
| |
| protected GroupEditPart getOuterGroupEP() { |
| return (GroupEditPart) getNote2EP().getParent(); |
| } |
| |
| protected GroupEditPart groupShapes(List editparts) { |
| View childView = (View) ((IGraphicalEditPart) editparts.get(0)) |
| .getModel(); |
| |
| GroupRequest request = new GroupRequest(ActionIds.ACTION_GROUP); |
| request.setEditParts(editparts); |
| Command cmd = ((IGraphicalEditPart) editparts.get(0)).getParent() |
| .getCommand(request); |
| assertTrue(cmd.canExecute()); |
| getCommandStack().execute(cmd); |
| flushEventQueue(); |
| |
| EditPart groupEP = findEditPart(childView).getParent(); |
| assertTrue(groupEP instanceof GroupEditPart); |
| return (GroupEditPart) groupEP; |
| } |
| |
| protected Tool getSelectionToolFromPalette() { |
| PaletteViewer paletteViewer = getDiagramEditPart().getViewer() |
| .getEditDomain().getPaletteViewer(); |
| ToolEntry selectionTool = paletteViewer.getPaletteRoot() |
| .getDefaultEntry(); |
| paletteViewer.setActiveTool(selectionTool); |
| Tool tool = selectionTool.createTool(); |
| tool.setEditDomain((EditDomain) getDiagramWorkbenchPart() |
| .getDiagramEditDomain()); |
| return tool; |
| } |
| |
| /** |
| * @return |
| */ |
| protected IGraphicalEditPart findEditPart(View view) { |
| return (IGraphicalEditPart) getDiagramEditPart().getViewer() |
| .getEditPartRegistry().get(view); |
| } |
| |
| protected MouseEvent createMouseEvent(int x, int y) { |
| Event e = new Event(); |
| |
| e.widget = getDiagramEditPart().getViewer().getControl(); |
| ; |
| e.display = e.widget.getDisplay(); |
| e.button = 1; // left button |
| e.x = x; |
| e.y = y; |
| |
| return new MouseEvent(e); |
| } |
| |
| protected MouseEvent createRightMouseEvent(int x, int y) { |
| Event e = new Event(); |
| |
| e.widget = getDiagramEditPart().getViewer().getControl(); |
| ; |
| e.display = e.widget.getDisplay(); |
| e.button = 3; // right button |
| e.x = x; |
| e.y = y; |
| |
| return new MouseEvent(e); |
| } |
| |
| protected Rectangle getAbsoluteBounds(IGraphicalEditPart editpart) { |
| Rectangle bounds = editpart.getFigure().getBounds().getCopy(); |
| editpart.getFigure().translateToAbsolute(bounds); |
| return bounds; |
| } |
| |
| public void testGroupCommandAndUndoRedo() |
| throws Exception { |
| |
| setupShapes(); |
| |
| // Group note1 and geoshape1 and test undo/redo of the action. |
| List shapes = new LinkedList(); |
| shapes.add(getNote1EP()); |
| shapes.add(getGeoshape1EP()); |
| |
| GroupEditPart group1EP = groupShapes(shapes); |
| |
| assertEquals(3, getContainerEP().getChildren().size()); |
| assertEquals(group1EP, getGeoshape1EP().getParent()); |
| assertEquals(group1EP.getParent(), getContainerEP()); |
| assertEquals(2, group1EP.getChildren().size()); |
| assertEquals(getAbsoluteBounds(group1EP), getAbsoluteBounds( |
| getNote1EP()).union(getAbsoluteBounds(getGeoshape1EP()))); |
| |
| assertTrue(getCommandStack().canUndo()); |
| getCommandStack().undo(); |
| |
| assertEquals(getContainerEP(), getNote1EP().getParent()); |
| assertEquals(getGeoshape1EP().getParent(), getContainerEP()); |
| assertEquals(4, getContainerEP().getChildren().size()); |
| |
| assertTrue(getCommandStack().canRedo()); |
| getCommandStack().redo(); |
| |
| group1EP = (GroupEditPart) getNote1EP().getParent(); |
| assertEquals(group1EP, getGeoshape1EP().getParent()); |
| assertEquals(group1EP.getParent(), getContainerEP()); |
| assertEquals(2, group1EP.getChildren().size()); |
| assertEquals(3, getContainerEP().getChildren().size()); |
| assertEquals(getAbsoluteBounds(group1EP), getAbsoluteBounds( |
| getNote1EP()).union(getAbsoluteBounds(getGeoshape1EP()))); |
| |
| // Group group1 and note2 and test undo/redo of the action. |
| |
| shapes.clear(); |
| shapes.add(group1EP); |
| shapes.add(getNote2EP()); |
| |
| GroupEditPart group2EP = groupShapes(shapes); |
| |
| group1EP = (GroupEditPart) getNote1EP().getParent(); |
| |
| assertEquals(group1EP, getGeoshape1EP().getParent()); |
| assertEquals(group2EP, group1EP.getParent()); |
| assertEquals(group2EP, getNote2EP().getParent()); |
| assertEquals(getContainerEP(), group2EP.getParent()); |
| assertEquals(2, group1EP.getChildren().size()); |
| assertEquals(2, group2EP.getChildren().size()); |
| assertEquals(2, getContainerEP().getChildren().size()); |
| assertEquals(getAbsoluteBounds(group2EP), getAbsoluteBounds( |
| getNote2EP()).union(getAbsoluteBounds(group1EP))); |
| |
| assertTrue(getCommandStack().canUndo()); |
| getCommandStack().undo(); |
| |
| group1EP = (GroupEditPart) getNote1EP().getParent(); |
| assertEquals(getContainerEP(), group1EP.getParent()); |
| assertEquals(getContainerEP(), getNote2EP().getParent()); |
| assertEquals(3, getContainerEP().getChildren().size()); |
| |
| assertTrue(getCommandStack().canRedo()); |
| getCommandStack().redo(); |
| |
| group1EP = (GroupEditPart) getNote1EP().getParent(); |
| group2EP = (GroupEditPart) getNote2EP().getParent(); |
| assertEquals(group2EP, group1EP.getParent()); |
| assertEquals(getContainerEP(), group2EP.getParent()); |
| assertEquals(2, group1EP.getChildren().size()); |
| assertEquals(2, group2EP.getChildren().size()); |
| assertEquals(2, getContainerEP().getChildren().size()); |
| assertEquals(getAbsoluteBounds(group2EP), getAbsoluteBounds( |
| getNote2EP()).union(getAbsoluteBounds(group1EP))); |
| } |
| |
| public void testUngroupCommandAndUndoRedo() |
| throws Exception { |
| |
| setupShapesAndGroups(); |
| |
| // Ungroup the top-level group. |
| Request request = new Request(ActionIds.ACTION_UNGROUP); |
| Command cmd = getOuterGroupEP().getCommand(request); |
| assertTrue(cmd.canExecute()); |
| getCommandStack().execute(cmd); |
| // flushEventQueue(); |
| |
| assertEquals(3, getContainerEP().getChildren().size()); |
| assertEquals(getContainerEP(), getInnerGroupEP().getParent()); |
| assertEquals(getContainerEP(), getNote2EP().getParent()); |
| |
| // Undo the ungroup of the top-level group. |
| assertTrue(getCommandStack().canUndo()); |
| getCommandStack().undo(); |
| |
| assertEquals(2, getContainerEP().getChildren().size()); |
| assertEquals(getOuterGroupEP(), getInnerGroupEP().getParent()); |
| assertEquals(2, getOuterGroupEP().getChildren().size()); |
| |
| // Redo the ungroup of the top-level group. |
| assertTrue(getCommandStack().canRedo()); |
| getCommandStack().redo(); |
| // flushEventQueue(); |
| |
| assertEquals(3, getContainerEP().getChildren().size()); |
| assertEquals(getContainerEP(), getInnerGroupEP().getParent()); |
| assertEquals(getContainerEP(), getNote2EP().getParent()); |
| } |
| |
| public void testGroupIsSelectedAfterGroupAction() |
| throws Exception { |
| |
| setupShapes(); |
| |
| List shapes = new LinkedList(); |
| shapes.add(getNote1EP()); |
| shapes.add(getGeoshape1EP()); |
| |
| GroupAction action = new GroupAction(getWorkbenchPage()); |
| getWorkbenchPage().activate(getDiagramWorkbenchPart()); |
| action.init(); |
| |
| EditPartViewer viewer = getDiagramWorkbenchPart() |
| .getDiagramGraphicalViewer(); |
| viewer.deselectAll(); |
| viewer.setSelection(new StructuredSelection(shapes)); |
| |
| action.refresh(); |
| assertTrue(action.isEnabled()); |
| action.run(); |
| action.dispose(); |
| |
| flushEventQueue(); |
| |
| assertEquals(1, ((StructuredSelection) viewer.getSelection()).size()); |
| assertTrue(((StructuredSelection) viewer.getSelection()) |
| .getFirstElement() instanceof GroupEditPart); |
| } |
| |
| public void testGroupActionEnablement() |
| throws Exception { |
| setupShapes(); |
| |
| GroupAction action = new GroupAction(getWorkbenchPage()); |
| getWorkbenchPage().activate(getDiagramWorkbenchPart()); |
| action.init(); |
| |
| EditPartViewer viewer = getDiagramWorkbenchPart() |
| .getDiagramGraphicalViewer(); |
| viewer.deselectAll(); |
| |
| // should be enabled when connections are included in the selection |
| viewer.setSelection(new StructuredSelection(getDiagramEditPart() |
| .getPrimaryEditParts())); |
| action.refresh(); |
| assertTrue(action.isEnabled()); |
| |
| // should be disabled when only one shape is selected |
| viewer.setSelection(new StructuredSelection(getNote1EP())); |
| action.refresh(); |
| assertFalse(action.isEnabled()); |
| |
| // should be enabled when connections are included in the selection |
| viewer.setSelection(new StructuredSelection(getDiagramEditPart() |
| .getPrimaryEditParts())); |
| action.refresh(); |
| assertTrue(action.isEnabled()); |
| |
| // should be disabled when only connections are selected |
| viewer.setSelection(new StructuredSelection(getDiagramEditPart() |
| .getConnections())); |
| action.refresh(); |
| assertFalse(action.isEnabled()); |
| |
| // should be enabled on groups |
| List shapes = new LinkedList(); |
| shapes.add(getNote1EP()); |
| shapes.add(getGeoshape1EP()); |
| GroupEditPart groupEP = groupShapes(shapes); |
| shapes.clear(); |
| shapes.add(groupEP); |
| shapes.add(getNote2EP()); |
| viewer.setSelection(new StructuredSelection(shapes)); |
| action.refresh(); |
| assertTrue(action.isEnabled()); |
| |
| // should be disabled on uneditable diagrams |
| getContainerEP().disableEditMode(); |
| action.refresh(); |
| assertFalse(action.isEnabled()); |
| } |
| |
| public void testUngroupActionEnablement() |
| throws Exception { |
| setupShapes(); |
| |
| List shapes = new LinkedList(); |
| shapes.add(getNote1EP()); |
| shapes.add(getGeoshape1EP()); |
| GroupEditPart group1EP = groupShapes(shapes); |
| |
| shapes.clear(); |
| shapes.add(getNote2EP()); |
| shapes.add(getGeoshape2EP()); |
| GroupEditPart group2EP = groupShapes(shapes); |
| |
| UngroupAction action = new UngroupAction(getWorkbenchPage()); |
| getWorkbenchPage().activate(getDiagramWorkbenchPart()); |
| action.init(); |
| |
| EditPartViewer viewer = getDiagramWorkbenchPart() |
| .getDiagramGraphicalViewer(); |
| viewer.deselectAll(); |
| |
| // should be enabled when one group is selected |
| viewer.setSelection(new StructuredSelection(getInnerGroupEP())); |
| action.refresh(); |
| assertTrue(action.isEnabled()); |
| |
| // should be enabled when multiple groups are selected |
| List groups = new LinkedList(); |
| groups.add(group1EP); |
| groups.add(group2EP); |
| viewer.setSelection(new StructuredSelection(groups)); |
| action.refresh(); |
| assertTrue(action.isEnabled()); |
| } |
| |
| public void testSelectGroupWithClickAndDrag() |
| throws Exception { |
| |
| setupShapesAndGroups(); |
| |
| EditPartViewer viewer = getDiagramEditPart().getViewer(); |
| PaletteViewer paletteViewer = viewer.getEditDomain().getPaletteViewer(); |
| |
| ToolEntry selectionTool = paletteViewer.getPaletteRoot() |
| .getDefaultEntry(); |
| paletteViewer.setActiveTool(selectionTool); |
| Tool tool = selectionTool.createTool(); |
| tool.setEditDomain((EditDomain) getDiagramWorkbenchPart() |
| .getDiagramEditDomain()); |
| |
| // draw rubber band around all the shapes |
| viewer.getSelectionManager().deselectAll(); |
| tool.activate(); |
| tool.mouseDown(createMouseEvent(0, 0), viewer); |
| tool.mouseDrag(createMouseEvent(200, 200), viewer); |
| tool.mouseUp(createMouseEvent(200, 200), viewer); |
| tool.deactivate(); |
| |
| // size should be 6: 1 group, 1 shape, 4 connections |
| assertEquals(6, viewer.getSelectedEditParts().size()); |
| assertTrue(viewer.getSelectedEditParts().contains(getOuterGroupEP())); |
| } |
| |
| public void testSelectGroupWithRightClick() |
| throws Exception { |
| |
| setupShapesAndGroups(); |
| |
| Tool tool = getSelectionToolFromPalette(); |
| |
| // click on a shape in the outer group and the outer group should be |
| // selected |
| EditPartViewer viewer = getDiagramEditPart().getViewer(); |
| viewer.getSelectionManager().deselectAll(); |
| tool.activate(); |
| Point point = getAbsoluteBounds(getNote2EP()).getCenter(); |
| tool.mouseDown(createMouseEvent(point.x, point.y), viewer); |
| tool.mouseUp(createMouseEvent(point.x, point.y), viewer); |
| |
| assertEquals(1, viewer.getSelectedEditParts().size()); |
| assertTrue(viewer.getSelectedEditParts().contains(getOuterGroupEP())); |
| |
| // right-click on the same shape a second time and the group should |
| // still be |
| // selected |
| tool.mouseDown(createRightMouseEvent(point.x, point.y), viewer); |
| tool.mouseUp(createRightMouseEvent(point.x, point.y), viewer); |
| |
| assertEquals(1, viewer.getSelectedEditParts().size()); |
| assertTrue(viewer.getSelectedEditParts().contains(getOuterGroupEP())); |
| } |
| |
| public void testSelectShapesAndGroupsWithClick() |
| throws Exception { |
| |
| setupShapesAndGroups(); |
| |
| Tool tool = getSelectionToolFromPalette(); |
| |
| // click on a shape in the outer group and the outer group should be |
| // selected |
| EditPartViewer viewer = getDiagramEditPart().getViewer(); |
| viewer.getSelectionManager().deselectAll(); |
| tool.activate(); |
| Point point = getAbsoluteBounds(getNote2EP()).getCenter(); |
| tool.mouseDown(createMouseEvent(point.x, point.y), viewer); |
| tool.mouseUp(createMouseEvent(point.x, point.y), viewer); |
| |
| assertEquals(1, viewer.getSelectedEditParts().size()); |
| assertTrue(viewer.getSelectedEditParts().contains(getOuterGroupEP())); |
| |
| // click on the same shape a second time and the shape should be |
| // selected |
| tool.mouseDown(createMouseEvent(point.x, point.y), viewer); |
| tool.mouseUp(createMouseEvent(point.x, point.y), viewer); |
| |
| assertEquals(1, viewer.getSelectedEditParts().size()); |
| assertTrue(viewer.getSelectedEditParts().contains(getNote2EP())); |
| |
| // right-click on the same shape and it should remain selected |
| tool.mouseDown(createRightMouseEvent(point.x, point.y), viewer); |
| tool.mouseUp(createRightMouseEvent(point.x, point.y), viewer); |
| |
| assertEquals(1, viewer.getSelectedEditParts().size()); |
| assertTrue(viewer.getSelectedEditParts().contains(getNote2EP())); |
| |
| // click on a shape not in the group and that shape itself should be |
| // selected |
| viewer.getSelectionManager().deselectAll(); |
| point = getAbsoluteBounds(getGeoshape2EP()).getCenter(); |
| tool.mouseDown(createMouseEvent(point.x, point.y), viewer); |
| tool.mouseUp(createMouseEvent(point.x, point.y), viewer); |
| |
| assertEquals(1, viewer.getSelectedEditParts().size()); |
| assertTrue(viewer.getSelectedEditParts().contains(getGeoshape2EP())); |
| |
| // click on an area of blank space in a group and nothing should be |
| // selected |
| viewer.getSelectionManager().deselectAll(); |
| tool.mouseDown(createMouseEvent(30, 75), viewer); |
| tool.mouseUp(createMouseEvent(30, 75), viewer); |
| |
| assertEquals(0, viewer.getSelectedEditParts().size()); |
| |
| // click on a shape in the inner group and the outer group should be |
| // selected |
| viewer.getSelectionManager().deselectAll(); |
| point = getAbsoluteBounds(getNote1EP()).getCenter(); |
| tool.mouseDown(createMouseEvent(point.x, point.y), viewer); |
| tool.mouseUp(createMouseEvent(point.x, point.y), viewer); |
| |
| assertEquals(1, viewer.getSelectedEditParts().size()); |
| assertTrue(viewer.getSelectedEditParts().contains(getOuterGroupEP())); |
| |
| // click on the same shape a second time and the inner group should be |
| // selected |
| tool.mouseDown(createMouseEvent(point.x, point.y), viewer); |
| tool.mouseUp(createMouseEvent(point.x, point.y), viewer); |
| |
| assertEquals(1, viewer.getSelectedEditParts().size()); |
| assertTrue(viewer.getSelectedEditParts().contains(getInnerGroupEP())); |
| |
| // click on the same shape a third time and the shape itself should be |
| // selected |
| tool.mouseDown(createMouseEvent(point.x, point.y), viewer); |
| tool.mouseUp(createMouseEvent(point.x, point.y), viewer); |
| |
| assertEquals(1, viewer.getSelectedEditParts().size()); |
| assertTrue(viewer.getSelectedEditParts().contains(getNote1EP())); |
| |
| tool.deactivate(); |
| } |
| |
| /** |
| * This ensure that when a group is created you can select a connection that |
| * exists between shapes in the group. The issue was that the connection |
| * editpart was not active. |
| * |
| * This fails because of GEF Bugzilla 174085. |
| * |
| * @throws Exception |
| */ |
| public void testSelectConnectionInGroupWithClick() |
| throws Exception { |
| |
| setupShapes(); |
| |
| List shapes = new LinkedList(); |
| shapes.add(getNote1EP()); |
| shapes.add(getGeoshape1EP()); |
| GroupEditPart groupEP = groupShapes(shapes); |
| |
| ConnectionEditPart connectionEP = (ConnectionEditPart) getNote1EP() |
| .getSourceConnections().get(0); |
| |
| Tool tool = getSelectionToolFromPalette(); |
| EditPartViewer viewer = getDiagramEditPart().getViewer(); |
| viewer.getSelectionManager().deselectAll(); |
| tool.activate(); |
| |
| Point point = getAbsoluteBounds(connectionEP).getCenter(); |
| tool.mouseDown(createMouseEvent(point.x, point.y), viewer); |
| tool.mouseUp(createMouseEvent(point.x, point.y), viewer); |
| |
| assertEquals(1, viewer.getSelectedEditParts().size()); |
| assertEquals(connectionEP, viewer.getSelectedEditParts().get(0)); |
| assertTrue(connectionEP.isActive()); |
| assertTrue(connectionEP.getSource().isActive()); |
| assertEquals(groupEP, connectionEP.getSource().getParent()); |
| assertTrue(connectionEP.getTarget().isActive()); |
| assertEquals(groupEP, connectionEP.getTarget().getParent()); |
| |
| tool.deactivate(); |
| } |
| |
| public void testMoveGroup() |
| throws Exception { |
| |
| setupShapesAndGroups(); |
| |
| Tool tool = getSelectionToolFromPalette(); |
| |
| System.out.println(getInnerGroupEP().getFigure().getBounds()); |
| System.out.println(getAbsoluteBounds(getInnerGroupEP())); |
| Rectangle origGroupBounds = getAbsoluteBounds(getInnerGroupEP()); |
| Rectangle origNote1Bounds = getAbsoluteBounds(getNote1EP()); |
| Rectangle origGeoshape1Bounds = getAbsoluteBounds(getGeoshape1EP()); |
| |
| Point offset = new Point(25, 25); |
| |
| // Click and drag the group in one gesture. |
| EditPartViewer viewer = getDiagramEditPart().getViewer(); |
| viewer.getSelectionManager().deselectAll(); |
| tool.activate(); |
| Point point = origNote1Bounds.getCenter(); |
| tool.mouseDown(createMouseEvent(point.x, point.y), viewer); |
| point.translate(offset); |
| tool.mouseDrag(createMouseEvent(point.x, point.y), viewer); |
| tool.mouseUp(createMouseEvent(point.x, point.y), viewer); |
| tool.deactivate(); |
| flushEventQueue(); |
| Thread.sleep(5000); |
| |
| // Cannot test the exact bounds because I can't figure out what the |
| // exact bounds should be (maybe there are rounding issues?) so the |
| // tests here will have to do. |
| Dimension resultingOffset = origGroupBounds.getLocation() |
| .getDifference(getAbsoluteBounds(getInnerGroupEP()).getLocation()); |
| assertTrue(resultingOffset.height != 0 && resultingOffset.width != 0); |
| assertEquals(resultingOffset, origNote1Bounds.getLocation() |
| .getDifference(getAbsoluteBounds(getNote1EP()).getLocation())); |
| assertEquals(resultingOffset, origGeoshape1Bounds.getLocation() |
| .getDifference(getAbsoluteBounds(getGeoshape1EP()).getLocation())); |
| |
| // Now select the group first and then click over a shape and drag. This |
| // should move the group. |
| origGroupBounds = getAbsoluteBounds(getInnerGroupEP()); |
| origNote1Bounds = getAbsoluteBounds(getNote1EP()); |
| origGeoshape1Bounds = getAbsoluteBounds(getGeoshape1EP()); |
| point = origNote1Bounds.getCenter(); |
| offset = new Point(-25, -25); |
| |
| viewer.getSelectionManager().deselectAll(); |
| viewer.select(getInnerGroupEP()); |
| tool.activate(); |
| |
| tool.mouseDown(createMouseEvent(point.x, point.y), viewer); |
| point.translate(offset); |
| tool.mouseDrag(createMouseEvent(point.x, point.y), viewer); |
| tool.mouseUp(createMouseEvent(point.x, point.y), viewer); |
| tool.deactivate(); |
| |
| flushEventQueue(); |
| |
| // Cannot test the exact bounds because I can't figure out what the |
| // exact bounds should be (maybe there are rounding issues?) so the |
| // tests here will have to do. |
| resultingOffset = origGroupBounds.getLocation().getDifference( |
| getAbsoluteBounds(getInnerGroupEP()).getLocation()); |
| assertTrue(resultingOffset.height != 0 && resultingOffset.width != 0); |
| |
| resultingOffset = origNote1Bounds.getLocation().getDifference( |
| getAbsoluteBounds(getNote1EP()).getLocation()); |
| assertTrue(resultingOffset.height != 0 && resultingOffset.width != 0); |
| |
| resultingOffset = origGeoshape1Bounds.getLocation().getDifference( |
| getAbsoluteBounds(getGeoshape1EP()).getLocation()); |
| assertTrue(resultingOffset.height != 0 && resultingOffset.width != 0); |
| |
| // Confirm sizes are still the same. |
| assertEquals(origGroupBounds.getSize(), getAbsoluteBounds( |
| getInnerGroupEP()).getSize()); |
| assertEquals(origNote1Bounds.getSize(), getAbsoluteBounds(getNote1EP()) |
| .getSize()); |
| assertEquals(origGeoshape1Bounds.getSize(), getAbsoluteBounds( |
| getGeoshape1EP()).getSize()); |
| } |
| |
| public void testMoveShapeInGroup() |
| throws Exception { |
| |
| setupShapesAndGroups(); |
| |
| Tool tool = getSelectionToolFromPalette(); |
| |
| Rectangle origGroupBounds = getAbsoluteBounds(getInnerGroupEP()); |
| Rectangle origNote1Bounds = getAbsoluteBounds(getNote1EP()); |
| Rectangle origGeoshape1Bounds = getAbsoluteBounds(getGeoshape1EP()); |
| |
| Point offset = new Point(25, 25); |
| |
| // Move geoshape1. Click three times -- first select the outer group, |
| // then select the inner group, then select geoshape1. |
| EditPartViewer viewer = getDiagramEditPart().getViewer(); |
| viewer.getSelectionManager().deselectAll(); |
| tool.activate(); |
| Point point = origGeoshape1Bounds.getCenter(); |
| tool.mouseDown(createMouseEvent(point.x, point.y), viewer); |
| tool.mouseUp(createMouseEvent(point.x, point.y), viewer); |
| |
| tool.mouseDown(createMouseEvent(point.x, point.y), viewer); |
| tool.mouseUp(createMouseEvent(point.x, point.y), viewer); |
| |
| tool.mouseDown(createMouseEvent(point.x, point.y), viewer); |
| tool.mouseUp(createMouseEvent(point.x, point.y), viewer); |
| |
| // Now click and drag geoshape1 to move it. |
| tool.mouseDown(createMouseEvent(point.x, point.y), viewer); |
| point.translate(offset); |
| tool.mouseDrag(createMouseEvent(point.x, point.y), viewer); |
| tool.mouseUp(createMouseEvent(point.x, point.y), viewer); |
| tool.deactivate(); |
| flushEventQueue(); |
| |
| // Confirm geoshape1 was not removed from the group. |
| assertEquals(2, getInnerGroupEP().getChildren().size()); |
| |
| // geoshape1 should have moved. |
| Dimension resultingOffset = origGeoshape1Bounds.getLocation() |
| .getDifference(getAbsoluteBounds(getGeoshape1EP()).getLocation()); |
| assertTrue(resultingOffset.height != 0 && resultingOffset.width != 0); |
| assertEquals(origGeoshape1Bounds.getSize(), getAbsoluteBounds( |
| getGeoshape1EP()).getSize()); |
| |
| // note1 should remain the same. |
| assertEquals(origNote1Bounds, getAbsoluteBounds(getNote1EP())); |
| |
| // The group location should not have changed but the size should have |
| // grown. |
| assertEquals(origGroupBounds.getLocation(), getAbsoluteBounds( |
| getInnerGroupEP()).getLocation()); |
| assertNotSame(origGroupBounds.getSize(), getAbsoluteBounds( |
| getInnerGroupEP()).getSize()); |
| |
| } |
| |
| public void testUngroupShapesMaintainsShapeLocations() |
| throws Exception { |
| |
| setupShapesAndGroups(); |
| |
| // Ungroup the inner group. |
| |
| // First cache the bounds in absolute coordinates of one of the figures. |
| Rectangle origGeoshape1Bounds = getAbsoluteBounds(getGeoshape1EP()); |
| |
| // Perform the ungroup. |
| Request request = new Request(ActionIds.ACTION_UNGROUP); |
| Command cmd = getInnerGroupEP().getCommand(request); |
| assertTrue(cmd.canExecute()); |
| getCommandStack().execute(cmd); |
| flushEventQueue(); |
| |
| // Test that the bounds in absolute have not changed. |
| assertEquals(origGeoshape1Bounds, getAbsoluteBounds(getGeoshape1EP())); |
| |
| // Ungroup the outer group. |
| |
| // First cache the bounds in absolute coordinates of one of the figures. |
| Rectangle origNote2Bounds = getAbsoluteBounds(getNote2EP()); |
| |
| // Perform the ungroup. |
| request = new Request(ActionIds.ACTION_UNGROUP); |
| cmd = getInnerGroupEP().getCommand(request); |
| assertTrue(cmd.canExecute()); |
| getCommandStack().execute(cmd); |
| flushEventQueue(); |
| |
| // Test that the bounds in absolute have not changed. |
| assertEquals(origNote2Bounds, getAbsoluteBounds(getNote2EP())); |
| } |
| |
| public void testDeleteShapeInGroup() |
| throws Exception { |
| |
| setupShapes(); |
| |
| List shapes = new LinkedList(); |
| shapes.add(getNote1EP()); |
| shapes.add(getGeoshape1EP()); |
| shapes.add(getGeoshape2EP()); |
| |
| GroupEditPart groupEP = groupShapes(shapes); |
| |
| shapes.clear(); |
| shapes.add(groupEP); |
| shapes.add(getNote2EP()); |
| |
| groupShapes(shapes); |
| |
| // Inner group has 3 shapes, outer group has inner group and 1 shape. |
| assertEquals(1, getContainerEP().getChildren().size()); |
| assertEquals(2, getOuterGroupEP().getChildren().size()); |
| assertEquals(3, getInnerGroupEP().getChildren().size()); |
| |
| Request request = new GroupRequest(RequestConstants.REQ_DELETE); |
| |
| // Delete one shape from the inner group. |
| getCommandStack().execute(getGeoshape1EP().getCommand(request)); |
| |
| // Inner group should now have 2 shapes. |
| assertEquals(2, getInnerGroupEP().getChildren().size()); |
| |
| // Delete another shape from the inner group. |
| getCommandStack().execute(getNote1EP().getCommand(request)); |
| |
| // Inner group should not exist anymore. |
| assertEquals(getOuterGroupEP(), getGeoshape2EP().getParent()); |
| assertEquals(2, getOuterGroupEP().getChildren().size()); |
| |
| // Now try undo. |
| getCommandStack().undo(); |
| getCommandStack().undo(); |
| |
| // Inner group has 3 shapes, outer group has inner group and 1 shape. |
| assertEquals(1, getContainerEP().getChildren().size()); |
| assertEquals(2, getOuterGroupEP().getChildren().size()); |
| assertEquals(3, getInnerGroupEP().getChildren().size()); |
| |
| } |
| |
| public void testCannotResizeGroup() |
| throws Exception { |
| |
| setupShapesAndGroups(); |
| |
| ChangeBoundsRequest request = new ChangeBoundsRequest( |
| RequestConstants.REQ_RESIZE); |
| request.setResizeDirection(PositionConstants.SOUTH); |
| request.setEditParts(getOuterGroupEP()); |
| request.setSizeDelta(new Dimension(0, 100)); |
| |
| Command cmd = getOuterGroupEP().getCommand(request); |
| assertTrue(cmd == null || !cmd.canExecute()); |
| } |
| |
| public void testResizeShapeInGroup() |
| throws Exception { |
| |
| setupShapesAndGroups(); |
| |
| Rectangle origNote1Bounds = getAbsoluteBounds(getNote1EP()); |
| Rectangle origGeoshape1Bounds = getAbsoluteBounds(getGeoshape1EP()); |
| |
| // Increase note1's size by 10 on each side. |
| ChangeBoundsRequest request = new ChangeBoundsRequest( |
| RequestConstants.REQ_RESIZE); |
| request.setResizeDirection(PositionConstants.NORTH_EAST); |
| request.setEditParts(getNote1EP()); |
| request.setSizeDelta(new Dimension(10, 10)); |
| |
| getNote1EP().getCommand(request).execute(); |
| |
| assertNotSame(origNote1Bounds, getAbsoluteBounds(getNote1EP())); |
| assertEquals(origGeoshape1Bounds, getAbsoluteBounds(getGeoshape1EP())); |
| assertEquals(getAbsoluteBounds(getNote1EP()).union( |
| getAbsoluteBounds(getGeoshape1EP())), |
| getAbsoluteBounds(getInnerGroupEP())); |
| |
| request.setResizeDirection(PositionConstants.SOUTH_WEST); |
| getNote1EP().getCommand(request).execute(); |
| |
| assertEquals(origGeoshape1Bounds, getAbsoluteBounds(getGeoshape1EP())); |
| assertEquals(getAbsoluteBounds(getNote1EP()).union( |
| getAbsoluteBounds(getGeoshape1EP())), |
| getAbsoluteBounds(getInnerGroupEP())); |
| |
| // Increase geoshape1's size by 10 on each side. |
| origNote1Bounds = getAbsoluteBounds(getNote1EP()); |
| origGeoshape1Bounds = getAbsoluteBounds(getGeoshape1EP()); |
| |
| request.setResizeDirection(PositionConstants.SOUTH_EAST); |
| request.setEditParts(getGeoshape1EP()); |
| |
| getGeoshape1EP().getCommand(request).execute(); |
| |
| assertNotSame(origGeoshape1Bounds, getAbsoluteBounds(getGeoshape1EP())); |
| assertEquals(origNote1Bounds, getAbsoluteBounds(getNote1EP())); |
| assertEquals(getAbsoluteBounds(getNote1EP()).union( |
| getAbsoluteBounds(getGeoshape1EP())), |
| getAbsoluteBounds(getInnerGroupEP())); |
| |
| request.setResizeDirection(PositionConstants.NORTH_WEST); |
| getGeoshape1EP().getCommand(request).execute(); |
| |
| assertEquals(origNote1Bounds, getAbsoluteBounds(getNote1EP())); |
| assertEquals(getAbsoluteBounds(getNote1EP()).union( |
| getAbsoluteBounds(getGeoshape1EP())), |
| getAbsoluteBounds(getInnerGroupEP())); |
| |
| // Decrease note1's size by 10 on each side. |
| origNote1Bounds = getAbsoluteBounds(getNote1EP()); |
| origGeoshape1Bounds = getAbsoluteBounds(getGeoshape1EP()); |
| |
| request.setResizeDirection(PositionConstants.NORTH_EAST); |
| request.setEditParts(getNote1EP()); |
| request.setSizeDelta(new Dimension(-10, -10)); |
| |
| getNote1EP().getCommand(request).execute(); |
| |
| assertNotSame(origNote1Bounds, getAbsoluteBounds(getNote1EP())); |
| assertEquals(origGeoshape1Bounds, getAbsoluteBounds(getGeoshape1EP())); |
| assertEquals(getAbsoluteBounds(getNote1EP()).union( |
| getAbsoluteBounds(getGeoshape1EP())), |
| getAbsoluteBounds(getInnerGroupEP())); |
| |
| request.setResizeDirection(PositionConstants.SOUTH_WEST); |
| getNote1EP().getCommand(request).execute(); |
| |
| assertEquals(origGeoshape1Bounds, getAbsoluteBounds(getGeoshape1EP())); |
| assertEquals(getAbsoluteBounds(getNote1EP()).union( |
| getAbsoluteBounds(getGeoshape1EP())), |
| getAbsoluteBounds(getInnerGroupEP())); |
| |
| // Decrease geoshape1's size by 10 on each side. |
| origNote1Bounds = getAbsoluteBounds(getNote1EP()); |
| origGeoshape1Bounds = getAbsoluteBounds(getNote1EP()); |
| |
| request.setResizeDirection(PositionConstants.SOUTH_EAST); |
| request.setEditParts(getGeoshape1EP()); |
| |
| getGeoshape1EP().getCommand(request).execute(); |
| |
| assertNotSame(origGeoshape1Bounds, getGeoshape1EP().getFigure() |
| .getBounds()); |
| assertEquals(origNote1Bounds, getAbsoluteBounds(getNote1EP())); |
| assertEquals(getAbsoluteBounds(getNote1EP()).union( |
| getAbsoluteBounds(getGeoshape1EP())), |
| getAbsoluteBounds(getInnerGroupEP())); |
| |
| request.setResizeDirection(PositionConstants.NORTH_WEST); |
| getGeoshape1EP().getCommand(request).execute(); |
| |
| assertEquals(origNote1Bounds, getAbsoluteBounds(getNote1EP())); |
| assertEquals(getAbsoluteBounds(getNote1EP()).union( |
| getAbsoluteBounds(getGeoshape1EP())), |
| getAbsoluteBounds(getInnerGroupEP())); |
| } |
| |
| public void testDeleteGroup() |
| throws Exception { |
| |
| setupShapesAndGroups(); |
| |
| Request request = new GroupRequest(RequestConstants.REQ_DELETE); |
| getCommandStack().execute(getOuterGroupEP().getCommand(request)); |
| |
| assertEquals(1, getContainerEP().getChildren().size()); |
| |
| getCommandStack().undo(); |
| |
| assertEquals(2, getContainerEP().getChildren().size()); |
| assertEquals(2, getOuterGroupEP().getChildren().size()); |
| assertEquals(2, getInnerGroupEP().getChildren().size()); |
| |
| } |
| |
| public void testSelectActions() |
| throws Exception { |
| setupShapesAndGroups(); |
| |
| // test select all |
| getContainerEP().getViewer().setSelection( |
| new StructuredSelection(getContainerEP())); |
| |
| SelectAllAction selectAction = SelectAllAction |
| .createSelectAllAction(getWorkbenchPage()); |
| |
| testAction(selectAction, new ITestActionCallback() { |
| |
| public void onRunExecution() { |
| |
| List selectedParts = getContainerEP().getViewer() |
| .getSelectedEditParts(); |
| |
| // 2 shapes and 4 connectors |
| assertEquals(6, selectedParts.size()); |
| assertTrue(selectedParts.contains(getOuterGroupEP())); |
| assertTrue(selectedParts.contains(getNote2EP() |
| .getSourceConnections().get(0))); |
| assertFalse(selectedParts.contains(getNote1EP())); |
| |
| } |
| }); |
| |
| // test select all shapes |
| getContainerEP().getViewer().deselectAll(); |
| getContainerEP().getViewer().setSelection( |
| new StructuredSelection(getContainerEP())); |
| |
| selectAction = SelectAllAction |
| .createSelectAllShapesAction(getWorkbenchPage()); |
| |
| testAction(selectAction, new ITestActionCallback() { |
| |
| public void onRunExecution() { |
| |
| List selectedParts = getContainerEP().getViewer() |
| .getSelectedEditParts(); |
| |
| // 2 shapes |
| assertEquals(2, selectedParts.size()); |
| assertTrue(selectedParts.contains(getOuterGroupEP())); |
| assertTrue(selectedParts.contains(getGeoshape2EP())); |
| |
| } |
| }); |
| |
| // test select all connections |
| getContainerEP().getViewer().deselectAll(); |
| getContainerEP().getViewer().setSelection( |
| new StructuredSelection(getContainerEP())); |
| |
| selectAction = SelectAllAction |
| .createSelectAllConnectionsAction(getWorkbenchPage()); |
| |
| testAction(selectAction, new ITestActionCallback() { |
| |
| public void onRunExecution() { |
| |
| List selectedParts = getContainerEP().getViewer() |
| .getSelectedEditParts(); |
| |
| // 4 connectors |
| assertEquals(4, selectedParts.size()); |
| assertTrue(selectedParts.contains(getNote2EP() |
| .getSourceConnections().get(0))); |
| } |
| }); |
| } |
| |
| } |