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

Last change on this file since 5086 was 5086, checked in by simon04, 12 years ago

fix #6895 - Add Map Paint Styles to View menu

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