1
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
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
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 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
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
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
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 }
163 }
164 }
165
166
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 GreedyMISLabeling labeling = new GreedyMISLabeling();
207
208 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 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