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;
005import static org.openstreetmap.josm.tools.I18n.trn;
006
007import java.awt.event.ActionEvent;
008
009import javax.swing.JOptionPane;
010import javax.swing.event.DocumentEvent;
011import javax.swing.event.DocumentListener;
012
013import org.openstreetmap.josm.Main;
014import org.openstreetmap.josm.gui.ConditionalOptionPaneUtil;
015import org.openstreetmap.josm.gui.dialogs.relation.MemberTable;
016import org.openstreetmap.josm.gui.dialogs.relation.MemberTableModel;
017import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField;
018import org.openstreetmap.josm.tools.ImageProvider;
019
020/**
021 * Sets a role for the selected members
022 * @since 9496
023 */
024public class SetRoleAction extends AbstractRelationEditorAction implements DocumentListener {
025
026    private final transient AutoCompletingTextField tfRole;
027
028    /**
029     * Constructs a new {@code SetRoleAction}.
030     * @param memberTable member table
031     * @param memberTableModel member table model
032     * @param tfRole role text field
033     */
034    public SetRoleAction(MemberTable memberTable, MemberTableModel memberTableModel, AutoCompletingTextField tfRole) {
035        super(memberTable, memberTableModel, null);
036        this.tfRole = tfRole;
037        putValue(SHORT_DESCRIPTION, tr("Sets a role for the selected members"));
038        new ImageProvider("apply").getResource().attachImageIcon(this);
039        putValue(NAME, tr("Apply Role"));
040        updateEnabledState();
041    }
042
043    @Override
044    protected void updateEnabledState() {
045        setEnabled(memberTable.getSelectedRowCount() > 0);
046    }
047
048    protected boolean isEmptyRole() {
049        return tfRole.getText() == null || tfRole.getText().trim().isEmpty();
050    }
051
052    protected boolean confirmSettingEmptyRole(int onNumMembers) {
053        String message = "<html>"
054            + trn("You are setting an empty role on {0} object.",
055                    "You are setting an empty role on {0} objects.", onNumMembers, onNumMembers)
056                    + "<br>"
057                    + tr("This is equal to deleting the roles of these objects.") +
058                    "<br>"
059                    + tr("Do you really want to apply the new role?") + "</html>";
060        String[] options = new String[] {
061                tr("Yes, apply it"),
062                tr("No, do not apply")
063        };
064        int ret = ConditionalOptionPaneUtil.showOptionDialog(
065                "relation_editor.confirm_applying_empty_role",
066                Main.parent,
067                message,
068                tr("Confirm empty role"),
069                JOptionPane.YES_NO_OPTION,
070                JOptionPane.WARNING_MESSAGE,
071                options,
072                options[0]
073        );
074        switch(ret) {
075        case JOptionPane.YES_OPTION:
076        case ConditionalOptionPaneUtil.DIALOG_DISABLED_OPTION:
077            return true;
078        default:
079            return false;
080        }
081    }
082
083    @Override
084    public void actionPerformed(ActionEvent e) {
085        if (isEmptyRole() && !confirmSettingEmptyRole(memberTable.getSelectedRowCount())) {
086            return;
087        }
088        memberTableModel.updateRole(memberTable.getSelectedRows(), tfRole.getText());
089    }
090
091    @Override
092    public void changedUpdate(DocumentEvent e) {
093        updateEnabledState();
094    }
095
096    @Override
097    public void insertUpdate(DocumentEvent e) {
098        updateEnabledState();
099    }
100
101    @Override
102    public void removeUpdate(DocumentEvent e) {
103        updateEnabledState();
104    }
105}