3 import java.awt.event.ActionEvent;
4 import java.awt.event.ActionListener;
5 import java.awt.event.InputEvent;
6 import java.awt.event.KeyEvent;
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;
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;
22 * Class to manage the menu bar,
23 * including enabling and disabling the menu items
25 public class MenuManager implements DataSubscriber
27 private JFrame _parent = null;
28 private App _app = null;
29 private Track _track = null;
30 private Selection _selection = null;
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;
57 * @param inParent parent object for dialogs
58 * @param inApp application to call on menu actions
60 public MenuManager(JFrame inParent, App inApp, TrackInfo inTrackInfo)
64 _track = inTrackInfo.getTrack();
65 _selection = inTrackInfo.getSelection();
70 * Create a JMenuBar containing all menu items
73 public JMenuBar createMenuBar()
75 JMenuBar menubar = new JMenuBar();
76 JMenu fileMenu = new JMenu(I18nManager.getText("menu.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)
86 fileMenu.add(openMenuItem);
88 JMenuItem addPhotosMenuItem = new JMenuItem(I18nManager.getText("menu.file.addphotos"));
89 addPhotosMenuItem.addActionListener(new ActionListener() {
90 public void actionPerformed(ActionEvent e)
95 // TODO: Re-add add photos menu item after v2
96 // fileMenu.add(addPhotosMenuItem);
98 _saveItem = new JMenuItem(I18nManager.getText("menu.file.save"), KeyEvent.VK_S);
99 _saveItem.addActionListener(new ActionListener() {
100 public void actionPerformed(ActionEvent e)
105 _saveItem.setEnabled(false);
106 fileMenu.add(_saveItem);
108 _exportKmlItem = new JMenuItem(I18nManager.getText("menu.file.exportkml"));
109 _exportKmlItem.addActionListener(new ActionListener() {
110 public void actionPerformed(ActionEvent e)
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)
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)
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)
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)
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)
161 _app.editCurrentPoint();
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)
170 _app.editCurrentPointName();
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)
179 _app.deleteCurrentPoint();
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)
188 _app.deleteSelectedRange();
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)
197 _app.deleteDuplicates();
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)
206 _app.compressTrack();
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)
216 _app.interpolateSelection();
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)
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)
237 _app.rearrangeWaypoints(App.REARRANGE_TO_START);
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)
246 _app.rearrangeWaypoints(App.REARRANGE_TO_END);
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)
255 _app.rearrangeWaypoints(App.REARRANGE_TO_NEAREST);
258 _rearrangeNearestItem.setEnabled(true);
259 _rearrangeMenu.add(_rearrangeNearestItem);
260 editMenu.add(_rearrangeMenu);
261 menubar.add(editMenu);
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)
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)
282 selectMenu.add(_selectNoneItem);
283 menubar.add(selectMenu);
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)
294 _show3dItem.setEnabled(false);
295 threeDMenu.add(_show3dItem);
296 menubar.add(threeDMenu);
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)
304 new AboutScreen(_parent).show();
307 helpMenu.add(aboutItem);
308 menubar.add(helpMenu);
315 * Method to update menu when file loaded
317 public void informFileLoaded()
319 // save, undo, delete enabled
320 _saveItem.setEnabled(true);
321 _undoItem.setEnabled(true);
322 _deleteDuplicatesItem.setEnabled(true);
323 _compressItem.setEnabled(true);
328 * @see tim.prune.DataSubscriber#dataUpdated(tim.prune.data.Track)
330 public void dataUpdated(byte inUpdateType)
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);