]> gitweb.fperrin.net Git - GpsPrune.git/blob - tim/prune/gui/MenuManager.java
Version 1, September 2006
[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 _exportItem = null;
35         JMenuItem _undoItem = null;
36         JMenuItem _clearUndoItem = null;
37         JMenuItem _deletePointItem = null;
38         JMenuItem _deleteRangeItem = null;
39         JMenuItem _deleteDuplicatesItem = null;
40         JMenuItem _compressItem = null;
41         JMenuItem _interpolateItem = null;
42         JMenuItem _selectAllItem = null;
43         JMenuItem _selectNoneItem = null;
44         JMenuItem _show3dItem = null;
45         JMenuItem _reverseItem = null;
46         JMenu     _rearrangeMenu = null;
47         JMenuItem _rearrangeStartItem = null;
48         JMenuItem _rearrangeEndItem = null;
49         JMenuItem _rearrangeNearestItem = null;
50
51
52         /**
53          * Constructor
54          * @param inParent parent object for dialogs
55          * @param inApp application to call on menu actions
56          */
57         public MenuManager(JFrame inParent, App inApp, TrackInfo inTrackInfo)
58         {
59                 _parent = inParent;
60                 _app = inApp;
61                 _track = inTrackInfo.getTrack();
62                 _selection = inTrackInfo.getSelection();
63         }
64
65
66         /**
67          * Create a JMenuBar containing all menu items
68          * @return JMenuBar
69          */
70         public JMenuBar createMenuBar()
71         {
72                 JMenuBar menubar = new JMenuBar();
73                 JMenu fileMenu = new JMenu(I18nManager.getText("menu.file"));
74                 JMenuItem openMenuItem = new JMenuItem(I18nManager.getText("menu.file.open"));
75                 openMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_DOWN_MASK));
76                 openMenuItem.addActionListener(new ActionListener() {
77                         public void actionPerformed(ActionEvent e)
78                         {
79                                 _app.openFile();
80                         }
81                 });
82                 fileMenu.add(openMenuItem);
83                 _saveItem = new JMenuItem(I18nManager.getText("menu.file.save"), KeyEvent.VK_S);
84                 _saveItem.addActionListener(new ActionListener() {
85                         public void actionPerformed(ActionEvent e)
86                         {
87                                 _app.saveFile();
88                         }
89                 });
90                 _saveItem.setEnabled(false);
91                 fileMenu.add(_saveItem);
92                 // Export
93                 _exportItem = new JMenuItem(I18nManager.getText("menu.file.export"));
94                 _exportItem.addActionListener(new ActionListener() {
95                         public void actionPerformed(ActionEvent e)
96                         {
97                                 _app.exportKml();
98                         }
99                 });
100                 _exportItem.setEnabled(false);
101                 fileMenu.add(_exportItem);
102                 fileMenu.addSeparator();
103                 JMenuItem exitMenuItem = new JMenuItem(I18nManager.getText("menu.file.exit"));
104                 exitMenuItem.addActionListener(new ActionListener() {
105                         public void actionPerformed(ActionEvent e)
106                         {
107                                 _app.exit();
108                         }
109                 });
110                 fileMenu.add(exitMenuItem);
111                 menubar.add(fileMenu);
112                 JMenu editMenu = new JMenu(I18nManager.getText("menu.edit"));
113                 editMenu.setMnemonic(KeyEvent.VK_E);
114                 _undoItem = new JMenuItem(I18nManager.getText("menu.edit.undo"));
115                 _undoItem.addActionListener(new ActionListener() {
116                         public void actionPerformed(ActionEvent e)
117                         {
118                                 _app.beginUndo();
119                         }
120                 });
121                 _undoItem.setEnabled(false);
122                 editMenu.add(_undoItem);
123                 _clearUndoItem = new JMenuItem(I18nManager.getText("menu.edit.clearundo"));
124                 _clearUndoItem.addActionListener(new ActionListener() {
125                         public void actionPerformed(ActionEvent e)
126                         {
127                                 _app.clearUndo();
128                         }
129                 });
130                 _clearUndoItem.setEnabled(false);
131                 editMenu.add(_clearUndoItem);
132                 editMenu.addSeparator();
133                 _deletePointItem = new JMenuItem(I18nManager.getText("menu.edit.deletepoint"));
134                 _deletePointItem.addActionListener(new ActionListener() {
135                         public void actionPerformed(ActionEvent e)
136                         {
137                                 _app.deleteCurrentPoint();
138                         }
139                 });
140                 _deletePointItem.setEnabled(false);
141                 editMenu.add(_deletePointItem);
142                 _deleteRangeItem = new JMenuItem(I18nManager.getText("menu.edit.deleterange"));
143                 _deleteRangeItem.addActionListener(new ActionListener() {
144                         public void actionPerformed(ActionEvent e)
145                         {
146                                 _app.deleteSelectedRange();
147                         }
148                 });
149                 _deleteRangeItem.setEnabled(false);
150                 editMenu.add(_deleteRangeItem);
151                 _deleteDuplicatesItem = new JMenuItem(I18nManager.getText("menu.edit.deleteduplicates"));
152                 _deleteDuplicatesItem.addActionListener(new ActionListener() {
153                         public void actionPerformed(ActionEvent e)
154                         {
155                                 _app.deleteDuplicates();
156                         }
157                 });
158                 _deleteDuplicatesItem.setEnabled(false);
159                 editMenu.add(_deleteDuplicatesItem);
160                 _compressItem = new JMenuItem(I18nManager.getText("menu.edit.compress"));
161                 _compressItem.addActionListener(new ActionListener() {
162                         public void actionPerformed(ActionEvent e)
163                         {
164                                 _app.compressTrack();
165                         }
166                 });
167                 _compressItem.setEnabled(false);
168                 editMenu.add(_compressItem);
169                 editMenu.addSeparator();
170                 _interpolateItem = new JMenuItem(I18nManager.getText("menu.edit.interpolate"));
171                 _interpolateItem.addActionListener(new ActionListener() {
172                         public void actionPerformed(ActionEvent e)
173                         {
174                                 _app.interpolateSelection();
175                         }
176                 });
177                 _interpolateItem.setEnabled(false);
178                 editMenu.add(_interpolateItem);
179                 _reverseItem = new JMenuItem(I18nManager.getText("menu.edit.reverse"));
180                 _reverseItem.addActionListener(new ActionListener() {
181                         public void actionPerformed(ActionEvent e)
182                         {
183                                 _app.reverseRange();
184                         }
185                 });
186                 _reverseItem.setEnabled(false);
187                 editMenu.add(_reverseItem);
188                 // Rearrange waypoints
189                 _rearrangeMenu = new JMenu(I18nManager.getText("menu.edit.rearrange"));
190                 _rearrangeMenu.setEnabled(false);
191                 _rearrangeStartItem = new JMenuItem(I18nManager.getText("menu.edit.rearrange.start"));
192                 _rearrangeStartItem.addActionListener(new ActionListener() {
193                         public void actionPerformed(ActionEvent e)
194                         {
195                                 _app.rearrangeWaypoints(App.REARRANGE_TO_START);
196                         }
197                 });
198                 _rearrangeStartItem.setEnabled(true);
199                 _rearrangeMenu.add(_rearrangeStartItem);
200                 _rearrangeEndItem = new JMenuItem(I18nManager.getText("menu.edit.rearrange.end"));
201                 _rearrangeEndItem.addActionListener(new ActionListener() {
202                         public void actionPerformed(ActionEvent e)
203                         {
204                                 _app.rearrangeWaypoints(App.REARRANGE_TO_END);
205                         }
206                 });
207                 _rearrangeEndItem.setEnabled(true);
208                 _rearrangeMenu.add(_rearrangeEndItem);
209                 _rearrangeNearestItem = new JMenuItem(I18nManager.getText("menu.edit.rearrange.nearest"));
210                 _rearrangeNearestItem.addActionListener(new ActionListener() {
211                         public void actionPerformed(ActionEvent e)
212                         {
213                                 _app.rearrangeWaypoints(App.REARRANGE_TO_NEAREST);
214                         }
215                 });
216                 _rearrangeNearestItem.setEnabled(true);
217                 _rearrangeMenu.add(_rearrangeNearestItem);
218                 editMenu.add(_rearrangeMenu);
219                 menubar.add(editMenu);
220
221                 // Select menu
222                 JMenu selectMenu = new JMenu(I18nManager.getText("menu.select"));
223                 _selectAllItem = new JMenuItem(I18nManager.getText("menu.select.all"));
224                 _selectAllItem.setEnabled(false);
225                 _selectAllItem.addActionListener(new ActionListener() {
226                         public void actionPerformed(ActionEvent e)
227                         {
228                                 _app.selectAll();
229                         }
230                 });
231                 selectMenu.add(_selectAllItem);
232                 _selectNoneItem = new JMenuItem(I18nManager.getText("menu.select.none"));
233                 _selectNoneItem.setEnabled(false);
234                 _selectNoneItem.addActionListener(new ActionListener() {
235                         public void actionPerformed(ActionEvent e)
236                         {
237                                 _app.selectNone();
238                         }
239                 });
240                 selectMenu.add(_selectNoneItem);
241                 menubar.add(selectMenu);
242
243                 // Add 3d menu if available
244                 if (isJava3dEnabled())
245                 {
246                         JMenu threeDMenu = new JMenu(I18nManager.getText("menu.3d"));
247                         _show3dItem = new JMenuItem(I18nManager.getText("menu.3d.show3d"));
248                         _show3dItem.addActionListener(new ActionListener() {
249                                 public void actionPerformed(ActionEvent e)
250                                 {
251                                         _app.show3dWindow();
252                                 }
253                         });
254                         _show3dItem.setEnabled(false);
255                         threeDMenu.add(_show3dItem);
256                         menubar.add(threeDMenu);
257                 }
258
259                 // Help menu for About
260                 JMenu helpMenu = new JMenu(I18nManager.getText("menu.help"));
261                 JMenuItem aboutItem = new JMenuItem(I18nManager.getText("menu.help.about"));
262                 aboutItem.addActionListener(new ActionListener() {
263                         public void actionPerformed(ActionEvent e)
264                         {
265                                 new AboutScreen(_parent).show();
266                         }
267                 });
268                 helpMenu.add(aboutItem);
269                 menubar.add(helpMenu);
270
271                 return menubar;
272         }
273
274
275         /**
276          * Method to update menu when file loaded
277          */
278         public void informFileLoaded()
279         {
280                 // save, undo, delete enabled
281                 _saveItem.setEnabled(true);
282                 _undoItem.setEnabled(true);
283                 _deleteDuplicatesItem.setEnabled(true);
284                 _compressItem.setEnabled(true);
285         }
286
287
288         /**
289          * @return true if 3d capability is installed
290          */
291         private static boolean isJava3dEnabled()
292         {
293                 boolean has3d = false;
294                 try
295                 {
296                         Class universeClass = Class.forName("com.sun.j3d.utils.universe.SimpleUniverse");
297                         has3d = true;
298                 }
299                 catch (ClassNotFoundException e)
300                 {
301                         // no java3d classes available
302                 }
303                 return has3d;
304         }
305
306
307         /**
308          * @see tim.prune.DataSubscriber#dataUpdated(tim.prune.data.Track)
309          */
310         public void dataUpdated()
311         {
312                 boolean hasData = (_track != null && _track.getNumPoints() > 0);
313                 // set functions which require data
314                 _saveItem.setEnabled(hasData);
315                 _exportItem.setEnabled(hasData);
316                 _deleteDuplicatesItem.setEnabled(hasData);
317                 _compressItem.setEnabled(hasData);
318                 _rearrangeMenu.setEnabled(hasData && _track.hasMixedData());
319                 _selectAllItem.setEnabled(hasData);
320                 _selectNoneItem.setEnabled(hasData);
321                 if (_show3dItem != null)
322                         _show3dItem.setEnabled(hasData);
323                 // is undo available?
324                 boolean hasUndo = !_app.getUndoStack().isEmpty();
325                 _undoItem.setEnabled(hasUndo);
326                 _clearUndoItem.setEnabled(hasUndo);
327                 // is there a current point?
328                 boolean hasPoint = (hasData && _selection.getCurrentPointIndex() >= 0);
329                 _deletePointItem.setEnabled(hasPoint);
330                 // is there a current range?
331                 boolean hasRange = (hasData && _selection.hasRangeSelected());
332                 _deleteRangeItem.setEnabled(hasRange);
333                 _interpolateItem.setEnabled(hasRange
334                         && (_selection.getEnd() - _selection.getStart()) == 1);
335                 _reverseItem.setEnabled(hasRange);
336         }
337 }