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

Last change on this file since 14206 was 14140, checked in by Don-vip, 6 years ago

see #15229 - move Main* termination methods to lifecycle SPI + new class MainTermination

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