// 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.atributeset.GraphAttrSet; import graphtea.graph.event.GraphEvent; import graphtea.graph.graph.*; import graphtea.graph.ui.GraphRectRegionSelect; import graphtea.library.exceptions.InvalidVertexException; import graphtea.platform.core.AbstractAction; import graphtea.platform.core.BlackBoard; import graphtea.ui.UIUtils; import java.awt.*; import java.awt.geom.Rectangle2D; /** * @author azin azadi */ public class RectangularSelect extends AbstractAction { String event = UIUtils.getUIEventKey("rectangular select"); GraphModel g; boolean deleteOlderSelections = true; GraphRectRegionSelect graphRectRegionSelector = new GraphRectRegionSelect(blackboard) { public void onMouseMoved(GraphEvent data) { _onMouseMoved(data); } public void onDrop(GraphEvent data) { _onDrop(data); } }; static BlackBoard gb; public void track(){} /** * constructor * * @param bb the blackboard of the action */ public RectangularSelect(BlackBoard bb) { super(bb); gb = bb; listen4Event(GraphEvent.EVENT_KEY); graphRectRegionSelector.startSelectingRegion(); KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventPostProcessor(e -> { deleteOlderSelections = true; invertOlderSelections = false; if (e.isControlDown()) deleteOlderSelections = false; if (e.isShiftDown()) invertOlderSelections = true; //not yet implemented //todo: implement return false; }); } public void performAction(String eventName, Object value) { // StatusBarMessage.showQuickMessage(blackboard, "press Control for continues selection."); g = blackboard.getData(GraphAttrSet.name); GraphEvent ge = blackboard.getData(GraphEvent.EVENT_KEY); if (ge.eventType == GraphEvent.DRAGGING_STARTED) graphRectRegionSelector.startSelectingRegion(); } void _onMouseMoved(GraphEvent data) { SubGraph selection = RectangularSelect.calculateSelected(g, graphRectRegionSelector.getCurrentRect().getBounds()); if (!deleteOlderSelections) { SubGraph sd = Select.getSelection(blackboard); for (Vertex v : sd.vertices) selection.vertices.add(v); for (Edge e : sd.edges) selection.edges.add(e); } blackboard.setData(Select.EVENT_KEY, selection); } void _onDrop(GraphEvent data) { // if (isEnable()) graphRectRegionSelector.startSelectingRegion(); } boolean invertOlderSelections = false; // public void paint(Graphics p, Component unused) { // //System.out.println(x + " " + y + " " + xx + " " + yy); // p.setColor(black); // p.drawLine(x, y, xx, yy); // } public static SubGraph calculateSelected(GraphModel g, Rectangle bounds) { SubGraph sd = new SubGraph(); for (Vertex vm : g) { GPoint loc = vm.getLocation(); Point cent = vm.getCenter(); if (bounds.contains(loc.x, loc.y)) { sd.vertices.add(vm); } } Edge em; for (Vertex v1 : sd.vertices) { for (Vertex v2 : sd.vertices) { try { Edge edge = g.getEdge(v1, v2); if (edge != null) { sd.edges.add(edge); } } catch (InvalidVertexException e) { } } } // for (Iterator<Edge> ei=gv.edgeIterator();ei.hasNext();){ // em=ei.next(); // if (bounds.contains(em.view.getBounds())) // sd.edges.add(em); // } return sd; } public static boolean isVertexInRect(Vertex v, GraphModel g, Rectangle viewBounds) { GPoint shapeSize = v.getSize(); int w = (int) shapeSize.getX(); int h = (int) shapeSize.getY(); Rectangle2D.Double selBounds = new Rectangle2D.Double(viewBounds.getX(), viewBounds.getY(), viewBounds.width, viewBounds.height); GPoint loc = v.getLocation(); Rectangle2D.Double verBounds = new Rectangle2D.Double(loc.x, loc.y, w, h); return selBounds.contains(verBounds); } }