Ticket #16255: 16255.patch
| File 16255.patch, 5.3 KB (added by , 7 years ago) |
|---|
-
src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
commit faee093e6f62484a9e501dfa88c27d6d676be424 Author: Simon Legner <Simon.Legner@gmail.com> Date: Tue Jan 8 19:03:16 2019 +0100 fix #16255 - Possibility to edit relation roles from the membership dialog diff --git a/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java b/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java index b84cdc0ef..5585204fc 100644a b 16 16 import java.util.ArrayList; 17 17 import java.util.Arrays; 18 18 import java.util.Collection; 19 import java.util.Collections; 19 20 import java.util.EnumSet; 20 21 import java.util.HashMap; 21 22 import java.util.HashSet; 22 23 import java.util.List; 23 24 import java.util.Map; 24 25 import java.util.Map.Entry; 25 import java.util.Optional;26 26 import java.util.Set; 27 27 import java.util.TreeMap; 28 28 import java.util.TreeSet; … … public void selectionChanged(SelectionChangeEvent event) { 631 631 for (IPrimitive ref: primitive.getReferrers(true)) { 632 632 if (ref instanceof IRelation && !ref.isIncomplete() && !ref.isDeleted()) { 633 633 IRelation<?> r = (IRelation<?>) ref; 634 MemberInfo mi = Optional.ofNullable(roles.get(r)).orElseGet(() -> new MemberInfo(newSel)); 635 roles.put(r, mi); 634 MemberInfo mi = roles.computeIfAbsent(r, ignore -> new MemberInfo(newSel)); 636 635 int i = 1; 637 636 for (IRelationMember<?> m : r.getMembers()) { 638 637 if (m.getMember() == primitive) { … … public void mouseClicked(MouseEvent e) { 892 891 } 893 892 } else if (e.getSource() == membershipTable) { 894 893 int row = membershipTable.rowAtPoint(e.getPoint()); 895 if (row > -1) { 894 int col = membershipTable.columnAtPoint(e.getPoint()); 895 if (row > -1 && col == 1) { 896 final Relation relation = (Relation) membershipData.getValueAt(row, 0); 897 final MemberInfo memberInfo = (MemberInfo) membershipData.getValueAt(row, 1); 898 RelationRoleEditor.editRole(relation, memberInfo); 899 } else if (row > -1) { 896 900 editMembership(row); 897 901 } 898 902 } else { … … String getPositionString() { 943 947 return Utils.shortenString(positionString, 20); 944 948 } 945 949 950 List<IRelationMember<?>> getRole() { 951 return Collections.unmodifiableList(role); 952 } 953 946 954 String getRoleString() { 947 955 if (roleString == null) { 948 956 for (IRelationMember<?> r : role) { -
new file src/org/openstreetmap/josm/gui/dialogs/properties/RelationRoleEditor.java
diff --git a/src/org/openstreetmap/josm/gui/dialogs/properties/RelationRoleEditor.java b/src/org/openstreetmap/josm/gui/dialogs/properties/RelationRoleEditor.java new file mode 100644 index 000000000..7f53823be
- + 1 // License: GPL. For details, see LICENSE file. 2 package org.openstreetmap.josm.gui.dialogs.properties; 3 4 import static org.openstreetmap.josm.tools.I18n.tr; 5 6 import java.util.Collection; 7 import java.util.List; 8 9 import javax.swing.JOptionPane; 10 11 import org.openstreetmap.josm.command.ChangeCommand; 12 import org.openstreetmap.josm.data.UndoRedoHandler; 13 import org.openstreetmap.josm.data.osm.DefaultNameFormatter; 14 import org.openstreetmap.josm.data.osm.Relation; 15 import org.openstreetmap.josm.data.osm.RelationMember; 16 import org.openstreetmap.josm.gui.MainApplication; 17 import org.openstreetmap.josm.tools.Utils; 18 19 /** 20 * Quickly change the relation roles of the selected members. 21 */ 22 final class RelationRoleEditor { 23 24 private RelationRoleEditor() { 25 } 26 27 /** 28 * Shows an {{@linkplain JOptionPane#showInputDialog input dialog} in order to quickly change 29 * the roles of the selected members. 30 * @param relation the relation to edit 31 * @param memberInfo the corresponding member info 32 */ 33 static void editRole(Relation relation, PropertiesDialog.MemberInfo memberInfo) { 34 if (MainApplication.getLayerManager().getActiveDataLayer().isLocked()) { 35 return; 36 } 37 final Collection<RelationMember> members = Utils.filteredCollection(memberInfo.getRole(), RelationMember.class); 38 final String oldRole = memberInfo.getRoleString(); 39 final DefaultNameFormatter formatter = DefaultNameFormatter.getInstance(); 40 final String newRole = JOptionPane.showInputDialog("<html>" + tr("Change role for {0} in relation {1}", 41 formatter.formatAsHtmlUnorderedList(Utils.transform(members, RelationMember::getMember), 5), 42 formatter.formatAsHtmlUnorderedList(relation)), 43 oldRole); 44 if (newRole == null || oldRole.equals(newRole) || tr("<different>").equals(newRole)) { 45 return; 46 } 47 final Relation newRelation = new Relation(relation); 48 final List<RelationMember> newMembers = newRelation.getMembers(); 49 newMembers.replaceAll(m -> members.contains(m) ? new RelationMember(newRole, m.getMember()) : m); 50 newRelation.setMembers(newMembers); 51 UndoRedoHandler.getInstance().add(new ChangeCommand(relation, newRelation)); 52 } 53 }
