/* * Author: tdanford * Date: May 27, 2008 */ package org.seqcode.viz.graphs; import java.util.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import org.seqcode.viz.utils.FileChooser; import java.io.*; public class InteractiveGraphPanel extends JPanel { private GraphView view; private GraphPaintable gp; private NodeView selectedNode; private Vector<NodeView> highlightedNodes; private Boolean displayPath=false; public InteractiveGraphPanel(GraphView v) { super(); view = v; gp = new GraphPaintable(view); selectedNode = null; highlightedNodes = new Vector<NodeView>(); addMouseMotionListener(new MouseMotionAdapter() { public void mouseDragged(MouseEvent arg0) { moved(arg0); } }); addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { clicked(e); } public void mousePressed(MouseEvent arg0) { pressed(arg0); } public void mouseReleased(MouseEvent arg0) { released(arg0); } }); } public void saveImage() { FileChooser chooser = new FileChooser(null); int w = getWidth(), h = getHeight(); File f = chooser.chooseSave(); try { gp.saveImage(f, w, h, true); } catch (IOException e) { e.printStackTrace(); } } public void createNode() { Random r = new Random(); NodeView nv = view.createNode(); nv.setX(r.nextInt(getWidth())); nv.setY(r.nextInt(getHeight())); repaint(); } public void createText() { Random r = new Random(); TextView tv = view.createText(); tv.setX(r.nextInt(getWidth())); tv.setY(r.nextInt(getHeight())); repaint(); } public void createHighlightedEdges() { for(int i = 0; i < highlightedNodes.size(); i++) { NodeView nv1 = highlightedNodes.get(i); for(int j = i + 1; j < highlightedNodes.size(); j++) { NodeView nv2 = highlightedNodes.get(j); EdgeView ev = view.createEdge(nv1, nv2); ev.setDirected(true); } } if(highlightedNodes.size() > 0) { repaint(); } } public void twistSelfEdge() { for(int i = 0; i < highlightedNodes.size(); i++) { NodeView nv = highlightedNodes.get(i); for(int e=0; e<nv.getNumEdges(); e++){ EdgeView ev =nv.getEdge(e); if(ev.containsOption("self") && (Boolean)ev.getOption("self")==true){ ev.twistSelfEdge(Math.PI/4); } } } if(highlightedNodes.size() > 0) { repaint(); } } private void clicked(MouseEvent e) { if(e.getButton() == MouseEvent.BUTTON3) { if(e.getClickCount() == 1) { NodeView nv = view.findTopNode(e.getX(), e.getY()); //if(nv != null && !highlightedNodes.contains(nv)) { if(nv != null) { highlightedNodes.add(nv); repaint(); } } else if (e.getClickCount() == 2) { highlightedNodes.clear(); repaint(); } } } private void pressed(MouseEvent e) { if(e.getButton() == MouseEvent.BUTTON1) { int x = e.getX(), y = e.getY(); selectedNode = view.findTopNode(x, y); } } private void released(MouseEvent e) { if(e.getButton() == MouseEvent.BUTTON1) { selectedNode = null; } } private void moved(MouseEvent e) { if(selectedNode != null) { selectedNode.setX(e.getX()); selectedNode.setY(e.getY()); for(int i = 0; i < selectedNode.getNumEdges(); i++) { selectedNode.getEdge(i).clearDynamicAttributes(); } for(int i = 0; i < selectedNode.getNumIncomingEdges(); i++) { selectedNode.getIncomingEdge(i).clearDynamicAttributes(); } repaint(); } } public void paintComponent(Graphics g) { super.paintComponent(g); gp.paintItem(g, 0, 0, getWidth(), getHeight()); for(NodeView nv : highlightedNodes) { gp.paintHightlightedNode(g, nv); } } public Vector<NodeView> getHighlightedNodes(){return highlightedNodes;} public void unHighlight(){highlightedNodes.clear();} public void setDisplayPath(Boolean dp){displayPath=dp;} public NodeView getTopNode(int x, int y) { return view.findTopNode(x, y); } }