/*******************************************************************************
* Copyright (c) MOBAC developers
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/
package mobac.gui.actions;
import java.util.List;
import javax.swing.tree.DefaultMutableTreeNode;
import mobac.data.gpx.gpx11.Gpx;
import mobac.data.gpx.gpx11.RteType;
import mobac.data.gpx.gpx11.TrkType;
import mobac.data.gpx.gpx11.TrksegType;
import mobac.data.gpx.gpx11.WptType;
import mobac.gui.gpxtree.GpxEntry;
import mobac.gui.gpxtree.RteEntry;
import mobac.gui.gpxtree.TrkEntry;
import mobac.gui.gpxtree.TrksegEntry;
/**
* Encapsulates all functionality regarding edits of loaded gpx files.
*
* @author lhoeppner
*
*/
public class GpxEditor {
private static GpxEditor editor = null;
public static GpxEditor getInstance() {
if (editor == null) {
editor = new GpxEditor();
}
return editor;
}
/**
* Adds a wpt to the selected route.
*
* @param entry
* @param wpt
*/
public void findRteAndAdd(RteEntry entry, WptType wpt) {
List<RteType> rtes = entry.getLayer().getGpx().getRte();
RteType rteParent = (entry).getRte();
for (RteType rte : rtes) {
if (rte.equals(rteParent)) {
rte.getRtept().add(wpt);
}
}
}
/**
* Adds a wpt to the selected track segment.
*
* @param entry
* @param wpt
*/
public void findTrksegAndAdd(TrksegEntry entry, WptType wpt) {
// get the track the selected track segment belongs to
DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) entry.getNode().getParent();
TrkEntry trkParent = (TrkEntry) parentNode.getUserObject();
// get the selected track segment
TrksegType trksegParent = entry.getTrkSeg();
List<TrksegType> trksegs = trkParent.getTrk().getTrkseg();
for (TrksegType trkseg : trksegs) {
if (trkseg.equals(trksegParent)) {
trkseg.getTrkpt().add(wpt);
}
}
}
/**
* Removes a waypoint from the Gpx assigned to the layer.
*
* @param wpt
* - the node to be removed
* @return - true if wpt found and deleted, false otherwise
*/
public boolean findWptAndDelete(WptType wpt, GpxEntry gpxEntry) {
Gpx gpx = gpxEntry.getLayer().getGpx();
// wpts
List<WptType> wpts = gpx.getWpt();
for (WptType currentWpt : wpts) {
if (currentWpt.equals(wpt)) {
wpts.remove(currentWpt);
return true;
}
}
// trks
List<TrkType> trks = gpx.getTrk();
for (TrkType currentTrk : trks) {
List<TrksegType> trksegs = currentTrk.getTrkseg();
for (TrksegType currentTrkseg : trksegs) {
wpts = currentTrkseg.getTrkpt();
for (WptType currentWpt : wpts) {
if (currentWpt.equals(wpt)) {
wpts.remove(currentWpt);
return true;
}
}
}
}
// rtes
List<RteType> rtes = gpx.getRte();
for (RteType currentRte : rtes) {
wpts = currentRte.getRtept();
for (WptType currentWpt : wpts) {
if (currentWpt.equals(wpt)) {
wpts.remove(currentWpt);
return true;
}
}
}
return false; // if the node wasn't found
}
}