001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.dialogs.properties;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import java.util.Collection;
007import java.util.List;
008
009import javax.swing.JOptionPane;
010
011import org.openstreetmap.josm.command.ChangeMembersCommand;
012import org.openstreetmap.josm.data.UndoRedoHandler;
013import org.openstreetmap.josm.data.osm.DefaultNameFormatter;
014import org.openstreetmap.josm.data.osm.Relation;
015import org.openstreetmap.josm.data.osm.RelationMember;
016import org.openstreetmap.josm.gui.MainApplication;
017import org.openstreetmap.josm.tools.Utils;
018
019/**
020 * Quickly change the relation roles of the selected members.
021 */
022final class RelationRoleEditor {
023
024    private RelationRoleEditor() {
025    }
026
027    /**
028     * Shows an {{@linkplain JOptionPane#showInputDialog input dialog} in order to quickly change
029     * the roles of the selected members.
030     * @param relation the relation to edit
031     * @param memberInfo the corresponding member info
032     */
033    static void editRole(Relation relation, PropertiesDialog.MemberInfo memberInfo) {
034        if (MainApplication.getLayerManager().getActiveDataLayer().isLocked()) {
035            return;
036        }
037        final Collection<RelationMember> members = Utils.filteredCollection(memberInfo.getRole(), RelationMember.class);
038        final String oldRole = memberInfo.getRoleString();
039        final DefaultNameFormatter formatter = DefaultNameFormatter.getInstance();
040        final String newRole = JOptionPane.showInputDialog("<html>" + tr("Change role for {0} in relation {1}",
041                formatter.formatAsHtmlUnorderedList(Utils.transform(members, RelationMember::getMember), 5),
042                formatter.formatAsHtmlUnorderedList(relation)),
043                oldRole);
044        if (newRole == null || oldRole.equals(newRole) || tr("<different>").equals(newRole)) {
045            return;
046        }
047        final List<RelationMember> newMembers = relation.getMembers();
048        newMembers.replaceAll(m -> members.contains(m) ? new RelationMember(Utils.strip(newRole), m.getMember()) : m);
049        UndoRedoHandler.getInstance().add(new ChangeMembersCommand(relation, newMembers));
050    }
051}