Index: /applications/editors/josm/plugins/editgpx/.settings/org.eclipse.jdt.ui.prefs
===================================================================
--- /applications/editors/josm/plugins/editgpx/.settings/org.eclipse.jdt.ui.prefs	(revision 21472)
+++ /applications/editors/josm/plugins/editgpx/.settings/org.eclipse.jdt.ui.prefs	(revision 21472)
@@ -0,0 +1,54 @@
+#Tue May 25 21:33:38 CEST 2010
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=false
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=false
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=false
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
Index: /applications/editors/josm/plugins/editgpx/src/org/openstreetmap/josm/plugins/editgpx/EditGpxLayer.java
===================================================================
--- /applications/editors/josm/plugins/editgpx/src/org/openstreetmap/josm/plugins/editgpx/EditGpxLayer.java	(revision 21471)
+++ /applications/editors/josm/plugins/editgpx/src/org/openstreetmap/josm/plugins/editgpx/EditGpxLayer.java	(revision 21472)
@@ -12,12 +12,4 @@
 import java.awt.Toolkit;
 import java.awt.event.ActionEvent;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
 
 import javax.swing.AbstractAction;
@@ -30,9 +22,4 @@
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.gpx.GpxData;
-import org.openstreetmap.josm.data.gpx.ImmutableGpxTrack;
-import org.openstreetmap.josm.data.gpx.WayPoint;
-import org.openstreetmap.josm.data.osm.DataSet;
-import org.openstreetmap.josm.data.osm.Node;
-import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
 import org.openstreetmap.josm.gui.MapView;
@@ -41,5 +28,8 @@
 import org.openstreetmap.josm.gui.layer.GpxLayer;
 import org.openstreetmap.josm.gui.layer.Layer;
-import org.openstreetmap.josm.tools.DateUtils;
+import org.openstreetmap.josm.plugins.editgpx.data.EditGpxData;
+import org.openstreetmap.josm.plugins.editgpx.data.EditGpxTrack;
+import org.openstreetmap.josm.plugins.editgpx.data.EditGpxTrackSegment;
+import org.openstreetmap.josm.plugins.editgpx.data.EditGpxWayPoint;
 import org.openstreetmap.josm.tools.ImageProvider;
 
@@ -48,11 +38,11 @@
 
 	private static Icon icon = new ImageIcon(Toolkit.getDefaultToolkit().createImage(EditGpxPlugin.class.getResource("/images/editgpx_layer.png")));
-	private DataSet dataSet;
+	private final EditGpxData data;
 	private GPXLayerImportAction layerImport;
 
-	public EditGpxLayer(String str, DataSet ds) {
+	public EditGpxLayer(String str, EditGpxData gpxData) {
 		super(str);
-		dataSet = ds;
-		layerImport = new GPXLayerImportAction(dataSet);
+		data = gpxData;
+		layerImport = new GPXLayerImportAction(data);
 	}
 
@@ -63,5 +53,5 @@
 	public void initializeImport() {
 		try {
-			if(dataSet.getNodes().isEmpty() ) {
+			if(data.isEmpty()) {
 				layerImport.activateImport();
 			}
@@ -117,8 +107,12 @@
 		//don't iterate through dataSet whiling making changes
 		synchronized(layerImport.importing) {
-			for(Node n: dataSet.getNodes()) {
-				if (!n.isDeleted()) {
-					Point pnt = Main.map.mapView.getPoint(n.getEastNorth());
-					g.drawOval(pnt.x - 2, pnt.y - 2, 4, 4);
+			for (EditGpxTrack track: data.getTracks()) {
+				for (EditGpxTrackSegment segment: track.getSegments()) {
+					for (EditGpxWayPoint wayPoint: segment.getWayPoints()) {
+						if (!wayPoint.isDeleted()) {
+							Point pnt = Main.map.mapView.getPoint(wayPoint.getCoor().getEastNorth());
+							g.drawOval(pnt.x - 2, pnt.y - 2, 4, 4);
+						}
+					}
 				}
 			}
@@ -145,74 +139,5 @@
 	 */
 	private GpxData toGpxData(boolean anonTime) {
-		GpxData gpxData = new GpxData();
-		HashSet<Node> doneNodes = new HashSet<Node>();
-		//add all ways
-		for (Way w : dataSet.getWays()) {
-			if (w.isIncomplete() || w.isDeleted()) continue;
-			List<Collection<WayPoint>> segments = new ArrayList<Collection<WayPoint>>();
-
-			List<WayPoint> trkseg = null;
-			for (Node n : w.getNodes()) {
-				if (n.isIncomplete() || n.isDeleted()) {
-					trkseg = null;
-					continue;
-				}
-
-				Date tstamp = n.getTimestamp();
-
-				if (trkseg == null) {
-					trkseg = new ArrayList<WayPoint>();
-					segments.add(trkseg);
-				}
-				doneNodes.add(n);
-
-				WayPoint wpt = new WayPoint(n.getCoor());
-				if (anonTime) {
-					wpt.attr.put("time", "1970-01-01T00:00:00Z");
-				} else {
-					wpt.attr.put("time", DateUtils.fromDate(tstamp));
-				}
-				wpt.setTime();
-
-				trkseg.add(wpt);
-			}
-
-			// Do not create empty segments
-			for (Iterator<Collection<WayPoint>>  segIt = segments.iterator(); segIt.hasNext(); ) {
-				if (segIt.next().isEmpty()) {
-					segIt.remove();
-				}
-			}
-
-			Map<String, Object> trkAttributes = new HashMap<String, Object>();
-			if (w.get("name") != null) {
-				trkAttributes.put("name", w.get("name"));
-			}
-			if (!segments.isEmpty()) {
-				gpxData.tracks.add(new ImmutableGpxTrack(segments, trkAttributes));
-			}
-
-		}
-
-		// add nodes as waypoints
-		for (Node n : dataSet.getNodes()) {
-			if (n.isIncomplete() || n.isDeleted() || doneNodes.contains(n)) continue;
-
-			Date tstamp = n.getTimestamp();
-
-			WayPoint wpt = new WayPoint(n.getCoor());
-			if (anonTime) {
-				wpt.attr.put("time", "1970-01-01T00:00:00Z");
-			} else {
-				wpt.attr.put("time", DateUtils.fromDate(tstamp));
-			}
-			wpt.setTime();
-
-			if (n.getKeys() != null && n.keySet().contains("name")) {
-				wpt.attr.put("name", n.get("name"));
-			}
-			gpxData.waypoints.add(wpt);
-		}
-		return gpxData;
+		return data.createGpxData();
 	}
 
Index: /applications/editors/josm/plugins/editgpx/src/org/openstreetmap/josm/plugins/editgpx/EditGpxMode.java
===================================================================
--- /applications/editors/josm/plugins/editgpx/src/org/openstreetmap/josm/plugins/editgpx/EditGpxMode.java	(revision 21471)
+++ /applications/editors/josm/plugins/editgpx/src/org/openstreetmap/josm/plugins/editgpx/EditGpxMode.java	(revision 21472)
@@ -14,122 +14,128 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.mapmode.MapMode;
-import org.openstreetmap.josm.data.osm.DataSet;
-import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.gui.MapFrame;
+import org.openstreetmap.josm.plugins.editgpx.data.EditGpxData;
+import org.openstreetmap.josm.plugins.editgpx.data.EditGpxTrack;
+import org.openstreetmap.josm.plugins.editgpx.data.EditGpxTrackSegment;
+import org.openstreetmap.josm.plugins.editgpx.data.EditGpxWayPoint;
 
 
 public class EditGpxMode extends MapMode {
 
-    private static final long serialVersionUID = 7940589057093872411L;
-    Point pointPressed;
-    DataSet dataSet;
-    MapFrame mapFrame;
-    Rectangle oldRect;
-    MapFrame frame;
+	private static final long serialVersionUID = 7940589057093872411L;
+	Point pointPressed;
+	EditGpxData data;
+	MapFrame mapFrame;
+	Rectangle oldRect;
+	MapFrame frame;
 
-    public EditGpxMode(MapFrame mapFrame, String name, String desc, DataSet ds) {
-        super(name, "editgpx_mode.png", desc, mapFrame, Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
-        dataSet = ds;
-    }
+	public EditGpxMode(MapFrame mapFrame, String name, String desc, EditGpxData gpxData) {
+		super(name, "editgpx_mode.png", desc, mapFrame, Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
+		this.data = gpxData;
+	}
 
-    @Override public void enterMode() {
-        super.enterMode();
-        Main.map.mapView.addMouseListener(this);
-        Main.map.mapView.addMouseMotionListener(this);
-    }
+	@Override public void enterMode() {
+		super.enterMode();
+		Main.map.mapView.addMouseListener(this);
+		Main.map.mapView.addMouseMotionListener(this);
+	}
 
-    @Override public void exitMode() {
-        super.exitMode();
-        Main.map.mapView.removeMouseListener(this);
-        Main.map.mapView.removeMouseMotionListener(this);
-    }
+	@Override public void exitMode() {
+		super.exitMode();
+		Main.map.mapView.removeMouseListener(this);
+		Main.map.mapView.removeMouseMotionListener(this);
+	}
 
 
-    @Override public void mousePressed(MouseEvent e) {
-        pointPressed = new Point(e.getPoint());
-    }
+	@Override public void mousePressed(MouseEvent e) {
+		pointPressed = new Point(e.getPoint());
+	}
 
 
-    @Override public void mouseDragged(MouseEvent e) {
-        if ( (e.getModifiersEx() & InputEvent.BUTTON1_DOWN_MASK) ==  InputEvent.BUTTON1_DOWN_MASK) {
-            //if button1 is hold, draw the rectangle.
-            paintRect(pointPressed, e.getPoint());
-        }
-    }
+	@Override public void mouseDragged(MouseEvent e) {
+		if ( (e.getModifiersEx() & InputEvent.BUTTON1_DOWN_MASK) ==  InputEvent.BUTTON1_DOWN_MASK) {
+			//if button1 is hold, draw the rectangle.
+			paintRect(pointPressed, e.getPoint());
+		}
+	}
 
-    @Override public void mouseReleased(MouseEvent e) {
-        if (e.getButton() != MouseEvent.BUTTON1) {
-            return;
-        } else {
-            Point pointReleased = e.getPoint();
+	@Override public void mouseReleased(MouseEvent e) {
+		if (e.getButton() != MouseEvent.BUTTON1) {
+			return;
+		} else {
+			Point pointReleased = e.getPoint();
 
-            Rectangle r = createRect(pointReleased, pointPressed);
+			Rectangle r = createRect(pointReleased, pointPressed);
 
-            //go through nodes and mark the ones in the selection rect as deleted
-            for (Node n: dataSet.getNodes()) {
-                Point p = Main.map.mapView.getPoint(n);
-                if (r.contains(p)) {
-                	n.setDeleted(true);
-                }
-            }
-            oldRect = null;
-            Main.map.mapView.repaint();
-        }
-    }
+			//go through nodes and mark the ones in the selection rect as deleted
+			for (EditGpxTrack track: data.getTracks()) {
+				for (EditGpxTrackSegment segment: track.getSegments()) {
+					for (EditGpxWayPoint wayPoint: segment.getWayPoints()) {
+						Point p = Main.map.mapView.getPoint(wayPoint.getCoor().getEastNorth());
+						if (r.contains(p)) {
+							wayPoint.setDeleted(true);
+						}
+					}
+				}
+			}
+			oldRect = null;
+			Main.map.mapView.repaint();
+		}
+	}
 
-    /**
-     * create rectangle out of two given corners
-     */
-    public Rectangle createRect(Point p1, Point p2) {
-        int x,y,w,h;
-        if (p1.x == p2.x && p1.y == p2.y) {
-            //if p1 and p2 same points draw a small rectangle around them
-            x = p1.x -1;
-            y = p1.y -1;
-            w = 3;
-            h = 3;
-        } else {
-            if (p1.x < p2.x){
-                x = p1.x;
-                w = p2.x-p1.x;
-            } else {
-                x = p2.x;
-                w = p1.x-p2.x;
-            }
-            if (p1.y < p2.y) {
-                y = p1.y;
-                h = p2.y-p1.y;
-            } else {
-                y = p2.y;
-                h = p1.y-p2.y;
-            }
-        }
-        return new Rectangle(x,y,w,h);
-    }
+	/**
+	 * create rectangle out of two given corners
+	 */
+	public Rectangle createRect(Point p1, Point p2) {
+		int x,y,w,h;
+		if (p1.x == p2.x && p1.y == p2.y) {
+			//if p1 and p2 same points draw a small rectangle around them
+			x = p1.x -1;
+			y = p1.y -1;
+			w = 3;
+			h = 3;
+		} else {
+			if (p1.x < p2.x){
+				x = p1.x;
+				w = p2.x-p1.x;
+			} else {
+				x = p2.x;
+				w = p1.x-p2.x;
+			}
+			if (p1.y < p2.y) {
+				y = p1.y;
+				h = p2.y-p1.y;
+			} else {
+				y = p2.y;
+				h = p1.y-p2.y;
+			}
+		}
+		return new Rectangle(x,y,w,h);
+	}
 
-    /**
-     * Draw a selection rectangle on screen.
-     */
-    private void paintRect(Point p1, Point p2) {
-        Graphics g = frame.getGraphics();//Main.map.mapView.getGraphics();
+	/**
+	 * Draw a selection rectangle on screen.
+	 */
+	private void paintRect(Point p1, Point p2) {
+		Graphics g = frame.getGraphics();//Main.map.mapView.getGraphics();
 
-        Rectangle r = oldRect;
-        if (r != null) {
-            //overwrite old rct
-            g.setXORMode(Color.BLACK);
-            g.setColor(Color.WHITE);
-            g.drawRect(r.x,r.y,r.width,r.height);
-        }
+		Rectangle r = oldRect;
+		if (r != null) {
+			//overwrite old rct
+			g.setXORMode(Color.BLACK);
+			g.setColor(Color.WHITE);
+			g.drawRect(r.x,r.y,r.width,r.height);
+		}
 
-        g.setXORMode(Color.BLACK);
-        g.setColor(Color.WHITE);
-        r = createRect(p1,p2);
-        g.drawRect(r.x,r.y,r.width,r.height);
-        oldRect = r;
-    }
+		g.setXORMode(Color.BLACK);
+		g.setColor(Color.WHITE);
+		r = createRect(p1,p2);
+		g.drawRect(r.x,r.y,r.width,r.height);
+		oldRect = r;
+	}
 
 
-    public void setFrame(MapFrame mapFrame) {
-        frame = mapFrame;
-    }
+	public void setFrame(MapFrame mapFrame) {
+		frame = mapFrame;
+	}
 }
Index: /applications/editors/josm/plugins/editgpx/src/org/openstreetmap/josm/plugins/editgpx/EditGpxPlugin.java
===================================================================
--- /applications/editors/josm/plugins/editgpx/src/org/openstreetmap/josm/plugins/editgpx/EditGpxPlugin.java	(revision 21471)
+++ /applications/editors/josm/plugins/editgpx/src/org/openstreetmap/josm/plugins/editgpx/EditGpxPlugin.java	(revision 21472)
@@ -3,4 +3,6 @@
  */
 package org.openstreetmap.josm.plugins.editgpx;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.awt.event.ActionEvent;
@@ -11,5 +13,4 @@
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.gui.IconToggleButton;
 import org.openstreetmap.josm.gui.MapFrame;
@@ -19,6 +20,5 @@
 import org.openstreetmap.josm.plugins.Plugin;
 import org.openstreetmap.josm.plugins.PluginInformation;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
+import org.openstreetmap.josm.plugins.editgpx.data.EditGpxData;
 
 /**
@@ -38,81 +38,81 @@
 public class EditGpxPlugin extends Plugin {
 
-    private IconToggleButton btn;
-    private EditGpxMode mode;
-    protected static EditGpxLayer eGpxLayer;
-    protected static DataSet dataSet;
-    public static boolean active = false;
+	private IconToggleButton btn;
+	private EditGpxMode mode;
+	protected static EditGpxLayer eGpxLayer;
+	protected static EditGpxData gpxData;
+	public static boolean active = false;
 
-    public EditGpxPlugin(PluginInformation info) {
-    	super(info);
-        dataSet = new DataSet();
-        mode = new EditGpxMode(Main.map, "editgpx", tr("edit gpx tracks"), dataSet);
+	public EditGpxPlugin(PluginInformation info) {
+		super(info);
+		gpxData = new EditGpxData();
+		mode = new EditGpxMode(Main.map, "editgpx", tr("edit gpx tracks"), gpxData);
 
-        btn = new IconToggleButton(mode);
-        btn.setVisible(true);
-    }
+		btn = new IconToggleButton(mode);
+		btn.setVisible(true);
+	}
 
-    /**
-     * initialize button. if button is pressed create new layer.
-     */
-    @Override
-    public void mapFrameInitialized(MapFrame oldFrame, MapFrame newFrame) {
-        if(oldFrame == null && newFrame != null) {
-            mode.setFrame(newFrame);
+	/**
+	 * initialize button. if button is pressed create new layer.
+	 */
+	@Override
+	public void mapFrameInitialized(MapFrame oldFrame, MapFrame newFrame) {
+		if(oldFrame == null && newFrame != null) {
+			mode.setFrame(newFrame);
 
-            if(Main.map != null)
-                Main.map.addMapMode(btn);
+			if(Main.map != null)
+				Main.map.addMapMode(btn);
 
-            active = btn.isSelected();
+			active = btn.isSelected();
 
-            btn.addActionListener(new ActionListener() {
-                public void actionPerformed(ActionEvent e) {
-                    active = btn.isSelected();
-                    if (active) {
-                        Main.worker.execute(new Runnable() {
-                            public void run() {
-                                updateLayer();
-                            }
-                        });
-                    }
-                }
-            });
-        }
-    }
+			btn.addActionListener(new ActionListener() {
+				public void actionPerformed(ActionEvent e) {
+					active = btn.isSelected();
+					if (active) {
+						Main.worker.execute(new Runnable() {
+							public void run() {
+								updateLayer();
+							}
+						});
+					}
+				}
+			});
+		}
+	}
 
-    /**
-     * create new layer, add listeners and try importing gpx data.
-     */
-    private void updateLayer() {
-        if(eGpxLayer == null) {
-            eGpxLayer = new EditGpxLayer(tr("EditGpx"), dataSet);
-            Main.main.addLayer(eGpxLayer);
-            MapView.addLayerChangeListener(new LayerChangeListener(){
+	/**
+	 * create new layer, add listeners and try importing gpx data.
+	 */
+	private void updateLayer() {
+		if(eGpxLayer == null) {
+			eGpxLayer = new EditGpxLayer(tr("EditGpx"), gpxData);
+			Main.main.addLayer(eGpxLayer);
+			MapView.addLayerChangeListener(new LayerChangeListener(){
 
-                public void activeLayerChange(final Layer oldLayer, final Layer newLayer) {
-                    if(newLayer instanceof EditGpxLayer)
-                        EditGpxPlugin.eGpxLayer = (EditGpxLayer)newLayer;
-                }
+				public void activeLayerChange(final Layer oldLayer, final Layer newLayer) {
+					if(newLayer instanceof EditGpxLayer)
+						EditGpxPlugin.eGpxLayer = (EditGpxLayer)newLayer;
+				}
 
-                public void layerAdded(final Layer newLayer) {
-                }
+				public void layerAdded(final Layer newLayer) {
+				}
 
-                public void layerRemoved(final Layer oldLayer) {
-                    if(oldLayer == eGpxLayer) {
-                        eGpxLayer = null;
-                        //dataSet = new DataSet();
-                        MapView.removeLayerChangeListener(this);
-                    }
-                }
-            });
+				public void layerRemoved(final Layer oldLayer) {
+					if(oldLayer == eGpxLayer) {
+						eGpxLayer = null;
+						//dataSet = new DataSet();
+						MapView.removeLayerChangeListener(this);
+					}
+				}
+			});
 
-            eGpxLayer.initializeImport();
-        }
-        Main.map.mapView.repaint();
-    }
+			eGpxLayer.initializeImport();
+		}
+		Main.map.mapView.repaint();
+	}
 
-    public static ImageIcon loadIcon(String name) {
-        URL url = EditGpxPlugin.class.getResource("/images/editgpx.png");
-        return new ImageIcon(url);
-    }
+	public static ImageIcon loadIcon(String name) {
+		URL url = EditGpxPlugin.class.getResource("/images/editgpx.png");
+		return new ImageIcon(url);
+	}
 }
Index: /applications/editors/josm/plugins/editgpx/src/org/openstreetmap/josm/plugins/editgpx/GPXLayerImportAction.java
===================================================================
--- /applications/editors/josm/plugins/editgpx/src/org/openstreetmap/josm/plugins/editgpx/GPXLayerImportAction.java	(revision 21471)
+++ /applications/editors/josm/plugins/editgpx/src/org/openstreetmap/josm/plugins/editgpx/GPXLayerImportAction.java	(revision 21472)
@@ -25,13 +25,7 @@
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.gpx.GpxTrack;
-import org.openstreetmap.josm.data.gpx.GpxTrackSegment;
-import org.openstreetmap.josm.data.gpx.WayPoint;
-import org.openstreetmap.josm.data.osm.DataSet;
-import org.openstreetmap.josm.data.osm.Node;
-import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.layer.GpxLayer;
 import org.openstreetmap.josm.gui.layer.Layer;
-import org.openstreetmap.josm.tools.DateUtils;
+import org.openstreetmap.josm.plugins.editgpx.data.EditGpxData;
 import org.openstreetmap.josm.tools.ImageProvider;
 
@@ -44,101 +38,88 @@
 
 
-    private static final long serialVersionUID = 5794897888911798168L;
-    private DataSet dataSet;
-    public Object importing = new Object(); //used for synchronization
+	private static final long serialVersionUID = 5794897888911798168L;
+	private EditGpxData data;
+	public Object importing = new Object(); //used for synchronization
 
-    public GPXLayerImportAction(DataSet ds) {
-        //TODO what is icon at the end?
-        super(tr("Import path from GPX layer"), ImageProvider.get("dialogs", "edit"));
-        this.dataSet = ds;
-    }
+	public GPXLayerImportAction(EditGpxData data) {
+		//TODO what is icon at the end?
+		super(tr("Import path from GPX layer"), ImageProvider.get("dialogs", "edit"));
+		this.data = data;
+	}
 
-    /**
-     * shows a list of GPX layers. if user selects one the data from this layer is
-     * imported.
-     */
-    public void activateImport() {
-        Box panel = Box.createVerticalBox();
-        DefaultListModel dModel= new DefaultListModel();
+	/**
+	 * shows a list of GPX layers. if user selects one the data from this layer is
+	 * imported.
+	 */
+	public void activateImport() {
+		Box panel = Box.createVerticalBox();
+		DefaultListModel dModel= new DefaultListModel();
 
-        final JList layerList = new JList(dModel);
-        Collection<Layer> data = Main.map.mapView.getAllLayers();
-        Layer lastLayer = null;
-        int layerCnt = 0;
+		final JList layerList = new JList(dModel);
+		Collection<Layer> data = Main.map.mapView.getAllLayers();
+		Layer lastLayer = null;
+		int layerCnt = 0;
 
-        for (Layer l : data){
-                if(l instanceof GpxLayer){
-                    dModel.addElement(l);
-                    lastLayer = l;
-                    layerCnt++;
-                }
-        }
-        if(layerCnt == 1){
-                layerList.setSelectedValue(lastLayer, true);
-        }
-        if(layerCnt > 0){
-            layerList.setCellRenderer(new DefaultListCellRenderer(){
-                    @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
-                        Layer layer = (Layer)value;
-                        JLabel label = (JLabel)super.getListCellRendererComponent(list,
-                                                                                  layer.getName(), index, isSelected, cellHasFocus);
-                        Icon icon = layer.getIcon();
-                        label.setIcon(icon);
-                        label.setToolTipText(layer.getToolTipText());
-                        return label;
-                    }
-                });
+		for (Layer l : data){
+			if(l instanceof GpxLayer){
+				dModel.addElement(l);
+				lastLayer = l;
+				layerCnt++;
+			}
+		}
+		if(layerCnt == 1){
+			layerList.setSelectedValue(lastLayer, true);
+		}
+		if(layerCnt > 0){
+			layerList.setCellRenderer(new DefaultListCellRenderer(){
+				@Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
+					Layer layer = (Layer)value;
+					JLabel label = (JLabel)super.getListCellRendererComponent(list,
+							layer.getName(), index, isSelected, cellHasFocus);
+					Icon icon = layer.getIcon();
+					label.setIcon(icon);
+					label.setToolTipText(layer.getToolTipText());
+					return label;
+				}
+			});
 
-            JCheckBox dropFirst = new JCheckBox(tr("Drop existing path"));
+			JCheckBox dropFirst = new JCheckBox(tr("Drop existing path"));
 
-            panel.add(layerList);
-            panel.add(dropFirst);
+			panel.add(layerList);
+			panel.add(dropFirst);
 
-            final JOptionPane optionPane = new JOptionPane(panel, JOptionPane.QUESTION_MESSAGE, JOptionPane.OK_CANCEL_OPTION){
-                    @Override public void selectInitialValue() {
-                        layerList.requestFocusInWindow();
-                    }
-                };
-            final JDialog dlg = optionPane.createDialog(Main.parent, tr("Import path from GPX layer"));
-            dlg.setVisible(true);
+			final JOptionPane optionPane = new JOptionPane(panel, JOptionPane.QUESTION_MESSAGE, JOptionPane.OK_CANCEL_OPTION){
+				@Override public void selectInitialValue() {
+					layerList.requestFocusInWindow();
+				}
+			};
+			final JDialog dlg = optionPane.createDialog(Main.parent, tr("Import path from GPX layer"));
+			dlg.setVisible(true);
 
-            Object answer = optionPane.getValue();
-            if (answer == null || answer == JOptionPane.UNINITIALIZED_VALUE ||
-                (answer instanceof Integer && (Integer)answer != JOptionPane.OK_OPTION)) {
-                return;
-            }
+			Object answer = optionPane.getValue();
+			if (answer == null || answer == JOptionPane.UNINITIALIZED_VALUE ||
+					(answer instanceof Integer && (Integer)answer != JOptionPane.OK_OPTION)) {
+				return;
+			}
 
-            GpxLayer gpx = (GpxLayer)layerList.getSelectedValue();
+			GpxLayer gpx = (GpxLayer)layerList.getSelectedValue();
 
-            synchronized(importing) {
-                for (GpxTrack trk : gpx.data.tracks) {
-                    for (GpxTrackSegment segment : trk.getSegments()) {
-                        Way w = new Way();
-                        for (WayPoint p : segment.getWayPoints()) {
-                            Node n = new Node(p.getCoor());
-                            String timestr = p.getString("time");
-                            if(timestr != null)
-                                n.setTimestamp(DateUtils.fromString(timestr));
-                            dataSet.addPrimitive(n);
-                            w.addNode(n); //TODO what to do with these while deletion
-                        }
-                        dataSet.addPrimitive(w);
-                    }
-                }
-            }
-            Main.map.mapView.repaint();
+			synchronized(importing) {
+				this.data.load(gpx.data);
+			}
+			Main.map.mapView.repaint();
 
-        } else {
-            // no gps layer
-            JOptionPane.showMessageDialog(Main.parent,tr("No GPX data layer found."));
-        }
-    }
+		} else {
+			// no gps layer
+			JOptionPane.showMessageDialog(Main.parent,tr("No GPX data layer found."));
+		}
+	}
 
-    /**
-     * called when pressing "Import.." from context menu of EditGpx layer
-     *
-     */
-    public void actionPerformed(ActionEvent arg0) {
-        activateImport();
-    }
+	/**
+	 * called when pressing "Import.." from context menu of EditGpx layer
+	 *
+	 */
+	public void actionPerformed(ActionEvent arg0) {
+		activateImport();
+	}
 }
Index: /applications/editors/josm/plugins/editgpx/src/org/openstreetmap/josm/plugins/editgpx/data/EditGpxData.java
===================================================================
--- /applications/editors/josm/plugins/editgpx/src/org/openstreetmap/josm/plugins/editgpx/data/EditGpxData.java	(revision 21472)
+++ /applications/editors/josm/plugins/editgpx/src/org/openstreetmap/josm/plugins/editgpx/data/EditGpxData.java	(revision 21472)
@@ -0,0 +1,61 @@
+package org.openstreetmap.josm.plugins.editgpx.data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.openstreetmap.josm.data.gpx.GpxData;
+import org.openstreetmap.josm.data.gpx.GpxRoute;
+import org.openstreetmap.josm.data.gpx.GpxTrack;
+import org.openstreetmap.josm.data.gpx.WayPoint;
+
+public class EditGpxData {
+
+	private final List<EditGpxTrack> tracks = new ArrayList<EditGpxTrack>();
+	// Only copy of routes and waypoints to preserve all info when converting back to gpx track
+	private final List<GpxRoute> routes = new ArrayList<GpxRoute>();
+	private final List<WayPoint> waypoints = new ArrayList<WayPoint>();
+
+	public void load(GpxData data) {
+		tracks.clear();
+		for (GpxTrack track: data.tracks) {
+			tracks.add(new EditGpxTrack(track));
+		}
+		routes.clear();
+		routes.addAll(data.routes);
+		waypoints.clear();
+		waypoints.addAll(data.waypoints);
+	}
+
+	public boolean isEmpty() {
+		for (EditGpxTrack track: tracks) {
+			for (EditGpxTrackSegment segment: track.getSegments()) {
+				if (!segment.getWayPoints().isEmpty()) {
+					return false;
+				}
+			}
+		}
+		return true;
+	}
+
+	public List<EditGpxTrack> getTracks() {
+		return tracks;
+	}
+
+	public GpxData createGpxData() {
+		GpxData result = new GpxData();
+
+		for (EditGpxTrack track: tracks) {
+			if (!track.isDeleted()) {
+				GpxTrack newTrack = track.createGpxTrack();
+				if (!newTrack.getSegments().isEmpty()) {
+					result.tracks.add(newTrack);
+				}
+			}
+		}
+
+		result.routes.addAll(routes);
+		result.waypoints.addAll(waypoints);
+		return result;
+	}
+
+}
Index: /applications/editors/josm/plugins/editgpx/src/org/openstreetmap/josm/plugins/editgpx/data/EditGpxTrack.java
===================================================================
--- /applications/editors/josm/plugins/editgpx/src/org/openstreetmap/josm/plugins/editgpx/data/EditGpxTrack.java	(revision 21472)
+++ /applications/editors/josm/plugins/editgpx/src/org/openstreetmap/josm/plugins/editgpx/data/EditGpxTrack.java	(revision 21472)
@@ -0,0 +1,57 @@
+package org.openstreetmap.josm.plugins.editgpx.data;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.openstreetmap.josm.data.gpx.GpxTrack;
+import org.openstreetmap.josm.data.gpx.GpxTrackSegment;
+import org.openstreetmap.josm.data.gpx.ImmutableGpxTrack;
+import org.openstreetmap.josm.data.gpx.WayPoint;
+
+public class EditGpxTrack {
+
+	private final List<EditGpxTrackSegment> segments = new ArrayList<EditGpxTrackSegment>();
+	private final Map<String, Object> attributes = new HashMap<String, Object>();
+	private boolean isDeleted;
+
+	public EditGpxTrack(GpxTrack track) {
+		attributes.putAll(track.getAttributes());
+		for (GpxTrackSegment segment: track.getSegments()) {
+			segments.add(new EditGpxTrackSegment(segment));
+		}
+	}
+
+	public List<EditGpxTrackSegment> getSegments() {
+		return segments;
+	}
+	public Map<String, Object> getAttributes() {
+		return attributes;
+	}
+
+	public GpxTrack createGpxTrack() {
+
+		Collection<Collection<WayPoint>> wayPoints = new ArrayList<Collection<WayPoint>>();
+
+		for (EditGpxTrackSegment segment: segments) {
+			if (!segment.isDeleted()) {
+				List<WayPoint> points = segment.getNonDeletedWaypoints();
+				if (!points.isEmpty()) {
+					wayPoints.add(points);
+				}
+			}
+		}
+
+		return new ImmutableGpxTrack(wayPoints, attributes);
+	}
+
+	public void setDeleted(boolean isDeleted) {
+		this.isDeleted = isDeleted;
+	}
+
+	public boolean isDeleted() {
+		return isDeleted;
+	}
+}
Index: /applications/editors/josm/plugins/editgpx/src/org/openstreetmap/josm/plugins/editgpx/data/EditGpxTrackSegment.java
===================================================================
--- /applications/editors/josm/plugins/editgpx/src/org/openstreetmap/josm/plugins/editgpx/data/EditGpxTrackSegment.java	(revision 21472)
+++ /applications/editors/josm/plugins/editgpx/src/org/openstreetmap/josm/plugins/editgpx/data/EditGpxTrackSegment.java	(revision 21472)
@@ -0,0 +1,44 @@
+package org.openstreetmap.josm.plugins.editgpx.data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.openstreetmap.josm.data.gpx.GpxTrackSegment;
+import org.openstreetmap.josm.data.gpx.WayPoint;
+
+public class EditGpxTrackSegment {
+
+	private final List<EditGpxWayPoint> wayPoints = new ArrayList<EditGpxWayPoint>();
+	private boolean deleted;
+
+	public EditGpxTrackSegment(GpxTrackSegment segment) {
+		for (WayPoint wayPoint: segment.getWayPoints()) {
+			wayPoints.add(new EditGpxWayPoint(wayPoint));
+		}
+	}
+
+	public List<EditGpxWayPoint> getWayPoints() {
+		return wayPoints;
+	}
+
+	public List<WayPoint> getNonDeletedWaypoints() {
+		List<WayPoint> result = new ArrayList<WayPoint>();
+
+		for (EditGpxWayPoint wp: wayPoints) {
+			if (!wp.isDeleted()) {
+				result.add(wp.createWayPoint());
+			}
+		}
+
+		return result;
+	}
+
+	public void setDeleted(boolean deleted) {
+		this.deleted = deleted;
+	}
+
+	public boolean isDeleted() {
+		return deleted;
+	}
+
+}
Index: /applications/editors/josm/plugins/editgpx/src/org/openstreetmap/josm/plugins/editgpx/data/EditGpxWayPoint.java
===================================================================
--- /applications/editors/josm/plugins/editgpx/src/org/openstreetmap/josm/plugins/editgpx/data/EditGpxWayPoint.java	(revision 21472)
+++ /applications/editors/josm/plugins/editgpx/src/org/openstreetmap/josm/plugins/editgpx/data/EditGpxWayPoint.java	(revision 21472)
@@ -0,0 +1,39 @@
+package org.openstreetmap.josm.plugins.editgpx.data;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.openstreetmap.josm.data.coor.CachedLatLon;
+import org.openstreetmap.josm.data.gpx.WayPoint;
+
+public class EditGpxWayPoint {
+	private final double time;
+	private final CachedLatLon coor;
+	private boolean deleted;
+	private Map<String, Object> attributes;
+
+	public EditGpxWayPoint(WayPoint wayPoint) {
+		this.time = wayPoint.time;
+		this.coor = new CachedLatLon(wayPoint.getCoor());
+		this.attributes = new HashMap<String, Object>(wayPoint.attr);
+	}
+
+	public WayPoint createWayPoint() {
+		WayPoint result = new WayPoint(getCoor());
+		result.time = time;
+		result.attr = attributes;
+		return result;
+	}
+
+	public void setDeleted(boolean deleted) {
+		this.deleted = deleted;
+	}
+
+	public boolean isDeleted() {
+		return deleted;
+	}
+
+	public CachedLatLon getCoor() {
+		return coor;
+	}
+}
