/** * License: GPL. Copyright 2008. Martin Garbe (leo at running-sheep dot com) */ package org.openstreetmap.josm.plugins.editgpx; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Toolkit; import java.awt.event.ActionEvent; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.Icon; import javax.swing.ImageIcon; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.data.Bounds; import org.openstreetmap.josm.data.gpx.GpxData; import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor; import org.openstreetmap.josm.gui.MapView; import org.openstreetmap.josm.gui.dialogs.LayerListDialog; import org.openstreetmap.josm.gui.dialogs.LayerListPopup; import org.openstreetmap.josm.gui.layer.GpxLayer; import org.openstreetmap.josm.gui.layer.Layer; 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; public class EditGpxLayer extends Layer { private static Icon icon = new ImageIcon(Toolkit.getDefaultToolkit().createImage(EditGpxPlugin.class.getResource("/images/editgpx_layer.png"))); public final EditGpxData data; private GPXLayerImportAction layerImport; /** * Constructs a new {@code EditGpxLayer}. * @param gpxData edit gpx data */ public EditGpxLayer(EditGpxData gpxData) { super(tr("EditGpx")); data = gpxData; layerImport = new GPXLayerImportAction(data); } /** * check if dataSet is empty * if so show import dialog to user */ public void initializeImport() { if (data.isEmpty()) { layerImport.activateImport(); } } @Override public Icon getIcon() { return icon; } @Override public Object getInfoComponent() { return getToolTipText(); } @Override public Action[] getMenuEntries() { return new Action[] { LayerListDialog.getInstance().createShowHideLayerAction(), LayerListDialog.getInstance().createDeleteLayerAction(), SeparatorLayerAction.INSTANCE, layerImport, new ConvertToGpxLayerAction(), new ConvertToAnonTimeGpxLayerAction(), SeparatorLayerAction.INSTANCE, new LayerListPopup.InfoAction(this)}; } @Override public String getToolTipText() { return tr("Layer for editing GPX tracks"); } @Override public boolean isMergable(Layer other) { // TODO return false; } @Override public void mergeFrom(Layer from) { // TODO } @Override public void paint(Graphics2D g, MapView mv, Bounds bounds) { g.setColor(Color.yellow); //don't iterate through dataSet whiling making changes synchronized(layerImport.importing) { for (EditGpxTrack track: data.getTracks()) { for (EditGpxTrackSegment segment: track.getSegments()) { for (EditGpxWayPoint wayPoint: segment.getWayPoints()) { if (!wayPoint.isDeleted()) { Point pnt = mv.getPoint(wayPoint.getCoor().getEastNorth()); g.drawOval(pnt.x - 2, pnt.y - 2, 4, 4); } } } } } } public void reset(){ //TODO implement a reset } @Override public void visitBoundingBox(BoundingXYVisitor v) { // TODO Auto-generated method stub } /** * convert a DataSet to GPX * * @param boolean anonTime If true set all time and date in GPX to 01/01/1970 00:00 ? * @return GPXData */ private GpxData toGpxData(boolean anonTime) { return data.createGpxData(anonTime); } /** * Context item "Convert to GPX layer" */ public class ConvertToGpxLayerAction extends AbstractAction { /** * Constructs a new {@code ConvertToGpxLayerAction}. */ public ConvertToGpxLayerAction() { super(tr("Convert to GPX layer"), ImageProvider.get("converttogpx")); } @Override public void actionPerformed(ActionEvent e) { if (Main.map.mapMode instanceof EditGpxMode && !Main.map.selectSelectTool(false)) { Main.map.selectZoomTool(false); // Select tool might not be support of active layer, zoom is always supported } Main.getLayerManager().addLayer(new GpxLayer(toGpxData(false), tr("Converted from: {0}", getName()))); Main.getLayerManager().removeLayer(EditGpxLayer.this); } } /** * Context item "Convert to GPX layer with anonymised time" */ public class ConvertToAnonTimeGpxLayerAction extends AbstractAction { /** * Constructs a new {@code ConvertToAnonTimeGpxLayerAction}. */ public ConvertToAnonTimeGpxLayerAction() { super(tr("Convert to GPX layer with anonymised time"), ImageProvider.get("converttogpx")); } @Override public void actionPerformed(ActionEvent e) { if (Main.map.mapMode instanceof EditGpxMode && !Main.map.selectSelectTool(false)) { Main.map.selectZoomTool(false); // Select tool might not be support of active layer, zoom is always supported } Main.getLayerManager().addLayer(new GpxLayer(toGpxData(true), tr("Converted from: {0}", getName()))); Main.getLayerManager().removeLayer(EditGpxLayer.this); } } }