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}