// License: GPL. For details, see LICENSE file.
package public_transport;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.command.Command;
import org.openstreetmap.josm.data.osm.DataSet;
import org.openstreetmap.josm.data.osm.Node;
import org.openstreetmap.josm.data.osm.OsmPrimitive;
public abstract class AbstractGTFSCatchJoinCommand extends Command {
private List<Integer> workingLines = null;
private Node undoMapNode = null;
private Node undoTableNode = null;
private GTFSStopTableModel gtfsStopTM = null;
private String type = null;
private final boolean isCatch;
public AbstractGTFSCatchJoinCommand(GTFSImporterAction controller, boolean isCatch) {
gtfsStopTM = controller.getGTFSStopTableModel();
workingLines = new ArrayList<>();
this.isCatch = isCatch;
// use either selected lines or all lines if no line is selected
int[] selectedLines = controller.getDialog().getGTFSStopTable().getSelectedRows();
if (selectedLines.length != 1)
return;
workingLines.add(selectedLines[0]);
}
@Override
public boolean executeCommand() {
if (workingLines.size() != 1)
return false;
Node dest = null;
DataSet ds = Main.getLayerManager().getEditDataSet();
Iterator<Node> iter = ds.getSelectedNodes().iterator();
int j = workingLines.get(0);
while (iter.hasNext()) {
Node n = iter.next();
if ((n != null) && (n.equals(gtfsStopTM.nodes.elementAt(j))))
continue;
if (dest != null)
return false;
dest = n;
}
if (dest == null)
return false;
undoMapNode = new Node(dest);
Node node = gtfsStopTM.nodes.elementAt(j);
undoTableNode = node;
if (node != null) {
ds.removePrimitive(node);
node.setDeleted(true);
}
if (isCatch)
dest.setCoor(gtfsStopTM.coors.elementAt(j));
dest.put("highway", "bus_stop");
dest.put("stop_id", (String) gtfsStopTM.getValueAt(j, 0));
if (dest.get("name") == null)
dest.put("name", (String) gtfsStopTM.getValueAt(j, 1));
if (isCatch)
dest.put("note", "moved by gtfs import");
gtfsStopTM.nodes.set(j, dest);
type = (String) gtfsStopTM.getValueAt(j, 2);
gtfsStopTM.setValueAt(isCatch ? "fed" : tr("moved"), j, 2);
return true;
}
@Override
public void undoCommand() {
if (workingLines.size() != 1)
return;
int j = workingLines.get(0);
DataSet ds = Main.getLayerManager().getEditDataSet();
Node node = gtfsStopTM.nodes.elementAt(j);
if (node != null) {
ds.removePrimitive(node);
node.setDeleted(true);
}
if (undoMapNode != null) {
undoMapNode.setDeleted(false);
ds.addPrimitive(undoMapNode);
}
if (undoTableNode != null) {
undoTableNode.setDeleted(false);
ds.addPrimitive(undoTableNode);
}
gtfsStopTM.nodes.set(j, undoTableNode);
gtfsStopTM.setValueAt(type, j, 2);
}
@Override
public void fillModifiedData(Collection<OsmPrimitive> modified,
Collection<OsmPrimitive> deleted, Collection<OsmPrimitive> added) {
// Do nothing
}
}