// License: GPL. For details, see LICENSE file. package relcontext.actions; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.Dialog.ModalityType; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.util.Arrays; import java.util.Collection; import java.util.List; import javax.swing.Box; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.actions.JosmAction; import org.openstreetmap.josm.command.AddCommand; import org.openstreetmap.josm.data.osm.OsmPrimitive; import org.openstreetmap.josm.data.osm.Relation; import org.openstreetmap.josm.data.osm.RelationMember; import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingComboBox; import org.openstreetmap.josm.tools.GBC; import org.openstreetmap.josm.tools.Shortcut; import relcontext.ChosenRelation; /** * Simple create relation with no tags and all selected objects in it with no roles. * Choose relation afterwards. * * @author Zverik */ public class CreateRelationAction extends JosmAction { private static final String PREF_LASTTYPE = "reltoolbox.createrelation.lasttype"; protected ChosenRelation chRel; public CreateRelationAction(ChosenRelation chRel) { super(tr("New"), "data/relation", tr("Create a relation from selected objects"), Shortcut.registerShortcut("reltoolbox:create", tr("Relation Toolbox: {0}", tr("Create a new relation")), KeyEvent.VK_N, Shortcut.ALT_CTRL), false); this.chRel = chRel; updateEnabledState(); } public CreateRelationAction() { this(null); } @Override public void actionPerformed(ActionEvent e) { String type = askForType(); if (type == null) return; Relation rel = new Relation(); if (type.length() > 0) { rel.put("type", type); } for (OsmPrimitive selected : getLayerManager().getEditDataSet().getSelected()) { rel.addMember(new RelationMember("", selected)); } Main.main.undoRedo.add(new AddCommand(rel)); if (chRel != null) { chRel.set(rel); } } @Override protected void updateEnabledState() { if (getLayerManager().getEditDataSet() == null) { setEnabled(false); } else { updateEnabledState(getLayerManager().getEditDataSet().getSelected()); } } @Override protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) { setEnabled(selection != null && !selection.isEmpty()); } // Thanks to TagInfo for the list private static final List<String> RELATION_TYPES = Arrays.asList(new String[] { "multipolygon", "boundary", "route", "site", "restriction", "associatedStreet", "public_transport", "street", "collection", "address", "enforcement", "destination_sign", "route_master", "junction", "waterway", "bridge", "tunnel", "surveillance" }); private String askForType() { JPanel panel = new JPanel(new GridBagLayout()); panel.add(new JLabel(tr("Choose a type for the relation:")), GBC.eol().insets(0, 0, 0, 5)); final AutoCompletingComboBox keys = new AutoCompletingComboBox(); keys.setPossibleItems(RELATION_TYPES); keys.setEditable(true); keys.getEditor().setItem(Main.pref.get(PREF_LASTTYPE, "multipolygon")); panel.add(new JLabel(tr("Type")), GBC.std()); panel.add(Box.createHorizontalStrut(10), GBC.std()); panel.add(keys, GBC.eol().fill(GBC.HORIZONTAL)); final JOptionPane optionPane = new JOptionPane(panel, JOptionPane.QUESTION_MESSAGE, JOptionPane.OK_CANCEL_OPTION) { @Override public void selectInitialValue() { keys.requestFocusInWindow(); keys.getEditor().selectAll(); } }; final JDialog dlg = optionPane.createDialog(Main.parent, tr("Create a new relation")); dlg.setModalityType(ModalityType.DOCUMENT_MODAL); keys.getEditor().addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { dlg.setVisible(false); optionPane.setValue(JOptionPane.OK_OPTION); } }); dlg.setVisible(true); Object answer = optionPane.getValue(); if (answer == null || answer == JOptionPane.UNINITIALIZED_VALUE || (answer instanceof Integer && (Integer) answer != JOptionPane.OK_OPTION)) return null; String result = keys.getEditor().getItem().toString().trim(); Main.pref.put(PREF_LASTTYPE, result); return result; } }