View Javadoc
1   /*
2    * Copyright (c) 2003, The JUNG Authors
3    * All rights reserved.
4    * 
5    * This software is open-source under the BSD license; see either "license.txt"
6    * or https://github.com/jrtom/jung/blob/master/LICENSE for a description.
7    * 
8    */
9   package edu.uci.ics.jung.samples;
10  
11  import java.awt.BorderLayout;
12  import java.awt.Color;
13  import java.awt.Container;
14  import java.awt.event.ActionEvent;
15  import java.awt.event.ActionListener;
16  import java.awt.event.ItemEvent;
17  import java.awt.event.ItemListener;
18  import java.util.HashMap;
19  import java.util.Map;
20  
21  import javax.swing.Icon;
22  import javax.swing.ImageIcon;
23  import javax.swing.JButton;
24  import javax.swing.JCheckBox;
25  import javax.swing.JFrame;
26  import javax.swing.JPanel;
27  
28  import com.google.common.base.Function;
29  import com.google.common.base.Functions;
30  
31  import edu.uci.ics.jung.algorithms.layout.FRLayout;
32  import edu.uci.ics.jung.graph.DirectedSparseGraph;
33  import edu.uci.ics.jung.graph.Graph;
34  import edu.uci.ics.jung.graph.util.EdgeType;
35  import edu.uci.ics.jung.visualization.GraphZoomScrollPane;
36  import edu.uci.ics.jung.visualization.VisualizationViewer;
37  import edu.uci.ics.jung.visualization.control.CrossoverScalingControl;
38  import edu.uci.ics.jung.visualization.control.DefaultModalGraphMouse;
39  import edu.uci.ics.jung.visualization.control.ScalingControl;
40  import edu.uci.ics.jung.visualization.decorators.EllipseVertexShapeTransformer;
41  import edu.uci.ics.jung.visualization.decorators.PickableEdgePaintTransformer;
42  import edu.uci.ics.jung.visualization.decorators.PickableVertexPaintTransformer;
43  import edu.uci.ics.jung.visualization.decorators.ToStringLabeller;
44  import edu.uci.ics.jung.visualization.decorators.VertexIconShapeTransformer;
45  import edu.uci.ics.jung.visualization.renderers.DefaultEdgeLabelRenderer;
46  import edu.uci.ics.jung.visualization.renderers.DefaultVertexLabelRenderer;
47  
48  /**
49   * A demo that shows flag images as vertices, and uses unicode
50   * to render vertex labels.
51   * 
52   * @author Tom Nelson 
53   * 
54   */
55  public class UnicodeLabelDemo {
56  
57      /**
58       * the graph
59       */
60      Graph<Integer,Number> graph;
61  
62      /**
63       * the visual component and renderer for the graph
64       */
65      VisualizationViewer<Integer,Number> vv;
66      
67      boolean showLabels;
68      
69      public UnicodeLabelDemo() {
70          
71          // create a simple graph for the demo
72          graph = new DirectedSparseGraph<Integer,Number>();
73          Integer[] v = createVertices(10);
74          createEdges(v);
75          Map<Integer, Icon> iconMap = new HashMap<Integer, Icon>();
76          
77          vv =  new VisualizationViewer<Integer,Number>(new FRLayout<Integer,Number>(graph));
78          vv.getRenderContext().setVertexLabelTransformer(new UnicodeVertexStringer<Integer>(v));
79          vv.getRenderContext().setVertexLabelRenderer(new DefaultVertexLabelRenderer(Color.cyan));
80          vv.getRenderContext().setEdgeLabelRenderer(new DefaultEdgeLabelRenderer(Color.cyan));
81          VertexIconShapeTransformer<Integer> vertexIconShapeFunction =
82              new VertexIconShapeTransformer<Integer>(new EllipseVertexShapeTransformer<Integer>());
83          Function<Integer, Icon> vertexIconFunction = Functions.forMap(iconMap);
84          vv.getRenderContext().setVertexShapeTransformer(vertexIconShapeFunction);
85          vv.getRenderContext().setVertexIconTransformer(vertexIconFunction);
86          loadImages(v, iconMap);
87          vertexIconShapeFunction.setIconMap(iconMap);
88          vv.getRenderContext().setVertexFillPaintTransformer(new PickableVertexPaintTransformer<Integer>(vv.getPickedVertexState(), Color.white,  Color.yellow));
89          vv.getRenderContext().setEdgeDrawPaintTransformer(new PickableEdgePaintTransformer<Number>(vv.getPickedEdgeState(), Color.black, Color.lightGray));
90  
91          vv.setBackground(Color.white);
92  
93          // add my listener for ToolTips
94          vv.setVertexToolTipTransformer(new ToStringLabeller());
95          
96          // create a frome to hold the graph
97          final JFrame frame = new JFrame();
98          Container content = frame.getContentPane();
99          final GraphZoomScrollPane panel = new GraphZoomScrollPane(vv);
100         content.add(panel);
101         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
102         
103         final DefaultModalGraphMouse<Integer, Number> gm
104         	= new DefaultModalGraphMouse<Integer,Number>();
105         vv.setGraphMouse(gm);
106         
107         final ScalingControl scaler = new CrossoverScalingControl();
108 
109         JButton plus = new JButton("+");
110         plus.addActionListener(new ActionListener() {
111             public void actionPerformed(ActionEvent e) {
112                 scaler.scale(vv, 1.1f, vv.getCenter());
113             }
114         });
115         JButton minus = new JButton("-");
116         minus.addActionListener(new ActionListener() {
117             public void actionPerformed(ActionEvent e) {
118                 scaler.scale(vv, 1/1.1f, vv.getCenter());
119             }
120         });
121 
122         JCheckBox lo = new JCheckBox("Show Labels");
123         lo.addItemListener(new ItemListener(){
124             public void itemStateChanged(ItemEvent e) {
125                 showLabels = e.getStateChange() == ItemEvent.SELECTED;
126                 vv.repaint();
127             }
128         });
129         lo.setSelected(true);
130         
131         JPanel controls = new JPanel();
132         controls.add(plus);
133         controls.add(minus);
134         controls.add(lo);
135         controls.add(gm.getModeComboBox());
136         content.add(controls, BorderLayout.SOUTH);
137 
138         frame.pack();
139         frame.setVisible(true);
140     }
141     
142     
143     class UnicodeVertexStringer<V> implements Function<V,String> {
144 
145         Map<V,String> map = new HashMap<V,String>();
146         Map<V,Icon> iconMap = new HashMap<V,Icon>();
147         String[] labels = {
148                 "\u0057\u0065\u006C\u0063\u006F\u006D\u0065\u0020\u0074\u006F\u0020JUNG\u0021",               
149                 "\u6B22\u8FCE\u4F7F\u7528\u0020\u0020JUNG\u0021",
150                 "\u0414\u043E\u0431\u0440\u043E\u0020\u043F\u043E\u0436\u0430\u043B\u043E\u0432\u0430\u0422\u044A\u0020\u0432\u0020JUNG\u0021",
151                 "\u0042\u0069\u0065\u006E\u0076\u0065\u006E\u0075\u0065\u0020\u0061\u0075\u0020JUNG\u0021",
152                 "\u0057\u0069\u006C\u006B\u006F\u006D\u006D\u0065\u006E\u0020\u007A\u0075\u0020JUNG\u0021",
153                 "JUNG\u3078\u3087\u3045\u3053\u305D\u0021",
154 //                "\u0053\u00E9\u006A\u0061\u0020\u0042\u0065\u006D\u0076\u0069\u006E\u0064\u006F\u0020JUNG\u0021",
155                "\u0042\u0069\u0065\u006E\u0076\u0065\u006E\u0069\u0064\u0061\u0020\u0061\u0020JUNG\u0021"
156         };
157         
158         public UnicodeVertexStringer(V[] vertices) {
159             for(int i=0; i<vertices.length; i++) {
160                 map.put(vertices[i], labels[i%labels.length]);
161             }
162         }
163         
164         /**
165          * @see edu.uci.ics.jung.graph.decorators.VertexStringer#getLabel(edu.uci.ics.jung.graph.Vertex)
166          */
167         public String getLabel(V v) {
168             if(showLabels) {
169                 return (String)map.get(v);
170             } else {
171                 return "";
172             }
173         }
174         
175 		public String apply(V input) {
176 			return getLabel(input);
177 		}
178     }
179     
180     /**
181      * create some vertices
182      * @param count how many to create
183      * @return the Vertices in an array
184      */
185     private Integer[] createVertices(int count) {
186         Integer[] v = new Integer[count];
187         for (int i = 0; i < count; i++) {
188             v[i] = new Integer(i);
189             graph.addVertex(v[i]);
190         }
191         return v;
192     }
193 
194     /**
195      * create edges for this demo graph
196      * @param v an array of Vertices to connect
197      */
198     void createEdges(Integer[] v) {
199         graph.addEdge(new Double(Math.random()), v[0], v[1], EdgeType.DIRECTED);
200         graph.addEdge(new Double(Math.random()), v[0], v[3], EdgeType.DIRECTED);
201         graph.addEdge(new Double(Math.random()), v[0], v[4], EdgeType.DIRECTED);
202         graph.addEdge(new Double(Math.random()), v[4], v[5], EdgeType.DIRECTED);
203         graph.addEdge(new Double(Math.random()), v[3], v[5], EdgeType.DIRECTED);
204         graph.addEdge(new Double(Math.random()), v[1], v[2], EdgeType.DIRECTED);
205         graph.addEdge(new Double(Math.random()), v[1], v[4], EdgeType.DIRECTED);
206         graph.addEdge(new Double(Math.random()), v[8], v[2], EdgeType.DIRECTED);
207         graph.addEdge(new Double(Math.random()), v[3], v[8], EdgeType.DIRECTED);
208         graph.addEdge(new Double(Math.random()), v[6], v[7], EdgeType.DIRECTED);
209         graph.addEdge(new Double(Math.random()), v[7], v[5], EdgeType.DIRECTED);
210         graph.addEdge(new Double(Math.random()), v[0], v[9], EdgeType.DIRECTED);
211         graph.addEdge(new Double(Math.random()), v[9], v[8], EdgeType.DIRECTED);
212         graph.addEdge(new Double(Math.random()), v[7], v[6], EdgeType.DIRECTED);
213         graph.addEdge(new Double(Math.random()), v[6], v[5], EdgeType.DIRECTED);
214         graph.addEdge(new Double(Math.random()), v[4], v[2], EdgeType.DIRECTED);
215         graph.addEdge(new Double(Math.random()), v[5], v[4], EdgeType.DIRECTED);
216     }
217 
218     protected void loadImages(Integer[] vertices, Map<Integer,Icon> imageMap) {
219         
220         ImageIcon[] icons = null;
221         try {
222             icons = new ImageIcon[] {
223                     new ImageIcon(getClass().getResource("/images/united-states.gif")),
224                     new ImageIcon(getClass().getResource("/images/china.gif")),
225                     new ImageIcon(getClass().getResource("/images/russia.gif")),
226                     new ImageIcon(getClass().getResource("/images/france.gif")),
227                     new ImageIcon(getClass().getResource("/images/germany.gif")),
228                     new ImageIcon(getClass().getResource("/images/japan.gif")),
229                     new ImageIcon(getClass().getResource("/images/spain.gif"))
230             };
231         } catch(Exception ex) {
232             System.err.println("You need flags.jar in your classpath to see the flag icons.");
233         }
234         for(int i=0; icons != null && i<vertices.length; i++) {
235             imageMap.put(vertices[i],icons[i%icons.length]);
236         }
237     }
238 
239     public static void main(String[] args) 
240     {
241         new UnicodeLabelDemo();
242     }
243 }