source: josm/trunk/src/org/openstreetmap/josm/gui/MainInitialization.java@ 17318

Last change on this file since 17318 was 17188, checked in by Klumbumbus, 4 years ago

fix #19851 - Fix shortcut names

  • Property svn:eol-style set to native
File size: 8.2 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.BorderLayout;
7import java.awt.event.KeyEvent;
8import java.util.Arrays;
9import java.util.Collection;
10import java.util.Collections;
11import java.util.List;
12import java.util.Objects;
13import java.util.concurrent.Callable;
14
15import org.openstreetmap.gui.jmapviewer.FeatureAdapter;
16import org.openstreetmap.gui.jmapviewer.FeatureAdapter.SettingsAdapter;
17import org.openstreetmap.josm.data.UndoRedoHandler;
18import org.openstreetmap.josm.data.coor.conversion.CoordinateFormatManager;
19import org.openstreetmap.josm.data.coor.conversion.DecimalDegreesCoordinateFormat;
20import org.openstreetmap.josm.data.coor.conversion.ICoordinateFormat;
21import org.openstreetmap.josm.data.validation.OsmValidator;
22import org.openstreetmap.josm.gui.layer.ImageryLayer;
23import org.openstreetmap.josm.gui.layer.TMSLayer;
24import org.openstreetmap.josm.gui.preferences.imagery.ImageryPreference;
25import org.openstreetmap.josm.gui.preferences.map.MapPaintPreference;
26import org.openstreetmap.josm.gui.tagging.presets.TaggingPresets;
27import org.openstreetmap.josm.gui.util.GuiHelper;
28import org.openstreetmap.josm.io.FileWatcher;
29import org.openstreetmap.josm.io.OsmApi;
30import org.openstreetmap.josm.io.OsmApiInitializationException;
31import org.openstreetmap.josm.io.OsmTransferCanceledException;
32import org.openstreetmap.josm.io.imagery.ApiKeyProvider;
33import org.openstreetmap.josm.spi.lifecycle.InitializationSequence;
34import org.openstreetmap.josm.spi.lifecycle.InitializationTask;
35import org.openstreetmap.josm.spi.preferences.Config;
36import org.openstreetmap.josm.tools.I18n;
37import org.openstreetmap.josm.tools.ImageProvider;
38import org.openstreetmap.josm.tools.Logging;
39import org.openstreetmap.josm.tools.OpenBrowser;
40import org.openstreetmap.josm.tools.PlatformManager;
41import org.openstreetmap.josm.tools.Shortcut;
42import org.openstreetmap.josm.tools.Tag2Link;
43import org.openstreetmap.josm.tools.Territories;
44import org.openstreetmap.josm.tools.Utils;
45
46/**
47 * JOSM initialization sequence.
48 * @since 14139
49 */
50public class MainInitialization implements InitializationSequence {
51
52 private final MainApplication application;
53
54 /**
55 * Constructs a new {@code MainInitialization}
56 * @param application Main application. Must not be null
57 */
58 public MainInitialization(MainApplication application) {
59 this.application = Objects.requireNonNull(application);
60 }
61
62 @Override
63 public List<InitializationTask> beforeInitializationTasks() {
64 return Arrays.asList(
65 new InitializationTask(tr("Initializing coordinate format"), () -> {
66 ICoordinateFormat fmt = CoordinateFormatManager.getCoordinateFormat(Config.getPref().get("coordinates"));
67 if (fmt == null) {
68 fmt = DecimalDegreesCoordinateFormat.INSTANCE;
69 }
70 CoordinateFormatManager.setCoordinateFormat(fmt);
71 }),
72 new InitializationTask(tr("Starting file watcher"), FileWatcher.getDefaultInstance()::start),
73 new InitializationTask(tr("Executing platform startup hook"),
74 () -> PlatformManager.getPlatform().startupHook(MainApplication::askUpdateJava)),
75 new InitializationTask(tr("Building main menu"), application::initializeMainWindow),
76 new InitializationTask(tr("Updating user interface"), () -> {
77 UndoRedoHandler.getInstance().addCommandQueueListener(application.redoUndoListener);
78 // creating toolbar
79 GuiHelper.runInEDTAndWait(() -> MainApplication.contentPanePrivate.add(MainApplication.toolbar.control, BorderLayout.NORTH));
80 // help shortcut
81 MainApplication.registerActionShortcut(MainApplication.menu.help,
82 Shortcut.registerShortcut("system:help", tr("Help: {0}", tr("Help")), KeyEvent.VK_F1, Shortcut.DIRECT));
83 }),
84 new InitializationTask(tr("Initializing internal boundaries data"), () -> {
85 Territories.initialize();
86 if (Config.getPref().getBoolean("override.numbering.format", true)) {
87 I18n.initializeNumberingFormat();
88 }
89 })
90 );
91 }
92
93 @Override
94 public Collection<InitializationTask> parallelInitializationTasks() {
95 return Arrays.asList(
96 new InitializationTask(tr("Initializing OSM API"), () -> {
97 OsmApi.addOsmApiInitializationListener(api -> {
98 // This checks if there are any layers currently displayed that are now on the blacklist, and removes them.
99 // This is a rare situation - probably only occurs if the user changes the API URL in the preferences menu.
100 // Otherwise they would not have been able to load the layers in the first place because they would have been disabled
101 if (MainApplication.isDisplayingMapView()) {
102 for (ImageryLayer l : MainApplication.getLayerManager().getLayersOfType(ImageryLayer.class)) {
103 if (l.getInfo().isBlacklisted()) {
104 Logging.info(tr("Removed layer {0} because it is not allowed by the configured API.", l.getName()));
105 MainApplication.getLayerManager().removeLayer(l);
106 }
107 }
108 }
109 });
110 // We try to establish an API connection early, so that any API
111 // capabilities are already known to the editor instance. However
112 // if it goes wrong that's not critical at this stage.
113 try {
114 OsmApi.getOsmApi().initialize(null, true);
115 } catch (OsmTransferCanceledException | OsmApiInitializationException | SecurityException e) {
116 Logging.warn(Logging.getErrorMessage(Utils.getRootCause(e)));
117 }
118 }),
119 new InitializationTask(tr("Initializing validator"), OsmValidator::initialize),
120 new InitializationTask(tr("Initializing presets"), TaggingPresets::initialize),
121 new InitializationTask(tr("Initializing map styles"), MapPaintPreference::initialize),
122 new InitializationTask(tr("Initializing Tag2Link rules"), Tag2Link::initialize),
123 new InitializationTask(tr("Loading imagery preferences"), ImageryPreference::initialize)
124 );
125 }
126
127 @Override
128 public List<Callable<?>> asynchronousCallableTasks() {
129 return Collections.emptyList();
130 }
131
132 @Override
133 public List<Runnable> asynchronousRunnableTasks() {
134 return Arrays.asList(
135 TMSLayer::getCache,
136 OsmValidator::initializeTests
137 );
138 }
139
140 @Override
141 public List<InitializationTask> afterInitializationTasks() {
142 return Arrays.asList(
143 new InitializationTask(tr("Updating user interface"), () -> GuiHelper.runInEDTAndWait(() -> {
144 // hooks for the jmapviewer component
145 FeatureAdapter.registerApiKeyAdapter(ApiKeyProvider::retrieveApiKey);
146 FeatureAdapter.registerBrowserAdapter(OpenBrowser::displayUrl);
147 FeatureAdapter.registerImageAdapter(ImageProvider::read);
148 FeatureAdapter.registerTranslationAdapter(I18n::tr);
149 FeatureAdapter.registerLoggingAdapter(name -> Logging.getLogger());
150 FeatureAdapter.registerSettingsAdapter(new JosmSettingsAdapter());
151 // UI update
152 MainApplication.toolbar.refreshToolbarControl();
153 MainApplication.toolbar.control.updateUI();
154 MainApplication.contentPanePrivate.updateUI();
155 }))
156 );
157 }
158
159 private static class JosmSettingsAdapter implements SettingsAdapter {
160
161 @Override
162 public String get(String key, String def) {
163 return Config.getPref().get(key, def);
164 }
165
166 @Override
167 public boolean put(String key, String value) {
168 return Config.getPref().put(key, value);
169 }
170 }
171}
Note: See TracBrowser for help on using the repository browser.