Changeset 55 in josm for src/org/openstreetmap


Ignore:
Timestamp:
2006-02-16T20:41:05+01:00 (19 years ago)
Author:
imi
Message:

added osm url edit field in download dialog

Location:
src/org/openstreetmap/josm
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/org/openstreetmap/josm/actions/DownloadAction.java

    r51 r55  
    77import java.awt.event.ActionListener;
    88import java.awt.event.InputEvent;
     9import java.awt.event.KeyAdapter;
    910import java.awt.event.KeyEvent;
     11import java.awt.event.KeyListener;
    1012import java.io.FileNotFoundException;
    1113import java.io.IOException;
     14import java.util.HashMap;
     15import java.util.Map;
    1216
    1317import javax.swing.DefaultListModel;
     
    2024import javax.swing.JTextField;
    2125import javax.swing.KeyStroke;
     26import javax.swing.SwingUtilities;
    2227import javax.swing.event.ListSelectionEvent;
    2328import javax.swing.event.ListSelectionListener;
     
    2530import org.jdom.JDOMException;
    2631import org.openstreetmap.josm.Main;
     32import org.openstreetmap.josm.data.Bounds;
    2733import org.openstreetmap.josm.data.GeoPoint;
    2834import org.openstreetmap.josm.data.osm.DataSet;
     
    6268        public void actionPerformed(ActionEvent e) {
    6369                JPanel dlg = new JPanel(new GridBagLayout());
    64                
     70
     71                // World image
    6572                WorldChooser wc = new WorldChooser();
    6673                dlg.add(wc, GBC.eop());
    67 
     74                wc.setToolTipText("Move and zoom the image like the main map. Select an area to download by dragging.");
     75
     76                // Bounding box edits
    6877                dlg.add(new JLabel("Bounding box"), GBC.eol());
    6978                dlg.add(new JLabel("min lat"), GBC.std().insets(10,0,5,0));
     
    7584                dlg.add(new JLabel("max lon"), GBC.std().insets(10,0,5,0));
    7685                dlg.add(latlon[3], GBC.eol());
    77 
    7886                if (Main.main.getMapFrame() != null) {
    7987                        MapView mv = Main.main.getMapFrame().mapView;
    80                         int w = mv.getWidth();
    81                         int h = mv.getHeight();
    82                         GeoPoint bottomLeft = mv.getPoint(0, h, true);
    83                         GeoPoint topRight = mv.getPoint(w, 0, true);
    84                         if (bottomLeft.isOutSideWorld())
    85                                 bottomLeft = new GeoPoint(-89.999, -179.999); // do not use the Projection constants, since this look better.
    86                         if (topRight.isOutSideWorld())
    87                                 topRight = new GeoPoint(89.999, 179.999);
    88                         latlon[0].setText(""+bottomLeft.lat);
    89                         latlon[1].setText(""+bottomLeft.lon);
    90                         latlon[2].setText(""+topRight.lat);
    91                         latlon[3].setText(""+topRight.lon);
    92                         for (JTextField f : latlon)
    93                                 f.setCaretPosition(0);
     88                        setEditBounds(new Bounds(
     89                                        mv.getPoint(0, mv.getHeight(), true),
     90                                        mv.getPoint(mv.getWidth(), 0, true)));
    9491                        rawGps.setSelected(mv.getActiveLayer() instanceof RawGpsDataLayer);
    9592                }
    96 
    9793                dlg.add(rawGps, GBC.eop());
    9894               
    99                 // load bookmarks
     95                // OSM url edit
     96                dlg.add(new JLabel("URL from www.openstreetmap.org"), GBC.eol());
     97                final JTextField osmUrl = new JTextField();
     98                dlg.add(osmUrl, GBC.eop().fill(GBC.HORIZONTAL));
     99                final KeyListener osmUrlRefresher = new KeyAdapter(){
     100                        @Override
     101                        public void keyTyped(KeyEvent e) {
     102                                SwingUtilities.invokeLater(new Runnable() {
     103                                        public void run() {
     104                                                try {
     105                                                        double latMin = Double.parseDouble(latlon[0].getText());
     106                                                        double lonMin = Double.parseDouble(latlon[1].getText());
     107                                                        double latMax = Double.parseDouble(latlon[2].getText());
     108                                                        double lonMax = Double.parseDouble(latlon[3].getText());
     109                                                        double lat = (latMax+latMin)/2;
     110                                                        double lon = (lonMax+lonMin)/2;
     111                                                        // convert to mercator (for calculation of zoom only)
     112                                                        latMin = Math.log(Math.tan(Math.PI/4.0+latMin/180.0*Math.PI/2.0))*180.0/Math.PI;
     113                                                        latMax = Math.log(Math.tan(Math.PI/4.0+latMax/180.0*Math.PI/2.0))*180.0/Math.PI;
     114                                                        double size = Math.max(Math.abs(latMax-latMin), Math.abs(lonMax-lonMin));
     115                                                        int zoom = 0;
     116                                                        while (zoom <= 20) {
     117                                                                if (size >= 180)
     118                                                                        break;
     119                                                                size *= 2;
     120                                                                zoom++;
     121                                                        }
     122                                                        osmUrl.setText("http://www.openstreetmap.org/index.html?lat="+lat+"&lon="+lon+"&zoom="+zoom);
     123                                                } catch (NumberFormatException x) {
     124                                                        osmUrl.setText("");
     125                                                }
     126                                                osmUrl.setCaretPosition(0);
     127                                        }
     128                                });
     129                        }
     130                };
     131                for (JTextField f : latlon)
     132                        f.addKeyListener(osmUrlRefresher);
     133                SwingUtilities.invokeLater(new Runnable() {public void run() {osmUrlRefresher.keyTyped(null);}});
     134                osmUrl.addKeyListener(new KeyAdapter(){
     135                        @Override
     136                        public void keyTyped(KeyEvent e) {
     137                                SwingUtilities.invokeLater(new Runnable() {
     138                                        public void run() {
     139                                                Map<String, Double> map = readArgs(osmUrl.getText());
     140                                                try {
     141                                                        double size = 180.0 / Math.pow(2, map.get("zoom"));
     142                                                        Bounds b = new Bounds(
     143                                                                        new GeoPoint(map.get("lat") - size/2, map.get("lon") - size),
     144                                                                        new GeoPoint(map.get("lat") + size/2, map.get("lon") + size));
     145                                                        setEditBounds(b);
     146                                                } catch (Exception x) { // NPE or IAE
     147                                                        for (JTextField f : latlon)
     148                                                                f.setText("");
     149                                                }
     150                                        }
     151                                });
     152                        }
     153                });
     154               
     155                // Bookmarks
    100156                dlg.add(new JLabel("Bookmarks"), GBC.eol());
    101157                final BookmarkList bookmarks = new BookmarkList();
     
    108164                                }
    109165                                rawGps.setSelected(b == null ? false : b.rawgps);
     166                                osmUrlRefresher.keyTyped(null);
    110167                        }
    111168                });
    112169                wc.addListMarker(bookmarks);
    113                 wc.addLatLonInputField(latlon);
    114170                dlg.add(new JScrollPane(bookmarks), GBC.eol().fill());
    115171
     
    145201                buttons.add(remove);
    146202                dlg.add(buttons, GBC.eop().fill(GBC.HORIZONTAL));
    147                
     203
    148204                Dimension d = dlg.getPreferredSize();
    149205                wc.setPreferredSize(new Dimension(d.width, d.width/2));
     206                wc.addInputFields(latlon, osmUrl, osmUrlRefresher);
    150207               
     208                // Finally: the dialog
    151209                int r = JOptionPane.showConfirmDialog(Main.main, dlg, "Choose an area",
    152210                                JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
     
    154212                        return;
    155213
     214                startDownload();
     215        }
     216
     217        /**
     218         * Read the values from the edit fields and start the download.
     219         */
     220        private void startDownload() {
    156221                Bookmark b = readBookmark();
    157222                if (b == null) {
     
    161226               
    162227                final OsmServerReader osmReader = new OsmServerReader(b.latlon[0], b.latlon[1], b.latlon[2], b.latlon[3]);
    163                
    164228                new Thread(new PleaseWaitRunnable("Downloading data"){
    165229                        @Override
     
    229293                }
    230294        }
     295       
     296       
     297        /**
     298         * Extrakt URL arguments.
     299         */
     300        private Map<String, Double> readArgs(String s) {
     301                int i = s.indexOf('?');
     302                if (i == -1)
     303                        return new HashMap<String, Double>();
     304                String[] args = s.substring(i+1).split("&");
     305                HashMap<String, Double> map = new HashMap<String, Double>();
     306                for (String arg : args) {
     307                        int eq = arg.indexOf('=');
     308                        if (eq != -1) {
     309                                try {
     310                                        map.put(arg.substring(0, eq), Double.parseDouble(arg.substring(eq + 1)));
     311                                } catch (NumberFormatException e) {
     312                                }                               
     313                        }
     314                }
     315                return map;
     316        }
     317       
     318        /**
     319         * Set the four edit fields to the given bounds coordinates.
     320         */
     321        private void setEditBounds(Bounds b) {
     322                GeoPoint bottomLeft = b.min;
     323                GeoPoint topRight = b.max;
     324                if (bottomLeft.isOutSideWorld())
     325                        bottomLeft = new GeoPoint(-89.999, -179.999); // do not use the Projection constants, since this looks better.
     326                if (topRight.isOutSideWorld())
     327                        topRight = new GeoPoint(89.999, 179.999);
     328                latlon[0].setText(""+bottomLeft.lat);
     329                latlon[1].setText(""+bottomLeft.lon);
     330                latlon[2].setText(""+topRight.lat);
     331                latlon[3].setText(""+topRight.lon);
     332                for (JTextField f : latlon)
     333                        f.setCaretPosition(0);
     334        }
    231335}
  • src/org/openstreetmap/josm/gui/WorldChooser.java

    r43 r55  
    144144         * @param field Must have exactly 4 entries (min lat to max lon)
    145145         */
    146         public void addLatLonInputField(final JTextField[] field) {
    147                 if (field.length != 4)
    148                         throw new IllegalArgumentException();
    149 
     146        public void addInputFields(final JTextField[] field, JTextField osmUrl, final KeyListener osmUrlRefresher) {
    150147                // listener that invokes updateMarkerFromTextField after all
    151148                // messages are dispatched and so text fields are updated.
     
    163160                for (JTextField f : field)
    164161                        f.addKeyListener(listener);
     162                osmUrl.addKeyListener(listener);
    165163
    166164                SelectionEnded selListener = new SelectionEnded(){
     
    175173                                for (JTextField f : field)
    176174                                        f.setCaretPosition(0);
     175                                osmUrlRefresher.keyTyped(null);
    177176                                repaint();
    178177                        }
Note: See TracChangeset for help on using the changeset viewer.