// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.JunctionChecker;
import static org.openstreetmap.josm.tools.I18n.marktr;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.util.Arrays;
import java.util.Collection;
import javax.swing.AbstractAction;
import javax.swing.BoxLayout;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import javax.swing.border.TitledBorder;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.data.SelectionChangedListener;
import org.openstreetmap.josm.data.osm.OsmPrimitive;
import org.openstreetmap.josm.gui.SideButton;
import org.openstreetmap.josm.gui.dialogs.ToggleDialog;
import org.openstreetmap.josm.gui.util.GuiHelper;
import org.openstreetmap.josm.tools.ImageProvider;
import org.openstreetmap.josm.tools.Shortcut;
/**
* @author joerg
*/
public class JunctionCheckDialog extends ToggleDialog implements SelectionChangedListener {
private final JunctionCheckerPlugin plugin;
/** Serializable ID */
private static final long serialVersionUID = 2952292777351992696L;
private final SideButton checkJunctionButton;
private final SideButton createDigraphButton;
private final SideButton searchJunctionButton;
private final JCheckBox digraphsealcb;
private final JCheckBox produceRelation;
private final JCheckBox sccCB;
private final JSpinner nways;
private final SpinnerNumberModel smodel;
private final JLabel nwayslabel;
public JunctionCheckDialog(JunctionCheckerPlugin junctionCheckerGuiPlugin) {
super(tr("JunctionChecking"), "junctionchecker", tr("Open the junctionchecking window."),
Shortcut.registerShortcut("subwindow:junctionchecker", tr("Toggle: {0}", tr("junctions")),
KeyEvent.VK_J, Shortcut.ALT_SHIFT), 150);
plugin = junctionCheckerGuiPlugin;
//das Digraph Create Panel
JPanel digraphPanel = new JPanel(new GridLayout(1, 2));
digraphPanel.setBorder(new TitledBorder(tr("Channel-Digraph creation")));
digraphsealcb = new JCheckBox(tr("seal Channel Digraph"));
digraphsealcb.setSelected(false);
//digraphPanel.add(digraphsealcb);
sccCB = new JCheckBox(tr("calculate strong connected channels"));
sccCB.setSelected(true);
digraphPanel.add(sccCB);
//das Panel zum Junctionchecken
JPanel jcPanel = new JPanel(new GridLayout(4, 1));
jcPanel.setBorder(new TitledBorder(tr("Junctionchecking/junctions searching")));
//Elemente für Grad-Auswahl der Kreuzung
JPanel spinnerpanel = new JPanel(new GridLayout(1, 2));
smodel = new SpinnerNumberModel(3, 1, 20, 1);
nways = new JSpinner(smodel);
nwayslabel = new JLabel(tr("order of junction (n):"));
nwayslabel.setEnabled(false);
spinnerpanel.add(nwayslabel);
spinnerpanel.add(nways);
//Elemente zur OSM-Relationen-Erzeugung
produceRelation = new JCheckBox(tr("produce OSM-Relations: junction"));
produceRelation.setToolTipText(tr("if enabled the plugin produces osm-relations from the junction subgraphs"));
produceRelation.setSelected(true);
produceRelation.setEnabled(false);
jcPanel.add(produceRelation);
jcPanel.add(spinnerpanel);
JPanel centerPanel = new JPanel();
centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.Y_AXIS));
centerPanel.add(digraphPanel);
centerPanel.add(jcPanel);
// ButtonPanel
createDigraphButton = new SideButton(new AbstractAction() {
{
putValue(NAME, marktr("Create"));
putValue(SHORT_DESCRIPTION, tr("create the channel digraph"));
putValue(SMALL_ICON, ImageProvider.get("dialogs", "digraphcreation"));
}
@Override
public void actionPerformed(ActionEvent e) {
DigraphCreationTask dct = new DigraphCreationTask(plugin, digraphsealcb.isSelected(), sccCB.isSelected());
Main.worker.submit(dct);
setActivateJunctionCheckOrSearch(true);
}
});
checkJunctionButton = new SideButton(new AbstractAction() {
{
putValue(NAME, marktr("Check "));
putValue(SHORT_DESCRIPTION, tr("check the subset for junction properties"));
putValue(SMALL_ICON, ImageProvider.get("dialogs", "junctioncheck"));
}
@Override
public void actionPerformed(ActionEvent e) {
PrepareJunctionCheckorSearch pjc = new PrepareJunctionCheckorSearch(plugin, smodel.getNumber().intValue(), produceRelation.isSelected());
pjc.prepareJunctionCheck();
}
});
checkJunctionButton.setEnabled(false);
searchJunctionButton = new SideButton(new AbstractAction() {
{
putValue(NAME, marktr("Search "));
putValue(SHORT_DESCRIPTION, tr("search for junctions in the channel subset"));
putValue(SMALL_ICON, ImageProvider.get("dialogs", "junctionsearch"));
}
@Override
public void actionPerformed(ActionEvent e) {
PrepareJunctionCheckorSearch pjc = new PrepareJunctionCheckorSearch(plugin, smodel.getNumber().intValue(), produceRelation.isSelected());
pjc.prepareJunctionSearch();
}
});
searchJunctionButton.setEnabled(false);
createLayout(centerPanel, false, Arrays.asList(new SideButton[] {
createDigraphButton, checkJunctionButton, searchJunctionButton
}));
}
/**
* (de)aktiviert Buttons zum JunctionCheck oder Suche
*/
public void setActivateJunctionCheckOrSearch(boolean activate) {
checkJunctionButton.setEnabled(activate);
nways.setEnabled(activate);
nwayslabel.setEnabled(activate);
produceRelation.setEnabled(activate);
searchJunctionButton.setEnabled(activate);
}
/**
* (de)aktiviert Buttons zur Channel Digraph Erstellung
*/
public void setActivateCreateDigraph(final boolean activate) {
GuiHelper.runInEDTAndWait(new Runnable() {
@Override
public void run() {
createDigraphButton.setEnabled(activate);
digraphsealcb.setEnabled(activate);
sccCB.setEnabled(activate);
}
});
}
@Override
public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
}
}