Ignore:
Timestamp:
2014-08-15T14:26:05+02:00 (10 years ago)
Author:
donvip
Message:

[josm_opendata] fix #josm9592 - handling of MIF file in cyrillic + CoordSys NonEarth clause

Location:
applications/editors/josm/plugins/opendata
Files:
3 added
4 edited
1 moved

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/AbstractDataSetHandler.java

    r30563 r30583  
    2626import org.openstreetmap.josm.plugins.opendata.core.io.geographic.DefaultShpHandler;
    2727import org.openstreetmap.josm.plugins.opendata.core.io.geographic.GmlHandler;
     28import org.openstreetmap.josm.plugins.opendata.core.io.geographic.MifHandler;
    2829import org.openstreetmap.josm.plugins.opendata.core.io.geographic.ShpHandler;
    2930import org.openstreetmap.josm.plugins.opendata.core.io.tabular.CsvHandler;
     
    440441        }
    441442
     443    // --------- MIF handling ---------
     444   
     445    private MifHandler mifHandler;
     446
     447    public final void setMifHandler(MifHandler handler) {
     448        mifHandler = handler;
     449    }
     450   
     451    public final MifHandler getMifHandler() {
     452        return mifHandler;
     453    }
     454
    442455        // --------- GML handling ---------
    443456       
  • applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/ProjectionChooser.java

    r30582 r30583  
    11// License: GPL. For details, see LICENSE file.
    2 package org.openstreetmap.josm.plugins.opendata.core.io;
     2package org.openstreetmap.josm.plugins.opendata.core.gui;
    33
    44import static org.openstreetmap.josm.tools.I18n.tr;
    55
    66import java.awt.Component;
     7import java.awt.Dimension;
    78import java.awt.GridBagLayout;
     9import java.awt.event.ActionEvent;
     10import java.awt.event.ActionListener;
    811
    912import javax.swing.BorderFactory;
     
    1215import javax.swing.JPanel;
    1316
     17import org.openstreetmap.josm.Main;
     18import org.openstreetmap.josm.data.Bounds;
     19import org.openstreetmap.josm.data.coor.CoordinateFormat;
    1420import org.openstreetmap.josm.data.projection.Projection;
    1521import org.openstreetmap.josm.gui.ExtendedDialog;
    1622import org.openstreetmap.josm.gui.preferences.projection.ProjectionChoice;
    1723import org.openstreetmap.josm.gui.preferences.projection.ProjectionPreference;
     24import org.openstreetmap.josm.gui.preferences.projection.SubPrefsOptions;
    1825import org.openstreetmap.josm.tools.GBC;
    1926
     27/**
     28 * Projection chooser, ugly copy-paste of ProjectionPreference.
     29 * FIXME: to be refactored in core for reuse by plugins.
     30 */
    2031public class ProjectionChooser extends ExtendedDialog {
    2132
    22     /**
    23      * This is the panel holding all projection preferences
    24      */
    25     private final JPanel projPanel = new JPanel(new GridBagLayout());
    26    
    2733    /**
    2834     * Combobox with all projections available
     
    3137            ProjectionPreference.getProjectionChoices().toArray(new ProjectionChoice[0]));
    3238
     39    /**
     40     * This variable holds the JPanel with the projection's preferences. If the
     41     * selected projection does not implement this, it will be set to an empty
     42     * Panel.
     43     */
     44    private JPanel projSubPrefPanel;
     45    private JPanel projSubPrefPanelWrapper = new JPanel(new GridBagLayout());
     46
     47    private JLabel projectionCodeLabel;
     48    private Component projectionCodeGlue;
     49    private JLabel projectionCode = new JLabel();
     50    private JLabel projectionNameLabel;
     51    private Component projectionNameGlue;
     52    private JLabel projectionName = new JLabel();
     53    private JLabel bounds = new JLabel();
     54   
     55    /**
     56     * This is the panel holding all projection preferences
     57     */
     58    private final JPanel projPanel = new JPanel(new GridBagLayout());
     59
     60    /**
     61     * The GridBagConstraints for the Panel containing the ProjectionSubPrefs.
     62     * This is required twice in the code, creating it here keeps both occurrences
     63     * in sync
     64     */
     65    private static final GBC projSubPrefPanelGBC = GBC.std().fill(GBC.BOTH).weight(1.0, 1.0);
     66
    3367        public ProjectionChooser(Component parent) {
    3468                this(parent, tr("Projection method"), new String[] {tr("OK"), tr("Cancel")});
    3569        }
    3670       
    37         protected ProjectionChooser(Component parent, String title,
    38                         String[] buttonTexts) {
     71        protected ProjectionChooser(Component parent, String title, String[] buttonTexts) {
    3972                super(parent, title, buttonTexts);
     73                setMinimumSize(new Dimension(600, 200));
    4074                addGui();
    4175        }
     
    4781        projPanel.add(GBC.glue(5,0), GBC.std().fill(GBC.HORIZONTAL));
    4882        projPanel.add(projectionCombo, GBC.eop().fill(GBC.HORIZONTAL).insets(0,5,5,5));
     83        projPanel.add(projectionCodeLabel = new JLabel(tr("Projection code")), GBC.std().insets(25,5,0,5));
     84        projPanel.add(projectionCodeGlue = GBC.glue(5,0), GBC.std().fill(GBC.HORIZONTAL));
     85        projPanel.add(projectionCode, GBC.eop().fill(GBC.HORIZONTAL).insets(0,5,5,5));
     86        projPanel.add(projectionNameLabel = new JLabel(tr("Projection name")), GBC.std().insets(25,5,0,5));
     87        projPanel.add(projectionNameGlue = GBC.glue(5,0), GBC.std().fill(GBC.HORIZONTAL));
     88        projPanel.add(projectionName, GBC.eop().fill(GBC.HORIZONTAL).insets(0,5,5,5));
     89        projPanel.add(new JLabel(tr("Bounds")), GBC.std().insets(25,5,0,5));
     90        projPanel.add(GBC.glue(5,0), GBC.std().fill(GBC.HORIZONTAL));
     91        projPanel.add(bounds, GBC.eop().fill(GBC.HORIZONTAL).insets(0,5,5,5));
     92        projPanel.add(projSubPrefPanelWrapper, GBC.eol().fill(GBC.HORIZONTAL).insets(20,5,5,5));
     93
     94        selectedProjectionChanged((ProjectionChoice) projectionCombo.getSelectedItem());
     95        projectionCombo.addActionListener(new ActionListener() {
     96            @Override
     97            public void actionPerformed(ActionEvent e) {
     98                ProjectionChoice pc = (ProjectionChoice) projectionCombo.getSelectedItem();
     99                selectedProjectionChanged(pc);
     100            }
     101        });
    49102        setContent(projPanel);
    50103        }
    51104       
    52         public Projection getProjection() {
    53                 ProjectionChoice choice = (ProjectionChoice) projectionCombo.getSelectedItem();
    54                 return choice != null ? choice.getProjection() : null;
     105        private void selectedProjectionChanged(final ProjectionChoice pc) {
     106        // Don't try to update if we're still starting up
     107        int size = projPanel.getComponentCount();
     108        if(size < 1)
     109            return;
     110
     111        final ActionListener listener = new ActionListener() {
     112            @Override
     113            public void actionPerformed(ActionEvent e) {
     114                updateMeta(pc);
     115            }
     116        };
     117
     118        // Replace old panel with new one
     119        projSubPrefPanelWrapper.removeAll();
     120        projSubPrefPanel = pc.getPreferencePanel(listener);
     121        projSubPrefPanelWrapper.add(projSubPrefPanel, projSubPrefPanelGBC);
     122        projPanel.revalidate();
     123        projSubPrefPanel.repaint();
     124        updateMeta(pc);
     125    }
     126       
     127    private void updateMeta(ProjectionChoice pc) {
     128        pc.setPreferences(pc.getPreferences(projSubPrefPanel));
     129        Projection proj = pc.getProjection();
     130        projectionCode.setText(proj.toCode());
     131        projectionName.setText(proj.toString());
     132        Bounds b = proj.getWorldBoundsLatLon();
     133        CoordinateFormat cf = CoordinateFormat.getDefaultFormat();
     134        bounds.setText(b.getMin().lonToString(cf)+", "+b.getMin().latToString(cf)+" : "+b.getMax().lonToString(cf)+", "+b.getMax().latToString(cf));
     135        boolean showCode = true;
     136        boolean showName = false;
     137        if (pc instanceof SubPrefsOptions) {
     138            showCode = ((SubPrefsOptions) pc).showProjectionCode();
     139            showName = ((SubPrefsOptions) pc).showProjectionName();
     140        }
     141        projectionCodeLabel.setVisible(showCode);
     142        projectionCodeGlue.setVisible(showCode);
     143        projectionCode.setVisible(showCode);
     144        projectionNameLabel.setVisible(showName);
     145        projectionNameGlue.setVisible(showName);
     146        projectionName.setVisible(showName);
     147    }
     148
     149    public Projection getProjection() {
     150                ProjectionChoice pc = (ProjectionChoice) projectionCombo.getSelectedItem();
     151                if (pc != null) {
     152                    Main.info("Chosen projection: "+pc+" ("+pc.getProjection()+")");
     153                    return pc.getProjection();
     154                } else {
     155                    return null;
     156                }
    55157        }
    56158}
  • applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/MifReader.java

    r30576 r30583  
    2929import org.openstreetmap.josm.data.projection.Projection;
    3030import org.openstreetmap.josm.data.projection.Projections;
     31import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
    3132import org.openstreetmap.josm.gui.progress.ProgressMonitor;
    3233import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
    3334import org.openstreetmap.josm.plugins.opendata.core.datasets.AbstractDataSetHandler;
     35import org.openstreetmap.josm.plugins.opendata.core.gui.ChooserLauncher;
    3436import org.openstreetmap.josm.plugins.opendata.core.io.InputStreamReaderUnbuffered;
    3537import org.openstreetmap.josm.plugins.opendata.core.util.OdUtils;
     
    5355        END_POLYLINE
    5456    }
     57   
     58    private final AbstractDataSetHandler handler;
    5559   
    5660    private File file;
     
    9195    private int numsections = -1;
    9296   
     97    private MifReader(AbstractDataSetHandler handler) {
     98        this.handler = handler;
     99    }
     100   
    93101    public static DataSet parseDataSet(InputStream in, File file,
    94102            AbstractDataSetHandler handler, ProgressMonitor instance) throws IOException {
    95         return new MifReader().parse(in, file, instance, Charset.forName(OdConstants.ISO8859_15));
     103        return new MifReader(handler).parse(in, file, instance, Charset.forName(OdConstants.ISO8859_15));
    96104    }
    97105
     
    327335            // Use syntax 2 to explicitly define a non-Earth coordinate system, such as the coordinate system used in a floor plan or other CAD drawing.
    328336           
    329             // FIXME: allow user to choose projection ?
    330             josmProj = new CustomProjection(null);
     337            if (handler != null && handler.getMifHandler() != null && handler.getMifHandler().getCoordSysNonEarthProjection() != null) {
     338                josmProj = handler.getMifHandler().getCoordSysNonEarthProjection();
     339            } else {
     340                josmProj = ChooserLauncher.askForProjection(NullProgressMonitor.INSTANCE);
     341            }
    331342            break;
    332343        case "layout":
  • applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/SpreadSheetReader.java

    r30568 r30583  
    44import static org.openstreetmap.josm.tools.I18n.tr;
    55
    6 import java.awt.Component;
    76import java.awt.GraphicsEnvironment;
    87import java.io.IOException;
     
    2322import org.openstreetmap.josm.data.projection.Projection;
    2423import org.openstreetmap.josm.gui.progress.ProgressMonitor;
    25 import org.openstreetmap.josm.gui.util.GuiHelper;
    2624import org.openstreetmap.josm.io.AbstractReader;
    2725import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
    28 import org.openstreetmap.josm.plugins.opendata.core.io.ProjectionChooser;
     26import org.openstreetmap.josm.plugins.opendata.core.gui.ChooserLauncher;
    2927import org.openstreetmap.josm.plugins.opendata.core.io.ProjectionPatterns;
    3028
     
    7876        }
    7977        return col;
    80         }
    81        
    82         private class ChooserLauncher implements Runnable {
    83 
    84             public Projection proj = null;
    85         private final ProgressMonitor progressMonitor;
    86            
    87         public ChooserLauncher(ProgressMonitor progressMonitor) {
    88             this.progressMonitor = progressMonitor;
    89         }
    90 
    91         @Override
    92         public void run() {
    93             Component parent = progressMonitor == null ? Main.parent : progressMonitor.getWindowParent();
    94             ProjectionChooser dialog = (ProjectionChooser) new ProjectionChooser(parent).showDialog();
    95             if (dialog.getValue() == 1) {
    96                 proj = dialog.getProjection();
    97             }
    98         }
    9978        }
    10079       
     
    153132                            }
    154133                                // TODO: filter proposed projections with min/max values ?
    155                             ChooserLauncher launcher = new ChooserLauncher(progressMonitor);
    156                             GuiHelper.runInEDTAndWait(launcher);
    157                                 if (launcher.proj == null) {
     134                Projection p = ChooserLauncher.askForProjection(progressMonitor);
     135                                if (p == null) {
    158136                                        return null; // User clicked Cancel
    159137                                }
    160138                        for (CoordinateColumns c : columns) {
    161                             c.proj = launcher.proj;
     139                            c.proj = p;
    162140                        }
    163141                        }
  • applications/editors/josm/plugins/opendata/test/unit/org/openstreetmap/josm/plugins/opendata/core/io/geographic/MifReaderTest.java

    r30573 r30583  
    1111import org.openstreetmap.josm.JOSMFixture;
    1212import org.openstreetmap.josm.TestUtils;
     13import org.openstreetmap.josm.data.osm.DataSet;
     14import org.openstreetmap.josm.data.projection.Projections;
     15import org.openstreetmap.josm.plugins.opendata.core.datasets.AbstractDataSetHandler;
    1316import org.openstreetmap.josm.plugins.opendata.core.io.NonRegFunctionalTests;
    1417
     
    2629    }
    2730   
     31    private static AbstractDataSetHandler newHandler(final String epsgCode) {
     32        AbstractDataSetHandler handler = new AbstractDataSetHandler() {
     33            @Override
     34            public boolean acceptsFilename(String filename) {
     35                return true;
     36            }
     37            @Override
     38            public void updateDataSet(DataSet ds) {
     39            }
     40        };
     41        DefaultMifHandler mifHandler = new DefaultMifHandler();
     42        mifHandler.setCoordSysNonEarthProjection(Projections.getProjectionByCode(epsgCode));
     43        handler.setMifHandler(mifHandler);
     44        return handler;
     45    }
     46   
    2847    /**
    2948     * Non-regression test for ticket <a href="https://josm.openstreetmap.de/ticket/9592">#9592</a>
     
    3453        File file = new File(TestUtils.getRegressionDataFile(9592, "bg.mif"));
    3554        try (InputStream is = new FileInputStream(file)) {
    36             NonRegFunctionalTests.testGeneric("#9592", MifReader.parseDataSet(is, file, null, null));
     55            NonRegFunctionalTests.testGeneric("#9592", MifReader.parseDataSet(is, file, newHandler("EPSG:32635"), null));
    3756        }
    3857    }
Note: See TracChangeset for help on using the changeset viewer.