source: josm/trunk/src/org/openstreetmap/josm/gui/MainMenu.java@ 4672

Last change on this file since 4672 was 4668, checked in by bastiK, 13 years ago

session support (first part, see #4029)

Idea: Save and load the current session, i.e. list of open layers and possibly more.
This change includes only support for reading session files and only for osm-data layers.

session.svg: Public Domain

  • Property svn:eol-style set to native
File size: 23.8 KB
Line 
1// License: GPL. See LICENSE file for details.
2package org.openstreetmap.josm.gui;
3
4import java.awt.Toolkit;
5import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
6import static org.openstreetmap.josm.tools.I18n.marktr;
7import static org.openstreetmap.josm.tools.I18n.tr;
8
9import java.awt.event.KeyEvent;
10
11import javax.swing.JCheckBoxMenuItem;
12import javax.swing.JMenu;
13import javax.swing.JMenuBar;
14import javax.swing.JMenuItem;
15import javax.swing.JPopupMenu;
16import javax.swing.JSeparator;
17import javax.swing.KeyStroke;
18import javax.swing.event.MenuEvent;
19import javax.swing.event.MenuListener;
20
21import org.openstreetmap.josm.Main;
22import org.openstreetmap.josm.actions.AboutAction;
23import org.openstreetmap.josm.actions.AddNodeAction;
24import org.openstreetmap.josm.actions.AlignInCircleAction;
25import org.openstreetmap.josm.actions.AlignInLineAction;
26import org.openstreetmap.josm.actions.AutoScaleAction;
27import org.openstreetmap.josm.actions.ChangesetManagerToggleAction;
28import org.openstreetmap.josm.actions.CloseChangesetAction;
29import org.openstreetmap.josm.actions.CombineWayAction;
30import org.openstreetmap.josm.actions.CopyAction;
31import org.openstreetmap.josm.actions.CopyCoordinatesAction;
32import org.openstreetmap.josm.actions.CreateCircleAction;
33import org.openstreetmap.josm.actions.CreateMultipolygonAction;
34import org.openstreetmap.josm.actions.DeleteAction;
35import org.openstreetmap.josm.actions.DistributeAction;
36import org.openstreetmap.josm.actions.DownloadAction;
37import org.openstreetmap.josm.actions.DownloadPrimitiveAction;
38import org.openstreetmap.josm.actions.DownloadReferrersAction;
39import org.openstreetmap.josm.actions.DuplicateAction;
40import org.openstreetmap.josm.actions.ExitAction;
41import org.openstreetmap.josm.actions.FollowLineAction;
42import org.openstreetmap.josm.actions.FullscreenToggleAction;
43import org.openstreetmap.josm.actions.GpxExportAction;
44import org.openstreetmap.josm.actions.HelpAction;
45import org.openstreetmap.josm.actions.HistoryInfoAction;
46import org.openstreetmap.josm.actions.HistoryInfoWebAction;
47import org.openstreetmap.josm.actions.InfoAction;
48import org.openstreetmap.josm.actions.InfoWebAction;
49import org.openstreetmap.josm.actions.JoinAreasAction;
50import org.openstreetmap.josm.actions.JoinNodeWayAction;
51import org.openstreetmap.josm.actions.JosmAction;
52import org.openstreetmap.josm.actions.JumpToAction;
53import org.openstreetmap.josm.actions.MergeLayerAction;
54import org.openstreetmap.josm.actions.MergeNodesAction;
55import org.openstreetmap.josm.actions.MergeSelectionAction;
56import org.openstreetmap.josm.actions.MirrorAction;
57import org.openstreetmap.josm.actions.MoveAction;
58import org.openstreetmap.josm.actions.MoveNodeAction;
59import org.openstreetmap.josm.actions.NewAction;
60import org.openstreetmap.josm.actions.OpenFileAction;
61import org.openstreetmap.josm.actions.OpenLocationAction;
62import org.openstreetmap.josm.actions.OrthogonalizeAction;
63import org.openstreetmap.josm.actions.PasteAction;
64import org.openstreetmap.josm.actions.PasteTagsAction;
65import org.openstreetmap.josm.actions.PreferencesAction;
66import org.openstreetmap.josm.actions.PurgeAction;
67import org.openstreetmap.josm.actions.RedoAction;
68import org.openstreetmap.josm.actions.ReverseWayAction;
69import org.openstreetmap.josm.actions.SaveAction;
70import org.openstreetmap.josm.actions.SaveAsAction;
71import org.openstreetmap.josm.actions.SelectAllAction;
72import org.openstreetmap.josm.actions.SessionLoadAction;
73import org.openstreetmap.josm.actions.ShowStatusReportAction;
74import org.openstreetmap.josm.actions.SimplifyWayAction;
75import org.openstreetmap.josm.actions.SplitWayAction;
76import org.openstreetmap.josm.actions.ToggleGPXLinesAction;
77import org.openstreetmap.josm.actions.UnGlueAction;
78import org.openstreetmap.josm.actions.UndoAction;
79import org.openstreetmap.josm.actions.UnselectAllAction;
80import org.openstreetmap.josm.actions.UpdateDataAction;
81import org.openstreetmap.josm.actions.UpdateModifiedAction;
82import org.openstreetmap.josm.actions.UpdateSelectionAction;
83import org.openstreetmap.josm.actions.UploadAction;
84import org.openstreetmap.josm.actions.UploadSelectionAction;
85import org.openstreetmap.josm.actions.ViewportFollowToggleAction;
86import org.openstreetmap.josm.actions.WireframeToggleAction;
87import org.openstreetmap.josm.actions.ZoomInAction;
88import org.openstreetmap.josm.actions.ZoomOutAction;
89import org.openstreetmap.josm.actions.OrthogonalizeAction.Undo;
90import org.openstreetmap.josm.actions.audio.AudioBackAction;
91import org.openstreetmap.josm.actions.audio.AudioFasterAction;
92import org.openstreetmap.josm.actions.audio.AudioFwdAction;
93import org.openstreetmap.josm.actions.audio.AudioNextAction;
94import org.openstreetmap.josm.actions.audio.AudioPlayPauseAction;
95import org.openstreetmap.josm.actions.audio.AudioPrevAction;
96import org.openstreetmap.josm.actions.audio.AudioSlowerAction;
97import org.openstreetmap.josm.actions.search.SearchAction;
98import org.openstreetmap.josm.gui.io.RecentlyOpenedFilesMenu;
99import org.openstreetmap.josm.gui.layer.Layer;
100import org.openstreetmap.josm.gui.tagging.TaggingPresetSearchAction;
101import org.openstreetmap.josm.tools.ImageProvider;
102import org.openstreetmap.josm.tools.Shortcut;
103
104/**
105 * This is the JOSM main menu bar. It is overwritten to initialize itself and provide all menu
106 * entries as member variables (sort of collect them).
107 *
108 * It also provides possibilities to attach new menu entries (used by plugins).
109 *
110 * @author Immanuel.Scholz
111 */
112public class MainMenu extends JMenuBar {
113
114 /* File menu */
115 public final NewAction newAction = new NewAction();
116 public final OpenFileAction openFile = new OpenFileAction();
117 public final RecentlyOpenedFilesMenu recentlyOpened = new RecentlyOpenedFilesMenu();
118 public final OpenLocationAction openLocation = new OpenLocationAction();
119 public final JosmAction save = new SaveAction();
120 public final JosmAction saveAs = new SaveAsAction();
121 public final JosmAction sessionLoad = new SessionLoadAction();
122 public final JosmAction gpxExport = new GpxExportAction();
123 public final DownloadAction download = new DownloadAction();
124 public final DownloadPrimitiveAction downloadPrimitive = new DownloadPrimitiveAction();
125 public final DownloadReferrersAction downloadReferrers = new DownloadReferrersAction();
126 public final CloseChangesetAction closeChangesetAction = new CloseChangesetAction();
127 public final JosmAction update = new UpdateDataAction();
128 public final JosmAction updateSelection = new UpdateSelectionAction();
129 public final JosmAction updateModified = new UpdateModifiedAction();
130 public final JosmAction upload = new UploadAction();
131 public final JosmAction uploadSelection = new UploadSelectionAction();
132 public final JosmAction exit = new ExitAction();
133
134 /* Edit menu */
135 public final UndoAction undo = new UndoAction();
136 public final RedoAction redo = new RedoAction();
137 public final JosmAction copy = new CopyAction();
138 public final JosmAction copyCoordinates = new CopyCoordinatesAction();
139 public final PasteAction paste = new PasteAction();
140 public final JosmAction pasteTags = new PasteTagsAction();
141 public final JosmAction duplicate = new DuplicateAction();
142 public final JosmAction delete = new DeleteAction();
143 public final JosmAction purge = new PurgeAction();
144 public final JosmAction merge = new MergeLayerAction();
145 public final JosmAction mergeSelected = new MergeSelectionAction();
146 public final JosmAction selectAll = new SelectAllAction();
147 public final JosmAction unselectAll = new UnselectAllAction();
148 public final JosmAction search = new SearchAction();
149 public final JosmAction preferences = new PreferencesAction();
150
151 /* View menu */
152 public final WireframeToggleAction wireFrameToggleAction = new WireframeToggleAction();
153 public final JosmAction toggleGPXLines = new ToggleGPXLinesAction();
154 public final InfoAction info = new InfoAction();
155 public final InfoWebAction infoweb = new InfoWebAction();
156 public final HistoryInfoAction historyinfo = new HistoryInfoAction();
157 public final HistoryInfoWebAction historyinfoweb = new HistoryInfoWebAction();
158
159 /* Tools menu */
160 public final JosmAction splitWay = new SplitWayAction();
161 public final JosmAction combineWay = new CombineWayAction();
162 public final JosmAction reverseWay = new ReverseWayAction();
163 public final JosmAction alignInCircle = new AlignInCircleAction();
164 public final JosmAction alignInLine = new AlignInLineAction();
165 public final JosmAction distribute = new DistributeAction();
166 public final OrthogonalizeAction ortho = new OrthogonalizeAction();
167 public final JosmAction orthoUndo = new Undo(); // action is not shown in the menu. Only triggered by shortcut
168 public final JosmAction mirror = new MirrorAction();
169 public final AddNodeAction addnode = new AddNodeAction();
170 public final MoveNodeAction movenode = new MoveNodeAction();
171 public final JosmAction createCircle = new CreateCircleAction();
172 public final JosmAction mergeNodes = new MergeNodesAction();
173 public final JosmAction joinNodeWay = new JoinNodeWayAction();
174 public final JosmAction unglueNodes = new UnGlueAction();
175 public final JosmAction simplifyWay = new SimplifyWayAction();
176 public final JosmAction joinAreas = new JoinAreasAction();
177 public final JosmAction createMultipolygon = new CreateMultipolygonAction();
178 public final JosmAction followLine = new FollowLineAction();
179
180 /* Audio menu */
181 public final JosmAction audioPlayPause = new AudioPlayPauseAction();
182 public final JosmAction audioNext = new AudioNextAction();
183 public final JosmAction audioPrev = new AudioPrevAction();
184 public final JosmAction audioFwd = new AudioFwdAction();
185 public final JosmAction audioBack = new AudioBackAction();
186 public final JosmAction audioFaster = new AudioFasterAction();
187 public final JosmAction audioSlower = new AudioSlowerAction();
188
189 /* Help menu */
190 public final HelpAction help = new HelpAction();
191 public final JosmAction about = new AboutAction();
192 public final JosmAction statusreport = new ShowStatusReportAction();
193
194 public final JMenu fileMenu = addMenu(marktr("File"), KeyEvent.VK_F, 0, ht("/Menu/File"));
195 public final JMenu sessionMenu = new JMenu(tr("Session")); // submenu of the file menu
196 public final JMenu editMenu = addMenu(marktr("Edit"), KeyEvent.VK_E, 1, ht("/Menu/Edit"));
197 public final JMenu viewMenu = addMenu(marktr("View"), KeyEvent.VK_V, 2, ht("/Menu/View"));
198 public final JMenu toolsMenu = addMenu(marktr("Tools"), KeyEvent.VK_T, 3, ht("/Menu/Tools"));
199 public final JMenu presetsMenu = addMenu(marktr("Presets"), KeyEvent.VK_P, 4, ht("/Menu/Presets"));
200 public final ImageryMenu imageryMenu =
201 (ImageryMenu)addMenu(new ImageryMenu(), marktr("Imagery"), KeyEvent.VK_I, 5, ht("/Menu/Imagery"));
202 /** the window menu is split into several groups. The first is for windows that can be opened from
203 * this menu any time, e.g. the changeset editor. The second group is for toggle dialogs and the third
204 * group is for currently open windows that cannot be toggled, e.g. relation editors. It's recommended
205 * to use WINDOW_MENU_GROUP to determine the group integer.
206 */
207 public final JMenu windowMenu = addMenu(marktr("Windows"), KeyEvent.VK_W, 6, ht("/Menu/Windows"));
208 public static enum WINDOW_MENU_GROUP { ALWAYS, TOGGLE_DIALOG, VOLATILE }
209
210 public JMenu audioMenu = null;
211 public final JMenu helpMenu = addMenu(marktr("Help"), KeyEvent.VK_H, 7, ht("/Menu/Help"));
212
213 public final int defaultMenuPos = 7;
214
215 public final JosmAction moveUpAction = new MoveAction(MoveAction.Direction.UP);
216 public final JosmAction moveDownAction = new MoveAction(MoveAction.Direction.DOWN);
217 public final JosmAction moveLeftAction = new MoveAction(MoveAction.Direction.LEFT);
218 public final JosmAction moveRightAction = new MoveAction(MoveAction.Direction.RIGHT);
219 public final JumpToAction jumpToAct = new JumpToAction();
220
221 public final TaggingPresetSearchAction presetSearchAction = new TaggingPresetSearchAction();
222 public FullscreenToggleAction fullscreenToggleAction = null;
223
224 /** this menu listener hides unnecessary JSeparators in a menu list but does not remove them.
225 * If at a later time the separators are required, they will be made visible again. Intended
226 * usage is make menus not look broken if separators are used to group the menu and some of
227 * these groups are empty.
228 */
229 public final static MenuListener menuSeparatorHandler = new MenuListener() {
230 @Override
231 public void menuCanceled(MenuEvent arg0) {}
232 @Override
233 public void menuDeselected(MenuEvent arg0) {}
234 @Override
235 public void menuSelected(MenuEvent a) {
236 if(!(a.getSource() instanceof JMenu))
237 return;
238 final JPopupMenu m = ((JMenu) a.getSource()).getPopupMenu();
239 for(int i=0; i < m.getComponentCount()-1; i++) {
240 if(!(m.getComponent(i) instanceof JSeparator)) {
241 continue;
242 }
243 // hide separator if the next menu item is one as well
244 ((JSeparator) m.getComponent(i)).setVisible(!(m.getComponent(i+1) instanceof JSeparator));
245 }
246 // hide separator at the end of the menu
247 if(m.getComponent(m.getComponentCount()-1) instanceof JSeparator) {
248 ((JSeparator) m.getComponent(m.getComponentCount()-1)).setVisible(false);
249 }
250 }
251 };
252
253 /**
254 * Add a JosmAction to a menu.
255 *
256 * This method handles all the shortcut handling. It also makes sure that actions that are
257 * handled by the OS are not duplicated on the menu. Menu item will be added at the end of
258 * the menu.
259 * @param menu to add the action to
260 * @param the action that should get a menu item
261 */
262 public static JMenuItem add(JMenu menu, JosmAction action) {
263 if (action.getShortcut().getAutomatic())
264 return null;
265 JMenuItem menuitem = menu.add(action);
266 KeyStroke ks = action.getShortcut().getKeyStroke();
267 if (ks != null) {
268 menuitem.setAccelerator(ks);
269 }
270 return menuitem;
271 }
272
273 /**
274 * Add a JosmAction to a menu.
275 *
276 * This method handles all the shortcut handling. It also makes sure that actions that are
277 * handled by the OS are not duplicated on the menu.
278 * @param menu to add the action to
279 * @param the action that should get a menu item
280 * @param group the item should be added to. Groups are split by a separator.
281 * 0 is the first group, -1 will add the item to the end.
282 */
283 public static <E extends Enum<E>> JMenuItem add(JMenu menu, JosmAction action, Enum<E> group) {
284 if (action.getShortcut().getAutomatic())
285 return null;
286 int i = getInsertionIndexForGroup(menu, group.ordinal());
287 JMenuItem menuitem = (JMenuItem) menu.add(new JMenuItem(action), i);
288 KeyStroke ks = action.getShortcut().getKeyStroke();
289 if (ks != null) {
290 menuitem.setAccelerator(ks);
291 }
292 return menuitem;
293 }
294
295 /**
296 * Add a JosmAction to a menu and automatically prints accelerator if available.
297 * Also adds a checkbox that may be toggled.
298 * @param menu to add the action to
299 * @param the action that should get a menu item
300 * @param group the item should be added to. Groups are split by a separator. Use
301 * one of the enums that are defined for some of the menus to tell in which
302 * group the item should go.
303 */
304 public static <E extends Enum<E>> JCheckBoxMenuItem addWithCheckbox(JMenu menu, JosmAction action, Enum<E> group) {
305 int i = getInsertionIndexForGroup(menu, group.ordinal());
306 final JCheckBoxMenuItem mi = (JCheckBoxMenuItem) menu.add(new JCheckBoxMenuItem(action), i);
307 final KeyStroke ks = action.getShortcut().getKeyStroke();
308 if (ks != null) {
309 mi.setAccelerator(ks);
310 }
311 return mi;
312 }
313
314 /** finds the correct insertion index for a given group and adds separators if necessary */
315 private static int getInsertionIndexForGroup(JMenu menu, int group) {
316 if(group < 0)
317 return -1;
318 // look for separator that *ends* the group (or stop at end of menu)
319 int i;
320 for(i=0; i < menu.getItemCount() && group >= 0; i++) {
321 if(menu.getItem(i) == null) {
322 group--;
323 }
324 }
325 // insert before separator that ends the group
326 if(group < 0) {
327 i--;
328 }
329 // not enough separators have been found, add them
330 while(group > 0) {
331 menu.addSeparator();
332 group--;
333 i++;
334 }
335 return i;
336 }
337
338 public JMenu addMenu(String name, int mnemonicKey, int position, String relativeHelpTopic) {
339 final JMenu menu = new JMenu(tr(name));
340 int screenHeight = Toolkit.getDefaultToolkit().getScreenSize().height;
341 int menuItemHeight = new JMenu().add(newAction).getPreferredSize().height;
342 MenuScroller.setScrollerFor(menu, screenHeight / menuItemHeight);
343 return addMenu(menu, name, mnemonicKey, position, relativeHelpTopic);
344 }
345
346 public JMenu addMenu(JMenu menu, String name, int mnemonicKey, int position, String relativeHelpTopic) {
347 Shortcut.registerShortcut("menu:" + name, tr("Menu: {0}", tr(name)), mnemonicKey,
348 Shortcut.GROUP_MNEMONIC).setMnemonic(menu);
349 add(menu, position);
350 menu.putClientProperty("help", relativeHelpTopic);
351 return menu;
352 }
353
354 public MainMenu() {
355 JMenuItem current;
356
357 add(fileMenu, newAction);
358 add(fileMenu, openFile);
359 fileMenu.add(recentlyOpened);
360 add(fileMenu, openLocation);
361 fileMenu.addSeparator();
362 add(fileMenu, save);
363 add(fileMenu, saveAs);
364 if (Main.pref.getBoolean("session")) {
365 sessionMenu.setToolTipText(tr("Save and load the current session (list of layers, etc.)"));
366 sessionMenu.setIcon(ImageProvider.get("session"));
367 add(sessionMenu, sessionLoad);
368 fileMenu.add(sessionMenu);
369 }
370 add(fileMenu, gpxExport);
371 fileMenu.addSeparator();
372 add(fileMenu, download);
373 add(fileMenu, downloadPrimitive);
374 add(fileMenu, downloadReferrers);
375 add(fileMenu, update);
376 add(fileMenu, updateSelection);
377 add(fileMenu, updateModified);
378 fileMenu.addSeparator();
379 add(fileMenu, upload);
380 add(fileMenu, uploadSelection);
381 fileMenu.addSeparator();
382 add(fileMenu, closeChangesetAction);
383 fileMenu.addSeparator();
384 add(fileMenu, exit);
385
386 add(editMenu, undo);
387 add(editMenu, redo);
388 editMenu.addSeparator();
389 add(editMenu, copy);
390 add(editMenu, copyCoordinates);
391 add(editMenu, paste);
392 add(editMenu, pasteTags);
393 add(editMenu, duplicate);
394 add(editMenu, delete);
395 add(editMenu, purge);
396 editMenu.addSeparator();
397 add(editMenu,merge);
398 add(editMenu,mergeSelected);
399 editMenu.addSeparator();
400 add(editMenu, selectAll);
401 add(editMenu, unselectAll);
402 editMenu.addSeparator();
403 add(editMenu, search);
404 editMenu.addSeparator();
405 add(editMenu, preferences);
406
407 // -- wireframe toggle action
408 final JCheckBoxMenuItem wireframe = new JCheckBoxMenuItem(wireFrameToggleAction);
409 viewMenu.add(wireframe);
410 wireframe.setAccelerator(wireFrameToggleAction.getShortcut().getKeyStroke());
411 wireFrameToggleAction.addButtonModel(wireframe.getModel());
412
413 viewMenu.addSeparator();
414 add(viewMenu, new ZoomInAction());
415 add(viewMenu, new ZoomOutAction());
416 viewMenu.addSeparator();
417 for (String mode : AutoScaleAction.MODES) {
418 JosmAction autoScaleAction = new AutoScaleAction(mode);
419 add(viewMenu, autoScaleAction);
420 }
421
422 // -- viewport follow toggle action
423 ViewportFollowToggleAction viewportFollowToggleAction = new ViewportFollowToggleAction();
424 final JCheckBoxMenuItem vft = new JCheckBoxMenuItem(viewportFollowToggleAction);
425 viewMenu.add(vft);
426 vft.setAccelerator(viewportFollowToggleAction.getShortcut().getKeyStroke());
427 viewportFollowToggleAction.addButtonModel(vft.getModel());
428
429 if(!Main.applet && Main.platform.canFullscreen()) {
430 // -- fullscreen toggle action
431 fullscreenToggleAction = new FullscreenToggleAction();
432 final JCheckBoxMenuItem fullscreen = new JCheckBoxMenuItem(fullscreenToggleAction);
433 viewMenu.addSeparator();
434 viewMenu.add(fullscreen);
435 fullscreen.setAccelerator(fullscreenToggleAction.getShortcut().getKeyStroke());
436 fullscreenToggleAction.addButtonModel(fullscreen.getModel());
437 }
438 viewMenu.addSeparator();
439 add(viewMenu, info);
440 add(viewMenu, infoweb);
441 add(viewMenu, historyinfo);
442 add(viewMenu, historyinfoweb);
443
444 add(presetsMenu, presetSearchAction);
445 presetsMenu.addSeparator();
446
447 add(toolsMenu, splitWay);
448 add(toolsMenu, combineWay);
449 toolsMenu.addSeparator();
450 add(toolsMenu, reverseWay);
451 add(toolsMenu, simplifyWay);
452 toolsMenu.addSeparator();
453 add(toolsMenu, alignInCircle);
454 add(toolsMenu, alignInLine);
455 add(toolsMenu, distribute);
456 add(toolsMenu, ortho);
457 add(toolsMenu, mirror);
458 toolsMenu.addSeparator();
459 add(toolsMenu, followLine);
460 add(toolsMenu, addnode);
461 add(toolsMenu, movenode);
462 add(toolsMenu, createCircle);
463 toolsMenu.addSeparator();
464 add(toolsMenu, mergeNodes);
465 add(toolsMenu, joinNodeWay);
466 add(toolsMenu, unglueNodes);
467 toolsMenu.addSeparator();
468 add(toolsMenu, joinAreas);
469 add(toolsMenu, createMultipolygon);
470
471 // -- changeset manager toggle action
472 ChangesetManagerToggleAction changesetManagerToggleAction = new ChangesetManagerToggleAction();
473 final JCheckBoxMenuItem mi = MainMenu.addWithCheckbox(windowMenu, changesetManagerToggleAction,
474 MainMenu.WINDOW_MENU_GROUP.ALWAYS);
475 changesetManagerToggleAction.addButtonModel(mi.getModel());
476
477
478 if (!Main.pref.getBoolean("audio.menuinvisible", false)) {
479 audioMenu = addMenu(marktr("Audio"), KeyEvent.VK_U, defaultMenuPos, ht("/Menu/Audio"));
480 add(audioMenu, audioPlayPause);
481 add(audioMenu, audioNext);
482 add(audioMenu, audioPrev);
483 add(audioMenu, audioFwd);
484 add(audioMenu, audioBack);
485 add(audioMenu, audioSlower);
486 add(audioMenu, audioFaster);
487 }
488
489 helpMenu.add(statusreport);
490
491 current = helpMenu.add(help); // FIXME why is help not a JosmAction?
492 current.setAccelerator(Shortcut.registerShortcut("system:help", tr("Help"), KeyEvent.VK_F1,
493 Shortcut.GROUP_DIRECT).getKeyStroke());
494 add(helpMenu, about);
495
496
497 windowMenu.addMenuListener(menuSeparatorHandler);
498
499 new PresetsMenuEnabler(presetsMenu).refreshEnabled();
500 }
501
502 static class PresetsMenuEnabler implements MapView.LayerChangeListener {
503 private JMenu presetsMenu;
504 public PresetsMenuEnabler(JMenu presetsMenu) {
505 MapView.addLayerChangeListener(this);
506 this.presetsMenu = presetsMenu;
507 }
508 /**
509 * Refreshes the enabled state
510 *
511 */
512 protected void refreshEnabled() {
513 presetsMenu.setEnabled(Main.map != null
514 && Main.map.mapView !=null
515 && Main.map.mapView.getEditLayer() != null
516 );
517 }
518
519 public void activeLayerChange(Layer oldLayer, Layer newLayer) {
520 refreshEnabled();
521 }
522
523 public void layerAdded(Layer newLayer) {
524 refreshEnabled();
525 }
526
527 public void layerRemoved(Layer oldLayer) {
528 refreshEnabled();
529 }
530 }
531}
Note: See TracBrowser for help on using the repository browser.