// License: GPL. See LICENSE file for details. Copyright 2012 by Josh Doe and others.
package org.openstreetmap.josm.plugins.conflation;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.actions.JosmAction;
import org.openstreetmap.josm.data.osm.*;
import org.openstreetmap.josm.gui.ExtendedDialog;
import org.openstreetmap.josm.gui.layer.OsmDataLayer;
import static org.openstreetmap.josm.tools.I18n.tr;
/**
* Dialog for selecting objects and configuring conflation settings
*/
public class SettingsDialog extends ExtendedDialog {
private JButton freezeReferenceButton;
private JButton freezeSubjectButton;
private JPanel jPanel3;
private JPanel jPanel5;
private JButton restoreReferenceButton;
private JButton restoreSubjectButton;
private JLabel referenceLayerLabel;
private JPanel referencePanel;
private JLabel referenceSelectionLabel;
private JLabel subjectLayerLabel;
private JPanel subjectPanel;
private JLabel subjectSelectionLabel;
private MatchFinderPanel matchFinderPanel;
List<OsmPrimitive> subjectSelection = null;
List<OsmPrimitive> referenceSelection = null;
OsmDataLayer referenceLayer;
DataSet subjectDataSet;
OsmDataLayer subjectLayer;
DataSet referenceDataSet;
public SettingsDialog() {
super(Main.parent,
tr("Configure conflation settings"),
new String[]{tr("Generate matches"), tr("Cancel")},
false);
referenceSelection = new ArrayList<OsmPrimitive>();
subjectSelection = new ArrayList<OsmPrimitive>();
initComponents();
}
/**
* Build GUI components
*/
private void initComponents() {
referencePanel = new JPanel();
referenceLayerLabel = new JLabel();
referenceSelectionLabel = new JLabel();
jPanel3 = new JPanel();
restoreReferenceButton = new JButton(new RestoreReferenceAction());
freezeReferenceButton = new JButton(new FreezeReferenceAction());
subjectPanel = new JPanel();
subjectLayerLabel = new JLabel();
subjectSelectionLabel = new JLabel();
jPanel5 = new JPanel();
restoreSubjectButton = new JButton(new RestoreSubjectAction());
freezeSubjectButton = new JButton(new FreezeSubjectAction());
JPanel pnl = new JPanel();
pnl.setLayout(new BoxLayout(pnl, BoxLayout.PAGE_AXIS));
referencePanel.setBorder(BorderFactory.createTitledBorder(tr("Reference")));
referencePanel.setLayout(new BoxLayout(referencePanel, BoxLayout.PAGE_AXIS));
referenceLayerLabel.setText("(none)");
referencePanel.add(referenceLayerLabel);
referenceSelectionLabel.setText("Rel.:0 / Ways:0 / Nodes: 0");
referencePanel.add(referenceSelectionLabel);
jPanel3.setLayout(new BoxLayout(jPanel3, BoxLayout.LINE_AXIS));
restoreReferenceButton.setText(tr("Restore"));
jPanel3.add(restoreReferenceButton);
jPanel3.add(freezeReferenceButton);
referencePanel.add(jPanel3);
pnl.add(referencePanel);
subjectPanel.setBorder(BorderFactory.createTitledBorder(tr("Subject")));
subjectPanel.setLayout(new BoxLayout(subjectPanel, BoxLayout.PAGE_AXIS));
subjectLayerLabel.setText("(none)");
subjectPanel.add(subjectLayerLabel);
subjectSelectionLabel.setText("Rel.:0 / Ways:0 / Nodes: 0");
subjectPanel.add(subjectSelectionLabel);
jPanel5.setLayout(new BoxLayout(jPanel5, BoxLayout.LINE_AXIS));
restoreSubjectButton.setText(tr("Restore"));
jPanel5.add(restoreSubjectButton);
freezeSubjectButton.setText(tr("Freeze"));
jPanel5.add(freezeSubjectButton);
subjectPanel.add(jPanel5);
pnl.add(subjectPanel);
matchFinderPanel = new MatchFinderPanel();
pnl.add(matchFinderPanel);
setContent(pnl);
setupDialog();
}
/**
* Matches are actually generated in windowClosed event in ConflationToggleDialog
*
* @param buttonIndex
* @param evt
*/
@Override
protected void buttonAction(int buttonIndex, ActionEvent evt) {
// "Generate matches" as clicked
if (buttonIndex == 0) {
if (referenceSelection.isEmpty() || subjectSelection.isEmpty()) {
JOptionPane.showMessageDialog(Main.parent, tr("Selections must be made for both reference and subject."), tr("Incomplete selections"), JOptionPane.ERROR_MESSAGE);
return;
}
}
super.buttonAction(buttonIndex, evt);
}
/**
* @return the settings
*/
public SimpleMatchSettings getSettings() {
SimpleMatchSettings settings = new SimpleMatchSettings();
settings.setReferenceDataSet(referenceDataSet);
settings.setReferenceLayer(referenceLayer);
settings.setReferenceSelection(referenceSelection);
settings.setSubjectDataSet(subjectDataSet);
settings.setSubjectLayer(subjectLayer);
settings.setSubjectSelection(subjectSelection);
settings.setMatchFinder(matchFinderPanel.getMatchFinder());
return settings;
}
// /**
// * @param settings the settings to set
// */
// public void setSettings(SimpleMatchSettings settings) {
// referenceDataSet = settings.getReferenceDataSet();
// referenceLayer = settings.getReferenceLayer();
// referenceSelection = settings.getReferenceSelection();
// subjectDataSet = settings.getSubjectDataSet();
// subjectLayer = settings.getSubjectLayer();
// subjectSelection = settings.getSubjectSelection();
// update();
// //matchFinderPanel.matchFinder = settings.getMatchFinder();
// }
class RestoreSubjectAction extends JosmAction {
public RestoreSubjectAction() {
super(tr("Restore"), null, tr("Restore subject selection"), null, false);
}
@Override
public void actionPerformed(ActionEvent e) {
if (subjectLayer != null && subjectDataSet != null && subjectSelection != null && !subjectSelection.isEmpty()) {
Main.map.mapView.setActiveLayer(subjectLayer);
subjectLayer.setVisible(true);
subjectDataSet.setSelected(subjectSelection);
}
}
}
class RestoreReferenceAction extends JosmAction {
public RestoreReferenceAction() {
super(tr("Restore"), null, tr("Restore reference selection"), null, false);
}
@Override
public void actionPerformed(ActionEvent e) {
if (referenceLayer != null && referenceDataSet != null && referenceSelection != null && !referenceSelection.isEmpty()) {
Main.map.mapView.setActiveLayer(referenceLayer);
referenceLayer.setVisible(true);
referenceDataSet.setSelected(referenceSelection);
}
}
}
class FreezeSubjectAction extends JosmAction {
public FreezeSubjectAction() {
super(tr("Freeze"), null, tr("Freeze subject selection"), null, false);
}
@Override
public void actionPerformed(ActionEvent e) {
if (subjectDataSet != null && subjectDataSet == Main.main.getCurrentDataSet()) {
// subjectDataSet.removeDataSetListener(this); FIXME:
// subjectDataSet.removeDataSetListener(this); FIXME:
}
subjectDataSet = Main.main.getCurrentDataSet();
// subjectDataSet.addDataSetListener(tableModel); FIXME:
// subjectDataSet.addDataSetListener(tableModel); FIXME:
subjectLayer = Main.main.getEditLayer();
if (subjectDataSet == null || subjectLayer == null) {
JOptionPane.showMessageDialog(Main.parent, tr("No valid OSM data layer present."), tr("Error freezing selection"), JOptionPane.ERROR_MESSAGE);
return;
}
subjectSelection.clear();
subjectSelection.addAll(subjectDataSet.getSelected());
if (subjectSelection.isEmpty()) {
JOptionPane.showMessageDialog(Main.parent, tr("Nothing is selected, please try again."), tr("Empty selection"), JOptionPane.ERROR_MESSAGE);
return;
}
update();
}
}
class FreezeReferenceAction extends JosmAction {
public FreezeReferenceAction() {
super(tr("Freeze"), null, tr("Freeze subject selection"), null, false);
}
@Override
public void actionPerformed(ActionEvent e) {
if (referenceDataSet != null && referenceDataSet == Main.main.getCurrentDataSet()) {
// referenceDataSet.removeDataSetListener(this); FIXME:
// referenceDataSet.removeDataSetListener(this); FIXME:
}
referenceDataSet = Main.main.getCurrentDataSet();
// referenceDataSet.addDataSetListener(this); FIXME:
// referenceDataSet.addDataSetListener(this); FIXME:
referenceLayer = Main.main.getEditLayer();
if (referenceDataSet == null || referenceLayer == null) {
JOptionPane.showMessageDialog(Main.parent, tr("No valid OSM data layer present."), tr("Error freezing selection"), JOptionPane.ERROR_MESSAGE);
return;
}
referenceSelection.clear();
referenceSelection.addAll(referenceDataSet.getSelected());
if (referenceSelection.isEmpty()) {
JOptionPane.showMessageDialog(Main.parent, tr("Nothing is selected, please try again."), tr("Empty selection"), JOptionPane.ERROR_MESSAGE);
return;
}
update();
}
}
/**
* Update GUI elements
*/
void update() {
int numNodes = 0;
int numWays = 0;
int numRelations = 0;
if (!subjectSelection.isEmpty()) {
for (OsmPrimitive p : subjectSelection) {
if (p instanceof Node) {
numNodes++;
} else if (p instanceof Way) {
numWays++;
} else if (p instanceof Relation) {
numRelations++;
}
}
// FIXME: translate correctly
subjectLayerLabel.setText(subjectLayer.getName());
subjectSelectionLabel.setText(String.format("Rel.: %d / Ways: %d / Nodes: %d", numRelations, numWays, numNodes));
}
numNodes = 0;
numWays = 0;
numRelations = 0;
if (!referenceSelection.isEmpty()) {
for (OsmPrimitive p : referenceSelection) {
if (p instanceof Node) {
numNodes++;
} else if (p instanceof Way) {
numWays++;
} else if (p instanceof Relation) {
numRelations++;
}
}
// FIXME: translate correctly
referenceLayerLabel.setText(referenceLayer.getName());
referenceSelectionLabel.setText(String.format("Rel.: %d / Ways: %d / Nodes: %d", numRelations, numWays, numNodes));
}
//FIXME: properly update match finder settings
}
}