View Javadoc
1   /*
2   * Copyright (c) 2003, The JUNG Authors 
3   *
4   * All rights reserved.
5   *
6   * This software is open-source under the BSD license; see either
7   * "license.txt" or
8   * https://github.com/jrtom/jung/blob/master/LICENSE for a description.
9   */
10  package edu.uci.ics.jung.visualization;
11  
12  import java.awt.Dimension;
13  import java.awt.event.KeyListener;
14  import java.awt.event.MouseAdapter;
15  import java.awt.event.MouseEvent;
16  import java.awt.event.MouseListener;
17  import java.awt.event.MouseMotionListener;
18  import java.awt.event.MouseWheelListener;
19  import java.awt.geom.Point2D;
20  
21  import javax.swing.ToolTipManager;
22  
23  import com.google.common.base.Function;
24  
25  import edu.uci.ics.jung.algorithms.layout.Layout;
26  import edu.uci.ics.jung.visualization.control.GraphMouseListener;
27  import edu.uci.ics.jung.visualization.control.MouseListenerTranslator;
28  
29  /**
30   * Adds mouse behaviors and tooltips to the graph visualization base class
31   * 
32   * @author Joshua O'Madadhain
33   * @author Tom Nelson 
34   * @author Danyel Fisher
35   */
36  @SuppressWarnings("serial")
37  public class VisualizationViewer<V,E> extends BasicVisualizationServer<V,E> {
38  
39  	protected Function<? super V,String> vertexToolTipTransformer;
40  	protected Function<? super E,String> edgeToolTipTransformer;
41  	protected Function<MouseEvent,String> mouseEventToolTipTransformer;
42  	
43      /**
44       * provides MouseListener, MouseMotionListener, and MouseWheelListener
45       * events to the graph
46       */
47      protected GraphMouse graphMouse;
48      
49      protected MouseListener requestFocusListener = new MouseAdapter() {
50  		public void mouseClicked(MouseEvent e) {
51  			requestFocusInWindow();
52  		}
53      };
54  
55  
56  	public VisualizationViewer(Layout<V,E> layout) {
57  	    this(new DefaultVisualizationModel<V,E>(layout));
58  	}
59  	
60  	public VisualizationViewer(Layout<V,E> layout, Dimension preferredSize) {
61  	    this(new DefaultVisualizationModel<V,E>(layout, preferredSize), preferredSize);
62  	}
63  	
64  	public VisualizationViewer(VisualizationModel<V,E> model) {
65  	    this(model, new Dimension(600,600));
66  	}
67  
68      public VisualizationViewer(VisualizationModel<V,E> model,
69  	        Dimension preferredSize) {
70          super(model, preferredSize);
71  		setFocusable(true);
72          addMouseListener(requestFocusListener);
73  	}
74  	
75  	/**
76  	 * a setter for the GraphMouse. This will remove any
77  	 * previous GraphMouse (including the one that
78  	 * is added in the initMouseClicker method.
79  	 * @param graphMouse new value
80  	 */
81  	public void setGraphMouse(GraphMouse graphMouse) {
82  	    this.graphMouse = graphMouse;
83  	    MouseListener[] ml = getMouseListeners();
84  	    for(int i=0; i<ml.length; i++) {
85  	        if(ml[i] instanceof GraphMouse) {
86  	            removeMouseListener(ml[i]);
87  	        }
88  	    }
89  	    MouseMotionListener[] mml = getMouseMotionListeners();
90  	    for(int i=0; i<mml.length; i++) {
91  	        if(mml[i] instanceof GraphMouse) {
92  	            removeMouseMotionListener(mml[i]);
93  	        }
94  	    }
95  	    MouseWheelListener[] mwl = getMouseWheelListeners();
96  	    for(int i=0; i<mwl.length; i++) {
97  	        if(mwl[i] instanceof GraphMouse) {
98  	            removeMouseWheelListener(mwl[i]);
99  	        }
100 	    }
101 	    addMouseListener(graphMouse);
102 	    addMouseMotionListener(graphMouse);
103 	    addMouseWheelListener(graphMouse);
104 	}
105 	
106 	/**
107 	 * @return the current <code>GraphMouse</code>
108 	 */
109 	public GraphMouse getGraphMouse() {
110 	    return graphMouse;
111 	}
112 
113 	/**
114 	 * This is the interface for adding a mouse listener. The GEL
115 	 * will be called back with mouse clicks on vertices.
116 	 * @param gel the mouse listener to add
117 	 */
118 	public void addGraphMouseListener( GraphMouseListener<V> gel ) {
119 		addMouseListener( new MouseListenerTranslator<V,E>( gel, this ));
120 	}
121 	
122 	/** 
123 	 * Override to request focus on mouse enter, if a key listener is added
124 	 * @see java.awt.Component#addKeyListener(java.awt.event.KeyListener)
125 	 */
126 	@Override
127 	public synchronized void addKeyListener(KeyListener l) {
128 		super.addKeyListener(l);
129 	}
130 	
131 	/**
132 	 * @param edgeToolTipTransformer the edgeToolTipTransformer to set
133 	 */
134 	public void setEdgeToolTipTransformer(
135 			Function<? super E, String> edgeToolTipTransformer) {
136 		this.edgeToolTipTransformer = edgeToolTipTransformer;
137 		ToolTipManager.sharedInstance().registerComponent(this);
138 	}
139 
140 	/**
141 	 * @param mouseEventToolTipTransformer the mouseEventToolTipTransformer to set
142 	 */
143 	public void setMouseEventToolTipTransformer(
144 			Function<MouseEvent, String> mouseEventToolTipTransformer) {
145 		this.mouseEventToolTipTransformer = mouseEventToolTipTransformer;
146 		ToolTipManager.sharedInstance().registerComponent(this);
147 	}
148 
149 	/**
150 	 * @param vertexToolTipTransformer the vertexToolTipTransformer to set
151 	 */
152 	public void setVertexToolTipTransformer(
153 			Function<? super V, String> vertexToolTipTransformer) {
154 		this.vertexToolTipTransformer = vertexToolTipTransformer;
155 		ToolTipManager.sharedInstance().registerComponent(this);
156 	}
157 
158     /**
159      * called by the superclass to display tooltips
160      */
161     public String getToolTipText(MouseEvent event) {
162         Layout<V,E> layout = getGraphLayout();
163         Point2D p = null;
164         if(vertexToolTipTransformer != null) {
165             p = event.getPoint();
166             	//renderContext.getBasicTransformer().inverseViewTransform(event.getPoint());
167             V vertex = getPickSupport().getVertex(layout, p.getX(), p.getY());
168             if(vertex != null) {
169             	return vertexToolTipTransformer.apply(vertex);
170             }
171         }
172         if(edgeToolTipTransformer != null) {
173         	if(p == null) p = renderContext.getMultiLayerTransformer().inverseTransform(Layer.VIEW, event.getPoint());
174             E edge = getPickSupport().getEdge(layout, p.getX(), p.getY());
175             if(edge != null) {
176             	return edgeToolTipTransformer.apply(edge);
177             }
178         }
179         if(mouseEventToolTipTransformer != null) {
180         	return mouseEventToolTipTransformer.apply(event);
181         }
182         return super.getToolTipText(event);
183     }
184 
185     /**
186      * a convenience type to represent a class that
187      * processes all types of mouse events for the graph
188      */
189     public interface GraphMouse extends MouseListener, MouseMotionListener, MouseWheelListener {}
190     
191 }