Changeset 100 in josm for src/org


Ignore:
Timestamp:
2006-04-28T01:32:03+02:00 (19 years ago)
Author:
imi
Message:
  • fixed JOSM crash when importing GeoImages on layers without timestamp
  • fixed merging: incomplete segments do not overwrite complete on ways
  • fixed focus when entering the popups from PropertyDialog
  • fixed broken "draw lines between gps points"
  • added doubleclick on bookmarklist
  • added background color configuration
  • added GpxImport to import 1.0 and 1.1 GPX files

This is release JOSM 1.3

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

Legend:

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

    r99 r100  
    9898                                                Main.main.editLayer().listenerCommands.add(redoUndoListener);
    9999                                }
    100                                 public void layerRemoved(final Layer oldLayer) {}
     100                                public void layerRemoved(final Layer oldLayer) {
     101                                        if (oldLayer instanceof OsmDataLayer)
     102                                                Main.main.editLayer().listenerCommands.add(redoUndoListener);
     103                                }
    101104                        });
    102105                        if (map.mapView.editLayer != null)
     
    110113         */
    111114        public final void removeLayer(final Layer layer) {
    112                 final Collection<Layer> allLayers = map.mapView.getAllLayers();
    113                 if (allLayers.size() == 1 && allLayers.iterator().next() == layer) {
    114                         Main.map.setVisible(false);
     115                map.mapView.removeLayer(layer);
     116                if (layer instanceof OsmDataLayer)
     117                        ds = new DataSet();
     118                if (map.mapView.getAllLayers().isEmpty())
    115119                        setMapFrame(null);
    116                         ds = new DataSet();
    117                 } else {
    118                         map.mapView.removeLayer(layer);
    119                         if (layer instanceof OsmDataLayer)
    120                                 ds = new DataSet();
    121                 }
    122120        }
    123121        public Main() {
  • src/org/openstreetmap/josm/actions/DownloadAction.java

    r99 r100  
    1010import java.awt.event.KeyEvent;
    1111import java.awt.event.KeyListener;
     12import java.awt.event.MouseAdapter;
     13import java.awt.event.MouseEvent;
    1214import java.io.IOException;
    1315import java.util.Collection;
     
    1719import javax.swing.JButton;
    1820import javax.swing.JCheckBox;
     21import javax.swing.JDialog;
    1922import javax.swing.JLabel;
    2023import javax.swing.JOptionPane;
     
    283286                Bookmark b;
    284287                do {
    285                         int r = JOptionPane.showConfirmDialog(Main.parent, dlg, "Choose an area",
    286                                         JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
    287                         if (r != JOptionPane.OK_OPTION)
     288                        final JOptionPane pane = new JOptionPane(dlg, JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION);
     289                        final JDialog panedlg = pane.createDialog(Main.parent, "Choose an area");
     290                        bookmarks.addMouseListener(new MouseAdapter(){
     291                                @Override public void mouseClicked(MouseEvent e) {
     292                        if (e.getClickCount() >= 2) {
     293                                        pane.setValue(JOptionPane.OK_OPTION);
     294                                        panedlg.setVisible(false);
     295                        }
     296                }
     297                        });
     298                        panedlg.setVisible(true);
     299                        Object answer = pane.getValue();
     300                        if (answer == null || answer == JOptionPane.UNINITIALIZED_VALUE || (answer instanceof Integer && (Integer)answer != JOptionPane.OK_OPTION))
    288301                                return;
    289302                        b = readBookmark();
  • src/org/openstreetmap/josm/actions/mapmode/AddNodeAction.java

    r99 r100  
    114114                        }
    115115
    116                         c = new SequenceCommand(cmds);
     116                        c = new SequenceCommand("Add Node into Segment", cmds);
    117117                }
    118118                Main.main.editLayer().add(c);
  • src/org/openstreetmap/josm/actions/mapmode/AddWayAction.java

    r99 r100  
    8888                                way = w;
    8989                                Main.ds.setSelected(way);
     90                                for (Segment seg : way.segments) {
     91                                        if (seg.incomplete) {
     92                                                JOptionPane.showMessageDialog(Main.parent, "Warning: This way is incomplete. Try to download it, before adding segments.");
     93                                                return;
     94                                        }
     95                                }
    9096                                return;
    9197                        }
     
    128134                        return null;
    129135
    130                 if (selection.size() == 1 && selection.iterator().next() instanceof Way)
    131                         return (Way)selection.iterator().next();
     136                if (selection.size() == 1 && selection.iterator().next() instanceof Way) {
     137                        Way way = (Way)selection.iterator().next();
     138                        for (Segment seg : way.segments) {
     139                                if (seg.incomplete) {
     140                                        JOptionPane.showMessageDialog(Main.parent, "Warning: This way is incomplete. Try to download it, before adding segments.");
     141                                        break;
     142                                }
     143                        }
     144                        return way;
     145                }
    132146
    133147                HashSet<Segment> segmentSet = new HashSet<Segment>();
     
    220234                Way w = new Way();
    221235                w.segments.addAll(sortedSegments);
    222 
    223                 if (way != null)
    224                         Main.main.editLayer().add(new AddCommand(way));
     236                Main.main.editLayer().add(new AddCommand(w));
    225237                return w;
    226238        }
  • src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java

    r98 r100  
    44import java.awt.event.KeyEvent;
    55import java.awt.event.MouseEvent;
     6import java.util.ArrayList;
     7import java.util.Arrays;
    68import java.util.Collection;
    79import java.util.Collections;
    810import java.util.HashSet;
     11import java.util.Map.Entry;
    912
    1013import javax.swing.JOptionPane;
    1114
    1215import org.openstreetmap.josm.Main;
     16import org.openstreetmap.josm.command.ChangeCommand;
     17import org.openstreetmap.josm.command.Command;
    1318import org.openstreetmap.josm.command.DeleteCommand;
     19import org.openstreetmap.josm.command.SequenceCommand;
     20import org.openstreetmap.josm.data.osm.Node;
    1421import org.openstreetmap.josm.data.osm.OsmPrimitive;
     22import org.openstreetmap.josm.data.osm.Segment;
     23import org.openstreetmap.josm.data.osm.Way;
    1524import org.openstreetmap.josm.data.osm.visitor.CollectBackReferencesVisitor;
    1625import org.openstreetmap.josm.gui.MapFrame;
     
    115124         * inform the user and do not delete.
    116125         *
     126         * If deleting a node which is part of exactly two segments, and both segments
     127         * have no conflicting keys, join them and remove the node.
     128         *
    117129         * @param selection The objects to delete.
    118130         * @param msgBox Whether a message box for errors should be shown
     
    124136                        osm.visit(v);
    125137                        if (!selection.containsAll(v.data)) {
    126                                 if (msgBox) {
     138                                if (osm instanceof Node) {
     139                                        String reason = deleteNodeAndJoinSegment((Node)osm);
     140                                        if (reason != null && msgBox) {
     141                                                JOptionPane.showMessageDialog(Main.parent, "Cannot delete node. "+reason);
     142                                                return;
     143                                        }
     144                                } else if (msgBox) {
    127145                                        JOptionPane.showMessageDialog(Main.parent, "This object is in use.");
    128146                                        return;
     
    136154                        Main.main.editLayer().add(new DeleteCommand(del));
    137155        }
     156
     157        private String deleteNodeAndJoinSegment(Node n) {
     158                ArrayList<Segment> segs = new ArrayList<Segment>(2);
     159                for (Segment s : Main.ds.segments) {
     160                        if (!s.deleted && (s.from == n || s.to == n)) {
     161                                if (segs.size() > 1)
     162                                        return "Used by more than two segments.";
     163                                segs.add(s);
     164                        }
     165                }
     166                if (segs.size() != 2)
     167                        return "Used by only one segment.";
     168                Segment seg1 = segs.get(0);
     169                Segment seg2 = segs.get(1);
     170                if (seg1.from == seg2.to) {
     171                        Segment s = seg1;
     172                        seg1 = seg2;
     173                        seg2 = s;
     174                }
     175                for (Way w : Main.ds.ways)
     176                        if (!w.deleted && (w.segments.contains(seg1) || w.segments.contains(seg2)))
     177                                return "Used in a way.";
     178                if (seg1.from == seg2.from || seg1.to == seg2.to)
     179                        return "Wrong direction of segments.";
     180                for (Entry<String, String> e : seg1.entrySet())
     181                        if (seg2.keySet().contains(e.getKey()) && !seg2.get(e.getKey()).equals(e.getValue()))
     182                                return "Conflicting keys";
     183                Segment s = new Segment(seg1);
     184                s.to = seg2.to;
     185                if (s.keys == null)
     186                        s.keys = seg2.keys;
     187                else if (seg2.keys != null)
     188                        s.keys.putAll(seg2.keys);
     189                Command[] cmds = new Command[]{
     190                        new ChangeCommand(seg1, s),
     191                        new DeleteCommand(Arrays.asList(new OsmPrimitive[]{n, seg2}))};
     192                Main.main.editLayer().add(new SequenceCommand("Delete Node", Arrays.asList(cmds)));
     193                return null;
     194    }
    138195}
  • src/org/openstreetmap/josm/command/SequenceCommand.java

    r94 r100  
    1919         */
    2020        private Command[] sequence;
     21        private final String name;
    2122
    2223        /**
     
    2425         * @param sequenz The sequenz that should be executed.
    2526         */
    26         public SequenceCommand(Collection<Command> sequenz) {
     27        public SequenceCommand(String name, Collection<Command> sequenz) {
     28                this.name = name;
    2729                this.sequence = new Command[sequenz.size()];
    2830                this.sequence = sequenz.toArray(this.sequence);
     
    4547
    4648        @Override public MutableTreeNode description() {
    47                 DefaultMutableTreeNode root = new DefaultMutableTreeNode("Sequence");
     49                DefaultMutableTreeNode root = new DefaultMutableTreeNode("Sequence: "+name);
    4850                for (Command c : sequence)
    4951                        root.add(c.description());
  • src/org/openstreetmap/josm/data/Preferences.java

    r98 r100  
    128128                properties.put("projection", "org.openstreetmap.josm.data.projection.Epsg4326");
    129129                properties.put("osm-server.url", "http://www.openstreetmap.org/api");
     130                properties.put("color.background", ColorHelper.color2html(Color.black));
    130131                properties.put("color.node", ColorHelper.color2html(Color.red));
    131132                properties.put("color.segment", ColorHelper.color2html(SimplePaintVisitor.darkgreen));
     
    134135                properties.put("color.selected", ColorHelper.color2html(Color.white));
    135136                properties.put("color.gps point", ColorHelper.color2html(Color.gray));
     137                properties.put("color.conflict", ColorHelper.color2html(Color.gray));
    136138                save();
    137139        }
  • src/org/openstreetmap/josm/data/osm/Node.java

    r94 r100  
    4848
    4949        public int compareTo(OsmPrimitive o) {
    50             return o instanceof Node ? Long.valueOf(id).compareTo(o.id) : -1;
     50            return o instanceof Node ? Long.valueOf(id).compareTo(o.id) : 1;
    5151    }
    5252}
  • src/org/openstreetmap/josm/data/osm/Segment.java

    r97 r100  
    8888
    8989        public int compareTo(OsmPrimitive o) {
    90                 return o instanceof Segment ? Long.valueOf(id).compareTo(o.id) : (o instanceof Node ? 1 : -1);
     90                return o instanceof Segment ? Long.valueOf(id).compareTo(o.id) : (o instanceof Node ? -1 : 1);
    9191        }
    9292}
  • src/org/openstreetmap/josm/data/osm/Way.java

    r94 r100  
    4848
    4949        public int compareTo(OsmPrimitive o) {
    50             return o instanceof Way ? Long.valueOf(id).compareTo(o.id) : 1;
     50            return o instanceof Way ? Long.valueOf(id).compareTo(o.id) : -1;
    5151    }
    5252}
  • src/org/openstreetmap/josm/data/osm/visitor/CollectBackReferencesVisitor.java

    r86 r100  
    2121
    2222        private final DataSet ds;
    23        
     23
    2424        /**
    2525         * The result list of primitives stored here.
     
    3535                this.ds = ds;
    3636        }
    37        
     37
    3838        public void visit(Node n) {
    39                 for (Way t : ds.ways) {
    40                         if (t.deleted)
     39                for (Way w : ds.ways) {
     40                        if (w.deleted)
    4141                                continue;
    42                         for (Segment ls : t.segments) {
     42                        for (Segment ls : w.segments) {
    4343                                if (ls.incomplete)
    4444                                        continue;
    4545                                if (ls.from == n || ls.to == n) {
    46                                         data.add(t);
     46                                        data.add(w);
    4747                                        break;
    4848                                }
  • src/org/openstreetmap/josm/data/osm/visitor/MergeVisitor.java

    r97 r100  
    99
    1010import org.openstreetmap.josm.data.osm.DataSet;
    11 import org.openstreetmap.josm.data.osm.Segment;
    1211import org.openstreetmap.josm.data.osm.Node;
    1312import org.openstreetmap.josm.data.osm.OsmPrimitive;
     13import org.openstreetmap.josm.data.osm.Segment;
    1414import org.openstreetmap.josm.data.osm.Way;
    1515
     
    116116        }
    117117
     118        private <T extends OsmPrimitive> void cloneFromExceptIncomplete(T myOsm, T otherOsm) {
     119                if (!(myOsm instanceof Way))
     120                        myOsm.cloneFrom(otherOsm);
     121                else {
     122                        Way my = (Way)myOsm;
     123                        Way other = (Way)otherOsm;
     124                        HashMap<Long, Segment> copy = new HashMap<Long, Segment>();
     125                        for (Segment s : my.segments)
     126                                copy.put(s.id, s);
     127                        my.cloneFrom(other);
     128                        my.segments.clear();
     129                        for (Segment s : other.segments) {
     130                                Segment myS = copy.get(s.id);
     131                                if (s.incomplete && myS != null && !myS.incomplete) {
     132                                        mergedSegments.put(s, myS);
     133                                        my.segments.add(myS);
     134                                } else
     135                                        my.segments.add(s);
     136                        }
     137                }
     138    }
     139
    118140        /**
    119141         * Merge the way if id matches or if all segments matches and the
     
    144166                        }
    145167                        if (!same) {
     168                                HashMap<Long, Segment> copy = new HashMap<Long, Segment>();
     169                                for (Segment s : my.segments)
     170                                        copy.put(s.id, s);
    146171                                my.segments.clear();
    147                                 my.segments.addAll(other.segments);
     172                                for (Segment s : other.segments) {
     173                                        Segment myS = copy.get(s.id);
     174                                        if (s.incomplete && myS != null && !myS.incomplete) {
     175                                                mergedSegments.put(s, myS);
     176                                                my.segments.add(myS);
     177                                        } else
     178                                                my.segments.add(s);
     179                                }
    148180                                my.modified = other.modified;
    149181                        }
     
    273305                                } else if (!my.modified && !other.modified) {
    274306                                        if (d1.before(d2)) {
    275                                                 my.cloneFrom(other);
     307                                                cloneFromExceptIncomplete(my, other);
    276308                                                if (merged != null)
    277309                                                        merged.put(other, my);
     
    283315                                                        merged.put(other, my);
    284316                                        } else {
    285                                                 my.cloneFrom(other);
     317                                                cloneFromExceptIncomplete(my, other);
    286318                                                if (merged != null)
    287319                                                        merged.put(other, my);
  • src/org/openstreetmap/josm/data/osm/visitor/NameVisitor.java

    r94 r100  
    4343                if (name == null) {
    4444                        if (ls.incomplete)
    45                                 name = ls.id == 0 ? "new" : ""+ls.id;
     45                                name = ls.id == 0 ? "new" : ""+ls.id+" (unknown)";
    4646                        else
    4747                                name = (ls.id==0?"":ls.id+" ")+"("+ls.from.coor.lat()+","+ls.from.coor.lon()+") -> ("+ls.to.coor.lat()+","+ls.to.coor.lon()+")";
     
    7171                if (name == null) {
    7272                        AllNodesVisitor.getAllNodes(w.segments);
     73                        boolean incomplete = false;
    7374                        Set<Node> nodes = new HashSet<Node>();
    7475                        for (Segment ls : w.segments) {
     
    7677                                        nodes.add(ls.from);
    7778                                        nodes.add(ls.to);
    78                                 }
     79                                } else
     80                                        incomplete = true;
    7981                        }
    80                         name = "("+nodes.size()+" nodes)";
     82                        name = nodes.size()+" nodes";
     83                        if (incomplete)
     84                                name += " (incomplete)";
    8185                }
    8286                icon = ImageProvider.get("data", "way");
  • src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java

    r99 r100  
    116116        public static Color getPreferencesColor(String colName, Color def) {
    117117                String colStr = Main.pref.get("color."+colName);
    118                 if (colStr.equals(""))
     118                if (colStr.equals("")) {
     119                        Main.pref.put("color."+colName, ColorHelper.color2html(def));
    119120                        return def;
     121                }
    120122                return ColorHelper.html2color(colStr);
    121123        }
  • src/org/openstreetmap/josm/gui/MapMover.java

    r86 r100  
    3232        private Cursor oldCursor;
    3333
     34        private boolean movementInPlace = false;
    3435       
    3536        /**
     
    8485         */
    8586        private void startMovement(MouseEvent e) {
     87                if (movementInPlace)
     88                        return;
     89                movementInPlace = true;
    8690                mousePosMove = nc.getEastNorth(e.getX(), e.getY());
    8791                oldCursor = nc.getCursor();
     
    9397         */
    9498        private void endMovement() {
     99                if (!movementInPlace)
     100                        return;
     101                movementInPlace = false;
    95102                if (oldCursor != null)
    96103                        nc.setCursor(oldCursor);
  • src/org/openstreetmap/josm/gui/MapStatus.java

    r94 r100  
    1212import java.awt.event.MouseEvent;
    1313import java.awt.event.MouseMotionListener;
    14 import java.beans.PropertyChangeEvent;
    15 import java.beans.PropertyChangeListener;
    1614import java.util.Collection;
    1715import java.util.ConcurrentModificationException;
     
    7977                 */
    8078                private Popup popup;
    81                 /**
    82                  * Signals the collector to shut down on next event.
    83                  */
    84                 boolean exitCollector = false;
     79               
     80                private MapFrame parent;
     81               
     82                public Collector(MapFrame parent) {
     83                        this.parent = parent;
     84                }
    8585               
    8686                /**
     
    9595                                        ms.mousePos = mouseState.mousePos;
    9696                                }
    97                                 if (exitCollector)
    98                                         return;
     97                                if (parent != Main.map)
     98                                        return; // exit, if new parent.
    9999                                if ((ms.modifiers & MouseEvent.CTRL_DOWN_MASK) != 0 || ms.mousePos == null)
    100100                                        continue; // freeze display when holding down ctrl
     
    218218               
    219219                // The background thread
    220                 final Collector collector = new Collector();
     220                final Collector collector = new Collector(mapFrame);
    221221                new Thread(collector).start();
    222222               
     
    233233                        }
    234234                }, AWTEvent.KEY_EVENT_MASK | AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK);
    235                
    236                 // listen for shutdowns to cancel the background thread
    237                 mapFrame.addPropertyChangeListener("visible", new PropertyChangeListener(){
    238                         public void propertyChange(PropertyChangeEvent evt) {
    239                                 if (evt.getNewValue() == Boolean.FALSE) {
    240                                         collector.exitCollector = true;
    241                                         synchronized (collector) {
    242                                                 collector.notify();
    243                                         }
    244                                 }
    245                         }
    246                 });
    247235        }
    248236}
  • src/org/openstreetmap/josm/gui/MapView.java

    r99 r100  
    2828import org.openstreetmap.josm.data.osm.OsmPrimitive;
    2929import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
     30import org.openstreetmap.josm.data.osm.visitor.SimplePaintVisitor;
    3031import org.openstreetmap.josm.data.projection.Projection;
    3132import org.openstreetmap.josm.gui.layer.Layer;
     
    8586       
    8687        private final class Scaler extends JSlider implements PropertyChangeListener, ChangeListener {
    87                 boolean hovered = false;
     88                boolean clicked = false;
    8889                public Scaler() {
    8990                        super(0, 20);
    9091                        addMouseListener(new MouseAdapter(){
    91                                 @Override public void mouseEntered(MouseEvent e) {
    92                         hovered = true;
     92                                @Override public void mousePressed(MouseEvent e) {
     93                        clicked = true;
    9394                }
    94                                 @Override public void mouseExited(MouseEvent e) {
    95                         hovered = false;
     95                                @Override public void mouseReleased(MouseEvent e) {
     96                        clicked = false;
    9697                }
    9798                        });
     
    104105        }
    105106                public void stateChanged(ChangeEvent e) {
    106                         if (!hovered)
     107                        if (!clicked)
    107108                                return;
    108109                        EastNorth pos = world;
     
    206207         */
    207208        @Override public void paint(Graphics g) {
    208                 g.setColor(Color.BLACK);
     209                g.setColor(SimplePaintVisitor.getPreferencesColor("background", Color.BLACK));
    209210                g.fillRect(0, 0, getWidth(), getHeight());
    210211
  • src/org/openstreetmap/josm/gui/PreferenceDialog.java

    r98 r100  
    315315                warning.setFont(warning.getFont().deriveFont(Font.ITALIC));
    316316                con.add(warning, GBC.eop().fill(GBC.HORIZONTAL));
    317                 con.add(new JLabel("WMS server base url (everything except bbox-parameter)"), GBC.eol());
    318                 con.add(wmsServerBaseUrl, GBC.eop().fill(GBC.HORIZONTAL));
    319                 con.add(Box.createVerticalGlue(), GBC.eol().fill(GBC.VERTICAL));
     317                //con.add(new JLabel("WMS server base url (everything except bbox-parameter)"), GBC.eol());
     318                //con.add(wmsServerBaseUrl, GBC.eop().fill(GBC.HORIZONTAL));
     319                //con.add(Box.createVerticalGlue(), GBC.eol().fill(GBC.VERTICAL));
    320320                con.add(new JLabel("CSV import specification (empty: read from first line in data)"), GBC.eol());
    321321                con.add(csvImportString, GBC.eop().fill(GBC.HORIZONTAL));
  • src/org/openstreetmap/josm/gui/SelectionManager.java

    r99 r100  
    123123         * @param eventSource The emitter of the mouse events.
    124124         */
    125         public void register(Component eventSource) {
     125        public void register(NavigatableComponent eventSource) {
    126126                eventSource.addMouseListener(this);
    127127                eventSource.addMouseMotionListener(this);
     
    134134                                mousePosStart = null;
    135135                                mousePos = null;
     136            }
     137        });
     138        eventSource.addPropertyChangeListener("scale", new PropertyChangeListener(){
     139                        public void propertyChange(PropertyChangeEvent evt) {
     140                                if (mousePosStart != null) {
     141                                        paintRect();
     142                                        mousePos = mousePosStart = null;
     143                                }
    136144            }
    137145        });
  • src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java

    r99 r100  
    3636                                        Main.main.editLayer().listenerCommands.add(CommandStackDialog.this);
    3737                        }
    38                         public void layerRemoved(Layer oldLayer) {}
     38                        public void layerRemoved(Layer oldLayer) {
     39                                if (oldLayer instanceof OsmDataLayer)
     40                                        Main.main.editLayer().listenerCommands.remove(CommandStackDialog.this);
     41                        }
    3942                });
    4043                if (mapFrame.mapView.editLayer != null)
     
    6972
    7073        private void buildList() {
     74                if (Main.map == null || Main.map.mapView == null || Main.map.mapView.editLayer == null)
     75                        return;
    7176                Collection<Command> commands = Main.main.editLayer().commands;
    7277                DefaultMutableTreeNode root = new DefaultMutableTreeNode();
     
    7479                        root.add(c.description());
    7580                treeModel.setRoot(root);
     81                tree.scrollRowToVisible(treeModel.getChildCount(root)-1);
    7682        }
    7783
  • src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java

    r98 r100  
    140140         */
    141141        public void paintConflicts(final Graphics g, final NavigatableComponent nc) {
    142                 Color preferencesColor = SimplePaintVisitor.getPreferencesColor("conflict", Color.GRAY);
     142                Color preferencesColor = SimplePaintVisitor.getPreferencesColor("conflict", Color.gray);
    143143                if (preferencesColor.equals(Color.BLACK))
    144144                        return;
  • src/org/openstreetmap/josm/gui/dialogs/LayerList.java

    r98 r100  
    145145                layers.addListSelectionListener(new ListSelectionListener(){
    146146                        public void valueChanged(ListSelectionEvent e) {
     147                                if (layers.getModel().getSize() == 0)
     148                                        return;
    147149                                if (layers.getSelectedIndex() == -1)
    148150                                        layers.setSelectedIndex(e.getFirstIndex());
  • src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java

    r98 r100  
    1111import java.awt.event.MouseAdapter;
    1212import java.awt.event.MouseEvent;
    13 import java.awt.event.WindowEvent;
    14 import java.awt.event.WindowFocusListener;
    1513import java.util.Collection;
    1614import java.util.HashMap;
    17 import java.util.Iterator;
    1815import java.util.Map;
    1916import java.util.TreeMap;
     
    9390                p.add(combo, BorderLayout.CENTER);
    9491
    95                 final JOptionPane optionPane = new JOptionPane(p, JOptionPane.QUESTION_MESSAGE, JOptionPane.OK_CANCEL_OPTION);
     92                final JOptionPane optionPane = new JOptionPane(p, JOptionPane.QUESTION_MESSAGE, JOptionPane.OK_CANCEL_OPTION){
     93                        @Override public void selectInitialValue() {
     94                                combo.requestFocusInWindow();
     95                                combo.getEditor().selectAll();
     96                        }
     97                };
    9698                final JDialog dlg = optionPane.createDialog(Main.parent, "Change values?");
    97                 dlg.addWindowFocusListener(new WindowFocusListener(){
    98                         public void windowGainedFocus(WindowEvent e) {
    99                                 combo.requestFocusInWindow();
    100                         }
    101                         public void windowLostFocus(WindowEvent e) {
    102                         }
    103                 });
    10499                combo.getEditor().addActionListener(new ActionListener(){
    105100                        public void actionPerformed(ActionEvent e) {
     
    130125                        PropertiesDialog.this.repaint(); // repaint is enough
    131126        }
    132        
     127
    133128        /**
    134129         * Open the add selection dialog and add a new key/value to the table (and to the
     
    137132        void add() {
    138133                Collection<OsmPrimitive> sel = Main.ds.getSelected();
    139                
     134
    140135                JPanel p = new JPanel(new BorderLayout());
    141136                p.add(new JLabel("<html>This will change "+sel.size()+" object"+(sel.size()==1?"":"s")+".<br><br>"+
    142137                "Please select a key"), BorderLayout.NORTH);
    143                 Vector<String> allKeys = new Vector<String>();
     138                TreeSet<String> allKeys = new TreeSet<String>();
    144139                for (OsmPrimitive osm : Main.ds.allNonDeletedPrimitives())
    145140                        allKeys.addAll(osm.keySet());
    146                 for (Iterator<String> it = allKeys.iterator(); it.hasNext();) {
    147                         String s = it.next();
    148                         for (int i = 0; i < data.getRowCount(); ++i) {
    149                                 if (s.equals(data.getValueAt(i, 0))) {
    150                                         it.remove();
    151                                         break;
    152                                 }
    153                         }
    154                 }
    155                 JComboBox keys = new JComboBox(allKeys);
     141                for (int i = 0; i < data.getRowCount(); ++i)
     142                        allKeys.remove(data.getValueAt(i, 0));
     143                final JComboBox keys = new JComboBox(new Vector<String>(allKeys));
    156144                keys.setEditable(true);
    157145                p.add(keys, BorderLayout.CENTER);
    158                
     146
    159147                JPanel p2 = new JPanel(new BorderLayout());
    160148                p.add(p2, BorderLayout.SOUTH);
    161149                p2.add(new JLabel("Please select a value"), BorderLayout.NORTH);
    162                 JTextField values = new JTextField();
     150                final JTextField values = new JTextField();
    163151                p2.add(values, BorderLayout.CENTER);
    164                 int answer = JOptionPane.showConfirmDialog(Main.parent, p,
    165                                 "Change values?", JOptionPane.OK_CANCEL_OPTION);
    166                 if (answer != JOptionPane.OK_OPTION)
     152                JOptionPane pane = new JOptionPane(p, JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION){
     153                        @Override public void selectInitialValue() {
     154                                keys.requestFocusInWindow();
     155                                keys.getEditor().selectAll();
     156                        }
     157                };
     158                pane.createDialog(Main.parent, "Change values?").setVisible(true);
     159                if (!Integer.valueOf(JOptionPane.OK_OPTION).equals(pane.getValue()))
    167160                        return;
    168161                String key = keys.getEditor().getItem().toString();
     
    184177                selectionChanged(sel); // update table
    185178        }
    186        
     179
    187180        /**
    188181         * The property data.
     
    200193         */
    201194        private final JTable propertyTable = new JTable(data);
    202        
     195
    203196        /**
    204197         * Create a new PropertiesDialog
     
    208201
    209202                setPreferredSize(new Dimension(320,150));
    210                
     203
    211204                data.setColumnIdentifiers(new String[]{"Key", "Value"});
    212205                propertyTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
     
    228221                        }
    229222                });
    230                 //propertyTable.addMouseListener(new DblClickWatch());
    231 
     223                DblClickWatch dblClickWatch = new DblClickWatch();
     224                propertyTable.addMouseListener(dblClickWatch);
    232225                JScrollPane scrollPane = new JScrollPane(propertyTable);
    233                 scrollPane.addMouseListener(new DblClickWatch());
     226                scrollPane.addMouseListener(dblClickWatch);
    234227                add(scrollPane, BorderLayout.CENTER);
    235                
     228
    236229                JPanel buttonPanel = new JPanel(new GridLayout(1,3));
    237230                ActionListener buttonAction = new ActionListener(){
     
    258251                add(buttonPanel, BorderLayout.SOUTH);
    259252        }
    260        
     253
    261254        private JButton createButton(String name, String tooltip, int mnemonic, ActionListener actionListener) {
    262255                JButton b = new JButton(name, ImageProvider.get("dialogs", name.toLowerCase()));
     
    284277                        propertyTable.getCellEditor().cancelCellEditing();
    285278                data.setRowCount(0);
    286                
     279
    287280                Map<String, Integer> valueCount = new HashMap<String, Integer>();
    288281                TreeMap<String, Collection<String>> props = new TreeMap<String, Collection<String>>();
  • src/org/openstreetmap/josm/gui/layer/GeoImageLayer.java

    r99 r100  
    55import java.awt.Component;
    66import java.awt.Cursor;
    7 import java.awt.Dimension;
    87import java.awt.Graphics;
    98import java.awt.GridBagLayout;
     
    2423import java.util.Date;
    2524import java.util.LinkedList;
    26 import java.util.List;
    2725import java.util.regex.Matcher;
    2826import java.util.regex.Pattern;
     
    8280                private final RawGpsLayer gpsLayer;
    8381                public Loader(Collection<File> files, RawGpsLayer gpsLayer) {
    84                 super("Images");
    85                 this.files = files;
     82                        super("Images");
     83                        this.files = files;
    8684                        this.gpsLayer = gpsLayer;
    87         }
     85                }
    8886                @Override protected void realRun() throws SAXException, JDOMException, IOException {
    8987                        currentAction.setText("Read GPS...");
    90                         layer = new GeoImageLayer();
     88                        LinkedList<TimedPoint> gps = new LinkedList<TimedPoint>();
    9189
    9290                        // check the gps layer for time loops (and process it on the way)
     
    102100                                                        throw new IOException("Cannot read time from point "+p.latlon.lat()+","+p.latlon.lon());
    103101                                                Date d = dateFormat.parse(m.group(1)+" "+m.group(2));
    104                                                 layer.gps.add(new TimedPoint(d, p.eastNorth));
     102                                                gps.add(new TimedPoint(d, p.eastNorth));
    105103                                                if (last != null && last.after(d))
    106104                                                        throw new IOException("Time loop in gps data.");
     
    112110                        }
    113111
    114                         if (layer.gps.isEmpty()) {
    115                                 layer.data = new ArrayList<ImageEntry>();
     112                        if (gps.isEmpty()) {
     113                                errorMessage = "No images with readable timestamps found.";
    116114                                return;
    117115                        }
    118116
    119117                        // read the image files
    120                         layer.data = new ArrayList<ImageEntry>(files.size());
     118                        ArrayList<ImageEntry> data = new ArrayList<ImageEntry>(files.size());
    121119                        int i = 0;
    122120                        progress.setMaximum(files.size());
     
    134132                                e.icon = loadScaledImage(f, 16);
    135133
    136                                 layer.data.add(e);
    137                         }
     134                                data.add(e);
     135                        }
     136                        layer = new GeoImageLayer(data, gps);
    138137                        layer.calculatePosition();
    139         }
     138                }
    140139                @Override protected void finish() {
    141140                        if (layer != null)
     
    144143                @Override protected void cancel() {cancelled = true;}
    145144        }
    146        
    147         public List<ImageEntry> data;
     145
     146        public ArrayList<ImageEntry> data;
    148147        private LinkedList<TimedPoint> gps = new LinkedList<TimedPoint>();
    149        
     148
    150149        /**
    151150         * The delta added to all timestamps in files from the camera
     
    156155        private boolean mousePressed = false;
    157156        private static final SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
     157        private MouseAdapter mouseAdapter;
    158158
    159159        public static final class GpsTimeIncorrect extends Exception {
     
    180180                loader.pleaseWaitDlg.setVisible(true);
    181181        }
    182        
    183         private GeoImageLayer() {
     182
     183        private GeoImageLayer(final ArrayList<ImageEntry> data, LinkedList<TimedPoint> gps) {
    184184                super("Geotagged Images");
    185                 Main.map.mapView.addMouseListener(new MouseAdapter(){
     185                this.data = data;
     186                this.gps = gps;
     187                mouseAdapter = new MouseAdapter(){
    186188                        @Override public void mousePressed(MouseEvent e) {
    187189                                if (e.getButton() != MouseEvent.BUTTON1)
     
    190192                                if (visible)
    191193                                        Main.map.mapView.repaint();
    192             }
     194                        }
    193195                        @Override public void mouseReleased(MouseEvent ev) {
    194196                                if (ev.getButton() != MouseEvent.BUTTON1)
     
    197199                                if (!visible)
    198200                                        return;
    199                                 for (ImageEntry e : data) {
     201                                for (int i = data.size(); i > 0; --i) {
     202                                        ImageEntry e = data.get(i-1);
    200203                                        if (e.pos == null)
    201204                                                continue;
     
    208211                                }
    209212                                Main.map.mapView.repaint();
    210             }
    211                 });
     213                        }
     214                };
     215                Main.map.mapView.addMouseListener(mouseAdapter);
    212216        }
    213217
    214218        private void showImage(final ImageEntry e) {
    215219                final JPanel p = new JPanel(new BorderLayout());
    216                 final JScrollPane scroll = new JScrollPane(new JLabel(new ImageIcon(e.image.getPath())));
    217                 scroll.setPreferredSize(new Dimension(800,600));
     220                final JScrollPane scroll = new JScrollPane(new JLabel(loadScaledImage(e.image, 580)));
     221                //scroll.setPreferredSize(new Dimension(800,600));
     222                final JViewport vp = scroll.getViewport();
    218223                p.add(scroll, BorderLayout.CENTER);
    219                
     224
    220225                final JToggleButton scale = new JToggleButton(ImageProvider.get("misc", "rectangle"));
    221226                JPanel p2 = new JPanel();
     
    224229                scale.addActionListener(new ActionListener(){
    225230                        public void actionPerformed(ActionEvent ev) {
    226                                 JViewport vp = scroll.getViewport();
    227231                                p.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
    228232                                if (scale.getModel().isSelected())
    229                                         vp.setView(new JLabel(loadScaledImage(e.image, Math.max(vp.getWidth(), vp.getHeight()))));
     233                                        ((JLabel)vp.getView()).setIcon(loadScaledImage(e.image, Math.max(vp.getWidth(), vp.getHeight())));
    230234                                else
    231                                         vp.setView(new JLabel(new ImageIcon(e.image.getPath())));
     235                                        ((JLabel)vp.getView()).setIcon(new ImageIcon(e.image.getPath()));
    232236                                p.setCursor(Cursor.getDefaultCursor());
    233             }
     237                        }
    234238                });
     239                scale.setSelected(true);
    235240                JOptionPane.showMessageDialog(Main.parent, p, e.image+" ("+e.coor.lat()+","+e.coor.lon()+")", JOptionPane.PLAIN_MESSAGE);
    236     }
     241        }
    237242
    238243        @Override public Icon getIcon() {
     
    246251                p.add(new JLabel("GPS start: "+dateFormat.format(gps.getFirst().time)), GBC.eol());
    247252                p.add(new JLabel("GPS end: "+dateFormat.format(gps.getLast().time)), GBC.eop());
    248                
     253
    249254                p.add(new JLabel("current delta: "+(delta/1000.0)+"s"), GBC.eol());
    250255                p.add(new JLabel("timezone difference: "+(gpstimezone>0?"+":"")+(gpstimezone/1000/60/60)), GBC.eop());
    251                
     256
    252257                JList img = new JList(data.toArray());
    253258                img.setCellRenderer(new DefaultListCellRenderer(){
     
    291296                                Rectangle r = new Rectangle(p.x-e.icon.getIconWidth()/2, p.y-e.icon.getIconHeight()/2, e.icon.getIconWidth(), e.icon.getIconHeight());
    292297                                e.icon.paintIcon(mv, g, r.x, r.y);
    293                                 Border b = BorderFactory.createBevelBorder(!clickedFound && mousePressed && r.contains(mv.getMousePosition()) ? BevelBorder.LOWERED : BevelBorder.RAISED);
    294                                 Insets i = b.getBorderInsets(mv);
    295                                 r.grow((i.top+i.bottom)/2, (i.left+i.right)/2);
     298                                Border b = null;
     299                                if (!clickedFound && mousePressed && r.contains(mv.getMousePosition())) {
     300                                        b = BorderFactory.createBevelBorder(BevelBorder.LOWERED);
     301                                        clickedFound = true;
     302                                } else
     303                                        b = BorderFactory.createBevelBorder(BevelBorder.RAISED);
     304                                Insets inset = b.getBorderInsets(mv);
     305                                r.grow((inset.top+inset.bottom)/2, (inset.left+inset.right)/2);
    296306                                b.paintBorder(mv, g, r.x, r.y, r.width, r.height);
    297307                        }
     
    402412                return new ImageIcon(img.getScaledInstance(w, h, Image.SCALE_SMOOTH));
    403413        }
     414
     415        @Override public void layerRemoved() {
     416                Main.map.mapView.removeMouseListener(mouseAdapter);
     417    }
    404418}
  • src/org/openstreetmap/josm/gui/layer/Layer.java

    r86 r100  
    8383       
    8484        abstract public void addMenuEntries(JPopupMenu menu);
     85       
     86        /**
     87         * Called, when the layer is removed from the list. (See it as an destructor)
     88         */
     89        public void layerRemoved() {}
    8590}
  • src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java

    r98 r100  
    7676        }
    7777
    78         private static Icon icon;
    79 
    8078        /**
    8179         * The data behind this layer.
     
    107105        public final LinkedList<ModifiedChangedListener> listenerModified = new LinkedList<ModifiedChangedListener>();
    108106        public final LinkedList<CommandQueueListener> listenerCommands = new LinkedList<CommandQueueListener>();
    109 
    110107
    111108        /**
     
    123120         */
    124121        @Override public Icon getIcon() {
    125                 if (icon == null)
    126                         icon = ImageProvider.get("layer", "osmdata");
    127                 return icon;
     122                return ImageProvider.get("layer", "osmdata");
    128123        }
    129124
     
    202197                redoCommands.push(c);
    203198                //TODO: Replace with listener scheme
    204                         setModified(uploadedModified);
     199                setModified(uploadedModified);
    205200                Main.ds.clearSelection();
    206201                fireCommandsChanged();
     
    255250
    256251        public void fireCommandsChanged() {
    257             for (final CommandQueueListener l : listenerCommands)
     252                for (final CommandQueueListener l : listenerCommands)
    258253                        l.commandChanged(commands.size(), redoCommands.size());
    259     }
     254        }
    260255
    261256        /**
  • src/org/openstreetmap/josm/gui/layer/RawGpsLayer.java

    r99 r100  
    3535 * @author imi
    3636 */
    37 public class RawGpsLayer extends Layer {
     37public class RawGpsLayer extends Layer implements PreferenceChangedListener {
    3838
    39         private static Icon icon;
    40        
    4139        public static class GpsPoint {
    4240                public final LatLon latlon;
     
    5856                super(name);
    5957                this.data = data;
    60                 Main.pref.listener.add(new PreferenceChangedListener(){
    61                 public void preferenceChanged(String key, String newValue) {
    62                         if (Main.map != null && (key.equals("drawRawGpsLines") || key.equals("forceRawGpsLines")))
    63                                 Main.map.repaint();
    64                 }
    65         });
     58                Main.pref.listener.add(this);
    6659        }
    6760
     
    7063         */
    7164        @Override public Icon getIcon() {
    72                 if (icon == null)
    73                         icon = ImageProvider.get("layer", "rawgps");
    74                 return icon;
     65                return ImageProvider.get("layer", "rawgps");
    7566        }
    7667
     
    8677                Point old = null;
    8778                for (Collection<GpsPoint> c : data) {
    88                         if (!Main.pref.getBoolean("forceRawGpsLines"))
     79                        if (!Main.pref.getBoolean("draw.rawgps.lines.force"))
    8980                                old = null;
    9081                        for (GpsPoint p : c) {
    9182                                Point screen = mv.getPoint(p.eastNorth);
    92                                 if (Main.pref.getBoolean("drawRawGpsLines") && old != null)
     83                                if (Main.pref.getBoolean("draw.rawgps.lines") && old != null)
    9384                                        g.drawLine(old.x, old.y, screen.x, screen.y);
    9485                                else
     
    196187                menu.add(new LayerListPopup.InfoAction(this));
    197188    }
     189
     190        public void preferenceChanged(String key, String newValue) {
     191                if (Main.map != null && (key.equals("draw.rawgps.lines") || key.equals("draw.rawgps.lines.force")))
     192                        Main.map.repaint();
     193        }
     194
     195        @Override public void layerRemoved() {
     196                Main.pref.listener.remove(this);
     197    }
    198198}
  • src/org/openstreetmap/josm/io/GpxReader.java

    r86 r100  
    11package org.openstreetmap.josm.io;
    22
    3 import static org.openstreetmap.josm.io.GpxWriter.GPX;
    43import static org.openstreetmap.josm.io.GpxWriter.JOSM;
    54import static org.openstreetmap.josm.io.GpxWriter.OSM;
     
    1211import org.jdom.Element;
    1312import org.jdom.JDOMException;
     13import org.jdom.Namespace;
    1414import org.jdom.input.SAXBuilder;
    1515import org.openstreetmap.josm.data.coor.LatLon;
    1616import org.openstreetmap.josm.data.osm.DataSet;
    17 import org.openstreetmap.josm.data.osm.Segment;
    1817import org.openstreetmap.josm.data.osm.Node;
    1918import org.openstreetmap.josm.data.osm.OsmPrimitive;
     19import org.openstreetmap.josm.data.osm.Segment;
    2020import org.openstreetmap.josm.data.osm.Way;
    2121
     
    4343        private boolean mergeNodes = false;
    4444
     45        private Namespace gpx;
     46       
    4547        /**
    4648         * Construct a parser from a specific data source.
     
    5052                this.source = source;
    5153        }
    52        
     54
    5355        /**
    5456         * Read the input stream and return a DataSet from the stream.
     
    5860                        final SAXBuilder builder = new SAXBuilder();
    5961                        Element root = builder.build(source).getRootElement();
     62                        gpx = root.getNamespace();
    6063                        mergeNodes = !root.getAdditionalNamespaces().contains(JOSM);
    6164                        return parseDataSet(root);
     
    7578        private Node parseWaypoint(Element e) {
    7679                Node data = new Node(new LatLon(
    77                         Double.parseDouble(e.getAttributeValue("lat")),
    78                         Double.parseDouble(e.getAttributeValue("lon"))));
    79                
     80                                Double.parseDouble(e.getAttributeValue("lat")),
     81                                Double.parseDouble(e.getAttributeValue("lon"))));
     82
    8083                for (Object o : e.getChildren()) {
    8184                        Element child = (Element)o;
     
    99102                DataSet data = new DataSet();
    100103                // read waypoints not contained in ways or areas
    101                 for (Object o : e.getChildren("wpt", GPX)) {
     104                for (Object o : e.getChildren("wpt", gpx)) {
    102105                        Node node = parseWaypoint((Element)o);
    103106                        addNode(data, node);
     
    105108
    106109                // read ways (and segments)
    107                 for (Object wayElement : e.getChildren("trk", GPX))
     110                for (Object wayElement : e.getChildren("trk", gpx))
    108111                        parseWay((Element)wayElement, data);
    109112
     
    112115                        if (osm.id < 0)
    113116                                osm.id = 0;
    114                
     117
    115118                // clean up the data a bit (remove broken stuff)
    116119                // remove segments with from==to
     
    157160                        if (child.getName().equals("trkseg")) {
    158161                                Node start = null;
    159                                 for (Object w : child.getChildren("trkpt", GPX)) {
     162                                for (Object w : child.getChildren("trkpt", gpx)) {
    160163                                        Node node = addNode(ds, parseWaypoint((Element)w));
    161164                                        if (start == null)
     
    163166                                        else {
    164167                                                Segment segment = new Segment(start, node);
    165                                                 parseKeyValueExtensions(segment, child.getChild("extensions", GPX));
     168                                                parseKeyValueExtensions(segment, child.getChild("extensions", gpx));
    166169                                                segment = (Segment)getNewIfSeenBefore(segment);
    167170                                                way.segments.add(segment);
     
    201204                return node;
    202205        }
    203        
     206
    204207
    205208        /**
  • src/org/openstreetmap/josm/io/GpxWriter.java

    r99 r100  
    112112
    113113                // ways
    114                 for (Way t : ds.ways) {
    115                         if (t.deleted && t.id == 0)
     114                for (Way w : ds.ways) {
     115                        if (w.deleted && w.id == 0)
    116116                                continue;
    117117                        Element tElem = new Element("trk", GPX);
    118118                        HashMap<String, String> keys = null;
    119                         if (t.keys != null) {
    120                                 keys = new HashMap<String, String>(t.keys);
     119                        if (w.keys != null) {
     120                                keys = new HashMap<String, String>(w.keys);
    121121                                addAndRemovePropertyTag("name", tElem, keys);
    122122                                addAndRemovePropertyTag("cmt", tElem, keys);
     
    127127                                addAndRemovePropertyTag("type", tElem, keys);
    128128                        }
    129                         addPropertyExtensions(tElem, keys, t);
     129                        addPropertyExtensions(tElem, keys, w);
    130130
    131131                        // segments
    132                         for (Segment ls : t.segments) {
     132                        for (Segment ls : w.segments) {
     133                                if (ls.incomplete)
     134                                        continue;
    133135                                tElem.getChildren().add(parseSegment(ls));
    134136                                unrefNodes.remove(ls.from);
     
    379381                        Segment oldLs = null;
    380382                        for (Segment ls : w.segments) {
     383                                if (ls.incomplete)
     384                                        continue;
    381385                                // end old segemnt, if no longer match a chain
    382386                                if (oldLs != null && !oldLs.to.coor.equals(ls.from.coor)) {
     
    407411                Collection<Segment> segments = new LinkedList<Segment>();
    408412                for (OsmPrimitive osm : all)
    409                         if (osm instanceof Segment)
     413                        if (osm instanceof Segment && !((Segment)osm).incomplete)
    410414                                segments.add((Segment)osm);
    411415                if (!segments.isEmpty()) {
     
    424428               
    425429                // finally add the remaining nodes
    426                 for (OsmPrimitive osm : all) {
    427                         outputNode((Node)osm, true);
    428                 }
     430                for (OsmPrimitive osm : all)
     431                        if (osm instanceof Node)
     432                                outputNode((Node)osm, true);
    429433               
    430434                out.println("</gpx>");
  • src/org/openstreetmap/josm/io/OsmServerWriter.java

    r92 r100  
    6868                                        return;
    6969                                osm.visit(v);
    70                                 currentAction.setText("Upload "+v.className+" "+osm.id+"...");
     70                                currentAction.setText("Upload "+v.className+" "+v.name+" ("+osm.id+")...");
    7171                                osm.visit(this);
    7272                                progress.setValue(progress.getValue()+1);
     
    184184                        throw new RuntimeException("Unknown host: "+e.getMessage(), e);
    185185                } catch (Exception e) {
     186                        if (cancel)
     187                                return; // assume cancel
    186188                        if (e instanceof RuntimeException)
    187189                                throw (RuntimeException)e;
    188                         if (!cancel)
    189                                 throw new RuntimeException(e.getMessage(), e);
     190                        throw new RuntimeException(e.getMessage(), e);
    190191                }
    191192        }
  • src/org/openstreetmap/josm/test/MergeVisitorTest.java

    r97 r100  
    1010import org.openstreetmap.josm.data.osm.OsmPrimitive;
    1111import org.openstreetmap.josm.data.osm.Segment;
     12import org.openstreetmap.josm.data.osm.Way;
    1213import org.openstreetmap.josm.data.osm.visitor.MergeVisitor;
    1314import org.openstreetmap.josm.test.framework.Bug;
     
    178179
    179180
     181        public void testCloneWayNotIncomplete() {
     182                DataSet ds = new DataSet();
     183                Node[] n = createNodes(ds, 2);
     184                Segment s = DataSetTestCaseHelper.createSegment(ds, n[0], n[1]);
     185                Way w = DataSetTestCaseHelper.createWay(ds, s);
     186                MergeVisitor v = new MergeVisitor(ds);
     187                v.visit(n[0]);
     188                v.visit(n[1]);
     189                v.visit(s);
     190                v.visit(w);
     191                Way w2 = new Way(w);
     192                w2.timestamp = new Date();
     193                Segment s2 = new Segment(s);
     194                s2.incomplete = true;
     195                w2.segments.clear();
     196                w2.segments.add(s2);
     197                v.visit(w2);
     198                assertSame("Do not import incomplete segments when merging ways.", s, w.segments.iterator().next());
     199        }
     200       
    180201        /**
    181202         * Create that amount of nodes and add them to the dataset. The id will be 1,2,3,4...
Note: See TracChangeset for help on using the changeset viewer.