1   /****************************************************************************
2    **
3    ** This file is part of yFiles-2.6. 
4    ** 
5    ** yWorks proprietary/confidential. Use is subject to license terms.
6    **
7    ** Redistribution of this file or of an unauthorized byte-code version
8    ** of this file is strictly forbidden.
9    **
10   ** Copyright (c) 2000-2008 by yWorks GmbH, Vor dem Kreuzberg 28, 
11   ** 72070 Tuebingen, Germany. All rights reserved.
12   **
13   ***************************************************************************/
14  package demo.view.layout.labeling;
15  
16  import demo.view.DemoBase;
17  import y.base.Edge;
18  import y.base.EdgeCursor;
19  import y.base.Node;
20  import y.base.NodeCursor;
21  import y.layout.labeling.GreedyMISLabeling;
22  import y.option.MappedListCellRenderer;
23  import y.option.OptionHandler;
24  import y.view.DefaultBackgroundRenderer;
25  import y.view.EdgeLabel;
26  import y.view.EdgeRealizer;
27  import y.view.EditMode;
28  import y.view.Graph2D;
29  import y.view.NodeLabel;
30  import y.view.NodeRealizer;
31  import y.view.PopupMode;
32  import y.view.ShapeNodeRealizer;
33  import y.view.YLabel;
34  
35  import javax.swing.AbstractAction;
36  import javax.swing.JPopupMenu;
37  import javax.swing.JToolBar;
38  import java.awt.Color;
39  import java.awt.Dimension;
40  import java.awt.event.ActionEvent;
41  import java.net.URL;
42  import java.util.Map;
43  
44  /**
45   * Demonstrates basic labeling features.
46   * <br>
47   * It is shown:
48   * <ul>
49   * <li>how to start a labeling algorithm</li>
50   * <li>how to create and manipulate labels</li>
51   * <li>how to assign a label model to a label</li>
52   * <li>how a labeling position can be changed interactively</li>
53   * </ul>
54   *
55   */
56  public class LabelingDemo extends DemoBase {
57    private byte edgeLabelModel = EdgeLabel.SIX_POS;
58    private byte nodeLabelModel = NodeLabel.SANDWICH;
59  
60    public LabelingDemo() {
61      DefaultBackgroundRenderer renderer = new DefaultBackgroundRenderer( view );
62  
63      URL bgImage = getClass().getResource( "resource/usamap.gif" );
64      renderer.setImageResource( bgImage );
65      renderer.setMode( DefaultBackgroundRenderer.DYNAMIC );
66      renderer.setColor( Color.white );
67      view.setBackgroundRenderer( renderer );
68      view.setPreferredSize( new Dimension( 650, 400 ) );
69      view.setWorldRect( 0, 0, 650, 400 );
70  
71      // use thicker edges 
72      // EdgeRealizer er = view.getGraph2D().getDefaultEdgeRealizer();
73      // er.setLineType(LineType.LINE_2);
74  
75      ShapeNodeRealizer defaultNode =
76          new ShapeNodeRealizer( ShapeNodeRealizer.ELLIPSE );
77      defaultNode.setSize( 7, 7 );
78      defaultNode.setFillColor( Color.black );
79      defaultNode.getLabel().setModel( nodeLabelModel );
80      view.getGraph2D().setDefaultNodeRealizer( defaultNode );
81      createExample();
82    }
83  
84    protected void registerViewModes() {
85      //add a popup view mode that listens to the right mouse click
86      //and displays context sensitive menus
87      EditMode mode = new EditMode();
88      mode.setPopupMode( new DemoPopupMode() );
89      view.addViewMode( mode );
90    }
91  
92    protected JToolBar createToolBar() {
93      JToolBar bar = super.createToolBar();
94      bar.addSeparator();
95      bar.add( new ChangeLabelModel() );
96      return bar;
97    }
98  
99    class DemoPopupMode extends PopupMode {
100     /**
101      * Popup menu for a hit node
102      */
103     public JPopupMenu getNodePopup( Node v ) {
104       JPopupMenu pm = new JPopupMenu();
105       NodeRealizer r = this.view.getGraph2D().getRealizer( v );
106       YLabel label = r.getLabel();
107       pm.add( new EditLabel( label ) );
108       return pm;
109     }
110 
111     /**
112      * Popup menu for a hit node
113      */
114     public JPopupMenu getEdgePopup( Edge e ) {
115       JPopupMenu pm = new JPopupMenu();
116       pm.add( new AddEdgeLabel( e ) );
117       return pm;
118     }
119 
120     public JPopupMenu getEdgeLabelPopup( EdgeLabel el ) {
121       JPopupMenu pm = new JPopupMenu();
122       pm.add( new EditLabel( el ) );
123       return pm;
124     }
125   }
126 
127 
128   /**
129    * Action that opens a text editor for the label of a node
130    */
131   class EditLabel extends AbstractAction {
132     YLabel label;
133 
134     EditLabel( YLabel l ) {
135       super( "Edit Label" );
136       label = l;
137     }
138 
139     public void actionPerformed( ActionEvent e ) {
140       view.openLabelEditor( label,
141           label.getLocation().getX(),
142           label.getLocation().getY() );
143     }
144   }
145 
146   public class AddEdgeLabel extends AbstractAction {
147     Edge edge;
148 
149     public AddEdgeLabel( Edge e ) {
150       super( "Add Label" );
151       edge = e;
152     }
153 
154     public void actionPerformed( ActionEvent e ) {
155       if ( edge != null ) {
156         Graph2D g = view.getGraph2D();
157         EdgeRealizer er = g.getRealizer( edge );
158         EdgeLabel label = new EdgeLabel( "Route" );
159         er.addLabel( label );
160         g.updateViews();
161         //label.setModel(edgeLabelModel); // a valid option!
162       }
163     }
164   }
165 
166   /**
167    * Change label model model and apply new labeling
168    */
169   public class ChangeLabelModel extends AbstractAction {
170     OptionHandler op;
171 
172     ChangeLabelModel() {
173       super( "Change Label Model" );
174     }
175 
176     public void actionPerformed( ActionEvent e ) {
177       if ( op == null ) {
178         op = new OptionHandler( "Label Model" );
179         Map m1 = NodeLabel.modelToStringMap();
180         Map m2 = EdgeLabel.modelToStringMap();
181         op.addEnum( "Node Label Model",
182             m1.keySet().toArray(), new Byte( nodeLabelModel ),
183             new MappedListCellRenderer( m1 ) );
184         op.addEnum( "Edge Label Model",
185             m2.keySet().toArray(), new Byte( edgeLabelModel ),
186             new MappedListCellRenderer( m2 ) );
187       }
188 
189       if ( op.showEditor() ) {
190         byte model1 = ( ( ( Byte ) op.get( "Node Label Model" ) ).byteValue() );
191         for ( NodeCursor nc = view.getGraph2D().nodes(); nc.ok(); nc.next() ) {
192           view.getGraph2D().getRealizer( nc.node() ).getLabel().setModel( model1 );
193         }
194         nodeLabelModel = model1;
195         byte model2 = ( ( ( Byte ) op.get( "Edge Label Model" ) ).byteValue() );
196         for ( EdgeCursor ec = view.getGraph2D().edges(); ec.ok(); ec.next() ) {
197           EdgeRealizer er = view.getGraph2D().getRealizer( ec.edge() );
198           for ( int i = 0; i < er.labelCount(); i++ ) {
199             er.getLabel( i ).setModel( model2 );
200           }
201         }
202         edgeLabelModel = model2;
203       }
204       //now do actual labeling
205       // Here you may choose another labeling algorithm, i.e. SALabling
206       GreedyMISLabeling labeling = new GreedyMISLabeling();
207 
208       // use:
209       // labeling.setPlaceNodeLabels(true);
210       // labeling.setPlaceEdgeLabels(false);
211       // to label only nodes.
212       labeling.label( view.getGraph2D() );
213       view.updateView();
214     }
215   }
216 
217 
218   public void createExample() {
219     Graph2D graph = view.getGraph2D();
220     graph.clear();
221     Node n1 = graph.createNode();
222     graph.setCenter( n1, 100, 90 );
223     graph.setLabelText( n1, "City 1" );
224     Node n2 = graph.createNode();
225     graph.setCenter( n2, 150, 200 );
226     graph.setLabelText( n2, "City 2" );
227     Node n3 = graph.createNode();
228     graph.setCenter( n3, 250, 260 );
229     graph.setLabelText( n3, "City 3" );
230     Node n4 = graph.createNode();
231     graph.setCenter( n4, 300, 45 );
232     graph.setLabelText( n4, "City 4" );
233     Node n5 = graph.createNode();
234     graph.setCenter( n5, 500, 300 );
235     graph.setLabelText( n5, "City 5" );
236     Node n6 = graph.createNode();
237     graph.setCenter( n6, 50, 150 );
238     graph.setLabelText( n6, "City 6" );
239     Node n7 = graph.createNode();
240     graph.setCenter( n7, 45, 135 );
241     graph.setLabelText( n7, "City 7" );
242     Node n8 = graph.createNode();
243     graph.setCenter( n8, 55, 165 );
244     graph.setLabelText( n8, "City 8" );
245     Node n9 = graph.createNode();
246     graph.setCenter( n9, 620, 50 );
247     graph.setLabelText( n9, "City 9" );
248     Node n10 = graph.createNode();
249     graph.setCenter( n10, 450, 150 );
250     graph.setLabelText( n10, "City 10" );
251     Node n11 = graph.createNode();
252     graph.setCenter( n11, 270, 180 );
253     graph.setLabelText( n11, "City 11" );
254     Node n12 = graph.createNode();
255     graph.setCenter( n12, 580, 100 );
256     graph.setLabelText( n12, "City 12" );
257     //
258     Edge e1 = graph.createEdge( n6, n7 );
259     Edge e2 = graph.createEdge( n7, n8 );
260     Edge e3 = graph.createEdge( n1, n2 );
261     graph.getRealizer( e3 ).addLabel( new EdgeLabel( "Route 1" ) );
262     Edge e4 = graph.createEdge( n2, n3 );
263     graph.getRealizer( e4 ).addLabel( new EdgeLabel( "Route 2" ) );
264     Edge e5 = graph.createEdge( n1, n6 );
265     Edge e6 = graph.createEdge( n2, n8 );
266     Edge e7 = graph.createEdge( n3, n5 );
267     Edge e8 = graph.createEdge( n9, n10 );
268     Edge e9 = graph.createEdge( n11, n10 );
269     Edge e10 = graph.createEdge( n11, n3 );
270     graph.getRealizer( e10 ).addLabel( new EdgeLabel( "Route 3" ) );
271     graph.getRealizer( e10 ).addLabel( new EdgeLabel( "Out of order !" ) );
272     Edge e11 = graph.createEdge( n1, n4 );
273     Edge e12 = graph.createEdge( n11, n4 );
274     Edge e13 = graph.createEdge( n10, n4 );
275     Edge e14 = graph.createEdge( n10, n5 );
276     Edge e15 = graph.createEdge( n12, n5 );
277     Edge e16 = graph.createEdge( n9, n12 );
278   }
279 
280 
281   public static void main( String args[] ) {
282     LabelingDemo demo = new LabelingDemo();
283     demo.start( "Labeling Demo" );
284   }
285 }
286 
287 
288       
289