// GraphTea Project: http://github.com/graphtheorysoftware/GraphTea // Copyright (C) 2012 Graph Theory Software Foundation: http://GraphTheorySoftware.com // Copyright (C) 2008 Mathematical Science Department of Sharif University of Technology // Distributed under the terms of the GNU General Public License (GPL): http://www.gnu.org/licenses/ package graphtea.plugins.main.select; import graphtea.graph.event.GraphEvent; import graphtea.graph.event.VertexEvent; import graphtea.graph.graph.AbstractGraphRenderer; import graphtea.graph.graph.GPoint; import graphtea.graph.graph.SubGraph; import graphtea.graph.graph.Vertex; import graphtea.library.exceptions.InvalidVertexException; import graphtea.platform.core.AbstractAction; import graphtea.platform.core.BlackBoard; import graphtea.plugins.main.GraphData; import java.util.Objects; /** * @author azin azadi */ public class MoveSelected extends AbstractAction { public static final String SELECTION_MOVED = "Selection Moved"; public static final String SELECTION_MOVING = "Selection Moving"; /** * constructor * * @param bb the blackboard of the action */ public MoveSelected(BlackBoard bb) { super(bb); listen4Event(VertexEvent.EVENT_KEY); listen4Event(GraphEvent.EVENT_KEY); gd = new GraphData(blackboard); } public void track(){} GraphData gd; private GPoint[] verticesPositionsBackUp; public void performAction(String eventName, Object value) { gv = blackboard.getData(AbstractGraphRenderer.EVENT_KEY); //while resizing the vertex it shouldn't move it //resize // if (b == null || !b) { if (Objects.equals(eventName, VertexEvent.EVENT_KEY)) { VertexEvent vdd = blackboard.getData(VertexEvent.EVENT_KEY); SubGraph sd = Select.getSelection(blackboard); if (sd.vertices.contains(vdd.v)) //start if the vertex selected { if (vdd.eventType == VertexEvent.DRAGGING_STARTED) { verticesPositionsBackUp = new GPoint[gd.getGraph().getVerticesCount()]; for (Vertex vertex : gd.getGraph()) { verticesPositionsBackUp[vertex.getId()] = vertex.getLocation(); } startx = vdd.v.getLocation().x; starty = vdd.v.getLocation().y; drag(); } if (vdd.eventType == VertexEvent.RELEASED || vdd.eventType == VertexEvent.DROPPED) { drop(); //add undo data GPoint[] newPos = new GPoint[gd.getGraph().getVerticesCount()]; for (Vertex ver : gd.getGraph()) { newPos[ver.getId()] = ver.getLocation(); } blackboard.setData(SELECTION_MOVED, new GPoint(vdd.v.getLocation().x - startx, vdd.v.getLocation().y - starty)); } if (vdd.eventType == VertexEvent.DRAGGING) { // VertexMouseDraggingData d = blackboard.get(VertexMouseDraggingData.name); xx = vdd.mousePos.x; yy = vdd.mousePos.y; moveVertices(); } } } } private void mouseMove() { GraphEvent ge = blackboard.getData(GraphEvent.EVENT_KEY); // GraphMouseMoveData gmmd = blackboard.get(GraphMouseMoveData.name); xx = ge.mousePos.x; yy = ge.mousePos.y; moveVertices(); } private void moveVertices() { blackboard.setData("MoveSelected.moving", "yes"); // System.out.println("mm"); final SubGraph selection = Select.getSelection(blackboard); final double dx = xx - x; final double dy = yy - y; // System.out.println(xx + ", " + x + ", " + dx); AbstractGraphRenderer ren = blackboard.getData(AbstractGraphRenderer.EVENT_KEY); ren.ignoreRepaints(() -> { for (Vertex v1 : selection.vertices) { GPoint loc = v1.getLocation(); v1.setLocation(new GPoint(loc.x + dx, loc.y + dy)); } }); blackboard.setData(SELECTION_MOVING, new GPoint(dx, dy)); // blackboard.setData(SELECTION_MOVING, new GPoint(vdd.v.getLocation().x - startx, vdd.v.getLocation().y - starty)); } private double x,y,startx,starty,xx,yy; AbstractGraphRenderer gv; Vertex v; private void drag() { VertexEvent data = blackboard.getData(VertexEvent.EVENT_KEY); x = data.mousePos.x; y = data.mousePos.y; v = data.v; } private void drop() { blackboard.setData("undo point", null); blackboard.setData("MoveSelected.moving", "no"); AbstractGraphRenderer ren = blackboard.getData(AbstractGraphRenderer.EVENT_KEY); ren.ignoreRepaints(() -> { VertexEvent ve = blackboard.getData(VertexEvent.EVENT_KEY); int _x = (int) ve.mousePos.getX(); int _y = (int) ve.mousePos.getY(); int dx = (int) (_x - x); int dy = (int) (_y - y); x = x + dx; y = y + dy; SubGraph selection = Select.getSelection(blackboard); for (Vertex v1 : selection.vertices) { try { v1.setLocation(new GPoint(v1.getLocation().x + dx, v1.getLocation().y + dy)); } catch (InvalidVertexException e) { selection.vertices.remove(v1); //as in java any thing is references, there is no need to update the log in the blackboard :D:D //exception occurs whenever a selected vertex, or edge was deleted by user // ExceptionHandler.catchException(e); } } }); } @Override public boolean trackUndos() { // the undos are tracked in the drop() method. we don't want to track undos during the move return false; } }