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

Last change on this file since 2899 was 2899, checked in by mjulius, 14 years ago

new action: DownloadUrlAction
This opens a dialog to allow the user to enter a URL to download OSM data from.

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