package org.openstreetmap.josm.plugins.taggingpresettester;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.data.coor.LatLon;
import org.openstreetmap.josm.data.osm.DataSet;
import org.openstreetmap.josm.data.osm.Node;
import org.openstreetmap.josm.data.osm.OsmPrimitive;
import org.openstreetmap.josm.data.osm.Relation;
import org.openstreetmap.josm.data.osm.Way;
import org.openstreetmap.josm.gui.tagging.presets.TaggingPreset;
import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetReader;
import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetSelector;
import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetType;
import org.openstreetmap.josm.tools.GBC;
/**
* The tagging presets tester window
*/
public class TaggingPresetTester extends JFrame {
private TaggingPresetSelector taggingPresets;
private final String[] args;
private JPanel taggingPresetPanel = new JPanel(new BorderLayout());
private JPanel panel = new JPanel(new GridBagLayout());
public final void reload() {
taggingPresets.init(TaggingPresetReader.readAll(Arrays.asList(args), true));
}
public final void reselect() {
taggingPresetPanel.removeAll();
TaggingPreset preset = taggingPresets.getSelectedPreset();
if (preset == null)
return;
Collection<OsmPrimitive> x;
DataSet ds = Main.getLayerManager().getEditDataSet();
if (ds != null) {
x = ds.getSelected();
} else {
x = makeFakeSuitablePrimitive(preset);
}
JPanel p = preset.createPanel(x);
if (p != null) {
p.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
taggingPresetPanel.add(p, BorderLayout.NORTH);
}
panel.validate();
panel.repaint();
}
public TaggingPresetTester(String[] args) {
super(tr("Tagging Preset Tester"));
this.args = args;
taggingPresets = new TaggingPresetSelector(true, true);
taggingPresets.setMinimumSize(new Dimension(150,250));
taggingPresets.setPreferredSize(new Dimension(300,500));
taggingPresetPanel.setMinimumSize(new Dimension(150,250));
taggingPresetPanel.setPreferredSize(new Dimension(300,500));
reload();
panel.add(taggingPresets, GBC.std(0,0).fill(GBC.BOTH).weight(0.5, 1.0));
panel.add(taggingPresetPanel, GBC.std(1,0).fill(GBC.BOTH).weight(0.5, 1.0));
taggingPresets.addSelectionListener(new ListSelectionListener(){
@Override
public void valueChanged(ListSelectionEvent e) {
if (!e.getValueIsAdjusting() && taggingPresets.getSelectedPreset() != null) {
reselect();
}
}
});
reselect();
JButton b = new JButton(tr("Reload"));
b.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
TaggingPreset p = taggingPresets.getSelectedPreset();
reload();
if (p!=null)taggingPresets.setSelectedPreset(p);
}
});
panel.add(b, GBC.std(0,1).span(2,1).fill(GBC.HORIZONTAL));
setContentPane(panel);
setMinimumSize(new Dimension(400,300));
setSize(600,500);
}
public static void main(String[] args) {
if (args.length == 0) {
JFileChooser c = new JFileChooser();
if (c.showOpenDialog(null) != JFileChooser.APPROVE_OPTION)
return;
args = new String[]{c.getSelectedFile().getPath()};
}
if (args!=null) {
Main.determinePlatformHook();
System.out.println("Opening file "+args[0]);
JFrame f = new TaggingPresetTester(args);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
private Collection<OsmPrimitive> makeFakeSuitablePrimitive(TaggingPreset preset) {
if (preset.typeMatches(Collections.singleton(TaggingPresetType.NODE))) {
return Collections.<OsmPrimitive>singleton(new Node());
} else if (preset.typeMatches(Collections.singleton(TaggingPresetType.WAY))) {
return Collections.<OsmPrimitive>singleton(new Way());
} else if (preset.typeMatches(Collections.singleton(TaggingPresetType.RELATION))) {
return Collections.<OsmPrimitive>singleton(new Relation());
} else if (preset.typeMatches(Collections.singleton(TaggingPresetType.CLOSEDWAY))) {
Way w = new Way();
w.addNode(new Node(new LatLon(0,0)));
w.addNode(new Node(new LatLon(0,1)));
w.addNode(new Node(new LatLon(1,1)));
w.addNode(new Node(new LatLon(0,0)));
return Collections.<OsmPrimitive>singleton(w);
} else {
return Collections.emptySet();
}
}
}