Ticket #12409: EditLastRelation.patch

File EditLastRelation.patch, 8.4 KB (added by kolesar, 8 years ago)
  • new file src/org/openstreetmap/josm/actions/relation/EditLastRelationAction.java

    diff --git a/src/org/openstreetmap/josm/actions/relation/EditLastRelationAction.java b/src/org/openstreetmap/josm/actions/relation/EditLastRelationAction.java
    new file mode 100644
    index 0000000..f959437
    - +  
     1// License: GPL. For details, see LICENSE file.
     2package org.openstreetmap.josm.actions.relation;
     3
     4import static org.openstreetmap.josm.tools.I18n.tr;
     5import static org.openstreetmap.josm.tools.I18n.trn;
     6
     7import java.awt.event.ActionEvent;
     8import java.awt.event.KeyEvent;
     9import java.util.Collection;
     10import java.util.HashSet;
     11import java.util.Set;
     12
     13import javax.swing.JOptionPane;
     14
     15import org.openstreetmap.josm.Main;
     16import org.openstreetmap.josm.actions.JosmAction;
     17import org.openstreetmap.josm.data.osm.OsmPrimitive;
     18import org.openstreetmap.josm.data.osm.Relation;
     19import org.openstreetmap.josm.data.osm.RelationMember;
     20import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
     21import org.openstreetmap.josm.gui.layer.Layer;
     22import org.openstreetmap.josm.gui.layer.OsmDataLayer;
     23import org.openstreetmap.josm.gui.layer.OsmDataLayer.CommandQueueListener;
     24import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
     25import org.openstreetmap.josm.tools.Shortcut;
     26
     27/**
     28 * The action for editing the last relation.
     29 */
     30public class EditLastRelationAction extends JosmAction implements CommandQueueListener {
     31
     32    /**
     33     * Constructs a new <code>EditLastRelationAction</code>.
     34     */
     35    public EditLastRelationAction() {
     36        super(
     37            tr("Open last relation"),
     38            "dialogs/edit-last",
     39            tr("Call relation editor for last relation"),
     40            Shortcut.registerShortcut(
     41                "relationeditor:editlastrelation",
     42                tr("Relation Editor: {0}", tr("Open last relation")),
     43                KeyEvent.CHAR_UNDEFINED,
     44                Shortcut.NONE
     45                ),
     46            false
     47        );
     48        Main.main.undoRedo.addCommandQueueListener(this);
     49    }
     50
     51    /**
     52     * Returns the set of currently selected relation members for the given relation.
     53     * @param r The relation to inspect
     54     * @return The set of currently selected relation members for the given relation.
     55     */
     56    public static Set<RelationMember> getMembersForCurrentSelection(Relation r) {
     57        Set<RelationMember> members = new HashSet<>();
     58        if (Main.isDisplayingMapView()) {
     59            OsmDataLayer editLayer = Main.main.getEditLayer();
     60            if (editLayer != null && editLayer.data != null) {
     61                Collection<OsmPrimitive> selection = editLayer.data.getSelected();
     62                for (RelationMember member: r.getMembers()) {
     63                    if (selection.contains(member.getMember())) {
     64                        members.add(member);
     65                    }
     66                }
     67            }
     68        }
     69        return members;
     70    }
     71
     72    /**
     73     * Launches relation editor for the given relation.
     74     * @param toEdit The relation to edit
     75     */
     76    public static void launchEditor(Relation toEdit) {
     77        if (toEdit == null || toEdit.isDeleted() || !Main.isDisplayingMapView()) return;
     78        RelationEditor.getEditor(Main.main.getEditLayer(), toEdit,
     79                getMembersForCurrentSelection(toEdit)).setVisible(true);
     80    }
     81
     82    @Override
     83    public void actionPerformed(ActionEvent e) {
     84        Relation r = getLastRelationOnActiveLayer();
     85        if (r == null || !isEnabled()) return;
     86        launchEditor(r);
     87    }
     88
     89    @Override
     90    public void updateEnabledState() {
     91        Relation r = getLastRelationOnActiveLayer();
     92        setEnabled(r != null && !r.isDeleted());
     93    }
     94
     95    private Relation getLastRelationOnActiveLayer() {
     96        if (Main.map == null || Main.map.mapView == null) return null;
     97        Layer activeLayer = Main.map.mapView.getActiveLayer();
     98        if (!(activeLayer instanceof OsmDataLayer)) {
     99            return null;
     100        } else {
     101            return ((OsmDataLayer) activeLayer).getLastRelation();
     102        }
     103    }
     104
     105    @Override
     106    public void commandChanged(int queueSize, int redoSize) {
     107        updateEnabledState();
     108    }
     109}
  • src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java

    diff --git a/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java b/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java
    index 53cb4da..a9aab41 100644
    a b import org.openstreetmap.josm.actions.relation.DeleteRelationsAction;  
    4040import org.openstreetmap.josm.actions.relation.DownloadMembersAction;
    4141import org.openstreetmap.josm.actions.relation.DownloadSelectedIncompleteMembersAction;
    4242import org.openstreetmap.josm.actions.relation.DuplicateRelationAction;
     43import org.openstreetmap.josm.actions.relation.EditLastRelationAction;
    4344import org.openstreetmap.josm.actions.relation.EditRelationAction;
    4445import org.openstreetmap.josm.actions.relation.SelectMembersAction;
    4546import org.openstreetmap.josm.actions.relation.SelectRelationAction;
    public class RelationListDialog extends ToggleDialog  
    105106    // Actions
    106107    /** the edit action */
    107108    private final EditRelationAction editAction = new EditRelationAction();
     109    private final EditLastRelationAction editLastAction = new EditLastRelationAction();
    108110    /** the delete action */
    109111    private final DeleteRelationsAction deleteRelationsAction = new DeleteRelationsAction();
    110112    /** the duplicate action */
    public class RelationListDialog extends ToggleDialog  
    171173        createLayout(pane, false, Arrays.asList(new SideButton[]{
    172174                new SideButton(newAction, false),
    173175                new SideButton(editAction, false),
     176                new SideButton(editLastAction, false),
    174177                new SideButton(duplicateAction, false),
    175178                new SideButton(deleteRelationsAction, false),
    176179                new SideButton(selectRelationAction, false)
    public class RelationListDialog extends ToggleDialog  
    212215        MapView.addLayerChangeListener(newAction);
    213216        MapView.addZoomChangeListener(this);
    214217        newAction.updateEnabledState();
     218        editLastAction.updateEnabledState();
    215219        DatasetEventManager.getInstance().addDatasetListener(this, FireMode.IN_EDT);
    216220        DataSet.addSelectionListener(addSelectionToRelations);
    217221        dataChanged(null);
    public class RelationListDialog extends ToggleDialog  
    288292        }
    289293    }
    290294
     295    public void updateEnabledStateEditLastAction() {
     296        editLastAction.updateEnabledState();
     297    }
     298
    291299    private JosmTextField  setupFilter() {
    292300        final JosmTextField f = new DisableShortcutsOnFocusGainedTextField();
    293301        f.setToolTipText(tr("Relation list filter"));
  • src/org/openstreetmap/josm/gui/dialogs/relation/RelationEditor.java

    diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/RelationEditor.java b/src/org/openstreetmap/josm/gui/dialogs/relation/RelationEditor.java
    index 8c04d22..13db6cb 100644
    a b public abstract class RelationEditor extends ExtendedDialog implements RelationA  
    189189    public final void removePropertyChangeListener(PropertyChangeListener listener) {
    190190        this.support.removePropertyChangeListener(listener);
    191191    }
     192
     193    @Override
     194    public void dispose() {
     195        layer.setLastRelation(relation);
     196        super.dispose();
     197    }
    192198}
  • src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java

    diff --git a/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java b/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
    index 7a22bdc..a51e83b 100644
    a b public class OsmDataLayer extends AbstractModifiableLayer implements Listener, S  
    121121     */
    122122    public final List<TestError> validationErrors = new ArrayList<>();
    123123
     124    /** last closed relation */
     125    private Relation lastRelation;
     126
     127    /**
     128     * Returns the last closed relation or null if none.
     129     */
     130    public Relation getLastRelation() {
     131        return lastRelation;
     132    }
     133
     134    public void setLastRelation(Relation relation) {
     135        lastRelation = relation;
     136        Main.map.relationListDialog.updateEnabledStateEditLastAction();
     137    }
     138
    124139    protected void setRequiresSaveToFile(boolean newValue) {
    125140        boolean oldValue = requiresSaveToFile;
    126141        requiresSaveToFile = newValue;