Changeset 51 in josm


Ignore:
Timestamp:
2006-02-13T23:05:22+01:00 (19 years ago)
Author:
imi
Message:
  • fixed server rounding problem
  • fixed bug, that save with filter does not add extension
  • fixed modified flag for data from server vs. data from disk
  • hacked "ConcurrentModifyException" (need to do this better)
Location:
src/org/openstreetmap/josm
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • src/org/openstreetmap/josm/Main.java

    r50 r51  
    149149                        public void windowClosing(WindowEvent arg0) {
    150150                                if (mapFrame != null) {
    151                                         boolean changed = false;
     151                                        boolean modified = false;
     152                                        boolean uploadedModified = false;
    152153                                        for (Layer l : mapFrame.mapView.getAllLayers()) {
    153154                                                if (l instanceof OsmDataLayer && ((OsmDataLayer)l).isModified()) {
    154                                                         changed = true;
     155                                                        modified = true;
     156                                                        uploadedModified = ((OsmDataLayer)l).uploadedModified;
    155157                                                        break;
    156158                                                }
    157159                                        }
    158                                         if (changed) {
     160                                        if (modified) {
     161                                                String msg = uploadedModified ? "\nHint: Some changes came from uploading new data to the server." : "";
    159162                                                int answer = JOptionPane.showConfirmDialog(
    160                                                                 Main.this, "There are unsaved changes. Really quit?",
     163                                                                Main.this, "There are unsaved changes. Really quit?"+msg,
    161164                                                                "Unsaved Changes", JOptionPane.YES_NO_OPTION);
    162165                                                if (answer != JOptionPane.YES_OPTION)
  • src/org/openstreetmap/josm/actions/DownloadAction.java

    r50 r51  
    183183                                                }
    184184
    185                                                 layer = new OsmDataLayer(dataSet, "Data Layer");
     185                                                layer = new OsmDataLayer(dataSet, "Data Layer", false);
    186186                                        }
    187187
  • src/org/openstreetmap/josm/actions/ExtensionFileFilter.java

    r33 r51  
    1515        private final String extension;
    1616        private final String description;
     17        public final String defaultExtension;
    1718
     19        public static final int OSM = 0;
     20        public static final int GPX = 1;
     21        public static final int CSV = 2;
     22       
    1823        public static ExtensionFileFilter[] filters = {
    19                 new ExtensionFileFilter(".xml", "OSM Server Version 0.2 (.xml)"),
    20                 new ExtensionFileFilter(".gpx", "GPX Files Version 0.1 (.gpx)"),
    21                 //new ExtensionFileFilter(".josm", "JOSM Savefiles (.josm)")
     24                new ExtensionFileFilter("osm,xml", "osm", "OSM Server Version 0.2 (.osm .xml)"),
     25                new ExtensionFileFilter("gpx", "gpx", "GPX Files Version 0.1 (.gpx)"),
     26                new ExtensionFileFilter("csv,txt", "csv", "CSV Files Version 0.1 (.csv .txt)"),
    2227        };
    2328
     
    2631         *
    2732         */
    28         private ExtensionFileFilter(String extension, String description) {
     33        private ExtensionFileFilter(String extension, String defExt, String description) {
    2934                this.extension = extension;
     35                defaultExtension = defExt;
    3036                this.description = description;
     37        }
     38
     39        public boolean acceptName(String filename) {
     40                String name = filename.toLowerCase();
     41                for (String ext : extension.split(","))
     42                        if (name.endsWith("."+ext))
     43                                return true;
     44                return false;
    3145        }
    3246
    3347        @Override
    3448        public boolean accept(File pathname) {
    35                 String name = pathname.getName().toLowerCase();
    36                 return pathname.isDirectory() || name.endsWith(extension);
     49                if (pathname.isDirectory())
     50                        return true;
     51                return acceptName(pathname.getName());
    3752        }
    3853
  • src/org/openstreetmap/josm/actions/OpenAction.java

    r44 r51  
    3636
    3737        /**
    38          * Create an open action. The name is "Open GPX".
     38         * Create an open action. The name is "Open a file".
    3939         */
    4040        public OpenAction() {
     
    4747                        fc.addChoosableFileFilter(ExtensionFileFilter.filters[i]);
    4848                fc.setAcceptAllFileFilterUsed(true);
    49                
     49
    5050                if (fc.showOpenDialog(Main.main) != JFileChooser.APPROVE_OPTION)
    5151                        return;
     
    5454                if (filename == null)
    5555                        return;
     56                String fn = filename.getName();
    5657
    5758                try {
    5859                        Layer layer;
    59                         String extension = filename.getName().toLowerCase().substring(filename.getName().lastIndexOf('.')+1);
    6060
    61                         if (asRawData(extension)) {
     61                        if (asRawData(fn)) {
    6262                                Collection<Collection<GeoPoint>> data;
    63                                 if (extension.equals("gpx")) {
     63                                if (ExtensionFileFilter.filters[ExtensionFileFilter.GPX].acceptName(fn)) {
    6464                                        data = new RawGpsReader(new FileReader(filename)).parse();
    65                                 } else if (extension.equals("csv") || extension.equals("txt")) {
     65                                } else if (ExtensionFileFilter.filters[ExtensionFileFilter.CSV].acceptName(fn)) {
    6666                                        data = new LinkedList<Collection<GeoPoint>>();
    6767                                        data.add(new RawCsvReader(new FileReader(filename)).parse());
     
    7171                        } else {
    7272                                DataSet dataSet;
    73                                 if (extension.equals("gpx"))
     73                                if (ExtensionFileFilter.filters[ExtensionFileFilter.GPX].acceptName(fn))
    7474                                        dataSet = new GpxReader(new FileReader(filename)).parse();
    75                                 else if (extension.equals("xml") || extension.equals("osm"))
     75                                else if (ExtensionFileFilter.filters[ExtensionFileFilter.OSM].acceptName(fn))
    7676                                        dataSet = new OsmReader(new FileReader(filename)).parse();
    77                                 else if (extension.equals("csv") || extension.equals("txt")) {
     77                                else if (ExtensionFileFilter.filters[ExtensionFileFilter.CSV].acceptName(fn)) {
    7878                                        JOptionPane.showMessageDialog(Main.main, "CSV Data import for non-GPS data is not implemented yet.");
    7979                                        return;
    8080                                } else {
    81                                         JOptionPane.showMessageDialog(Main.main, "Unknown file extension: "+extension);
     81                                        JOptionPane.showMessageDialog(Main.main, "Unknown file extension: "+fn.substring(filename.getName().lastIndexOf('.')+1));
    8282                                        return;
    8383                                }
    84                                 layer = new OsmDataLayer(dataSet, "Data Layer");
     84                                layer = new OsmDataLayer(dataSet, "Data Layer", true);
    8585                        }
    8686                       
     
    9595                } catch (IOException x) {
    9696                        x.printStackTrace();
    97                         JOptionPane.showMessageDialog(Main.main, "Could not read '"+filename.getName()+"'\n"+x.getMessage());
     97                        JOptionPane.showMessageDialog(Main.main, "Could not read '"+fn+"'\n"+x.getMessage());
    9898                }
    9999        }
     
    103103         * user, if unsure.
    104104         */
    105         private boolean asRawData(String extension) {
    106                 if (extension.equals("csv") || extension.equals("txt"))
     105        private boolean asRawData(String fn) {
     106                if (ExtensionFileFilter.filters[ExtensionFileFilter.CSV].acceptName(fn))
    107107                        return true;
    108                 if (!extension.equals("gpx"))
     108                if (!ExtensionFileFilter.filters[ExtensionFileFilter.GPX].acceptName(fn))
    109109                        return false;
    110110                return JOptionPane.YES_OPTION == JOptionPane.showConfirmDialog(
  • src/org/openstreetmap/josm/actions/SaveAction.java

    r49 r51  
    1111import javax.swing.JOptionPane;
    1212import javax.swing.KeyStroke;
     13import javax.swing.filechooser.FileFilter;
    1314
    1415import org.openstreetmap.josm.Main;
     
    5152
    5253                try {
    53                         String fn = file.getName();
     54                        String fn = file.getPath();
     55                        if (fn.indexOf('.') == -1) {
     56                                FileFilter ff = fc.getFileFilter();
     57                                if (ff instanceof ExtensionFileFilter) {
     58                                        fn = fn + "." + ((ExtensionFileFilter)ff).defaultExtension;
     59                                        file = new File(fn);
     60                                }
     61                        }
    5462                        FileWriter fileWriter;
    55                         if (fn.endsWith(".gpx"))
     63                        if (ExtensionFileFilter.filters[ExtensionFileFilter.GPX].acceptName(fn))
    5664                                new GpxWriter(fileWriter = new FileWriter(file), Main.main.ds).output();
    57                         else if (fn.endsWith(".xml") || fn.endsWith(".osm"))
     65                        else if (ExtensionFileFilter.filters[ExtensionFileFilter.OSM].acceptName(fn))
    5866                                new OsmWriter(fileWriter = new FileWriter(file), Main.main.ds).output();
    59                         else if (fn.endsWith(".txt") || fn.endsWith(".csv")) {
     67                        else if (ExtensionFileFilter.filters[ExtensionFileFilter.CSV].acceptName(fn)) {
    6068                                JOptionPane.showMessageDialog(Main.main, "CSV output not supported yet.");
    6169                                return;
     
    6573                        }
    6674                        fileWriter.close();
     75                        Main.main.getMapFrame().mapView.editLayer().cleanData(false, false);
    6776                } catch (IOException e) {
    6877                        e.printStackTrace();
  • src/org/openstreetmap/josm/actions/UploadAction.java

    r50 r51  
    3939
    4040        public void actionPerformed(ActionEvent e) {
    41                 Collection<OsmPrimitive> add = new LinkedList<OsmPrimitive>();
    42                 Collection<OsmPrimitive> update = new LinkedList<OsmPrimitive>();
    43                 Collection<OsmPrimitive> delete = new LinkedList<OsmPrimitive>();
     41                final Collection<OsmPrimitive> add = new LinkedList<OsmPrimitive>();
     42                final Collection<OsmPrimitive> update = new LinkedList<OsmPrimitive>();
     43                final Collection<OsmPrimitive> delete = new LinkedList<OsmPrimitive>();
    4444                boolean acceptedTracks = false;
    4545                for (OsmPrimitive osm : Main.main.ds.allPrimitives()) {
     
    8484                                        JOptionPane.showMessageDialog(Main.main, x.getMessage());
    8585                                }
     86                                Main.main.getMapFrame().mapView.editLayer().cleanData(true, !add.isEmpty());
    8687                        }
    8788                }).start();
    88                
    89                 // finished without errors -> clean dataset
    90                 Main.main.getMapFrame().mapView.editLayer().cleanData();
    9189        }
    9290       
  • src/org/openstreetmap/josm/data/projection/Epsg4263.java

    r43 r51  
    1616
    1717        public void xy2latlon(GeoPoint p) {
    18                 p.lat = p.y;
    19                 p.lon = p.x;
     18                p.lat = Math.round(p.y*MAX_SERVER_PRECISION)/MAX_SERVER_PRECISION;
     19                p.lon = Math.round(p.x*MAX_SERVER_PRECISION)/MAX_SERVER_PRECISION;
    2020        }
    2121
  • src/org/openstreetmap/josm/data/projection/Mercator.java

    r43 r51  
    2222                p.lon = p.x*180/Math.PI;
    2323                p.lat = Math.atan(Math.sinh(p.y))*180/Math.PI;
     24                // round values to maximum server precision
     25                p.lon = Math.round(p.lon*MAX_SERVER_PRECISION)/MAX_SERVER_PRECISION;
     26                p.lat = Math.round(p.lat*MAX_SERVER_PRECISION)/MAX_SERVER_PRECISION;
    2427        }
    2528
  • src/org/openstreetmap/josm/data/projection/Projection.java

    r43 r51  
    1313        public static double MAX_LAT = 85;
    1414        public static double MAX_LON = 180;
     15        public static final double MAX_SERVER_PRECISION = 1e13;
    1516       
    1617        /**
     
    2829        void xy2latlon(GeoPoint p);
    2930
    30        
    31         // description functions
    32        
    3331        /**
    3432         * Describe the projection converter in one or two words.
  • src/org/openstreetmap/josm/gui/MapStatus.java

    r39 r51  
    1515import java.beans.PropertyChangeListener;
    1616import java.util.Collection;
     17import java.util.ConcurrentModificationException;
    1718import java.util.Map.Entry;
    1819
     
    107108                                osmStatus = osms;
    108109                                oldModifiers = ms.modifiers;
    109                                
    110                                 // Set the text label in the bottom status bar
    111                                 OsmPrimitive osmNearest = mv.getNearest(ms.mousePos, (ms.modifiers & MouseEvent.ALT_DOWN_MASK) != 0);
     110
     111                                // This try/catch is a hack to stop the flooding bug reports about this.
     112                                // The exception needed to handle with in the first place, means that this
     113                                // access to the data need to be restarted, if the main thread modifies
     114                                // the data.
     115                                OsmPrimitive osmNearest = null;
     116                                try {
     117                                        // Set the text label in the bottom status bar
     118                                        osmNearest = mv.getNearest(ms.mousePos, (ms.modifiers & MouseEvent.ALT_DOWN_MASK) != 0);
     119                                } catch (ConcurrentModificationException x) {
     120                                }
    112121                                if (osmNearest != null) {
    113122                                        SelectionComponentVisitor visitor = new SelectionComponentVisitor();
  • src/org/openstreetmap/josm/gui/MapView.java

    r50 r51  
    216216                        if (h < 20)
    217217                                h = 20;
    218                        
     218
    219219                        Bounds bounds = null;
    220220                        for (Layer l : layers) {
     
    309309        public OsmDataLayer editLayer() {
    310310                if (editLayer == null)
    311                         addLayer(new OsmDataLayer(new DataSet(), "unnamed"));
     311                        addLayer(new OsmDataLayer(new DataSet(), "unnamed", false));
    312312                return editLayer;
    313313        }
  • src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java

    r50 r51  
    5050        private boolean modified = false;
    5151        /**
     52         * Whether the data was modified due an upload of the data to the server.
     53         */
     54        public boolean uploadedModified = false;
     55        /**
     56         * Whether the data (or pieces of the data) was loaded from disk rather than from
     57         * the server directly. This affects the modified state.
     58         */
     59        private boolean fromDisk = false;
     60        /**
    5261         * All commands that were made on the dataset.
    5362         */
     
    6271         */
    6372        LinkedList<ModifiedChangedListener> listener;
     73
    6474       
    6575        /**
    6676         * Construct a OsmDataLayer.
    6777         */
    68         public OsmDataLayer(DataSet data, String name) {
     78        public OsmDataLayer(DataSet data, String name, boolean fromDisk) {
    6979                super(name);
    7080                this.data = data;
     81                this.fromDisk = fromDisk;
    7182                Main.pref.addPropertyChangeListener(new PropertyChangeListener() {
    7283                        public void propertyChange(PropertyChangeEvent evt) {
     
    186197                Main.main.redoAction.setEnabled(true);
    187198                if (commands.isEmpty())
    188                         setModified(false);
     199                        setModified(uploadedModified);
    189200        }
    190201        /**
     
    200211                Main.main.undoAction.setEnabled(true);
    201212                Main.main.redoAction.setEnabled(!redoCommands.isEmpty());
     213                setModified(true);
    202214        }
    203215
     
    206218         * really deleting all deleted objects and reset the modified flags. This is done
    207219         * after a successfull upload.
    208          */
    209         public void cleanData() {
     220         * @param uploaded <code>true</code>, if the data was uploaded, false if saved to disk
     221         * @param dataAdded <code>true</code>, if data was added during the upload process.
     222         */
     223        public void cleanData(boolean uploaded, boolean dataAdded) {
    210224                redoCommands.clear();
    211225                commands.clear();
    212                 for (Iterator<Node> it = data.nodes.iterator(); it.hasNext();)
    213                         cleanIterator(it);
    214                 for (Iterator<LineSegment> it = data.lineSegments.iterator(); it.hasNext();)
    215                         cleanIterator(it);
    216                 for (Iterator<Track> it = data.tracks.iterator(); it.hasNext();)
    217                         cleanIterator(it);
    218                
    219                 // not modified anymore, since either everything reverted to file state or
    220                 // everything uploaded properly.               
    221                 setModified(false);
    222                
     226               
     227                // if uploaded, clean the modified flags as well
     228                if (uploaded) {
     229                        for (Iterator<Node> it = data.nodes.iterator(); it.hasNext();)
     230                                cleanModifiedFlag(it);
     231                        for (Iterator<LineSegment> it = data.lineSegments.iterator(); it.hasNext();)
     232                                cleanModifiedFlag(it);
     233                        for (Iterator<Track> it = data.tracks.iterator(); it.hasNext();)
     234                                cleanModifiedFlag(it);
     235                }
     236               
     237                // update the modified flag
     238               
     239                if (fromDisk && uploaded && !dataAdded)
     240                        return; // do nothing when uploading non-harmful changes.
     241               
     242                // modified if server changed the data (esp. the id).
     243                uploadedModified = fromDisk && uploaded && dataAdded;
     244                setModified(uploadedModified);
     245                //TODO: Replace with listener scheme
     246                Main.main.undoAction.setEnabled(false);
     247                Main.main.redoAction.setEnabled(false);
     248        }
     249
     250        private void cleanModifiedFlag(Iterator<? extends OsmPrimitive> it) {
     251                OsmPrimitive osm = it.next();
     252                osm.modified = false;
     253                osm.modifiedProperties = false;
     254                if (osm.isDeleted())
     255                        it.remove();
    223256        }
    224257
     
    246279        }
    247280
    248         private void cleanIterator(Iterator<? extends OsmPrimitive> it) {
    249                 OsmPrimitive osm = it.next();
    250                 osm.modified = false;
    251                 osm.modifiedProperties = false;
    252                 if (osm.isDeleted())
    253                         it.remove();
    254         }
    255 
    256281        /**
    257282         * @return The number of not-deleted primitives in the list.
Note: See TracChangeset for help on using the changeset viewer.