001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.dialogs.relation.actions;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import java.awt.GraphicsEnvironment;
007import java.awt.event.ActionEvent;
008
009import org.openstreetmap.josm.data.osm.Relation;
010import org.openstreetmap.josm.gui.dialogs.relation.MemberTableModel;
011import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
012import org.openstreetmap.josm.gui.layer.OsmDataLayer;
013import org.openstreetmap.josm.gui.tagging.TagEditorModel;
014import org.openstreetmap.josm.tools.ImageProvider;
015
016/**
017 * Creates a new relation with a copy of the current editor state.
018 * @since 9496
019 */
020public class DuplicateRelationAction extends AbstractRelationEditorAction {
021
022    private final transient TagEditorModel tagEditorModel;
023
024    /**
025     * Constructs a new {@code DuplicateRelationAction}.
026     * @param memberTableModel member table model
027     * @param tagEditorModel tag editor model
028     * @param layer OSM data layer
029     */
030    public DuplicateRelationAction(MemberTableModel memberTableModel, TagEditorModel tagEditorModel, OsmDataLayer layer) {
031        super(null, memberTableModel, null, layer, null);
032        this.tagEditorModel = tagEditorModel;
033        putValue(SHORT_DESCRIPTION, tr("Create a copy of this relation and open it in another editor window"));
034        // FIXME provide an icon
035        new ImageProvider("duplicate").getResource().attachImageIcon(this, true);
036        putValue(NAME, tr("Duplicate"));
037        setEnabled(true);
038    }
039
040    @Override
041    public void actionPerformed(ActionEvent e) {
042        Relation copy = new Relation();
043        tagEditorModel.applyToPrimitive(copy);
044        memberTableModel.applyToRelation(copy);
045        if (!GraphicsEnvironment.isHeadless()) {
046            RelationEditor.getEditor(layer, copy, memberTableModel.getSelectedMembers()).setVisible(true);
047        }
048    }
049
050    @Override
051    protected void updateEnabledState() {
052        // Do nothing
053    }
054}