001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.gui; 003 004import static org.openstreetmap.josm.tools.I18n.tr; 005 006import java.applet.AppletContext; 007import java.applet.AppletStub; 008import java.awt.GridBagLayout; 009import java.awt.event.ActionEvent; 010import java.awt.event.KeyEvent; 011import java.io.File; 012import java.net.URL; 013import java.util.Arrays; 014import java.util.Collection; 015import java.util.HashMap; 016import java.util.LinkedList; 017import java.util.Map; 018 019import javax.swing.JApplet; 020import javax.swing.JFrame; 021import javax.swing.JLabel; 022import javax.swing.JOptionPane; 023import javax.swing.JPanel; 024 025import org.openstreetmap.josm.Main; 026import org.openstreetmap.josm.actions.JosmAction; 027import org.openstreetmap.josm.data.ServerSidePreferences; 028import org.openstreetmap.josm.gui.MainApplication.Option; 029import org.openstreetmap.josm.gui.widgets.JosmPasswordField; 030import org.openstreetmap.josm.gui.widgets.JosmTextField; 031import org.openstreetmap.josm.tools.GBC; 032import org.openstreetmap.josm.tools.I18n; 033import org.openstreetmap.josm.tools.Shortcut; 034 035public class MainApplet extends JApplet { 036 037 final static JFrame frame = new JFrame("Java OpenStreetMap Editor"); 038 039 public static final class UploadPreferencesAction extends JosmAction { 040 /** 041 * Constructs a new {@code UploadPreferencesAction}. 042 */ 043 public UploadPreferencesAction() { 044 super(tr("Upload Preferences"), "upload-preferences", tr("Upload the current preferences to the server"), 045 Shortcut.registerShortcut("applet:uploadprefs", tr("Upload Preferences"), KeyEvent.CHAR_UNDEFINED, Shortcut.NONE), true); 046 } 047 @Override 048 public void actionPerformed(ActionEvent e) { 049 ((ServerSidePreferences)Main.pref).upload(); 050 } 051 } 052 053 private final class MainCaller extends Main { 054 private MainCaller(Map<Option, Collection<String>> mapargs) { 055 addListener(); 056 setContentPane(contentPanePrivate); 057 setJMenuBar(menu); 058 postConstructorProcessCmdLine(mapargs); 059 } 060 } 061 062 private final static String[][] paramInfo = { 063 {"username", tr("string"), tr("Name of the user.")}, 064 {"password", tr("string"), tr("OSM Password.")}, 065 {"geometry", tr("string"), tr("Resize the applet to the given geometry (format: WIDTHxHEIGHT)")}, 066 {"download", tr("string;string;..."), tr("Download each. Can be x1,y1,x2,y2 an URL containing lat=y&lon=x&zoom=z or a filename")}, 067 {"downloadgps", tr("string;string;..."), tr("Download each as raw gps. Can be x1,y1,x2,y2 an URL containing lat=y&lon=x&zoom=z or a filename")}, 068 {"selection", tr("string;string;..."), tr("Add each to the initial selection. Can be a google-like search string or an URL which returns osm-xml")}, 069 {"reset-preferences", tr("any"),tr("If specified, reset the configuration instead of reading it.")} 070 }; 071 072 private Map<String, Collection<String>> args = new HashMap<String, Collection<String>>(); 073 074 @Override public String[][] getParameterInfo() { 075 return paramInfo; 076 } 077 078 @Override public void init() { 079 for (String[] s : paramInfo) { 080 Collection<String> p = readParameter(s[0], args.get(s[0])); 081 if (p != null) { 082 args.put(s[0], p); 083 } 084 } 085 if (!args.containsKey("geometry") && getParameter("width") != null && getParameter("height") != null) { 086 args.put("geometry", Arrays.asList(new String[]{getParameter("width")+"x"+getParameter("height")})); 087 } 088 } 089 090 @Override public void start() { 091 I18n.init(); 092 Main.checkJava6(); 093 094 String url = getParameter("load_url"); 095 if(url != null) 096 args.put("download", Arrays.asList(new String[]{url})); 097 098 // initialize the platform hook, and 099 Main.determinePlatformHook(); 100 // call the really early hook before we do anything else 101 Main.platform.preStartupHook(); 102 103 Main.initAppletPreferences(getCodeBase()); 104 105 String lang = getParameter("language"); 106 I18n.set(lang != null ? lang : Main.pref.get("language", null)); 107 Main.pref.updateSystemProperties(); 108 109 try 110 { 111 ((ServerSidePreferences)Main.pref).download(); 112 } catch (ServerSidePreferences.MissingPassword e) { 113 String username = args.containsKey("username") ? args.get("username").iterator().next() : null; 114 String password = args.containsKey("password") ? args.get("password").iterator().next() : null; 115 if (username == null || password == null) { 116 JPanel p = new JPanel(new GridBagLayout()); 117 p.add(new JLabel(tr(e.realm)), GBC.eol().fill(GBC.HORIZONTAL)); 118 p.add(new JLabel(tr("Username")), GBC.std().insets(0,0,20,0)); 119 JosmTextField user = new JosmTextField(username == null ? "" : username); 120 p.add(user, GBC.eol().fill(GBC.HORIZONTAL)); 121 p.add(new JLabel(tr("Password")), GBC.std().insets(0,0,20,0)); 122 JosmPasswordField pass = new JosmPasswordField(password == null ? "" : password); 123 p.add(pass, GBC.eol().fill(GBC.HORIZONTAL)); 124 JOptionPane.showMessageDialog(null, p); 125 username = user.getText(); 126 if("".equals(username)) 127 username = null; 128 password = new String(pass.getPassword()); 129 if("".equals(password)) 130 password = null; 131 } 132 if (username != null && password != null) { 133 ((ServerSidePreferences)Main.pref).download(username, password); 134 } 135 } 136 137 Main.preConstructorInit(Option.fromStringMap(args)); 138 Main.pref.updateSystemProperties(); 139 Main.parent = frame; 140 141 new MainCaller(Option.fromStringMap(args)); 142 143 MainMenu m = Main.main.menu; // shortcut 144 145 // remove offending stuff from JOSM (that would break the SecurityManager) 146 m.editMenu.add(new UploadPreferencesAction()); 147 m.openFile.setEnabled(false); 148 m.exit.setEnabled(false); 149 m.save.setEnabled(false); 150 m.saveAs.setEnabled(false); 151 m.gpxExport.setEnabled(false); 152 } 153 154 private Collection<String> readParameter(String s, Collection<String> v) { 155 String param = getParameter(s); 156 if (param != null) { 157 if (v == null) { 158 v = new LinkedList<String>(); 159 } 160 v.addAll(Arrays.asList(param.split(";"))); 161 } 162 return v; 163 } 164 165 public static void main(String[] args) { 166 Main.applet = true; 167 MainApplet applet = new MainApplet(); 168 Main.initAppletPreferences(applet.getCodeBase()); 169 applet.setStub(new AppletStub() { 170 @Override 171 public void appletResize(int w, int h) { 172 frame.setSize(w, h); 173 } 174 175 @Override 176 public AppletContext getAppletContext() { 177 return null; 178 } 179 180 @Override 181 public URL getCodeBase() { 182 try { 183 return new File(".").toURI().toURL(); 184 } catch (Exception e) { 185 e.printStackTrace(); 186 return null; 187 } 188 } 189 190 @Override 191 public URL getDocumentBase() { 192 return getCodeBase(); 193 } 194 195 @Override 196 public String getParameter(String k) { 197 return null; 198 } 199 200 @Override 201 public boolean isActive() { 202 return true; 203 } 204 }); 205 applet.init(); 206 applet.start(); 207 frame.setContentPane(applet); 208 frame.setVisible(true); 209 } 210}