Ticket #5787: imagery-offset-dialog.patch

File imagery-offset-dialog.patch, 5.0 KB (added by Zverikk, 13 years ago)
  • openstreetmap/josm/actions/ImageryAdjustAction.java

     
    8888        if (!(event instanceof KeyEvent)) return;
    8989        if (event.getID() != KeyEvent.KEY_PRESSED) return;
    9090        if (layer == null) return;
     91        if (offsetDialog != null && offsetDialog.areFieldsInFocus()) return;
    9192        KeyEvent kev = (KeyEvent)event;
    9293        double dx = 0, dy = 0;
    9394        switch (kev.getKeyCode()) {
     
    147148    }
    148149
    149150    class ImageryOffsetDialog extends ExtendedDialog implements FocusListener {
    150         public final JTextField easting = new JTextField();
    151         public final JTextField northing = new JTextField();
     151        public final JTextField tOffset = new JTextField();
    152152        JTextField tBookmarkName = new JTextField();
    153153        private boolean ignoreListener;
    154154        public ImageryOffsetDialog() {
     
    162162            pnl.add(new JMultilineLabel(tr("Use arrow keys or drag the imagery layer with mouse to adjust the imagery offset.\n" +
    163163                    "You can also enter east and north offset in the {0} coordinates.\n" +
    164164                    "If you want to save the offset as bookmark, enter the bookmark name below",Main.proj.toString())), GBC.eop());
    165             pnl.add(new JLabel(tr("Easting") + ": "),GBC.std());
    166             pnl.add(easting,GBC.std().fill(GBC.HORIZONTAL).insets(0, 0, 5, 0));
    167             pnl.add(new JLabel(tr("Northing") + ": "),GBC.std());
    168             pnl.add(northing,GBC.eol().fill(GBC.HORIZONTAL));
    169             pnl.add(new JLabel(tr("Bookmark name: ")),GBC.eol().insets(0,5,0,0));
     165            pnl.add(new JLabel(tr("Offset: ")),GBC.std());
     166            pnl.add(tOffset,GBC.eol().fill(GBC.HORIZONTAL).insets(0,0,0,5));
     167            pnl.add(new JLabel(tr("Bookmark name: ")),GBC.std());
    170168            pnl.add(tBookmarkName,GBC.eol().fill(GBC.HORIZONTAL));
    171             easting.setColumns(8);
    172             northing.setColumns(8);
    173             easting.setText(String.valueOf(layer.getDx()));
    174             northing.setText(String.valueOf(layer.getDy()));
    175             easting.addFocusListener(this);
    176             northing.addFocusListener(this);
     169            tOffset.setColumns(16);
     170            updateOffsetIntl();
     171            tOffset.addFocusListener(this);
    177172            setContent(pnl);
    178173            setupDialog();
    179174        }
    180175
     176        public boolean areFieldsInFocus() {
     177            return tOffset.hasFocus();
     178        }
     179
    181180        @Override
    182181        public void focusGained(FocusEvent e) {
    183182        }
     
    185184        @Override
    186185        public void focusLost(FocusEvent e) {
    187186            if (ignoreListener) return;
    188             double dx = oldDx;
    189             try {
    190                 dx = Double.parseDouble(easting.getText());
    191             } catch (NumberFormatException nfe) {
    192                 easting.setText(String.valueOf(oldDx));
     187            String ostr = tOffset.getText();
     188            int semicolon = ostr.indexOf(';');
     189            if( semicolon >= 0 && semicolon + 1 < ostr.length() ) {
     190                try {
     191                    // here we assume that Double.parseDouble() needs '.' as a decimal separator
     192                    String easting = ostr.substring(0, semicolon).trim().replace(',', '.');
     193                    String northing = ostr.substring(semicolon + 1).trim().replace(',', '.');
     194                    double dx = Double.parseDouble(easting);
     195                    double dy = Double.parseDouble(northing);
     196                    layer.setOffset(dx, dy);
     197                } catch (NumberFormatException nfe) {
     198                    // we repaint offset numbers in any case
     199                }
    193200            }
    194             double dy = oldDy;
    195             try {
    196                 dy = Double.parseDouble(northing.getText());
    197             } catch (NumberFormatException nfe) {
    198                 northing.setText(String.valueOf(oldDy));
    199             }
    200             layer.setOffset(dx, dy);
     201            updateOffsetIntl();
    201202            Main.map.repaint();
    202203        }
    203204
    204205        public void updateOffset() {
    205206            ignoreListener = true;
    206             easting.setText(String.valueOf(layer.getDx()));
    207             northing.setText(String.valueOf(layer.getDy()));
     207            updateOffsetIntl();
    208208            ignoreListener = false;
    209209        }
    210210
     211        public void updateOffsetIntl() {
     212            // Support projections with very small numbers (e.g. 4326)
     213            int precision = Main.proj.getDefaultZoomInPPD() >= 1.0 ? 2 : 7;
     214            // US locale to force decimal separator to be '.'
     215            tOffset.setText(new java.util.Formatter(java.util.Locale.US).format(
     216                    "%1." + precision + "f; %1." + precision + "f",
     217                    layer.getDx(), layer.getDy()).toString());
     218        }
     219
    211220        private boolean confirmOverwriteBookmark() {
    212221            ExtendedDialog dialog = new ExtendedDialog(
    213222                    Main.parent,