]> gitweb.fperrin.net Git - GpsPrune.git/blob - tim/prune/gui/MenuManager.java
64a66d86aaba94296fb04e24535916d3e95670b9
[GpsPrune.git] / tim / prune / gui / MenuManager.java
1 package tim.prune.gui;
2
3 import java.awt.event.ActionEvent;
4 import java.awt.event.ActionListener;
5 import java.awt.event.InputEvent;
6 import java.awt.event.KeyEvent;
7
8 import javax.swing.JFrame;
9 import javax.swing.JMenu;
10 import javax.swing.JMenuBar;
11 import javax.swing.JMenuItem;
12 import javax.swing.KeyStroke;
13
14 import tim.prune.App;
15 import tim.prune.DataSubscriber;
16 import tim.prune.I18nManager;
17 import tim.prune.data.Selection;
18 import tim.prune.data.Track;
19 import tim.prune.data.TrackInfo;
20
21 /**
22  * Class to manage the menu bar,
23  * including enabling and disabling the menu items
24  */
25 public class MenuManager implements DataSubscriber
26 {
27         private JFrame _parent = null;
28         private App _app = null;
29         private Track _track = null;
30         private Selection _selection = null;
31
32         // Menu items which need enabling/disabling
33         JMenuItem _saveItem = null;
34         JMenuItem _exportKmlItem = null;
35         JMenuItem _exportPovItem = null;
36         JMenuItem _undoItem = null;
37         JMenuItem _clearUndoItem = null;
38         JMenuItem _editPointItem = null;
39         JMenuItem _editWaypointNameItem = null;
40         JMenuItem _deletePointItem = null;
41         JMenuItem _deleteRangeItem = null;
42         JMenuItem _deleteDuplicatesItem = null;
43         JMenuItem _compressItem = null;
44         JMenuItem _interpolateItem = null;
45         JMenuItem _selectAllItem = null;
46         JMenuItem _selectNoneItem = null;
47         JMenuItem _show3dItem = null;
48         JMenuItem _reverseItem = null;
49         JMenu     _rearrangeMenu = null;
50         JMenuItem _rearrangeStartItem = null;
51         JMenuItem _rearrangeEndItem = null;
52         JMenuItem _rearrangeNearestItem = null;
53
54
55         /**
56          * Constructor
57          * @param inParent parent object for dialogs
58          * @param inApp application to call on menu actions
59          */
60         public MenuManager(JFrame inParent, App inApp, TrackInfo inTrackInfo)
61         {
62                 _parent = inParent;
63                 _app = inApp;
64                 _track = inTrackInfo.getTrack();
65                 _selection = inTrackInfo.getSelection();
66         }
67
68
69         /**
70          * Create a JMenuBar containing all menu items
71          * @return JMenuBar
72          */
73         public JMenuBar createMenuBar()
74         {
75                 JMenuBar menubar = new JMenuBar();
76                 JMenu fileMenu = new JMenu(I18nManager.getText("menu.file"));
77                 // Open file
78                 JMenuItem openMenuItem = new JMenuItem(I18nManager.getText("menu.file.open"));
79                 openMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_DOWN_MASK));
80                 openMenuItem.addActionListener(new ActionListener() {
81                         public void actionPerformed(ActionEvent e)
82                         {
83                                 _app.openFile();
84                         }
85                 });
86                 fileMenu.add(openMenuItem);
87                 // Add photos
88                 JMenuItem addPhotosMenuItem = new JMenuItem(I18nManager.getText("menu.file.addphotos"));
89                 addPhotosMenuItem.addActionListener(new ActionListener() {
90                         public void actionPerformed(ActionEvent e)
91                         {
92                                 _app.addPhotos();
93                         }
94                 });
95                 // TODO: Re-add add photos menu item after v2
96                 // fileMenu.add(addPhotosMenuItem);
97                 // Save
98                 _saveItem = new JMenuItem(I18nManager.getText("menu.file.save"), KeyEvent.VK_S);
99                 _saveItem.addActionListener(new ActionListener() {
100                         public void actionPerformed(ActionEvent e)
101                         {
102                                 _app.saveFile();
103                         }
104                 });
105                 _saveItem.setEnabled(false);
106                 fileMenu.add(_saveItem);
107                 // Export
108                 _exportKmlItem = new JMenuItem(I18nManager.getText("menu.file.exportkml"));
109                 _exportKmlItem.addActionListener(new ActionListener() {
110                         public void actionPerformed(ActionEvent e)
111                         {
112                                 _app.exportKml();
113                         }
114                 });
115                 _exportKmlItem.setEnabled(false);
116                 fileMenu.add(_exportKmlItem);
117                 _exportPovItem = new JMenuItem(I18nManager.getText("menu.file.exportpov"));
118                 _exportPovItem.addActionListener(new ActionListener() {
119                         public void actionPerformed(ActionEvent e)
120                         {
121                                 _app.exportPov();
122                         }
123                 });
124                 _exportPovItem.setEnabled(false);
125                 fileMenu.add(_exportPovItem);
126                 fileMenu.addSeparator();
127                 JMenuItem exitMenuItem = new JMenuItem(I18nManager.getText("menu.file.exit"));
128                 exitMenuItem.addActionListener(new ActionListener() {
129                         public void actionPerformed(ActionEvent e)
130                         {
131                                 _app.exit();
132                         }
133                 });
134                 fileMenu.add(exitMenuItem);
135                 menubar.add(fileMenu);
136                 JMenu editMenu = new JMenu(I18nManager.getText("menu.edit"));
137                 editMenu.setMnemonic(KeyEvent.VK_E);
138                 _undoItem = new JMenuItem(I18nManager.getText("menu.edit.undo"));
139                 _undoItem.addActionListener(new ActionListener() {
140                         public void actionPerformed(ActionEvent e)
141                         {
142                                 _app.beginUndo();
143                         }
144                 });
145                 _undoItem.setEnabled(false);
146                 editMenu.add(_undoItem);
147                 _clearUndoItem = new JMenuItem(I18nManager.getText("menu.edit.clearundo"));
148                 _clearUndoItem.addActionListener(new ActionListener() {
149                         public void actionPerformed(ActionEvent e)
150                         {
151                                 _app.clearUndo();
152                         }
153                 });
154                 _clearUndoItem.setEnabled(false);
155                 editMenu.add(_clearUndoItem);
156                 editMenu.addSeparator();
157                 _editPointItem = new JMenuItem(I18nManager.getText("menu.edit.editpoint"));
158                 _editPointItem.addActionListener(new ActionListener() {
159                         public void actionPerformed(ActionEvent e)
160                         {
161                                 _app.editCurrentPoint();
162                         }
163                 });
164                 _editPointItem.setEnabled(false);
165                 editMenu.add(_editPointItem);
166                 _editWaypointNameItem = new JMenuItem(I18nManager.getText("menu.edit.editwaypointname"));
167                 _editWaypointNameItem.addActionListener(new ActionListener() {
168                         public void actionPerformed(ActionEvent e)
169                         {
170                                 _app.editCurrentPointName();
171                         }
172                 });
173                 _editWaypointNameItem.setEnabled(false);
174                 editMenu.add(_editWaypointNameItem);
175                 _deletePointItem = new JMenuItem(I18nManager.getText("menu.edit.deletepoint"));
176                 _deletePointItem.addActionListener(new ActionListener() {
177                         public void actionPerformed(ActionEvent e)
178                         {
179                                 _app.deleteCurrentPoint();
180                         }
181                 });
182                 _deletePointItem.setEnabled(false);
183                 editMenu.add(_deletePointItem);
184                 _deleteRangeItem = new JMenuItem(I18nManager.getText("menu.edit.deleterange"));
185                 _deleteRangeItem.addActionListener(new ActionListener() {
186                         public void actionPerformed(ActionEvent e)
187                         {
188                                 _app.deleteSelectedRange();
189                         }
190                 });
191                 _deleteRangeItem.setEnabled(false);
192                 editMenu.add(_deleteRangeItem);
193                 _deleteDuplicatesItem = new JMenuItem(I18nManager.getText("menu.edit.deleteduplicates"));
194                 _deleteDuplicatesItem.addActionListener(new ActionListener() {
195                         public void actionPerformed(ActionEvent e)
196                         {
197                                 _app.deleteDuplicates();
198                         }
199                 });
200                 _deleteDuplicatesItem.setEnabled(false);
201                 editMenu.add(_deleteDuplicatesItem);
202                 _compressItem = new JMenuItem(I18nManager.getText("menu.edit.compress"));
203                 _compressItem.addActionListener(new ActionListener() {
204                         public void actionPerformed(ActionEvent e)
205                         {
206                                 _app.compressTrack();
207                         }
208                 });
209                 _compressItem.setEnabled(false);
210                 editMenu.add(_compressItem);
211                 editMenu.addSeparator();
212                 _interpolateItem = new JMenuItem(I18nManager.getText("menu.edit.interpolate"));
213                 _interpolateItem.addActionListener(new ActionListener() {
214                         public void actionPerformed(ActionEvent e)
215                         {
216                                 _app.interpolateSelection();
217                         }
218                 });
219                 _interpolateItem.setEnabled(false);
220                 editMenu.add(_interpolateItem);
221                 _reverseItem = new JMenuItem(I18nManager.getText("menu.edit.reverse"));
222                 _reverseItem.addActionListener(new ActionListener() {
223                         public void actionPerformed(ActionEvent e)
224                         {
225                                 _app.reverseRange();
226                         }
227                 });
228                 _reverseItem.setEnabled(false);
229                 editMenu.add(_reverseItem);
230                 // Rearrange waypoints
231                 _rearrangeMenu = new JMenu(I18nManager.getText("menu.edit.rearrange"));
232                 _rearrangeMenu.setEnabled(false);
233                 _rearrangeStartItem = new JMenuItem(I18nManager.getText("menu.edit.rearrange.start"));
234                 _rearrangeStartItem.addActionListener(new ActionListener() {
235                         public void actionPerformed(ActionEvent e)
236                         {
237                                 _app.rearrangeWaypoints(App.REARRANGE_TO_START);
238                         }
239                 });
240                 _rearrangeStartItem.setEnabled(true);
241                 _rearrangeMenu.add(_rearrangeStartItem);
242                 _rearrangeEndItem = new JMenuItem(I18nManager.getText("menu.edit.rearrange.end"));
243                 _rearrangeEndItem.addActionListener(new ActionListener() {
244                         public void actionPerformed(ActionEvent e)
245                         {
246                                 _app.rearrangeWaypoints(App.REARRANGE_TO_END);
247                         }
248                 });
249                 _rearrangeEndItem.setEnabled(true);
250                 _rearrangeMenu.add(_rearrangeEndItem);
251                 _rearrangeNearestItem = new JMenuItem(I18nManager.getText("menu.edit.rearrange.nearest"));
252                 _rearrangeNearestItem.addActionListener(new ActionListener() {
253                         public void actionPerformed(ActionEvent e)
254                         {
255                                 _app.rearrangeWaypoints(App.REARRANGE_TO_NEAREST);
256                         }
257                 });
258                 _rearrangeNearestItem.setEnabled(true);
259                 _rearrangeMenu.add(_rearrangeNearestItem);
260                 editMenu.add(_rearrangeMenu);
261                 menubar.add(editMenu);
262
263                 // Select menu
264                 JMenu selectMenu = new JMenu(I18nManager.getText("menu.select"));
265                 _selectAllItem = new JMenuItem(I18nManager.getText("menu.select.all"));
266                 _selectAllItem.setEnabled(false);
267                 _selectAllItem.addActionListener(new ActionListener() {
268                         public void actionPerformed(ActionEvent e)
269                         {
270                                 _app.selectAll();
271                         }
272                 });
273                 selectMenu.add(_selectAllItem);
274                 _selectNoneItem = new JMenuItem(I18nManager.getText("menu.select.none"));
275                 _selectNoneItem.setEnabled(false);
276                 _selectNoneItem.addActionListener(new ActionListener() {
277                         public void actionPerformed(ActionEvent e)
278                         {
279                                 _app.selectNone();
280                         }
281                 });
282                 selectMenu.add(_selectNoneItem);
283                 menubar.add(selectMenu);
284
285                 // Add 3d menu (whether java3d available or not)
286                 JMenu threeDMenu = new JMenu(I18nManager.getText("menu.3d"));
287                 _show3dItem = new JMenuItem(I18nManager.getText("menu.3d.show3d"));
288                 _show3dItem.addActionListener(new ActionListener() {
289                         public void actionPerformed(ActionEvent e)
290                         {
291                                 _app.show3dWindow();
292                         }
293                 });
294                 _show3dItem.setEnabled(false);
295                 threeDMenu.add(_show3dItem);
296                 menubar.add(threeDMenu);
297
298                 // Help menu for About
299                 JMenu helpMenu = new JMenu(I18nManager.getText("menu.help"));
300                 JMenuItem aboutItem = new JMenuItem(I18nManager.getText("menu.help.about"));
301                 aboutItem.addActionListener(new ActionListener() {
302                         public void actionPerformed(ActionEvent e)
303                         {
304                                 new AboutScreen(_parent).show();
305                         }
306                 });
307                 helpMenu.add(aboutItem);
308                 menubar.add(helpMenu);
309
310                 return menubar;
311         }
312
313
314         /**
315          * Method to update menu when file loaded
316          */
317         public void informFileLoaded()
318         {
319                 // save, undo, delete enabled
320                 _saveItem.setEnabled(true);
321                 _undoItem.setEnabled(true);
322                 _deleteDuplicatesItem.setEnabled(true);
323                 _compressItem.setEnabled(true);
324         }
325
326
327         /**
328          * @see tim.prune.DataSubscriber#dataUpdated(tim.prune.data.Track)
329          */
330         public void dataUpdated(byte inUpdateType)
331         {
332                 boolean hasData = (_track != null && _track.getNumPoints() > 0);
333                 // set functions which require data
334                 _saveItem.setEnabled(hasData);
335                 _exportKmlItem.setEnabled(hasData);
336                 _exportPovItem.setEnabled(hasData);
337                 _deleteDuplicatesItem.setEnabled(hasData);
338                 _compressItem.setEnabled(hasData);
339                 _rearrangeMenu.setEnabled(hasData && _track.hasMixedData());
340                 _selectAllItem.setEnabled(hasData);
341                 _selectNoneItem.setEnabled(hasData);
342                 if (_show3dItem != null)
343                         _show3dItem.setEnabled(hasData);
344                 // is undo available?
345                 boolean hasUndo = !_app.getUndoStack().isEmpty();
346                 _undoItem.setEnabled(hasUndo);
347                 _clearUndoItem.setEnabled(hasUndo);
348                 // is there a current point?
349                 boolean hasPoint = (hasData && _selection.getCurrentPointIndex() >= 0);
350                 _editPointItem.setEnabled(hasPoint);
351                 _editWaypointNameItem.setEnabled(hasPoint);
352                 _deletePointItem.setEnabled(hasPoint);
353                 // is there a current range?
354                 boolean hasRange = (hasData && _selection.hasRangeSelected());
355                 _deleteRangeItem.setEnabled(hasRange);
356                 _interpolateItem.setEnabled(hasRange
357                         && (_selection.getEnd() - _selection.getStart()) == 1);
358                 _reverseItem.setEnabled(hasRange);
359         }
360 }