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

Last change on this file since 3747 was 3737, checked in by Upliner, 13 years ago

make possible to place imagery offset action to the top toolbar and place it there by default; completely fixes #5726

  • Property svn:eol-style set to native
File size: 17.1 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.event.KeyEvent;
9
10import javax.swing.JCheckBoxMenuItem;
11import javax.swing.JMenu;
12import javax.swing.JMenuBar;
13import javax.swing.JMenuItem;
14import javax.swing.KeyStroke;
15
16import org.openstreetmap.josm.Main;
17import org.openstreetmap.josm.actions.AboutAction;
18import org.openstreetmap.josm.actions.AddNodeAction;
19import org.openstreetmap.josm.actions.AlignInCircleAction;
20import org.openstreetmap.josm.actions.AlignInLineAction;
21import org.openstreetmap.josm.actions.AutoScaleAction;
22import org.openstreetmap.josm.actions.ChangesetManagerToggleAction;
23import org.openstreetmap.josm.actions.CloseChangesetAction;
24import org.openstreetmap.josm.actions.CombineWayAction;
25import org.openstreetmap.josm.actions.CopyAction;
26import org.openstreetmap.josm.actions.CreateCircleAction;
27import org.openstreetmap.josm.actions.CreateMultipolygonAction;
28import org.openstreetmap.josm.actions.DeleteAction;
29import org.openstreetmap.josm.actions.DistributeAction;
30import org.openstreetmap.josm.actions.DownloadAction;
31import org.openstreetmap.josm.actions.DownloadPrimitiveAction;
32import org.openstreetmap.josm.actions.DownloadReferrersAction;
33import org.openstreetmap.josm.actions.DuplicateAction;
34import org.openstreetmap.josm.actions.ExitAction;
35import org.openstreetmap.josm.actions.FullscreenToggleAction;
36import org.openstreetmap.josm.actions.GpxExportAction;
37import org.openstreetmap.josm.actions.HelpAction;
38import org.openstreetmap.josm.actions.HistoryInfoAction;
39import org.openstreetmap.josm.actions.InfoAction;
40import org.openstreetmap.josm.actions.JoinAreasAction;
41import org.openstreetmap.josm.actions.JoinNodeWayAction;
42import org.openstreetmap.josm.actions.JosmAction;
43import org.openstreetmap.josm.actions.JumpToAction;
44import org.openstreetmap.josm.actions.MergeLayerAction;
45import org.openstreetmap.josm.actions.MergeNodesAction;
46import org.openstreetmap.josm.actions.MergeSelectionAction;
47import org.openstreetmap.josm.actions.MirrorAction;
48import org.openstreetmap.josm.actions.MoveAction;
49import org.openstreetmap.josm.actions.MoveNodeAction;
50import org.openstreetmap.josm.actions.NewAction;
51import org.openstreetmap.josm.actions.OpenFileAction;
52import org.openstreetmap.josm.actions.OpenLocationAction;
53import org.openstreetmap.josm.actions.OrthogonalizeAction;
54import org.openstreetmap.josm.actions.OrthogonalizeAction.Undo;
55import org.openstreetmap.josm.actions.PasteAction;
56import org.openstreetmap.josm.actions.PasteTagsAction;
57import org.openstreetmap.josm.actions.PreferencesAction;
58import org.openstreetmap.josm.actions.PurgeAction;
59import org.openstreetmap.josm.actions.RedoAction;
60import org.openstreetmap.josm.actions.ReverseWayAction;
61import org.openstreetmap.josm.actions.SaveAction;
62import org.openstreetmap.josm.actions.SaveAsAction;
63import org.openstreetmap.josm.actions.SelectAllAction;
64import org.openstreetmap.josm.actions.ShowStatusReportAction;
65import org.openstreetmap.josm.actions.SimplifyWayAction;
66import org.openstreetmap.josm.actions.SplitWayAction;
67import org.openstreetmap.josm.actions.ToggleGPXLinesAction;
68import org.openstreetmap.josm.actions.UnGlueAction;
69import org.openstreetmap.josm.actions.UndoAction;
70import org.openstreetmap.josm.actions.UnselectAllAction;
71import org.openstreetmap.josm.actions.UpdateDataAction;
72import org.openstreetmap.josm.actions.UpdateModifiedAction;
73import org.openstreetmap.josm.actions.UpdateSelectionAction;
74import org.openstreetmap.josm.actions.UploadAction;
75import org.openstreetmap.josm.actions.UploadSelectionAction;
76import org.openstreetmap.josm.actions.WireframeToggleAction;
77import org.openstreetmap.josm.actions.ZoomInAction;
78import org.openstreetmap.josm.actions.ZoomOutAction;
79import org.openstreetmap.josm.actions.audio.AudioBackAction;
80import org.openstreetmap.josm.actions.audio.AudioFasterAction;
81import org.openstreetmap.josm.actions.audio.AudioFwdAction;
82import org.openstreetmap.josm.actions.audio.AudioNextAction;
83import org.openstreetmap.josm.actions.audio.AudioPlayPauseAction;
84import org.openstreetmap.josm.actions.audio.AudioPrevAction;
85import org.openstreetmap.josm.actions.audio.AudioSlowerAction;
86import org.openstreetmap.josm.actions.search.SearchAction;
87import org.openstreetmap.josm.gui.io.RecentlyOpenedFilesMenu;
88import org.openstreetmap.josm.gui.layer.Layer;
89import org.openstreetmap.josm.gui.tagging.TaggingPresetSearchAction;
90import org.openstreetmap.josm.tools.Shortcut;
91
92/**
93 * This is the JOSM main menu bar. It is overwritten to initialize itself and provide all menu
94 * entries as member variables (sort of collect them).
95 *
96 * It also provides possibilities to attach new menu entries (used by plugins).
97 *
98 * @author Immanuel.Scholz
99 */
100public class MainMenu extends JMenuBar {
101
102 /* File menu */
103 public final NewAction newAction = new NewAction();
104 public final OpenFileAction openFile = new OpenFileAction();
105 public final RecentlyOpenedFilesMenu recentlyOpened = new RecentlyOpenedFilesMenu();
106 public final OpenLocationAction openLocation = new OpenLocationAction();
107 public final JosmAction save = new SaveAction();
108 public final JosmAction saveAs = new SaveAsAction();
109 public final JosmAction gpxExport = new GpxExportAction();
110 public final DownloadAction download = new DownloadAction();
111 public final DownloadPrimitiveAction downloadPrimitive = new DownloadPrimitiveAction();
112 public final DownloadReferrersAction downloadReferrers = new DownloadReferrersAction();
113 public final CloseChangesetAction closeChangesetAction = new CloseChangesetAction();
114 public final JosmAction update = new UpdateDataAction();
115 public final JosmAction updateSelection = new UpdateSelectionAction();
116 public final JosmAction updateModified = new UpdateModifiedAction();
117 public final JosmAction upload = new UploadAction();
118 public final JosmAction uploadSelection = new UploadSelectionAction();
119 public final JosmAction exit = new ExitAction();
120
121 /* Edit menu */
122 public final UndoAction undo = new UndoAction();
123 public final RedoAction redo = new RedoAction();
124 public final JosmAction copy = new CopyAction();
125 public final JosmAction paste = new PasteAction();
126 public final JosmAction pasteTags = new PasteTagsAction();
127 public final JosmAction duplicate = new DuplicateAction();
128 public final JosmAction delete = new DeleteAction();
129 public final JosmAction purge = new PurgeAction();
130 public final JosmAction merge = new MergeLayerAction();
131 public final JosmAction mergeSelected = new MergeSelectionAction();
132 public final JosmAction selectAll = new SelectAllAction();
133 public final JosmAction unselectAll = new UnselectAllAction();
134 /* crashes when loading data, if using JosmAction for search */
135 public final JosmAction search = new SearchAction();
136 public final JosmAction preferences = new PreferencesAction();
137
138 /* View menu */
139 public final JosmAction toggleGPXLines = new ToggleGPXLinesAction();
140 public final InfoAction info = new InfoAction();
141 public final HistoryInfoAction historyinfo = new HistoryInfoAction();
142
143 /* Tools menu */
144 public final JosmAction splitWay = new SplitWayAction();
145 public final JosmAction combineWay = new CombineWayAction();
146 public final JosmAction reverseWay = new ReverseWayAction();
147 public final JosmAction alignInCircle = new AlignInCircleAction();
148 public final JosmAction alignInLine = new AlignInLineAction();
149 public final JosmAction distribute = new DistributeAction();
150 public final OrthogonalizeAction ortho = new OrthogonalizeAction();
151 public final JosmAction orthoUndo = new Undo(); // action is not shown in the menu. Only triggered by shortcut
152 public final JosmAction mirror = new MirrorAction();
153 public final AddNodeAction addnode = new AddNodeAction();
154 public final MoveNodeAction movenode = new MoveNodeAction();
155 public final JosmAction createCircle = new CreateCircleAction();
156 public final JosmAction mergeNodes = new MergeNodesAction();
157 public final JosmAction joinNodeWay = new JoinNodeWayAction();
158 public final JosmAction unglueNodes = new UnGlueAction();
159 public final JosmAction simplifyWay = new SimplifyWayAction();
160 public final JosmAction joinAreas = new JoinAreasAction();
161 public final JosmAction createMultipolygon = new CreateMultipolygonAction();
162
163 /* Audio menu */
164 public final JosmAction audioPlayPause = new AudioPlayPauseAction();
165 public final JosmAction audioNext = new AudioNextAction();
166 public final JosmAction audioPrev = new AudioPrevAction();
167 public final JosmAction audioFwd = new AudioFwdAction();
168 public final JosmAction audioBack = new AudioBackAction();
169 public final JosmAction audioFaster = new AudioFasterAction();
170 public final JosmAction audioSlower = new AudioSlowerAction();
171
172 /* Help menu */
173 public final HelpAction help = new HelpAction();
174 public final JosmAction about = new AboutAction();
175 public final JosmAction statusreport = new ShowStatusReportAction();
176
177 public final JMenu fileMenu = addMenu(marktr("File"), KeyEvent.VK_F, 0, ht("/Menu/File"));
178 public final JMenu editMenu = addMenu(marktr("Edit"), KeyEvent.VK_E, 1, ht("/Menu/Edit"));
179 public final JMenu viewMenu = addMenu(marktr("View"), KeyEvent.VK_V, 2, ht("/Menu/View"));
180 public final JMenu toolsMenu = addMenu(marktr("Tools"), KeyEvent.VK_T, 3, ht("/Menu/Tools"));
181 public final JMenu presetsMenu = addMenu(marktr("Presets"), KeyEvent.VK_P, 4, ht("/Menu/Presets"));
182 public final ImageryMenu imageryMenu =
183 (ImageryMenu)addMenu(new ImageryMenu(), marktr("Imagery"), KeyEvent.VK_I, 5, ht("/Menu/Imagery"));
184 public JMenu audioMenu = null;
185 public final JMenu helpMenu = addMenu(marktr("Help"), KeyEvent.VK_H, 6, ht("/Menu/Help"));
186 public final int defaultMenuPos = 6;
187
188 public final JosmAction moveUpAction = new MoveAction(MoveAction.Direction.UP);
189 public final JosmAction moveDownAction = new MoveAction(MoveAction.Direction.DOWN);
190 public final JosmAction moveLeftAction = new MoveAction(MoveAction.Direction.LEFT);
191 public final JosmAction moveRightAction = new MoveAction(MoveAction.Direction.RIGHT);
192 public final JumpToAction jumpToAct = new JumpToAction();
193
194 public final TaggingPresetSearchAction presetSearchAction = new TaggingPresetSearchAction();
195
196 /**
197 * Add a JosmAction to a menu.
198 *
199 * This method handles all the shortcut handling. It also makes sure that actions that are
200 * handled by the OS are not duplicated on the menu.
201 */
202 public static JMenuItem add(JMenu menu, JosmAction action) {
203 JMenuItem menuitem = null;
204 if (!action.getShortcut().getAutomatic()) {
205 menuitem = menu.add(action);
206 KeyStroke ks = action.getShortcut().getKeyStroke();
207 if (ks != null) {
208 menuitem.setAccelerator(ks);
209 }
210 }
211 return menuitem;
212 }
213
214 public JMenu addMenu(String name, int mnemonicKey, int position, String relativeHelpTopic) {
215 return addMenu(new JMenu(tr(name)), name, mnemonicKey, position, relativeHelpTopic);
216 }
217
218 public JMenu addMenu(JMenu menu, String name, int mnemonicKey, int position, String relativeHelpTopic) {
219 Shortcut.registerShortcut("menu:" + name, tr("Menu: {0}", tr(name)), mnemonicKey,
220 Shortcut.GROUP_MNEMONIC).setMnemonic(menu);
221 add(menu, position);
222 menu.putClientProperty("help", relativeHelpTopic);
223 return menu;
224 }
225
226 public MainMenu() {
227 JMenuItem current;
228
229 add(fileMenu, newAction);
230 add(fileMenu, openFile);
231 fileMenu.add(recentlyOpened);
232 add(fileMenu, openLocation);
233 fileMenu.addSeparator();
234 add(fileMenu, save);
235 add(fileMenu, saveAs);
236 add(fileMenu, gpxExport);
237 fileMenu.addSeparator();
238 add(fileMenu, download);
239 add(fileMenu, downloadPrimitive);
240 add(fileMenu, downloadReferrers);
241 add(fileMenu, update);
242 add(fileMenu, updateSelection);
243 add(fileMenu, updateModified);
244 fileMenu.addSeparator();
245 add(fileMenu, upload);
246 add(fileMenu, uploadSelection);
247 fileMenu.addSeparator();
248 add(fileMenu, closeChangesetAction);
249 fileMenu.addSeparator();
250 add(fileMenu, exit);
251
252 add(editMenu, undo);
253 add(editMenu, redo);
254 editMenu.addSeparator();
255 add(editMenu, copy);
256 add(editMenu, paste);
257 add(editMenu, pasteTags);
258 add(editMenu, duplicate);
259 add(editMenu, delete);
260 add(editMenu, purge);
261 editMenu.addSeparator();
262 add(editMenu,merge);
263 add(editMenu,mergeSelected);
264 editMenu.addSeparator();
265 add(editMenu, selectAll);
266 add(editMenu, unselectAll);
267 editMenu.addSeparator();
268 add(editMenu, search);
269 editMenu.addSeparator();
270 add(editMenu, preferences);
271
272 // -- wireframe toggle action
273 WireframeToggleAction wireFrameToggleAction = new WireframeToggleAction();
274 final JCheckBoxMenuItem wireframe = new JCheckBoxMenuItem(wireFrameToggleAction);
275 viewMenu.add(wireframe);
276 wireframe.setAccelerator(wireFrameToggleAction.getShortcut().getKeyStroke());
277 wireFrameToggleAction.addButtonModel(wireframe.getModel());
278
279 viewMenu.addSeparator();
280 add(viewMenu, new ZoomInAction());
281 add(viewMenu, new ZoomOutAction());
282 viewMenu.addSeparator();
283 for (String mode : AutoScaleAction.MODES) {
284 JosmAction autoScaleAction = new AutoScaleAction(mode);
285 add(viewMenu, autoScaleAction);
286 }
287
288 // -- changeset manager toggle action
289 ChangesetManagerToggleAction changesetManagerToggleAction = new ChangesetManagerToggleAction();
290 final JCheckBoxMenuItem mi = new JCheckBoxMenuItem(changesetManagerToggleAction);
291 viewMenu.addSeparator();
292 viewMenu.add(mi);
293 mi.setAccelerator(changesetManagerToggleAction.getShortcut().getKeyStroke());
294 changesetManagerToggleAction.addButtonModel(mi.getModel());
295
296 // -- fullscreen toggle action
297 FullscreenToggleAction fullscreenToggleAction = new FullscreenToggleAction();
298 if (fullscreenToggleAction.canFullscreen()) {
299 final JCheckBoxMenuItem fullscreen = new JCheckBoxMenuItem(fullscreenToggleAction);
300 viewMenu.addSeparator();
301 viewMenu.add(fullscreen);
302 fullscreen.setAccelerator(fullscreenToggleAction.getShortcut().getKeyStroke());
303 fullscreenToggleAction.addButtonModel(fullscreen.getModel());
304 }
305 viewMenu.addSeparator();
306 add(viewMenu, info);
307 add(viewMenu, historyinfo);
308
309 add(presetsMenu, presetSearchAction);
310
311 add(toolsMenu, splitWay);
312 add(toolsMenu, combineWay);
313 toolsMenu.addSeparator();
314 add(toolsMenu, reverseWay);
315 add(toolsMenu, simplifyWay);
316 toolsMenu.addSeparator();
317 add(toolsMenu, alignInCircle);
318 add(toolsMenu, alignInLine);
319 add(toolsMenu, distribute);
320 add(toolsMenu, ortho);
321 add(toolsMenu, mirror);
322 toolsMenu.addSeparator();
323 add(toolsMenu, addnode);
324 add(toolsMenu, movenode);
325 add(toolsMenu, createCircle);
326 toolsMenu.addSeparator();
327 add(toolsMenu, mergeNodes);
328 add(toolsMenu, joinNodeWay);
329 add(toolsMenu, unglueNodes);
330 toolsMenu.addSeparator();
331 add(toolsMenu, joinAreas);
332 add(toolsMenu, createMultipolygon);
333
334 if (!Main.pref.getBoolean("audio.menuinvisible", false)) {
335 audioMenu = addMenu(marktr("Audio"), KeyEvent.VK_A, defaultMenuPos, ht("/Menu/Audio"));
336 add(audioMenu, audioPlayPause);
337 add(audioMenu, audioNext);
338 add(audioMenu, audioPrev);
339 add(audioMenu, audioFwd);
340 add(audioMenu, audioBack);
341 add(audioMenu, audioSlower);
342 add(audioMenu, audioFaster);
343 }
344
345 helpMenu.add(statusreport);
346
347 current = helpMenu.add(help); // FIXME why is help not a JosmAction?
348 current.setAccelerator(Shortcut.registerShortcut("system:help", tr("Help"), KeyEvent.VK_F1,
349 Shortcut.GROUP_DIRECT).getKeyStroke());
350 add(helpMenu, about);
351
352 new PresetsMenuEnabler(presetsMenu).refreshEnabled();
353 }
354
355 static class PresetsMenuEnabler implements MapView.LayerChangeListener {
356 private JMenu presetsMenu;
357 public PresetsMenuEnabler(JMenu presetsMenu) {
358 MapView.addLayerChangeListener(this);
359 this.presetsMenu = presetsMenu;
360 }
361 /**
362 * Refreshes the enabled state
363 *
364 */
365 protected void refreshEnabled() {
366 presetsMenu.setEnabled(Main.map != null
367 && Main.map.mapView !=null
368 && Main.map.mapView.getEditLayer() != null
369 );
370 }
371
372 public void activeLayerChange(Layer oldLayer, Layer newLayer) {
373 refreshEnabled();
374 }
375
376 public void layerAdded(Layer newLayer) {
377 refreshEnabled();
378 }
379
380 public void layerRemoved(Layer oldLayer) {
381 refreshEnabled();
382 }
383 }
384}
Note: See TracBrowser for help on using the repository browser.