// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.JunctionChecker;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import javax.swing.JOptionPane;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.gui.PleaseWaitRunnable;
import org.openstreetmap.josm.io.OsmTransferException;
import org.openstreetmap.josm.plugins.JunctionChecker.datastructure.Channel;
import org.openstreetmap.josm.plugins.JunctionChecker.junctionchecking.JunctionChecker;
import org.xml.sax.SAXException;
/**
* Diese Klasse wird aufgerufen, wenn eine Teilmenge von Channels auf die Kreuzungskriterien geprüft
* wird.
* @author joerg
*/
public class JunctionCheckTask extends PleaseWaitRunnable {
private final JunctionChecker jc;
private final JunctionCheckerPlugin plugin;
private final int n; //Grad der Kreuzung
private final HashSet<Channel> subset; //Teilmge der zu prüfenden Channel
private final boolean producerelation;
private boolean canceled;
public JunctionCheckTask(JunctionCheckerPlugin plugin, int n, HashSet<Channel> subset, boolean produceRelation) {
super("JunctionCheck", false);
this.plugin = plugin;
this.n = n;
this.subset = subset;
this.producerelation = produceRelation;
jc = new JunctionChecker(plugin.getChannelDigraph(), n);
}
@Override
protected void cancel() {
canceled = true;
progressMonitor.cancel();
}
@Override
protected void finish() {
if (canceled) {
return;
}
progressMonitor.finishTask();
if (jc.isSmallerJunction()) {
showjunction();
JOptionPane.showMessageDialog(Main.parent,
tr("The marked channels contains a junctioncandidate (white). To test this candidat mark these channel and press the \"Check\" button again."));
} else if (jc.getCheck()) {
showjunction();
JOptionPane.showMessageDialog(Main.parent, tr("The marked channels are a {0}-ways junction", n));
plugin.getChannelDigraph().ereaseJunctioncandidate();
for (int i = 0; i < jc.getSubJunction().size(); i++) {
plugin.getChannelDigraph().addJunctioncandidateChannel(jc.getSubJunction().get(i));
}
if (producerelation) {
this.plugin.getRelationProducer().produceRelation(subset, n);
}
} else if (!jc.getCheck()) {
JOptionPane.showMessageDialog(Main.parent, tr("The marked channels are not a junction:") + jc.getJCheckResult());
}
}
@Override
protected void realRun() throws SAXException, IOException,
OsmTransferException {
jc.checkjunctions(new ArrayList<>(subset), getProgressMonitor());
}
public JunctionChecker getJunctionChecker() {
return jc;
}
/**
* zeigt den gefundenen Kreuzungskandidatena an
*/
private void showjunction() {
plugin.getChannelDigraph().ereaseJunctioncandidate();
for (int i = 0; i < jc.getSubJunction().size(); i++) {
plugin.getChannelDigraph().addJunctioncandidateChannel(jc.getSubJunction().get(i));
}
Main.getLayerManager().setActiveLayer(plugin.getChannelDigraphLayer());
}
}