source: josm/trunk/src/org/openstreetmap/josm/gui/MainApplication.java@ 5201

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

see #4421 - command line argument --load-preferences= to apply settings on JOSM start

  • Property svn:eol-style set to native
File size: 14.9 KB
Line 
1// License: GPL. Copyright 2007 by Immanuel Scholz and others
2package org.openstreetmap.josm.gui;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5import static org.openstreetmap.josm.tools.I18n.trn;
6
7import java.awt.Image;
8import java.awt.Toolkit;
9import java.awt.event.ActionEvent;
10import java.awt.event.WindowAdapter;
11import java.awt.event.WindowEvent;
12import java.io.File;
13import java.net.Authenticator;
14import java.net.ProxySelector;
15import java.net.URL;
16import java.security.AllPermission;
17import java.security.CodeSource;
18import java.security.PermissionCollection;
19import java.security.Permissions;
20import java.security.Policy;
21import java.util.Collection;
22import java.util.HashMap;
23import java.util.LinkedList;
24import java.util.List;
25import java.util.Map;
26
27import javax.swing.JFrame;
28import javax.swing.RepaintManager;
29import javax.swing.SwingUtilities;
30
31import org.jdesktop.swinghelper.debug.CheckThreadViolationRepaintManager;
32import org.openstreetmap.josm.Main;
33import org.openstreetmap.josm.data.AutosaveTask;
34import org.openstreetmap.josm.data.CustomConfigurator;
35import org.openstreetmap.josm.data.Preferences;
36import org.openstreetmap.josm.data.Version;
37import org.openstreetmap.josm.gui.download.DownloadDialog;
38import org.openstreetmap.josm.gui.preferences.server.OAuthAccessTokenHolder;
39import org.openstreetmap.josm.gui.progress.ProgressMonitor;
40import org.openstreetmap.josm.io.DefaultProxySelector;
41import org.openstreetmap.josm.io.auth.CredentialsManager;
42import org.openstreetmap.josm.io.auth.DefaultAuthenticator;
43import org.openstreetmap.josm.io.remotecontrol.RemoteControl;
44import org.openstreetmap.josm.plugins.PluginHandler;
45import org.openstreetmap.josm.plugins.PluginInformation;
46import org.openstreetmap.josm.tools.BugReportExceptionHandler;
47import org.openstreetmap.josm.tools.I18n;
48import org.openstreetmap.josm.tools.ImageProvider;
49
50/**
51 * Main window class application.
52 *
53 * @author imi
54 */
55public class MainApplication extends Main {
56 /**
57 * Allow subclassing (see JOSM.java)
58 */
59 public MainApplication() {}
60
61 /**
62 * Construct an main frame, ready sized and operating. Does not
63 * display the frame.
64 */
65 public MainApplication(JFrame mainFrame) {
66 super();
67 mainFrame.setContentPane(contentPanePrivate);
68 mainFrame.setJMenuBar(menu);
69 geometry.applySafe(mainFrame);
70 LinkedList<Image> l = new LinkedList<Image>();
71 l.add(ImageProvider.get("logo_16x16x32").getImage());
72 l.add(ImageProvider.get("logo_16x16x8").getImage());
73 l.add(ImageProvider.get("logo_32x32x32").getImage());
74 l.add(ImageProvider.get("logo_32x32x8").getImage());
75 l.add(ImageProvider.get("logo_48x48x32").getImage());
76 l.add(ImageProvider.get("logo_48x48x8").getImage());
77 l.add(ImageProvider.get("logo").getImage());
78 mainFrame.setIconImages(l);
79 mainFrame.addWindowListener(new WindowAdapter(){
80 @Override public void windowClosing(final WindowEvent arg0) {
81 Main.exitJosm(true);
82 }
83 });
84 mainFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
85 }
86
87 /**
88 * Displays help on the console
89 *
90 */
91 public static void showHelp() {
92 // TODO: put in a platformHook for system that have no console by default
93 System.out.println(tr("Java OpenStreetMap Editor")+"\n\n"+
94 tr("usage")+":\n"+
95 "\tjava -jar josm.jar <options>...\n\n"+
96 tr("options")+":\n"+
97 "\t--help|-?|-h "+tr("Show this help")+"\n"+
98 "\t--geometry=widthxheight(+|-)x(+|-)y "+tr("Standard unix geometry argument")+"\n"+
99 "\t[--download=]minlat,minlon,maxlat,maxlon "+tr("Download the bounding box")+"\n"+
100 "\t[--download=]<url> "+tr("Download the location at the url (with lat=x&lon=y&zoom=z)")+"\n"+
101 "\t[--download=]<filename> "+tr("Open a file (any file type that can be opened with File/Open)")+"\n"+
102 "\t--downloadgps=minlat,minlon,maxlat,maxlon "+tr("Download the bounding box as raw gps")+"\n"+
103 "\t--downloadgps=<url> "+tr("Download the location at the url (with lat=x&lon=y&zoom=z) as raw gps")+"\n"+
104 "\t--selection=<searchstring> "+tr("Select with the given search")+"\n"+
105 "\t--[no-]maximize "+tr("Launch in maximized mode")+"\n"+
106 "\t--reset-preferences "+tr("Reset the preferences to default")+"\n\n"+
107 "\t--load-preferences=<url-to-xml> "+tr("Changes preferences according to the XML file")+"\n\n"+
108 "\t--set=<key>=<value> "+tr("Set preference key to value")+"\n\n"+
109 "\t--language=<language> "+tr("Set the language")+"\n\n"+
110 tr("options provided as Java system properties")+":\n"+
111 "\t-Djosm.home="+tr("/PATH/TO/JOSM/FOLDER/ ")+tr("Change the folder for all user settings")+"\n\n"+
112 tr("note: For some tasks, JOSM needs a lot of memory. It can be necessary to add the following\n" +
113 " Java option to specify the maximum size of allocated memory in megabytes")+":\n"+
114 "\t-Xmx...m\n\n"+
115 tr("examples")+":\n"+
116 "\tjava -jar josm.jar track1.gpx track2.gpx london.osm\n"+
117 "\tjava -jar josm.jar http://www.openstreetmap.org/index.html?lat=43.2&lon=11.1&zoom=13\n"+
118 "\tjava -jar josm.jar london.osm --selection=http://www.ostertag.name/osm/OSM_errors_node-duplicate.xml\n"+
119 "\tjava -jar josm.jar 43.2,11.1,43.4,11.4\n"+
120 "\tjava -Djosm.home=/home/user/.josm_dev -jar josm.jar\n"+
121 "\tjava -Xmx400m -jar josm.jar\n\n"+
122 tr("Parameters --download, --downloadgps, and --selection are processed in this order.")+"\n"+
123 tr("Make sure you load some data if you use --selection.")+"\n"
124 );
125 }
126
127 private static Map<String, Collection<String>> buildCommandLineArgumentMap(String[] args) {
128 Map<String, Collection<String>> argMap = new HashMap<String, Collection<String>>();
129 for (String arg : args) {
130 if ("-h".equals(arg) || "-?".equals(arg)) {
131 arg = "--help";
132 } else if ("-v".equals(arg)) {
133 arg = "--version";
134 }
135 // handle simple arguments like file names, URLs, bounds
136 if (!arg.startsWith("--")) {
137 arg = "--download="+arg;
138 }
139 int i = arg.indexOf('=');
140 String key = i == -1 ? arg.substring(2) : arg.substring(2,i);
141 String value = i == -1 ? "" : arg.substring(i+1);
142 Collection<String> v = argMap.get(key);
143 if (v == null) {
144 v = new LinkedList<String>();
145 }
146 v.add(value);
147 argMap.put(key, v);
148 }
149 return argMap;
150 }
151
152 /**
153 * Main application Startup
154 */
155 public static void main(final String[] argArray) {
156 I18n.init();
157 Main.checkJava6();
158 Main.pref = new Preferences();
159
160 Policy.setPolicy(new Policy() {
161 // Permissions for plug-ins loaded when josm is started via webstart
162 private PermissionCollection pc;
163
164 {
165 pc = new Permissions();
166 pc.add(new AllPermission());
167 }
168
169 @Override
170 public void refresh() { }
171
172 @Override
173 public PermissionCollection getPermissions(CodeSource codesource) {
174 return pc;
175 }
176 });
177
178 Thread.setDefaultUncaughtExceptionHandler(new BugReportExceptionHandler());
179 // http://stuffthathappens.com/blog/2007/10/15/one-more-note-on-uncaught-exception-handlers/
180 System.setProperty("sun.awt.exception.handler", BugReportExceptionHandler.class.getName());
181
182 // initialize the platform hook, and
183 Main.determinePlatformHook();
184 // call the really early hook before we do anything else
185 Main.platform.preStartupHook();
186
187 // construct argument table
188 final Map<String, Collection<String>> args = buildCommandLineArgumentMap(argArray);
189
190 if (args.containsKey("version")) {
191 System.out.println(Version.getInstance().getAgentString());
192 System.exit(0);
193 } else {
194 System.out.println(Version.getInstance().getReleaseAttributes());
195 }
196
197 Main.pref.init(args.containsKey("reset-preferences"));
198
199 // Check if passed as parameter
200 if (args.containsKey("language")) {
201 I18n.set(args.get("language").iterator().next());
202 } else {
203 I18n.set(Main.pref.get("language", null));
204 }
205 Main.pref.updateSystemProperties();
206
207 JFrame mainFrame = new JFrame(tr("Java OpenStreetMap Editor"));
208 Main.parent = mainFrame;
209
210 if (args.containsKey("load-preferences")) {
211 CustomConfigurator.XMLCommandProcessor config = new CustomConfigurator.XMLCommandProcessor(Main.pref);
212 for (String i : args.get("load-preferences")) {
213 System.out.println("Reading preferences from " + i);
214 try {
215 URL url = new URL(i);
216 config.openAndReadXML(url.openStream());
217 } catch (Exception ex) {
218 throw new RuntimeException(ex);
219 }
220 }
221 }
222
223 if (args.containsKey("set")) {
224 for (String i : args.get("set")) {
225 String[] kv = i.split("=", 2);
226 Main.pref.put(kv[0], "null".equals(kv[1]) ? null : kv[1]);
227 }
228 }
229
230 DefaultAuthenticator.createInstance();
231 Authenticator.setDefault(DefaultAuthenticator.getInstance());
232 ProxySelector.setDefault(new DefaultProxySelector(ProxySelector.getDefault()));
233 OAuthAccessTokenHolder.getInstance().init(Main.pref, CredentialsManager.getInstance());
234
235 // asking for help? show help and exit
236 if (args.containsKey("help")) {
237 showHelp();
238 System.exit(0);
239 }
240
241 SplashScreen splash = new SplashScreen();
242 final ProgressMonitor monitor = splash.getProgressMonitor();
243 monitor.beginTask(tr("Initializing"));
244 splash.setVisible(Main.pref.getBoolean("draw.splashscreen", true));
245 Main.setInitStatusListener(new InitStatusListener() {
246
247 @Override
248 public void updateStatus(String event) {
249 monitor.indeterminateSubTask(event);
250 }
251 });
252
253 List<PluginInformation> pluginsToLoad = PluginHandler.buildListOfPluginsToLoad(splash,monitor.createSubTaskMonitor(1, false));
254 if (!pluginsToLoad.isEmpty() && PluginHandler.checkAndConfirmPluginUpdate(splash)) {
255 monitor.subTask(tr("Updating plugins"));
256 pluginsToLoad = PluginHandler.updatePlugins(splash,pluginsToLoad, monitor.createSubTaskMonitor(1, false));
257 }
258
259 monitor.indeterminateSubTask(tr("Installing updated plugins"));
260 PluginHandler.installDownloadedPlugins(true);
261
262 monitor.indeterminateSubTask(tr("Loading early plugins"));
263 PluginHandler.loadEarlyPlugins(splash,pluginsToLoad, monitor.createSubTaskMonitor(1, false));
264
265 monitor.indeterminateSubTask(tr("Setting defaults"));
266 preConstructorInit(args);
267
268 monitor.indeterminateSubTask(tr("Creating main GUI"));
269 Main.addListener();
270 final Main main = new MainApplication(mainFrame);
271
272 monitor.indeterminateSubTask(tr("Loading plugins"));
273 PluginHandler.loadLatePlugins(splash,pluginsToLoad, monitor.createSubTaskMonitor(1, false));
274 toolbar.refreshToolbarControl();
275 splash.setVisible(false);
276 splash.dispose();
277 mainFrame.setVisible(true);
278
279 boolean maximized = Boolean.parseBoolean(Main.pref.get("gui.maximized"));
280 if ((!args.containsKey("no-maximize") && maximized) || args.containsKey("maximize")) {
281 if (Toolkit.getDefaultToolkit().isFrameStateSupported(JFrame.MAXIMIZED_BOTH)) {
282 // Main.debug("Main window maximized");
283 Main.windowState = JFrame.MAXIMIZED_BOTH;
284 mainFrame.setExtendedState(Main.windowState);
285 } else {
286 Main.debug("Main window: maximizing not supported");
287 }
288 } else {
289 // Main.debug("Main window not maximized");
290 }
291 if(main.menu.fullscreenToggleAction != null) {
292 main.menu.fullscreenToggleAction.initial();
293 }
294
295 SwingUtilities.invokeLater(new Runnable() {
296 public void run() {
297 if (AutosaveTask.PROP_AUTOSAVE_ENABLED.get()) {
298 AutosaveTask autosaveTask = new AutosaveTask();
299 List<File> unsavedLayerFiles = autosaveTask.getUnsavedLayersFiles();
300 if (!unsavedLayerFiles.isEmpty()) {
301 ExtendedDialog dialog = new ExtendedDialog(
302 Main.parent,
303 tr("Unsaved osm data"),
304 new String[] {tr("Restore"), tr("Cancel"), tr("Discard")}
305 );
306 dialog.setContent(
307 trn("JOSM found {0} unsaved osm data layer. ",
308 "JOSM found {0} unsaved osm data layers. ", unsavedLayerFiles.size(), unsavedLayerFiles.size()) +
309 tr("It looks like JOSM crashed last time. Would you like to restore the data?"));
310 dialog.setButtonIcons(new String[] {"ok", "cancel", "dialogs/remove"});
311 int selection = dialog.showDialog().getValue();
312 if (selection == 1) {
313 autosaveTask.recoverUnsavedLayers();
314 } else if (selection == 3) {
315 autosaveTask.dicardUnsavedLayers();
316 }
317 }
318 autosaveTask.schedule();
319 }
320
321 main.postConstructorProcessCmdLine(args);
322
323 DownloadDialog.autostartIfNeeded();
324 }
325 });
326
327 if (RemoteControl.PROP_REMOTECONTROL_ENABLED.get()) {
328 RemoteControl.start();
329 }
330
331 if (Main.pref.getBoolean("debug.edt-checker.enable", Version.getInstance().isLocalBuild())) {
332 // Repaint manager is registered so late for a reason - there is lots of violation during startup process but they don't seem to break anything and are difficult to fix
333 System.out.println("Enabled EDT checker, wrongful access to gui from non EDT thread will be printed to console");
334 RepaintManager.setCurrentManager(new CheckThreadViolationRepaintManager());
335 }
336 }
337}
Note: See TracBrowser for help on using the repository browser.