root/trunk/MapEditor.java

Revision 3, 13.1 kB (checked in by dpaola2, 4 years ago)

old pathways project added

Line 
1
2 import java.awt.*;
3 import java.awt.event.*;
4 import java.awt.geom.*;
5 import javax.swing.event.*;
6 import java.util.*;
7 import javax.swing.*;
8 import java.io.*;
9
10 class MapEditor implements ActionListener, PointListener, ChangeListener {
11
12         JGraphViewer graphViewer;
13         JMenuBar menuBar;
14         JMenu fileMenu, modeMenu, mapsMenu, miscMenu;
15        
16         JMenuItem openMenuItem, saveAsMenuItem;
17         JMenuItem makeCampusMapsMenuItem, makeSiebelMapsMenuItem, switchMapMenuItem, populateBusNodesItem;
18        
19         JRadioButtonMenuItem addNodesMode, addEdgesMode, deleteMode, chainMode, identifyMode;
20         JRadioButtonMenuItem physicalMode, buildingMode;
21        
22         ButtonGroup modeGroup, typeGroup;
23        
24         JFileChooser fileChooser;
25         JSlider slider;
26         JFrame frame;
27         Graph graph;
28
29         int mapIndex = 0;
30
31         MapEditor(String args[]) {
32                 graph = new Graph();
33                 graphViewer = new JGraphViewer(graph, 1/1.31, 1/1.31, null);
34                 graphViewer.addPointListener(this);
35                 graphViewer.setBackground(Color.BLACK);
36                 graphViewer.setDefaultNodePainter(new PhysicalNodePainter(Color.RED, 5));
37                 graphViewer.setDefaultEdgePainter(new PhysicalEdgePainter(Color.BLUE, 4));
38                 graphViewer.setSelectedNodePainter(new PhysicalNodePainter(Color.GREEN, 7));
39                 graphViewer.setSelectedEdgePainter(new PhysicalEdgePainter(Color.GREEN, 7));
40
41
42
43                 frame = new JFrame("Pathways Map Editor");
44
45                 menuBar = new JMenuBar();
46
47                 fileMenu = new JMenu("File");
48                 menuBar.add(fileMenu);
49
50                 modeMenu = new JMenu("Mode");
51                 menuBar.add(modeMenu);
52                
53                 mapsMenu = new JMenu("Maps");
54                 menuBar.add(mapsMenu);
55                                
56                 miscMenu = new JMenu("Misc");
57                 menuBar.add(miscMenu);
58
59                 openMenuItem = new JMenuItem("Open...");
60                 openMenuItem.setActionCommand("open");
61                 openMenuItem.addActionListener(this);
62                 fileMenu.add(openMenuItem);
63
64                 saveAsMenuItem = new JMenuItem("Save as...");
65                 saveAsMenuItem.setActionCommand("saveAs");
66                 saveAsMenuItem.addActionListener(this);
67                 fileMenu.add(saveAsMenuItem);
68
69                 modeGroup = new ButtonGroup();
70
71                 addNodesMode = new JRadioButtonMenuItem("Add nodes", true);
72                 modeGroup.add(addNodesMode);
73                 modeMenu.add(addNodesMode);
74
75                 addEdgesMode = new JRadioButtonMenuItem("Add edges", false);
76                 modeGroup.add(addEdgesMode);
77                 modeMenu.add(addEdgesMode);
78
79                 deleteMode = new JRadioButtonMenuItem("Delete stuff", false);
80                 modeGroup.add(deleteMode);
81                 modeMenu.add(deleteMode);
82
83                 chainMode = new JRadioButtonMenuItem("Chain", false);
84                 modeGroup.add(chainMode);
85                 modeMenu.add(chainMode);
86
87                 identifyMode = new JRadioButtonMenuItem("Identify", false);
88                 modeGroup.add(identifyMode);
89                 modeMenu.add(identifyMode);
90
91                 modeMenu.addSeparator();
92                
93                 typeGroup = new ButtonGroup();
94                
95                 physicalMode = new JRadioButtonMenuItem("PhysicalNodes and PhysicalEdges", true);
96                 typeGroup.add(physicalMode);
97                 modeMenu.add(physicalMode);
98
99                 buildingMode = new JRadioButtonMenuItem("RoomNodes and HallEdges", false);
100                 typeGroup.add(buildingMode);
101                 modeMenu.add(buildingMode);             
102                
103                 switchMapMenuItem = new JMenuItem("Switch map");
104                 switchMapMenuItem.setActionCommand("switchMap");
105                 switchMapMenuItem.addActionListener(this);
106                 mapsMenu.add(switchMapMenuItem);
107                
108                 makeCampusMapsMenuItem = new JMenuItem("Make campus maps");
109                 makeCampusMapsMenuItem.setActionCommand("makeCampusMaps");
110                 makeCampusMapsMenuItem.addActionListener(this);
111                 miscMenu.add(makeCampusMapsMenuItem);
112                
113                 makeSiebelMapsMenuItem = new JMenuItem("Make Siebel maps");
114                 makeSiebelMapsMenuItem.setActionCommand("makeSiebelMaps");
115                 makeSiebelMapsMenuItem.addActionListener(this);
116                 miscMenu.add(makeSiebelMapsMenuItem);
117                
118                 populateBusNodesItem = new JMenuItem("Populate Bus Nodes");
119                 populateBusNodesItem.setActionCommand("populateBusNodes");
120                 populateBusNodesItem.addActionListener(this);
121                 miscMenu.add(populateBusNodesItem);
122
123                 Dictionary sliderLabels = new Hashtable();
124                 sliderLabels.put(new Integer(0), new JLabel("Fit"));
125                 sliderLabels.put(new Integer(100), new JLabel("1X"));
126                 sliderLabels.put(new Integer(200), new JLabel("2X"));
127                 sliderLabels.put(new Integer(300), new JLabel("3X"));
128                 sliderLabels.put(new Integer(400), new JLabel("4X"));
129
130                 slider = new JSlider(0, 400, 100);
131                 slider.addChangeListener(this);
132                 slider.setLabelTable(sliderLabels);
133                 slider.setPaintLabels(true);
134
135                 fileChooser = new JFileChooser();
136
137                 frame.setJMenuBar(menuBar);
138
139                 Container contentPane = frame.getContentPane();
140                 contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.PAGE_AXIS));
141                 contentPane.add(graphViewer);
142                 contentPane.add(slider);
143
144                 if(args.length > 0) {
145                         try {
146                                 graph = Graph.loadFromFile(args[0]);
147                                 graphViewer.setGraph(graph);
148                                 mapIndex = -1;
149                                 switchMap();
150                         } catch(Exception e) {
151                                 System.out.println("Error while loading: " + e);
152                                 e.printStackTrace();
153                         }
154                 }
155
156
157                 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
158                 frame.pack();
159                 frame.setVisible(true);
160
161         }
162
163         public void actionPerformed(ActionEvent event) {
164
165                 if(event.getActionCommand() == "open") open(); else
166                 if(event.getActionCommand() == "saveAs") saveAs(); else
167                 if(event.getActionCommand() == "makeCampusMaps") makeCampusMaps(); else
168                 if(event.getActionCommand() == "makeSiebelMaps") makeSiebelMaps(); else
169                 if(event.getActionCommand() == "switchMap") switchMap(); else
170                 if(event.getActionCommand() == "populateBusNodes") populateBusNodes();
171         }
172
173         public void populateBusNodes()
174         {
175             System.out.println("Entering populate bus nodes");
176             DummyBusSchedule temp  = new DummyBusSchedule();
177             temp.CreateBusRoutes(graph);
178             graph.schedules = temp;
179         }
180
181         public void open() {
182                 if(fileChooser.showOpenDialog(frame) != JFileChooser.APPROVE_OPTION)
183                         return;
184                 try {
185                         graph = Graph.loadFromFile(fileChooser.getSelectedFile().toString());
186                         graphViewer.setGraph(graph);
187
188                         mapIndex = -1;
189                         switchMap();
190                 } catch(Exception e) {
191                         System.out.println("Error while loading: " + e);
192                         e.printStackTrace();
193                 }
194         }
195
196         public void saveAs() {
197             System.out.println("Entering saveas");
198                 if(fileChooser.showSaveDialog(frame) != JFileChooser.APPROVE_OPTION)
199                         return;
200                 try {
201                         System.out.println("vector is of size " + graph.getBackgroundMaps().size());
202                         graph.saveToFile(fileChooser.getSelectedFile().toString());
203                 } catch(IOException e) {
204                         System.out.println("Error while saving: " + e);
205                         e.printStackTrace();
206                 }
207         }
208
209         /// Adds the default maps to the current graph
210         public void makeCampusMaps() {
211
212                 graph.clearBackgroundMaps();
213
214                 TiledMap map;
215
216                 // the gif map
217                 map = new TiledMap(15, 13, 200, 200, AffineTransform.getScaleInstance(1.31,1.31));
218                 map.setDescription("Colorful Map");
219                 map.setTreeUri("images/uiucmap/");
220                 map.setExtension("png");
221                 graph.addBackgroundMap(map);
222
223                 Point2D.Double realPoints[] = {
224                         new Point2D.Double(1844.4800000000002, 465.05),   // SouthEast corner of DCL (sidewalk int.)
225                         new Point2D.Double(2445.77, 3461.0200000000004),  // lone building NE of Windsor and Lincoln
226                         new Point2D.Double(463.74, 3537.0000000000005)    // Fork in the river NE of Windsor and Neil
227                 };
228                 Point2D.Double imagePoints[] = {
229                         new Point2D.Double(1925.8119658119663, 553.1111111111112),
230                         new Point2D.Double(2533.643811573166, 3690.2649325233588),
231                         new Point2D.Double(460.7444267834348, 3762.0368672661193)
232                 };
233
234                 AffineTransform aerialTransform = AffineTransformFactory.createTransform(imagePoints, realPoints);
235
236                 map = new TiledMap(20, 18, 200, 200, aerialTransform);
237                 map.setDescription("Aerial Map");
238                 map.setTreeUri("images/aerialmap/");
239                 map.setExtension("jpg");
240                 graph.addBackgroundMap(map);
241
242                 mapIndex = 0;
243                 graphViewer.setBackgroundMap((BackgroundMap)graph.getBackgroundMaps().get(mapIndex));
244         }
245
246        
247         public void makeSiebelMaps() {
248                 graph.clearBackgroundMaps();
249                
250
251                 // meters per pixel
252                 AffineTransform imageToReal = AffineTransform.getScaleInstance(0.145,0.145);
253                
254                 // where the document is located
255
256                 String rootUri = "";
257                
258                 String treeUri = "images/siebelmaps/";
259                 String extension = "png";
260                
261                 graph.addBackgroundMap(new BuildingMap(0, 684,768, imageToReal, rootUri, treeUri, extension));
262                 graph.addBackgroundMap(new BuildingMap(1, 684,768, imageToReal, rootUri, treeUri, extension));
263                 graph.addBackgroundMap(new BuildingMap(2, 684,768, imageToReal, rootUri, treeUri, extension));
264                 graph.addBackgroundMap(new BuildingMap(3, 684,768, imageToReal, rootUri, treeUri, extension));
265                 graph.addBackgroundMap(new BuildingMap(4, 684,768, imageToReal, rootUri, treeUri, extension));
266
267                 mapIndex = 0;
268                 graphViewer.setBackgroundMap((BackgroundMap)graph.getBackgroundMaps().get(mapIndex));                           
269         }
270        
271         public void switchMap() {
272                 if(graph.getBackgroundMaps().size() == 0) return;
273                 mapIndex = (mapIndex + 1) % graph.getBackgroundMaps().size();
274                 graphViewer.setBackgroundMap((BackgroundMap)graph.getBackgroundMaps().get(mapIndex));
275                 if(graphViewer.getBackgroundMap() instanceof BuildingMap)
276                         graphViewer.setSelectedObject(null);
277                 //graphViewer.scaleRelative(1);
278         }
279
280
281        
282         private PhysicalNode newNode(Point2D p) {
283                 if(physicalMode.isSelected()) {
284                         return new PhysicalNode(graph.getUnusedNodeID(), p.getX(), p.getY());                   
285                 } else if(buildingMode.isSelected()) {
286                         return new RoomNode(graph.getUnusedNodeID(), p.getX(), p.getY(), ((BuildingMap)graphViewer.getBackgroundMap()).getFloor());
287                 }
288                 return null;           
289         }
290        
291         private PhysicalEdge newEdge(int a, int b) {
292                 if(physicalMode.isSelected()) {
293                         return new PhysicalEdge(a, b);                 
294                 } else if(buildingMode.isSelected()) {
295                         return new HallEdge(a, b, ((BuildingMap)graphViewer.getBackgroundMap()).getFloor());
296                 }
297                 return null;   
298         }
299        
300        
301         private PhysicalNode lastSource;
302         public void pointReceived(MouseEvent event, Point2D.Double point) {
303                 try {
304                         if(event.getID() == MouseEvent.MOUSE_PRESSED) {
305                                 if(addNodesMode.isSelected()) {
306                                         graphViewer.setSelectedObject(null);
307                                         graph.addNode(newNode(point));
308                                 } else
309                                 if(addEdgesMode.isSelected()) {
310                                         Object source = graphViewer.getSelectedObject();
311                                         Object destination = graphViewer.closestMatch(point, 0);
312                                         if(event.isShiftDown() && source == null) source = lastSource;
313                                         if(source instanceof PhysicalNode && destination instanceof PhysicalNode) {
314                                                 graph.addEdge(newEdge(((PhysicalNode)source).id, ((PhysicalNode)destination).id));
315                                                 lastSource = (PhysicalNode)source;
316                                                 graphViewer.setSelectedObject(null);
317                                         } else
318                                         if(destination instanceof PhysicalNode) {
319                                                 graphViewer.setSelectedObject(destination);
320                                         }
321                                 } else
322                                 if(deleteMode.isSelected()) {
323                                         graphViewer.setSelectedObject(null);
324                                         Object toBeDeleted = graphViewer.closestMatch(point, 0);
325                                         if(toBeDeleted instanceof PhysicalNode) {
326                                                 Iterator i = ((PhysicalNode)toBeDeleted).edges.iterator();
327                                                 while(i.hasNext())
328                                                         graph.removeEdge((PhysicalEdge)i.next());
329                                                 graph.removeNode((PhysicalNode)toBeDeleted);
330                                         } else
331                                         if(toBeDeleted instanceof PhysicalEdge) {
332                                                 graph.removeEdge((PhysicalEdge)toBeDeleted);
333                                         }
334                                 } else
335        
336                                 if(chainMode.isSelected()) {
337        
338                                         Object clickedObject = graphViewer.closestMatch(point, 0);
339                                         Object selectedObject = graphViewer.getSelectedObject();
340        
341                                         if(clickedObject instanceof PhysicalNode && selectedObject instanceof PhysicalNode) {
342                                                 if(clickedObject == selectedObject) {
343                                                         graphViewer.setSelectedObject(null);
344                                                 } else {
345                                                         graph.addEdge(
346                                                                 newEdge(
347                                                                         ((PhysicalNode)selectedObject).id,
348                                                                         ((PhysicalNode)clickedObject).id
349                                                                 )
350                                                         );
351                                                         if(!event.isShiftDown())
352                                                                 graphViewer.setSelectedObject(clickedObject);
353                                                 }
354                                         } else
355                                         if(selectedObject instanceof PhysicalNode && clickedObject == null) {
356                                                 PhysicalNode newNode = newNode(point);
357                                                 graph.addNode(newNode);
358                                                 graph.addEdge(newEdge(((PhysicalNode)selectedObject).id, newNode.id));
359                                                 if(!event.isShiftDown())
360                                                         graphViewer.setSelectedObject(newNode);
361                                         } else
362                                         if(clickedObject != null) {
363                                                 graphViewer.setSelectedObject(clickedObject);
364                                         } else
365                                         if(clickedObject == null && selectedObject == null) {
366                                                 PhysicalNode newNode = newNode(point);
367                                                 graph.addNode(newNode);
368                                                 graphViewer.setSelectedObject(newNode);
369                                         }
370                                 } else
371                                 if(identifyMode.isSelected()) {
372                                         // print out ids for teh busnode haX
373                                         Object clicked = graphViewer.closestMatch(point, 0);
374                                         if(clicked instanceof PhysicalNode) {
375                                                 System.out.println("Node ID: " + ((PhysicalNode)clicked).id);
376                                         }
377                                         // also offer a dialog box for naming nodes
378                                         
379                                         if(clicked instanceof Node) {
380                                                 String newName = JOptionPane.showInputDialog(
381                                                         frame,
382                                                         ((Node)clicked).toString() + "\nPlease enter a new name for this node.",
383                                                         ((Node)clicked).getName()
384                                                 );
385                                                 if(newName != null) ((Node)clicked).setName(newName);
386                                         }                                       
387                                 }
388                         }
389                 } catch(ClassCastException e) {
390                         //todo - dialog box warning     
391                 }
392         }
393
394         public void stateChanged(ChangeEvent e) {
395                 graphViewer.setTemporaryLowQuality(((JSlider)e.getSource()).getValueIsAdjusting());
396                 graphViewer.scaleRelative(((JSlider)e.getSource()).getValue() / 100.0);
397         }
398
399
400         public static void main(String[] args) {
401                 //Schedule a job for the event-dispatching thread:
402                 //creating and showing this application's GUI.
403                 final String[] finalArgs = args;
404                 javax.swing.SwingUtilities.invokeLater(new Runnable() {
405                         public void run() {
406                                 new MapEditor(finalArgs);
407                         }
408                 });
409         }
410 }
Note: See TracBrowser for help on using the browser.