// 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 Lesser General Public License (LGPL): http://www.gnu.org/licenses/ package graphtea.plugins.visualization; import graphtea.graph.event.GraphEvent; import graphtea.graph.graph.Edge; import graphtea.graph.graph.GraphModel; import graphtea.graph.graph.GPoint; import graphtea.graph.graph.Vertex; import graphtea.graph.ui.GTabbedGraphPane; import graphtea.platform.core.BlackBoard; import graphtea.platform.core.Listener; import graphtea.platform.parameter.Parameter; import graphtea.platform.parameter.Parametrizable; import graphtea.plugins.main.GraphData; import graphtea.plugins.main.extension.GraphActionExtension; import java.awt.*; import java.awt.image.BufferedImage; /** * @author Ricado Nussbaum */ public class LocalityLens implements GraphActionExtension, Parametrizable { @Parameter(name = "Locality Lenses", description = "locality lenses") public boolean active = false; public String getName() { return "Locality Lens"; } public String getDescription() { return "Locality Lens"; } public void action(GraphData graphData) { if (active) { int x = (int) graphData.getGraph().getVertex(0).getSize().getX() + 20; int y = (int) graphData.getGraph().getVertex(0).getSize().getY() + 20; BufferedImage bi = new BufferedImage(x,y, BufferedImage.TYPE_INT_ARGB); Graphics g = bi.getGraphics(); g.setColor(Color.blue); g.drawOval(0,0,x,y); GTabbedGraphPane.getCurrentGTabbedGraphPane(graphData.getBlackboard()) .getComponent(graphData.getBlackboard()).setCursor(Toolkit.getDefaultToolkit() .createCustomCursor(bi, new Point(x/2,y/2), Color.blue + " Circle")); graphData.getBlackboard().addListener(GraphEvent.EVENT_KEY, new MouseEventListener(graphData.getBlackboard(), graphData.getGraph())); }else{ GTabbedGraphPane.getCurrentGTabbedGraphPane(graphData.getBlackboard()) .getComponent(graphData.getBlackboard()).setCursor(Cursor.getDefaultCursor()); graphData.getBlackboard().getListeners(GraphEvent.EVENT_KEY).clear(); for(Edge e : graphData.getGraph().getEdges()) e.setColor(0); } } @Override public String getCategory() { return null; } @Override public String checkParameters() { return null; } } class MouseEventListener implements Listener { BlackBoard bb; GraphModel g; public MouseEventListener(BlackBoard bb, GraphModel g) {this.bb=bb;this.g=g;} public Vertex getEnteredVertex(GPoint gp) { for(Vertex v : g) { if(v.getLocation().distance(gp) < v.getSize().norm()/3) return v; } return null; } @Override public void keyChanged(String key, Object Value) { if (key.equals(GraphEvent.EVENT_KEY)) { GraphEvent ge = bb.getData(GraphEvent.EVENT_KEY); if (ge.eventType == GraphEvent.MOUSE_MOVED) { Vertex v = getEnteredVertex(ge.mousePos); if (v != null) { for(Edge e : g.getEdges()) e.setColor(-921360); for(Vertex n : g.directNeighbors(v)) g.getEdge(n,v).setColor(3); } else{ for(Edge e : g.getEdges()) e.setColor(0); } } } } }