// License: GPL. For details, see LICENSE file. package public_transport; import static org.openstreetmap.josm.tools.I18n.tr; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.Vector; import org.openstreetmap.josm.command.Command; import org.openstreetmap.josm.data.osm.Node; import org.openstreetmap.josm.data.osm.OsmPrimitive; public class TrackStoplistSortCommand extends Command { private TrackStoplistTableModel stoplistTM = null; private Vector<Vector<Object>> tableDataModel = null; private Vector<Node> nodes = null; private Vector<String> times = null; private Vector<Integer> workingLines = null; private int insPos; private String stopwatchStart; public TrackStoplistSortCommand(StopImporterAction controller) { stoplistTM = controller.getCurrentTrack().stoplistTM; workingLines = new Vector<>(); insPos = controller.getDialog().getStoplistTable().getSelectedRow(); stopwatchStart = controller.getCurrentTrack().stopwatchStart; // use either selected lines or all lines if no line is selected int[] selectedLines = controller.getDialog().getStoplistTable().getSelectedRows(); if (selectedLines.length > 0) { for (int i = 0; i < selectedLines.length; ++i) { workingLines.add(selectedLines[i]); } } else { for (int i = 0; i < stoplistTM.getRowCount(); ++i) { workingLines.add(Integer.valueOf(i)); } } } @Override @SuppressWarnings("unchecked") public boolean executeCommand() { tableDataModel = (Vector<Vector<Object>>) stoplistTM.getDataVector().clone(); nodes = (Vector<Node>) stoplistTM.getNodes().clone(); times = (Vector<String>) stoplistTM.getTimes().clone(); Vector<NodeSortEntry> nodesToSort = new Vector<>(); for (int i = workingLines.size() - 1; i >= 0; --i) { int j = workingLines.elementAt(i).intValue(); nodesToSort.add(new NodeSortEntry(stoplistTM.nodeAt(j), (String) stoplistTM.getValueAt(j, 0), (String) stoplistTM.getValueAt(j, 1), (TransText) stoplistTM.getValueAt(j, 2), StopImporterDialog.parseTime(stopwatchStart))); stoplistTM.removeRow(j); } Collections.sort(nodesToSort); int insPos = this.insPos; Iterator<NodeSortEntry> iter = nodesToSort.iterator(); while (iter.hasNext()) { NodeSortEntry nse = iter.next(); stoplistTM.insertRow(insPos, nse.node, nse.time, nse.name, nse.shelter); if (insPos >= 0) ++insPos; } return true; } @Override public void undoCommand() { stoplistTM.setDataVector(tableDataModel); stoplistTM.setNodes(nodes); stoplistTM.setTimes(times); } @Override public void fillModifiedData(Collection<OsmPrimitive> modified, Collection<OsmPrimitive> deleted, Collection<OsmPrimitive> added) { } @Override public String getDescriptionText() { return tr("Public Transport: sort track stop list"); } private static class NodeSortEntry implements Comparable<NodeSortEntry> { public Node node = null; public String time = null; public String name = null; public TransText shelter = null; public double startTime = 0; NodeSortEntry(Node node, String time, String name, TransText shelter, double startTime) { this.node = node; this.time = time; this.name = name; this.shelter = shelter; } @Override public int compareTo(NodeSortEntry nse) { double time = StopImporterDialog.parseTime(this.time); if (time - startTime > 12 * 60 * 60) time -= 24 * 60 * 60; double nseTime = StopImporterDialog.parseTime(nse.time); if (nseTime - startTime > 12 * 60 * 60) nseTime -= 24 * 60 * 60; if (time < nseTime) return -1; else if (time > nseTime) return 1; else return 0; } } }