Changeset 22 in josm


Ignore:
Timestamp:
2005-10-23T22:13:33+02:00 (19 years ago)
Author:
imi
Message:

starting restructure of dataset. Checkpoint is broken!

Files:
7 added
32 edited

Legend:

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

    r21 r22  
    44import java.awt.BorderLayout;
    55import java.awt.Container;
     6import java.util.Collection;
     7import java.util.LinkedList;
    68
    79import javax.swing.JFrame;
     
    2022import org.openstreetmap.josm.actions.PreferencesAction;
    2123import org.openstreetmap.josm.actions.SaveGpxAction;
     24import org.openstreetmap.josm.command.Command;
     25import org.openstreetmap.josm.command.DataSet;
    2226import org.openstreetmap.josm.data.Preferences;
    2327import org.openstreetmap.josm.data.Preferences.PreferencesException;
     
    2630
    2731/**
    28  * Main window class consisting of the mainframe MDI application.
     32 * Main window class application.
    2933 * 
    3034 * @author imi
     
    4145         */
    4246        public final static Preferences pref = new Preferences();
     47
     48        /**
     49         * The global command queue since last save. So if you reload the data from disk
     50         * (or from OSM server, if nothing changed on server) and reapply the commands,
     51         * you should get the same result as currently displaying.
     52         */
     53        public Collection<Command> commands = new LinkedList<Command>();
     54
     55        /**
     56         * The global dataset.
     57         */
     58        public DataSet ds = new DataSet();
    4359       
    4460        /**
     
    105121                // creating toolbar
    106122                JToolBar toolBar = new JToolBar();
    107                 toolBar.setFloatable(false);
     123                toolBar.setFloatable(true);
    108124                toolBar.add(openServerAction);
    109125                toolBar.add(openGpxAction);
  • src/org/openstreetmap/josm/actions/OpenOsmServerAction.java

    r21 r22  
    4444public class OpenOsmServerAction extends AbstractAction {
    4545
    46         private JTextField[] latlon = new JTextField[]{
     46        JTextField[] latlon = new JTextField[]{
    4747                        new JTextField(9),
    4848                        new JTextField(9),
    4949                        new JTextField(9),
    5050                        new JTextField(9)};
    51         private JCheckBox rawGps = new JCheckBox("Open as raw gps data", false);
     51        JCheckBox rawGps = new JCheckBox("Open as raw gps data", false);
    5252
    5353        public OpenOsmServerAction() {
     
    178178         *              checkbox.
    179179         */
    180         private Bookmark readBookmark() {
     180        Bookmark readBookmark() {
    181181                try {
    182182                        Bookmark b = new Bookmark();
  • src/org/openstreetmap/josm/actions/SaveGpxAction.java

    r21 r22  
    4747                try {
    4848                        FileWriter fileWriter = new FileWriter(gpxFile);
    49                         GpxWriter out = new GpxWriter(fileWriter, Main.main.getMapFrame().mapView.getActiveDataSet());
     49                        GpxWriter out = new GpxWriter(fileWriter);
    5050                        out.output();
    5151                        fileWriter.close();
  • src/org/openstreetmap/josm/actions/mapmode/AddLineSegmentAction.java

    r21 r22  
    1111
    1212import org.openstreetmap.josm.Main;
    13 import org.openstreetmap.josm.command.DataSet;
     13import org.openstreetmap.josm.command.AddCommand;
     14import org.openstreetmap.josm.command.Command;
    1415import org.openstreetmap.josm.data.osm.LineSegment;
    1516import org.openstreetmap.josm.data.osm.Node;
     
    130131               
    131132                if (start != end) {
    132                         DataSet ds = mv.getActiveDataSet();
    133 
    134133                        // try to find a line segment
    135                         for (Track t : ds.tracks())
     134                        for (Track t : Main.main.ds.tracks())
    136135                                for (LineSegment ls : t.segments())
    137136                                        if (start == ls.getStart() && end == ls.getEnd()) {
     
    141140
    142141                        LineSegment ls = new LineSegment(start, end);
    143                         boolean foundTrack = false;
    144 
    145                         if (((e.getModifiersEx() & MouseEvent.ALT_DOWN_MASK) != 0)) {
    146                                 // find a track for the new line segment
    147                                 for (Track t : ds.tracks()) {
    148                                         if (t.getEndingNode() == start) {
    149                                                 t.add(ls);
    150                                                 foundTrack = true;
    151                                         }
    152                                 }
    153                                 if (!foundTrack) {
    154                                         for (Track t : ds.tracks()) {
    155                                                 if (t.getStartingNode() == end) {
    156                                                         t.addStart(ls);
    157                                                         foundTrack = true;
    158                                                 }
    159                                         }
    160                                 }
    161                         }
    162                         if (!foundTrack)
    163                                 ds.addPendingLineSegment(ls);
     142                        Command c = new AddCommand(ls);
     143                        c.executeCommand();
     144                        Main.main.commands.add(c);
    164145                }
    165146               
  • src/org/openstreetmap/josm/actions/mapmode/AddNodeAction.java

    r17 r22  
    44import java.awt.event.MouseEvent;
    55
     6import org.openstreetmap.josm.Main;
     7import org.openstreetmap.josm.command.AddCommand;
     8import org.openstreetmap.josm.command.Command;
    69import org.openstreetmap.josm.data.osm.Node;
    710import org.openstreetmap.josm.gui.MapFrame;
     
    4851                        Node node = new Node();
    4952                        node.coor = mv.getPoint(e.getX(), e.getY(), true);
    50                         mv.getActiveDataSet().nodes.add(node);
     53                        Command c = new AddCommand(node);
     54                        c.executeCommand();
     55                        Main.main.commands.add(c);
    5156                        mv.repaint();
    5257                }
  • src/org/openstreetmap/josm/actions/mapmode/AddTrackAction.java

    r21 r22  
    66import java.util.LinkedList;
    77
    8 import org.openstreetmap.josm.command.DataSet;
     8import org.openstreetmap.josm.Main;
     9import org.openstreetmap.josm.command.AddCommand;
     10import org.openstreetmap.josm.command.Command;
    911import org.openstreetmap.josm.data.osm.LineSegment;
    1012import org.openstreetmap.josm.data.osm.OsmPrimitive;
     
    7678                        return; // not allowed together
    7779
    78                 DataSet ds = mv.getActiveDataSet();
    79                
    8080                if (!ctrl && !shift)
    81                         ds.clearSelection(); // new selection will replace the old.
     81                        Main.main.ds.clearSelection(); // new selection will replace the old.
    8282
    8383                Collection<OsmPrimitive> selectionList = selectionManager.getObjectsInRectangle(r,alt);
    8484                for (OsmPrimitive osm : selectionList)
    85                         osm.setSelected(!ctrl, ds);
     85                        osm.setSelected(!ctrl);
    8686
    8787                mv.repaint(); // from now on, the map has to be repainted.
     
    9090                        return; // no new track yet.
    9191               
    92                 Collection<OsmPrimitive> selection = ds.getSelected();
     92                Collection<OsmPrimitive> selection = Main.main.ds.getSelected();
    9393                if (selection.isEmpty())
    9494                        return;
     
    104104                Track t = new Track();
    105105                for (LineSegment ls : lineSegments)
    106                         ds.assignPendingLineSegment(ls, t, true);
    107                 ds.addTrack(t);
    108                 ds.clearSelection();
     106                        t.add(ls);
     107                Command c = new AddCommand(t);
     108                c.executeCommand();
     109                Main.main.commands.add(c);
     110                Main.main.ds.clearSelection();
    109111        }
    110112
  • src/org/openstreetmap/josm/actions/mapmode/CombineAction.java

    r21 r22  
    1010
    1111import org.openstreetmap.josm.Main;
    12 import org.openstreetmap.josm.command.DataSet;
     12import org.openstreetmap.josm.command.CombineCommand;
     13import org.openstreetmap.josm.command.Command;
    1314import org.openstreetmap.josm.data.osm.LineSegment;
    1415import org.openstreetmap.josm.data.osm.Node;
     
    8384                mv.addMouseListener(this);
    8485                mv.addMouseMotionListener(this);
    85                 mv.getActiveDataSet().clearSelection();
     86                Main.main.ds.clearSelection();
    8687        }
    8788
     
    147148                if (first instanceof LineSegment && second instanceof LineSegment)
    148149                        JOptionPane.showMessageDialog(Main.main, "Cannot combine two line segments. To create tracks use 'Add Track'.");
    149                 else if (first instanceof LineSegment && second instanceof Track)
    150                         combine((LineSegment)first, (Track)second);
    151                 else if (first instanceof Track && second instanceof LineSegment)
    152                         combine((LineSegment)second, (Track)first);
    153                 else if (first instanceof Track && second instanceof Track) {
    154                         if (!first.keyPropertiesMergable(second))
    155                                 JOptionPane.showMessageDialog(Main.main, "Cannot combine because of different properties.");
    156                         else {
    157                                 Track t1 = (Track)first;
    158                                 Track t2 = (Track)second;
    159                                 if (t1.getStartingNode() == t2.getEndingNode()) {
    160                                         t1 = t2;
    161                                         t2 = (Track)first;
    162                                 }
    163                                 t1.addAll(t2.segments());
    164                                 if (t1.keys == null)
    165                                         t1.keys = t2.keys;
    166                                 else   
    167                                         t1.keys.putAll(t2.keys);
    168                                 mv.getActiveDataSet().removeTrack(t2);
    169                         }
     150                else if (first instanceof Track && second instanceof Track && !first.keyPropertiesMergable(second))
     151                        JOptionPane.showMessageDialog(Main.main, "Cannot combine because of different properties.");
     152                else {
     153                        Command c = new CombineCommand(first, second);
     154                        c.executeCommand();
     155                        Main.main.commands.add(c);
    170156                }
    171157                mv.repaint();
    172         }
    173 
    174 
    175         /**
    176          * Add the line segment to the track and remove it from the pending segments.
    177          * @param ls The line segment to add
    178          * @param t The track to add the line segment to
    179          */
    180         private void combine(LineSegment ls, Track t) {
    181                 DataSet ds = mv.getActiveDataSet();
    182                 if (!ds.pendingLineSegments().contains(ls))
    183                         throw new IllegalStateException("Should not be able to select non-pending line segments.");
    184                
    185                 ds.assignPendingLineSegment(ls, t, t.getStartingNode() != ls.getEnd());
    186158        }
    187159
     
    218190                        Point start = mv.getScreenPoint(ls.getStart().coor);
    219191                        Point end = mv.getScreenPoint(ls.getEnd().coor);
    220                         if (mv.getActiveDataSet().pendingLineSegments().contains(osm) && g.getColor() == Color.GRAY)
     192                        if (Main.main.ds.pendingLineSegments().contains(osm) && g.getColor() == Color.GRAY)
    221193                                g.drawLine(start.x, start.y, end.x, end.y);
    222194                        else
  • src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java

    r21 r22  
    1111
    1212import org.openstreetmap.josm.Main;
    13 import org.openstreetmap.josm.command.DataSet;
    1413import org.openstreetmap.josm.data.osm.Key;
    1514import org.openstreetmap.josm.data.osm.LineSegment;
     
    9493                        return;
    9594
    96                 DataSet ds = mv.getActiveDataSet();
    97 
    9895                if ((e.getModifiersEx() & MouseEvent.CTRL_DOWN_MASK) != 0)
    99                         deleteWithReferences(sel, ds);
     96                        deleteWithReferences(sel);
    10097                else
    101                         delete(sel, ds);
     98                        delete(sel);
    10299
    103100                mv.repaint();
     
    129126         * @param osm The object to delete.
    130127         */
    131         private void deleteWithReferences(OsmPrimitive osm, DataSet ds) {
     128        private void deleteWithReferences(OsmPrimitive osm) {
    132129                // collect all tracks, areas and pending line segments that should be deleted
    133130                ArrayList<Track> tracksToDelete = new ArrayList<Track>();
     
    136133                if (osm instanceof Node) {
    137134                        // delete any track and line segment the node is in.
    138                         for (Track t : ds.tracks())
     135                        for (Track t : Main.main.ds.tracks())
    139136                                for (LineSegment ls : t.segments())
    140137                                        if (ls.getStart() == osm || ls.getEnd() == osm)
    141138                                                tracksToDelete.add(t);
    142                         for (LineSegment ls : ds.pendingLineSegments())
     139                        for (LineSegment ls : Main.main.ds.pendingLineSegments())
    143140                                if (ls.getStart() == osm || ls.getEnd() == osm)
    144141                                        lineSegmentsToDelete.add(ls);
     
    147144                        LineSegment lineSegment = (LineSegment)osm;
    148145                        lineSegmentsToDelete.add(lineSegment);
    149                         for (Track t : ds.tracks())
     146                        for (Track t : Main.main.ds.tracks())
    150147                                for (LineSegment ls : t.segments())
    151148                                        if (lineSegment == ls)
     
    169166                // delete tracks and areas
    170167                for (Track t : tracksToDelete)
    171                         ds.removeTrack(t);
     168                        Main.main.ds.removeTrack(t);
    172169                for (LineSegment ls : lineSegmentsToDelete)
    173                         ds.destroyPendingLineSegment(ls);
     170                        Main.main.ds.destroyPendingLineSegment(ls);
    174171
    175172                // removing all unreferenced nodes
    176173                for (Node n : checkUnreferencing) {
    177                         if (!isReferenced(n, ds))
    178                                 ds.nodes.remove(n);
     174                        if (!isReferenced(n))
     175                                Main.main.ds.nodes.remove(n);
    179176                }
    180177                // now, all references are killed. Delete the node (if it was a node)
    181178                if (osm instanceof Node)
    182                         ds.nodes.remove(osm);
     179                        Main.main.ds.nodes.remove(osm);
    183180        }
    184181
     
    190187         * @param osm The object to delete.
    191188         */
    192         private void delete(OsmPrimitive osm, DataSet ds) {
     189        private void delete(OsmPrimitive osm) {
    193190                if (osm instanceof Node) {
    194191                        Node n = (Node)osm;
    195                         if (isReferenced(n, ds)) {
    196                                 String combined = combine(n, ds);
     192                        if (isReferenced(n)) {
     193                                String combined = combine(n);
    197194                                if (combined != null) {
    198195                                        JOptionPane.showMessageDialog(Main.main, combined);
     
    201198                        }
    202199                        // now, the node isn't referenced anymore, so delete it.
    203                         ds.nodes.remove(n);
     200                        Main.main.ds.nodes.remove(n);
    204201                } else if (osm instanceof LineSegment) {
    205202                        LinkedList<Track> tracksToDelete = new LinkedList<Track>();
    206                         for (Track t : ds.tracks()) {
     203                        for (Track t : Main.main.ds.tracks()) {
    207204                                t.remove((LineSegment)osm);
    208205                                if (t.segments().isEmpty())
     
    210207                        }
    211208                        for (Track t : tracksToDelete)
    212                                 ds.removeTrack(t);
    213                         ds.destroyPendingLineSegment((LineSegment)osm);
     209                                Main.main.ds.removeTrack(t);
     210                        Main.main.ds.destroyPendingLineSegment((LineSegment)osm);
    214211                } else if (osm instanceof Track) {
    215                         ds.removeTrack((Track)osm);
     212                        Main.main.ds.removeTrack((Track)osm);
    216213                        for (LineSegment ls : ((Track)osm).segments())
    217                                 ds.addPendingLineSegment(ls);
     214                                Main.main.ds.addPendingLineSegment(ls);
    218215                }
    219216        }
     
    225222         * @return Whether the node is used by a track or area.
    226223         */
    227         private boolean isReferenced(Node n, DataSet ds) {
    228                 for (Track t : ds.tracks())
     224        private boolean isReferenced(Node n) {
     225                for (Track t : Main.main.ds.tracks())
    229226                        for (LineSegment ls : t.segments())
    230227                                if (ls.getStart() == n || ls.getEnd() == n)
    231228                                        return true;
    232                 for (LineSegment ls : ds.pendingLineSegments())
     229                for (LineSegment ls : Main.main.ds.pendingLineSegments())
    233230                        if (ls.getStart() == n || ls.getEnd() == n)
    234231                                return true;
     
    246243         *              are problems combining the node.
    247244         */
    248         private String combine(Node n, DataSet ds) {
     245        private String combine(Node n) {
    249246                // first, check for pending line segments
    250                 for (LineSegment ls : ds.pendingLineSegments())
     247                for (LineSegment ls : Main.main.ds.pendingLineSegments())
    251248                        if (n == ls.getStart() || n == ls.getEnd())
    252249                                return "Node used by a line segment which is not part of any track. Remove this first.";
     
    261258                HashMap<ArrayList<LineSegment>, Track> lineSegments = new HashMap<ArrayList<LineSegment>, Track>();
    262259               
    263                 for (Track t : ds.tracks()) {
     260                for (Track t : Main.main.ds.tracks()) {
    264261                        ArrayList<LineSegment> current = new ArrayList<LineSegment>();
    265262                        for (LineSegment ls : t.segments())
     
    284281                // try to combine tracks
    285282                ArrayList<Track> tracks = new ArrayList<Track>();
    286                 for (Track t : ds.tracks())
     283                for (Track t : Main.main.ds.tracks())
    287284                        if (t.getStartingNode() == n || t.getEndingNode() == n)
    288285                                tracks.add(t);
     
    349346                        // move the remaining line segments to first track.
    350347                        first.addAll(second.segments());
    351                         ds.removeTrack(second);
     348                        Main.main.ds.removeTrack(second);
    352349                }
    353350               
  • src/org/openstreetmap/josm/actions/mapmode/MapMode.java

    r17 r22  
    8787                mapFrame.selectMapMode(this);
    8888        }
    89        
     89
    9090        /**
    9191         * Does nothing. Only to subclass.
  • src/org/openstreetmap/josm/actions/mapmode/MoveAction.java

    r21 r22  
    66import java.awt.event.MouseEvent;
    77import java.util.Collection;
    8 import java.util.HashSet;
    98
    10 import org.openstreetmap.josm.command.DataSet;
    11 import org.openstreetmap.josm.data.osm.Node;
     9import org.openstreetmap.josm.Main;
     10import org.openstreetmap.josm.command.Command;
     11import org.openstreetmap.josm.command.MoveCommand;
     12import org.openstreetmap.josm.data.GeoPoint;
    1213import org.openstreetmap.josm.data.osm.OsmPrimitive;
    1314import org.openstreetmap.josm.gui.MapFrame;
     
    7576                }
    7677
    77                 int dx = e.getX() - mousePos.x;
    78                 int dy = e.getY() - mousePos.y;
     78                GeoPoint mouseGeo = mv.getPoint(e.getX(), e.getY(), false);
     79                GeoPoint mouseStartGeo = mv.getPoint(mousePos.x, mousePos.y, false);
     80                double dx = mouseGeo.x - mouseStartGeo.x;
     81                double dy = mouseGeo.y - mouseStartGeo.y;
    7982                if (dx == 0 && dy == 0)
    8083                        return;
    8184
    82                 Collection<OsmPrimitive> selection = mv.getActiveDataSet().getSelected();
    83                 // creating a list of all nodes that should be moved.
    84                 Collection<Node> movingNodes = new HashSet<Node>();
    85                 for (OsmPrimitive osm : selection)
    86                         movingNodes.addAll(osm.getAllNodes());
    87 
    88                 for (Node n : movingNodes) {
    89                         Point pos = mv.getScreenPoint(n.coor);
    90                         pos.x += dx;
    91                         pos.y += dy;
    92                         n.coor = mv.getPoint(pos.x, pos.y, true);
    93                 }
     85                Collection<OsmPrimitive> selection = Main.main.ds.getSelected();
     86                Command c = new MoveCommand(selection, dx, dy);
     87                c.executeCommand();
     88                Main.main.commands.add(c);
     89               
    9490                mv.repaint();
    95                
    9691                mousePos = e.getPoint();
    9792        }
     
    111106                        return;
    112107
    113                 DataSet ds = mv.getActiveDataSet();
    114 
    115                 if (ds.getSelected().size() == 0) {
     108                if (Main.main.ds.getSelected().size() == 0) {
    116109                        OsmPrimitive osm = mv.getNearest(e.getPoint(), (e.getModifiersEx() & MouseEvent.ALT_DOWN_MASK) != 0);
    117110                        if (osm != null)
    118                                 osm.setSelected(true, ds);
     111                                osm.setSelected(true);
    119112                        singleOsmPrimitive = osm;
    120113                        mv.repaint();
     
    134127                mv.setCursor(oldCursor);
    135128                if (singleOsmPrimitive != null) {
    136                         singleOsmPrimitive.setSelected(false, mv.getActiveDataSet());
     129                        singleOsmPrimitive.setSelected(false);
    137130                        mv.repaint();
    138131                }
  • src/org/openstreetmap/josm/actions/mapmode/SelectionAction.java

    r21 r22  
    55import java.util.Collection;
    66
    7 import org.openstreetmap.josm.command.DataSet;
     7import org.openstreetmap.josm.Main;
    88import org.openstreetmap.josm.data.osm.OsmPrimitive;
    99import org.openstreetmap.josm.gui.MapFrame;
     
    8787                        return; // not allowed together
    8888
    89                 DataSet ds = mv.getActiveDataSet();
    90 
    9189                if (!ctrl && !shift)
    92                         ds.clearSelection(); // new selection will replace the old.
     90                        Main.main.ds.clearSelection(); // new selection will replace the old.
    9391
    9492                Collection<OsmPrimitive> selectionList = selectionManager.getObjectsInRectangle(r,alt);
    9593                for (OsmPrimitive osm : selectionList)
    96                         osm.setSelected(!ctrl, ds);
     94                        osm.setSelected(!ctrl);
    9795                mv.repaint();
    9896        }
  • src/org/openstreetmap/josm/command/AddCommand.java

    r21 r22  
    22
    33import java.awt.Component;
     4import java.util.Collection;
    45import java.util.Iterator;
    56
    67import javax.swing.JLabel;
    78
     9import org.openstreetmap.josm.Main;
    810import org.openstreetmap.josm.data.osm.Key;
    911import org.openstreetmap.josm.data.osm.LineSegment;
     
    2628         */
    2729        private final OsmPrimitive osm;
    28         /**
    29          * The dataset to add the primitive to.
    30          */
    31         private final DataSet ds;
    3230
    3331        /**
    3432         * Create the command and specify the element to add.
    3533         */
    36         public AddCommand(OsmPrimitive osm, DataSet dataSet) {
     34        public AddCommand(OsmPrimitive osm) {
    3735                this.osm = osm;
    38                 this.ds = dataSet;
    3936        }
    4037
     
    4239                osm.visit(this);
    4340        }
    44 
     41       
    4542        public Component commandDescription() {
    4643                SelectionComponentVisitor v = new SelectionComponentVisitor();
    4744                osm.visit(v);
    4845                return new JLabel(v.name, v.icon, JLabel.LEADING);
     46        }
     47       
     48        public void fillModifiedData(Collection<OsmPrimitive> modified, Collection<OsmPrimitive> deleted, Collection<OsmPrimitive> added) {
     49                if (!added.contains(osm))
     50                        added.add(osm);
    4951        }
    5052
     
    5456         */
    5557        public void visit(Node n) {
    56                 ds.nodes.add(n);
     58                Main.main.ds.nodes.add(n);
    5759        }
    5860
     
    6264         */
    6365        public void visit(LineSegment ls) {
    64                 ds.pendingLineSegments.add(ls);
     66                Main.main.ds.pendingLineSegments.add(ls);
    6567        }
    6668
     
    7072         */
    7173        public void visit(Track t) {
    72                 ds.addTrack(t);
    73                 for (Iterator<LineSegment> it =  ds.pendingLineSegments.iterator(); it.hasNext();)
     74                Main.main.ds.tracks.add(t);
     75                for (Iterator<LineSegment> it =  Main.main.ds.pendingLineSegments.iterator(); it.hasNext();)
    7476                        if (t.segments().contains(it.next()))
    7577                                it.remove();
  • src/org/openstreetmap/josm/command/Command.java

    r21 r22  
    22
    33import java.awt.Component;
     4import java.util.Collection;
     5
     6import org.openstreetmap.josm.data.osm.OsmPrimitive;
    47
    58
    69/**
    710 * Classes implementing Command modify a dataset in a specific way. A command is
    8  * one atomic action on a dataset, such as move or delete.
     11 * one atomic action on a specific dataset, such as move or delete.
    912 *
    1013 * @author imi
     
    1619         */
    1720        void executeCommand();
    18        
     21
    1922        /**
    2023         * Give a description of the command as component to draw
    2124         */
    2225        Component commandDescription();
     26       
     27        /**
     28         * Fill in the changed data this command operates on (for sending to the server).
     29         * Add to the lists, don't clear them.
     30         * @param modified  The modified primitives
     31         * @param deleted   The deleted primitives
     32         * @param added         The added primitives
     33         */
     34        void fillModifiedData(Collection<OsmPrimitive> modified,
     35                        Collection<OsmPrimitive> deleted,
     36                        Collection<OsmPrimitive> added);
    2337}
  • src/org/openstreetmap/josm/command/DataSet.java

    r21 r22  
    205205         */
    206206        public void mergeFrom(DataSet ds, boolean mergeEqualNodes) {
    207                 System.out.println(nodes.size()+" "+pendingLineSegments.size()+" "+tracks.size());
    208                 if (mergeEqualNodes) {
     207                if (mergeEqualNodes && !nodes.isEmpty()) {
    209208                        Map<Node, Node> mergeMap = new HashMap<Node, Node>();
    210209                        Set<Node> nodesToAdd = new HashSet<Node>();
     
    247246                        pendingLineSegments.addAll(ds.pendingLineSegments);
    248247                }
    249                 System.out.println(nodes.size()+" "+pendingLineSegments.size()+" "+tracks.size());
    250248        }
    251249
     
    258256                        return;
    259257                for (OsmPrimitive osm : list) {
    260                         osm.setSelected(false, this);
     258                        osm.setSelected(false);
    261259                        if (osm.keys != null)
    262260                                clearSelection(osm.keys.keySet());
  • src/org/openstreetmap/josm/command/MoveCommand.java

    r21 r22  
    6363                return new JLabel("Move "+objects.size()+" primitives "+xstr+" "+ystr);
    6464        }
     65
     66        public void fillModifiedData(Collection<OsmPrimitive> modified, Collection<OsmPrimitive> deleted, Collection<OsmPrimitive> added) {
     67                for (OsmPrimitive osm : objects)
     68                        if (!modified.contains(osm))
     69                                modified.add(osm);
     70        }
    6571}
  • src/org/openstreetmap/josm/data/SelectionTracker.java

    r8 r22  
    5959         * @author imi
    6060         */
    61         private enum SelectionEventState {WAITING, COLLECTING, PURGING};
     61        private enum SelectionEventState {WAITING, COLLECTING, PURGING}
    6262
    6363        /**
    6464         * The state, regarding to the selection changing that we are in.
    6565         */
    66         transient private SelectionEventState state = SelectionEventState.WAITING;
     66        transient SelectionEventState state = SelectionEventState.WAITING;
    6767
    6868        /**
    6969         * A list of listeners to selection changed events.
    7070         */
    71         transient private Collection<SelectionChangedListener> listeners = new LinkedList<SelectionChangedListener>();
     71        transient Collection<SelectionChangedListener> listeners = new LinkedList<SelectionChangedListener>();
    7272
    7373       
  • src/org/openstreetmap/josm/data/osm/OsmPrimitive.java

    r21 r22  
    44import java.util.Map;
    55
    6 import org.openstreetmap.josm.command.DataSet;
     6import org.openstreetmap.josm.Main;
    77import org.openstreetmap.josm.data.osm.visitor.Visitor;
    88
     
    7272         * changed later, if the value actualy changed.
    7373         * @param selected Whether the primitive should be selected or not.
    74          * @param ds The dataSet, this primitive is in.
    7574         */
    76         public void setSelected(boolean selected, DataSet ds) {
     75        public void setSelected(boolean selected) {
    7776                if (selected != this.selected)
    78                         ds.fireSelectionChanged();
     77                        Main.main.ds.fireSelectionChanged();
    7978                this.selected = selected;
    8079        }
  • src/org/openstreetmap/josm/data/projection/Projection.java

    r21 r22  
    88import javax.swing.event.ChangeListener;
    99
    10 import org.openstreetmap.josm.command.DataSet;
    1110import org.openstreetmap.josm.data.GeoPoint;
    1211
     
    8180         * This implementation does nothing. It is provided only for subclasses
    8281         * to initialize their data members.
    83          *
    84          * @param dataSet
    85          *            The dataset, which will be displayed on screen. Later, all
    86          *            projections should be relative to the given dataset. Any
    87          *            reverse projections (xy2latlon) can be assumed to be in near
    88          *            distance to nodes of this dataset (that means, it is ok, if
    89          *            there is a conversion error, if the requested x/y to xy2latlon
    90          *            is far away from any coordinate in the dataset)
    9182         */
    92         public void init(DataSet dataSet) {}
     83        public void init() {}
    9384       
    9485        /**
  • src/org/openstreetmap/josm/data/projection/UTM.java

    r21 r22  
    1616
    1717import org.openstreetmap.josm.Main;
    18 import org.openstreetmap.josm.command.DataSet;
    1918import org.openstreetmap.josm.data.Bounds;
    2019import org.openstreetmap.josm.data.GeoPoint;
     
    8079        };
    8180
    82         private enum Hemisphere {north, south};
     81        private enum Hemisphere {north, south}
    8382
    8483        /**
     
    102101         * Spinner with all possible zones for the configuration panel
    103102         */
    104         private JSpinner zoneSpinner;
     103        JSpinner zoneSpinner;
    105104        /**
    106105         * Hemisphere combo for the configuration panel
    107106         */
    108         private JComboBox hemisphereCombo;
     107        JComboBox hemisphereCombo;
    109108
    110109       
     
    193192        /**
    194193         * Try to autodetect the zone and hemisphere from the dataset.
    195          * @param dataSet The dataset to extrakt zone information from.
    196194         * @return The zone data extrakted from the dataset.
    197195         */
    198         private ZoneData autoDetect(DataSet dataSet) {
     196        ZoneData autoDetect() {
    199197                ZoneData zd = new ZoneData();
    200198               
    201                 Bounds b = dataSet.getBoundsLatLon();
     199                Bounds b = Main.main.ds.getBoundsLatLon();
    202200                if (b == null)
    203201                        return zd;
     
    234232         */
    235233        @Override
    236         public void init(DataSet dataSet) {
     234        public void init() {
    237235                if (zone == 0) {
    238                         ZoneData zd = autoDetect(dataSet);
     236                        ZoneData zd = autoDetect();
    239237                        zone = zd.zone;
    240238                        hemisphere = zd.hemisphere;
     
    274272                        public void actionPerformed(ActionEvent e) {
    275273                                if (Main.main.getMapFrame() != null) {
    276                                         DataSet ds = Main.main.getMapFrame().mapView.getActiveDataSet();
    277                                         ZoneData zd = autoDetect(ds);
     274                                        ZoneData zd = autoDetect();
    278275                                        if (zd.zone == 0)
    279276                                                JOptionPane.showMessageDialog(Main.main, "Autodetection failed. Maybe the data set contain too few information.");
  • src/org/openstreetmap/josm/gui/ImageProvider.java

    r21 r22  
    2525         * @author imi
    2626         */
    27         public enum OverlayPosition {NORTHWEST, NORTHEAST, SOUTHWEST, SOUTHEAST};
     27        public enum OverlayPosition {NORTHWEST, NORTHEAST, SOUTHWEST, SOUTHEAST}
    2828       
    2929        /**
  • src/org/openstreetmap/josm/gui/MapStatus.java

    r17 r22  
    4747         * The position of the mouse cursor.
    4848         */
    49         private JTextField positionText = new JTextField("-000.00000000000000 -000.00000000000000".length());
     49        JTextField positionText = new JTextField("-000.00000000000000 -000.00000000000000".length());
    5050        /**
    5151         * The field holding the name of the object under the mouse.
    5252         */
    53         private JTextField nameText = new JTextField(30);
     53        JTextField nameText = new JTextField(30);
    5454
    5555        /**
     
    147147         * The last sent mouse movement event.
    148148         */
    149         private MouseState mouseState = new MouseState();
     149        MouseState mouseState = new MouseState();
    150150       
    151151        /**
  • src/org/openstreetmap/josm/gui/MapView.java

    r21 r22  
    3232 * provide the MapMode's enough capabilities to operate.
    3333 *
    34  * MapView holds the map data, organize it, convert it, provide access to it.
    35  *
    3634 * MapView hold meta-data about the data set currently displayed, as scale level,
    3735 * center point viewed, what scrolling mode or editing mode is selected or with
     
    8785         */
    8886        public MapView(Layer layer) {
    89                 if (layer.dataSet == null)
    90                         throw new IllegalArgumentException("Initial layer must have a dataset.");
    91 
    9287                addComponentListener(new ComponentAdapter(){
    9388                        @Override
     
    118113                        // initialize the projection if it was the first layer
    119114                        if (layers.size() == 1)
    120                                 Main.pref.getProjection().init(layer.dataSet);
     115                                Main.pref.getProjection().init();
    121116                       
    122117                        // initialize the dataset in the new layer
     
    231226                OsmPrimitive minPrimitive = null;
    232227
    233                 // calculate the object based on the current active dataset.
    234                 DataSet ds = getActiveDataSet();
    235                
    236228                // nodes
    237                 for (Node n : ds.nodes) {
     229                for (Node n : Main.main.ds.nodes) {
    238230                        Point sp = getScreenPoint(n.coor);
    239231                        double dist = p.distanceSq(sp);
     
    247239               
    248240                // pending line segments
    249                 for (LineSegment ls : ds.pendingLineSegments()) {
     241                for (LineSegment ls : Main.main.ds.pendingLineSegments()) {
    250242                        Point A = getScreenPoint(ls.getStart().coor);
    251243                        Point B = getScreenPoint(ls.getEnd().coor);
     
    262254                // tracks & line segments
    263255                minDistanceSq = Double.MAX_VALUE;
    264                 for (Track t : ds.tracks()) {
     256                for (Track t : Main.main.ds.tracks()) {
    265257                        for (LineSegment ls : t.segments()) {
    266258                                Point A = getScreenPoint(ls.getStart().coor);
     
    375367       
    376368        /**
    377          * Return the dataSet for the current selected layer. If the active layer
    378          * does not have a dataset, return the DataSet from the next layer a.s.o.
    379          * 
    380          * @return The DataSet of the current active layer.
    381          */
    382         public DataSet getActiveDataSet() {
    383                 if (activeLayer.dataSet != null)
    384                         return activeLayer.dataSet;
    385                 for (Layer l : layers)
    386                         if (l.dataSet != null)
    387                                 return l.dataSet;
    388                 throw new IllegalStateException("No dataset found.");
    389         }
    390 
    391         /**
    392369         * Change to the new projection. Recalculate the dataset and zoom, if autoZoom
    393370         * is active.
     
    422399                                h = 20;
    423400                       
    424                         Bounds bounds = getActiveDataSet().getBoundsXY();
     401                        Bounds bounds = Main.main.ds.getBoundsXY();
    425402                       
    426403                        boolean oldAutoScale = autoScale;
  • src/org/openstreetmap/josm/gui/PreferenceDialog.java

    r21 r22  
    9191         * Indicate, that the application has to be restarted for the settings to take effect.
    9292         */
    93         private boolean requiresRestart = false;
     93        boolean requiresRestart = false;
    9494        /**
    9595         * ComboBox with all look and feels.
    9696         */
    97         private JComboBox lafCombo = new JComboBox(UIManager.getInstalledLookAndFeels());
     97        JComboBox lafCombo = new JComboBox(UIManager.getInstalledLookAndFeels());
    9898        /**
    9999         * Combobox with all projections available
    100100         */
    101         private JComboBox projectionCombo = new JComboBox(Preferences.allProjections.clone());
     101        JComboBox projectionCombo = new JComboBox(Preferences.allProjections.clone());
    102102        /**
    103103         * The main tab panel.
     
    108108         * Editfield for the Base url to the REST API from OSM.
    109109         */
    110         private JTextField osmDataServer = new JTextField(20);
     110        JTextField osmDataServer = new JTextField(20);
    111111        /**
    112112         * Editfield for the username to the OSM account.
    113113         */
    114         private JTextField osmDataUsername = new JTextField(20);
     114        JTextField osmDataUsername = new JTextField(20);
    115115        /**
    116116         * Passwordfield for the userpassword of the REST API.
    117117         */
    118         private JPasswordField osmDataPassword = new JPasswordField(20);
     118        JPasswordField osmDataPassword = new JPasswordField(20);
    119119        /**
    120120         * The checkbox stating whether nodes should be merged together.
    121121         */
    122         private JCheckBox drawRawGpsLines = new JCheckBox("Draw lines between raw gps points.");
     122        JCheckBox drawRawGpsLines = new JCheckBox("Draw lines between raw gps points.");
    123123        /**
    124124         * The checkbox stating whether raw gps lines should be forced.
    125125         */
    126         private JCheckBox forceRawGpsLines = new JCheckBox("Force lines if no line segments imported.");
     126        JCheckBox forceRawGpsLines = new JCheckBox("Force lines if no line segments imported.");
    127127        /**
    128128         * The checkbox stating whether nodes should be merged together.
    129129         */
    130         private JCheckBox mergeNodes = new JCheckBox("Merge nodes with equal latitude/longitude.");
     130        JCheckBox mergeNodes = new JCheckBox("Merge nodes with equal latitude/longitude.");
    131131
    132132        /**
  • src/org/openstreetmap/josm/gui/SelectionManager.java

    r21 r22  
    1515import java.util.LinkedList;
    1616
    17 import org.openstreetmap.josm.command.DataSet;
     17import org.openstreetmap.josm.Main;
    1818import org.openstreetmap.josm.data.osm.LineSegment;
    1919import org.openstreetmap.josm.data.osm.Node;
     
    272272                } else {
    273273                        // nodes
    274                         DataSet ds = mv.getActiveDataSet();
    275                         for (Node n : ds.nodes) {
     274                        for (Node n : Main.main.ds.nodes) {
    276275                                if (r.contains(mv.getScreenPoint(n.coor)))
    277276                                        selection.add(n);
     
    279278                       
    280279                        // pending line segments
    281                         for (LineSegment ls : ds.pendingLineSegments())
     280                        for (LineSegment ls : Main.main.ds.pendingLineSegments())
    282281                                if (rectangleContainLineSegment(r, alt, ls))
    283282                                        selection.add(ls);
    284283
    285284                        // tracks
    286                         for (Track t : ds.tracks()) {
     285                        for (Track t : Main.main.ds.tracks()) {
    287286                                boolean wholeTrackSelected = !t.segments().isEmpty();
    288287                                for (LineSegment ls : t.segments())
  • src/org/openstreetmap/josm/gui/dialogs/LayerList.java

    r21 r22  
    88import java.awt.event.ActionListener;
    99import java.awt.event.KeyEvent;
     10import java.io.IOException;
    1011import java.util.Collection;
    1112
     
    1617import javax.swing.JLabel;
    1718import javax.swing.JList;
     19import javax.swing.JOptionPane;
    1820import javax.swing.JPanel;
    1921import javax.swing.JScrollPane;
     
    3032import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
    3133import org.openstreetmap.josm.gui.layer.Layer;
     34import org.openstreetmap.josm.io.OsmWriter;
    3235
    3336/**
     
    4245         * The data model for the list component.
    4346         */
    44         private DefaultListModel model = new DefaultListModel();
     47        DefaultListModel model = new DefaultListModel();
    4548        /**
    4649         * The list component holding all layers.
    4750         */
    48         private JList layers = new JList(model);
     51        JList layers = new JList(model);
    4952        /**
    5053         * The invisible icon blended over invisible layers.
    5154         */
    52         private static final Icon invisible = ImageProvider.get("layer", "invisible");
     55        static final Icon invisible = ImageProvider.get("layer", "invisible");
    5356
    5457        /**
     
    6972         */
    7073        private JButton deleteButton = new JButton(ImageProvider.get("dialogs", "delete"));
    71        
     74        /**
     75         * Button for connecting disconnecting to the server.
     76         */
     77        private JButton uploadButton = new JButton(ImageProvider.get("dialogs", "condiscon"));
     78
    7279        /**
    7380         * Create an layerlist and attach it to the given mapView.
     
    8996                                        icon = ImageProvider.overlay(icon, invisible, ImageProvider.OverlayPosition.SOUTHEAST);
    9097                                label.setIcon(icon);
    91                                
     98
    9299                                DataSet ds = layer.dataSet;
    93100                                if (ds != null) {
     
    100107
    101108                final MapView mapView = mapFrame.mapView;
    102                
     109
    103110                Collection<Layer> data = mapView.getAllLayers();
    104111                for (Layer l : data)
     
    115122                });
    116123                mapView.addLayerChangeListener(this);
    117                
     124
    118125                // Buttons
    119126                JPanel buttonPanel = new JPanel(new GridLayout(1, 5));
     
    173180                mergeButton.setToolTipText("Merge the selected layer into the layer directly below.");
    174181                mergeButton.addActionListener(new ActionListener(){
    175                                 public void actionPerformed(ActionEvent e) {
    176                                         Layer lFrom = (Layer)layers.getSelectedValue();
    177                                         DataSet dsFrom = lFrom.dataSet;
    178                                         Layer lTo = (Layer)model.get(layers.getSelectedIndex()+1);
    179                                         DataSet dsTo = lTo.dataSet;
    180                                         dsTo.mergeFrom(dsFrom, Main.pref.mergeNodes);
    181                                         layers.setSelectedValue(lTo, true);
    182                                         mapView.removeLayer(lFrom);
     182                        public void actionPerformed(ActionEvent e) {
     183                                Layer lFrom = (Layer)layers.getSelectedValue();
     184                                DataSet dsFrom = lFrom.dataSet;
     185                                Layer lTo = (Layer)model.get(layers.getSelectedIndex()+1);
     186                                DataSet dsTo = lTo.dataSet;
     187                                dsTo.mergeFrom(dsFrom, Main.pref.mergeNodes);
     188                                layers.setSelectedValue(lTo, true);
     189                                mapView.removeLayer(lFrom);
     190                        }
     191                });             
     192                buttonPanel.add(mergeButton);
     193
     194                uploadButton.setToolTipText("Upload changes to the server.");
     195                uploadButton.addActionListener(new ActionListener(){
     196                        public void actionPerformed(ActionEvent e) {
     197                                OsmWriter con = new OsmWriter(Main.pref.osmDataServer, Main.main.commands);
     198                                try {
     199                                        con.output();
     200                                } catch (IOException x) {
     201                                        x.printStackTrace();
     202                                        JOptionPane.showMessageDialog(Main.main, "Not all changes could be uploaded.");
    183203                                }
    184                         });             
    185                 buttonPanel.add(mergeButton);
    186 
     204                        }
     205                });
     206                buttonPanel.add(uploadButton);
     207               
    187208                add(buttonPanel, BorderLayout.SOUTH);
    188209               
     
    193214         * Updates the state of the Buttons.
    194215         */
    195         private void updateButtonEnabled() {
     216        void updateButtonEnabled() {
    196217                int sel = layers.getSelectedIndex();
    197218                Layer l = (Layer)layers.getSelectedValue();
  • src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java

    r21 r22  
    1717
    1818import org.openstreetmap.josm.Main;
    19 import org.openstreetmap.josm.command.DataSet;
    2019import org.openstreetmap.josm.data.SelectionChangedListener;
    2120import org.openstreetmap.josm.data.osm.OsmPrimitive;
     
    2322import org.openstreetmap.josm.gui.ImageProvider;
    2423import org.openstreetmap.josm.gui.MapFrame;
    25 import org.openstreetmap.josm.gui.MapView;
    26 import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
    27 import org.openstreetmap.josm.gui.layer.Layer;
    2824
    2925/**
     
    3430 * @author imi
    3531 */
    36 public class SelectionListDialog extends ToggleDialog implements SelectionChangedListener, LayerChangeListener {
     32public class SelectionListDialog extends ToggleDialog implements SelectionChangedListener {
    3733
    3834        /**
     
    4440         */
    4541        private JList displaylist = new JList(list);
    46         /**
    47          * The dataset, all selections are part of.
    48          */
    49         private final MapView mapView;
    5042       
    5143        /**
     
    5547        public SelectionListDialog(MapFrame mapFrame) {
    5648                super(mapFrame, "Current Selection", "Selection List", "selectionlist", KeyEvent.VK_E, "Open a selection list window.");
    57                 this.mapView = mapFrame.mapView;
    5849                setLayout(new BorderLayout());
    5950                setSize(300,400);
     
    8475                getContentPane().add(button, BorderLayout.SOUTH);
    8576
    86                 selectionChanged(mapView.getActiveDataSet().getSelected());
     77                selectionChanged(Main.main.ds.getSelected());
    8778        }
    8879
     
    9081        public void setVisible(boolean b) {
    9182                if (b) {
    92                         mapView.addLayerChangeListener(this);
    93                         mapView.getActiveDataSet().addSelectionChangedListener(this);
    94                         selectionChanged(mapView.getActiveDataSet().getSelected());
     83                        Main.main.ds.addSelectionChangedListener(this);
     84                        selectionChanged(Main.main.ds.getSelected());
    9585                } else {
    96                         mapView.removeLayerChangeListener(this);
    97                         mapView.getActiveDataSet().removeSelectionChangedListener(this);
     86                        Main.main.ds.removeSelectionChangedListener(this);
    9887                }
    9988                super.setVisible(b);
     
    118107         */
    119108        public void updateMap() {
    120                 DataSet ds = mapView.getActiveDataSet();
    121                 ds.clearSelection();
     109                Main.main.ds.clearSelection();
    122110                for (int i = 0; i < list.getSize(); ++i)
    123111                        if (displaylist.isSelectedIndex(i))
    124                                 ((OsmPrimitive)list.get(i)).setSelected(true, ds);
     112                                ((OsmPrimitive)list.get(i)).setSelected(true);
    125113                Main.main.getMapFrame().repaint();
    126114        }
    127 
    128         public void activeLayerChange(Layer oldLayer, Layer newLayer) {
    129                 DataSet ds = oldLayer.dataSet;
    130                 if (ds != null)
    131                         ds.removeSelectionChangedListener(this);
    132                 ds = newLayer.dataSet;
    133                 if (ds != null)
    134                         ds.addSelectionChangedListener(this);
    135         }
    136 
    137         /**
    138          * Does nothing. Only to satisfy LayerChangeListener
    139          */
    140         public void layerAdded(Layer newLayer) {}
    141         /**
    142          * Does nothing. Only to satisfy LayerChangeListener
    143          */
    144         public void layerRemoved(Layer oldLayer) {}
    145115}
  • src/org/openstreetmap/josm/gui/layer/Layer.java

    r21 r22  
    55import javax.swing.Icon;
    66
    7 import org.openstreetmap.josm.command.DataSet;
    8 import org.openstreetmap.josm.data.osm.LineSegment;
    9 import org.openstreetmap.josm.data.osm.Node;
    10 import org.openstreetmap.josm.data.osm.Track;
    117import org.openstreetmap.josm.gui.MapView;
    12 import org.openstreetmap.josm.gui.engine.Engine;
    138
    149/**
     
    3429        public boolean visible = true;
    3530        /**
    36          * The dataSet this layer operates on, if any. Not all layer may have a
    37          * dataset associated.
    38          */
    39         public final DataSet dataSet;
    40         /**
    4131         * The name of this layer.
    4232         */
    4333        public final String name;
    44         /**
    45          * The engine used to draw the data.
    46          */
    47         private final Engine engine;
    4834       
    4935        /**
    5036         * Create the layer and fill in the necessary components.
    51          * @param dataSet The DataSet, this layer operates on. Can be <code>null</code>.
    5237         */
    53         public Layer(DataSet dataSet, Engine engine, String name) {
    54                 if (engine == null || name == null)
    55                         throw new NullPointerException();
    56                 this.dataSet = dataSet;
     38        public Layer(String name) {
    5739                this.name = name;
    58                 this.engine = engine;
    5940        }
    6041
     
    6344         * @param mv The object that can translate GeoPoints to screen coordinates.
    6445         */
    65         public final void paint(Graphics g, MapView mv) {
    66                 engine.init(g, mv);
    67 
    68                 for (Track t : dataSet.tracks())
    69                         engine.drawTrack(t);
    70                 for (LineSegment ls : dataSet.pendingLineSegments())
    71                         engine.drawPendingLineSegment(ls);
    72                 for (Node n : dataSet.nodes)
    73                         engine.drawNode(n);
    74         }
    75 
     46        abstract public void paint(Graphics g, MapView mv);
    7647        /**
    7748         * Return a representative small image for this layer. The image must not
  • src/org/openstreetmap/josm/gui/layer/LayerFactory.java

    r21 r22  
    1919         */
    2020        public static Layer create(DataSet dataSet, String name, boolean rawGps) {
    21                 Layer layer = rawGps ? new RawGpsDataLayer(dataSet, name) : new OsmDataLayer(dataSet, name);
     21                Layer layer = rawGps ? new RawGpsDataLayer(dataSet, name) : new OsmDataLayer(name);
    2222                return layer;
    2323        }
  • src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java

    r21 r22  
    11package org.openstreetmap.josm.gui.layer;
     2
     3import java.awt.Color;
     4import java.awt.Graphics;
     5import java.awt.Point;
     6import java.util.Collection;
     7import java.util.HashSet;
    28
    39import javax.swing.Icon;
    410
    5 import org.openstreetmap.josm.command.DataSet;
     11import org.openstreetmap.josm.Main;
     12import org.openstreetmap.josm.data.osm.Key;
     13import org.openstreetmap.josm.data.osm.LineSegment;
     14import org.openstreetmap.josm.data.osm.Node;
     15import org.openstreetmap.josm.data.osm.OsmPrimitive;
     16import org.openstreetmap.josm.data.osm.Track;
     17import org.openstreetmap.josm.data.osm.visitor.Visitor;
    618import org.openstreetmap.josm.gui.ImageProvider;
    7 import org.openstreetmap.josm.gui.engine.SimpleEngine;
     19import org.openstreetmap.josm.gui.MapView;
    820
    921/**
     
    1426 * @author imi
    1527 */
    16 public class OsmDataLayer extends Layer {
     28public class OsmDataLayer extends Layer implements Visitor {
    1729
    1830        private static Icon icon;
     31        private final static Color darkblue = new Color(0,0,128);
     32        private final static Color darkgreen = new Color(0,128,0);
     33
     34        /**
     35         * The data behind this layer. A list of primitives which are also in Main.main.ds.
     36         */
     37        private final Collection<OsmPrimitive> data;
     38
     39        /**
     40         * The mapview we are currently drawing on.
     41         */
     42        private MapView mv;
     43        /**
     44         * The graphic environment we are drawing with.
     45         */
     46        private Graphics g;
    1947       
    2048        /**
    2149         * Construct a OsmDataLayer.
    2250         */
    23         protected OsmDataLayer(DataSet dataSet, String name) {
    24                 super(dataSet, new SimpleEngine(), name);
     51        protected OsmDataLayer(Collection<OsmPrimitive> data, String name) {
     52                super(name);
     53                this.data = data;
    2554        }
    2655
     
    4069                return true;
    4170        }
     71
     72        @Override
     73        public void paint(Graphics g, MapView mv) {
     74                this.mv = mv;
     75                this.g = g;
     76                for (OsmPrimitive osm : data)
     77                        osm.visit(this);
     78        }
     79
     80        /**
     81         * Draw a small rectangle.
     82         *
     83         * - White if selected (as always)
     84         * - Yellow, if not used by any tracks or areas.
     85         * - Green, if only used by pending line segments.
     86         * - Darkblue, if used in tracks but are only as inbound node. Inbound are
     87         *   all nodes, that have only line segments of the same track and
     88         *   at least two different line segments attached.
     89         * - Red otherwise (means, this is a dead end or is part of more than
     90         *   one track).
     91         *
     92         * @param n The node to draw.
     93         */
     94        public void visit(Node n) {
     95                if (n.isSelected()) {
     96                        drawNode(n, Color.WHITE); // selected
     97                        return;
     98                }
     99
     100                Collection<LineSegment> lineSegments = n.getParentSegments();
     101                if (lineSegments.isEmpty()) {
     102                        drawNode(n, Color.YELLOW); // single waypoint only
     103                        return;
     104                }
     105               
     106                HashSet<Track> tracks = new HashSet<Track>();
     107                for (LineSegment ls : lineSegments)
     108                        tracks.addAll(ls.getParents());
     109                if (tracks.isEmpty()) {
     110                        drawNode(n, Color.GREEN); // pending line
     111                        return;
     112                }
     113                if (tracks.size() > 1) {
     114                        drawNode(n, Color.RED); // more than one track
     115                        return;
     116                }
     117                int segmentUsed = 0;
     118                for (LineSegment ls : tracks.iterator().next().segments())
     119                        if (n == ls.getStart() || n == ls.getEnd())
     120                                ++segmentUsed;
     121                drawNode(n, segmentUsed > 1 ? darkblue : Color.RED);
     122        }
     123
     124        public void visit(LineSegment ls) {
     125                g.setColor(ls.isSelected() ? Color.WHITE : darkblue);
     126                if (Main.main.ds.pendingLineSegments().contains(ls))
     127                        g.setColor(darkgreen);
     128                Point p1 = mv.getScreenPoint(ls.getStart().coor);
     129                Point p2 = mv.getScreenPoint(ls.getEnd().coor);
     130                g.drawLine(p1.x, p1.y, p2.x, p2.y);
     131        }
     132
     133        /**
     134         * Draw a darkblue line for all line segments.
     135         * @param t The track to draw.
     136         */
     137        public void visit(Track t) {
     138                for (LineSegment ls : t.segments())
     139                        ls.visit(this);
     140        }
     141
     142        public void visit(Key k) {
     143        }
     144       
     145        /**
     146         * Draw the node as small rectangle with the given color.
     147         *
     148         * @param n             The node to draw.
     149         * @param color The color of the node.
     150         */
     151        private void drawNode(Node n, Color color) {
     152                Point p = mv.getScreenPoint(n.coor);
     153                g.setColor(color);
     154                g.drawRect(p.x-1, p.y-1, 2, 2);
     155        }
    42156}
  • src/org/openstreetmap/josm/gui/layer/RawGpsDataLayer.java

    r21 r22  
    55import org.openstreetmap.josm.command.DataSet;
    66import org.openstreetmap.josm.gui.ImageProvider;
    7 import org.openstreetmap.josm.gui.engine.RawGpsEngine;
    87
    98/**
     
    1817
    1918        protected RawGpsDataLayer(DataSet dataSet, String name) {
    20                 super(dataSet, new RawGpsEngine(), name);
     19                super(name);
    2120        }
    2221
  • src/org/openstreetmap/josm/io/GpxWriter.java

    r21 r22  
    1414import org.jdom.output.Format;
    1515import org.jdom.output.XMLOutputter;
    16 import org.openstreetmap.josm.command.DataSet;
     16import org.openstreetmap.josm.Main;
    1717import org.openstreetmap.josm.data.osm.Key;
    1818import org.openstreetmap.josm.data.osm.LineSegment;
     
    4747         */
    4848        private Writer out;
    49         /**
    50          * The DataSet this outputter operates on.
    51          */
    52         private final DataSet ds;
    5349       
    5450        /**
     
    5753         *
    5854         * @param out The Writer to store the result data in.
    59          * @param ds The dataset to store.
    60          */
    61         public GpxWriter(Writer out, DataSet ds) {
    62                 this.ds = ds;
     55         */
     56        public GpxWriter(Writer out) {
    6357                this.out = out;
    6458        }
     
    8882                e.setAttribute("creator", "JOSM Beta");
    8983                // for getting all unreferenced waypoints in the wpt-list
    90                 LinkedList<Node> nodes = new LinkedList<Node>(ds.nodes);
     84                LinkedList<Node> nodes = new LinkedList<Node>(Main.main.ds.nodes);
    9185
    9286                // tracks
    93                 for (Track t : ds.tracks()) {
     87                for (Track t : Main.main.ds.tracks()) {
    9488                        Element tElem = new Element("trk", GPX);
    9589                        if (t.keys != null) {
  • src/org/openstreetmap/josm/io/OsmReader.java

    r21 r22  
    11package org.openstreetmap.josm.io;
    22
    3 import java.awt.Font;
    4 import java.awt.GridBagLayout;
    53import java.io.IOException;
    64import java.io.InputStreamReader;
    75import java.io.Reader;
    8 import java.net.Authenticator;
    96import java.net.HttpURLConnection;
    10 import java.net.PasswordAuthentication;
    117import java.net.URL;
    128
    13 import javax.swing.JLabel;
    14 import javax.swing.JOptionPane;
    15 import javax.swing.JPanel;
    16 import javax.swing.JPasswordField;
    17 import javax.swing.JTextField;
    18 
    19 import org.openstreetmap.josm.Main;
    209import org.openstreetmap.josm.command.DataSet;
    21 import org.openstreetmap.josm.gui.GBC;
    2210
    2311/**
     
    2614 * @author imi
    2715 */
    28 public class OsmReader implements DataReader {
     16public class OsmReader extends OsmConnection implements DataReader {
    2917
    3018        /**
     
    3624         */
    3725        private boolean rawGps;
    38         /**
    39          * Whether the user cancelled the password dialog
    40          */
    41         private boolean cancelled = false;
    42         /**
    43          * Set to true, when the autenticator tried the password once.
    44          */
    45         private boolean passwordtried = false;
    46 
     26       
    4727        /**
    4828         * Construct the reader and store the information for attaching
     
    5232                this.rawGps = rawGps;
    5333                urlStr = server.endsWith("/") ? server : server+"/";
    54                 urlStr += rawGps?"trackpoints" : "map";
    55                 urlStr += "?bbox="+lon1+","+lat1+","+lon2+","+lat2;
    5634                if (rawGps)
    57                         urlStr += "&page=";
    58                
    59                 HttpURLConnection.setFollowRedirects(true);
    60                 Authenticator.setDefault(new Authenticator(){
    61                         @Override
    62                         protected PasswordAuthentication getPasswordAuthentication() {
    63                                 String username = Main.pref.osmDataUsername;
    64                                 String password = Main.pref.osmDataPassword;
    65                                 if (passwordtried || "".equals(username) || password == null || "".equals(password)) {
    66                                         JPanel p = new JPanel(new GridBagLayout());
    67                                         p.add(new JLabel("Username"), GBC.std().insets(0,0,10,0));
    68                                         JTextField usernameField = new JTextField("".equals(username) ? "" : username, 20);
    69                                         p.add(usernameField, GBC.eol());
    70                                         p.add(new JLabel("Password"), GBC.std().insets(0,0,10,0));
    71                                         JPasswordField passwordField = new JPasswordField(password == null ? "" : password, 20);
    72                                         p.add(passwordField, GBC.eol());
    73                                         JLabel warning = new JLabel("Warning: The password is transferred unencrypted.");
    74                                         warning.setFont(warning.getFont().deriveFont(Font.ITALIC));
    75                                         p.add(warning, GBC.eol());
    76                                         int choice = JOptionPane.showConfirmDialog(Main.main, p, "Enter Password", JOptionPane.OK_CANCEL_OPTION);
    77                                         if (choice == JOptionPane.CANCEL_OPTION) {
    78                                                 cancelled = true;
    79                                                 return null;
    80                                         }
    81                                         username = usernameField.getText();
    82                                         password = String.valueOf(passwordField.getPassword());
    83                                         if ("".equals(username))
    84                                                 return null;
    85                                 }
    86                                 passwordtried = true;
    87                                 return new PasswordAuthentication(username, password.toCharArray());
    88                         }
    89                 });
     35                        urlStr += "trackpoints?bbox="+lat1+","+lon1+","+lat2+","+lon2+"&page=";
     36                else
     37                        urlStr += "map?bbox="+lon1+","+lat1+","+lon2+","+lat2;
    9038        }
    9139
     
    9341        public DataSet parse() throws ParseException, ConnectionException {
    9442                Reader in;
     43                initAuthentication();
    9544                try {
    9645                        if (rawGps) {
     
    9847                                for (int i = 0;;++i) {
    9948                                        URL url = new URL(urlStr+i);
     49                                        System.out.println(url);
    10050                                        HttpURLConnection con = (HttpURLConnection)url.openConnection();
    10151                                        con.setConnectTimeout(20000);
    102                                         if (con.getResponseCode() == 401 && cancelled)
     52                                        if (con.getResponseCode() == 401 && isCancelled())
    10353                                                return null;
    10454                                        in = new InputStreamReader(con.getInputStream());
     
    11262                        HttpURLConnection con = (HttpURLConnection)url.openConnection();
    11363                        con.setConnectTimeout(20000);
    114                         if (con.getResponseCode() == 401 && cancelled)
     64                        if (con.getResponseCode() == 401 && isCancelled())
    11565                                return null;
    11666                        in = new InputStreamReader(con.getInputStream());
Note: See TracChangeset for help on using the changeset viewer.