Ticket #16255: 16255.patch

File 16255.patch, 5.3 KB (added by simon04, 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 100644
    a b  
    1616import java.util.ArrayList;
    1717import java.util.Arrays;
    1818import java.util.Collection;
     19import java.util.Collections;
    1920import java.util.EnumSet;
    2021import java.util.HashMap;
    2122import java.util.HashSet;
    2223import java.util.List;
    2324import java.util.Map;
    2425import java.util.Map.Entry;
    25 import java.util.Optional;
    2626import java.util.Set;
    2727import java.util.TreeMap;
    2828import java.util.TreeSet;
    public void selectionChanged(SelectionChangeEvent event) {  
    631631            for (IPrimitive ref: primitive.getReferrers(true)) {
    632632                if (ref instanceof IRelation && !ref.isIncomplete() && !ref.isDeleted()) {
    633633                    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));
    636635                    int i = 1;
    637636                    for (IRelationMember<?> m : r.getMembers()) {
    638637                        if (m.getMember() == primitive) {
    public void mouseClicked(MouseEvent e) {  
    892891                }
    893892            } else if (e.getSource() == membershipTable) {
    894893                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) {
    896900                    editMembership(row);
    897901                }
    898902            } else {
    String getPositionString() {  
    943947            return Utils.shortenString(positionString, 20);
    944948        }
    945949
     950        List<IRelationMember<?>> getRole() {
     951            return Collections.unmodifiableList(role);
     952        }
     953
    946954        String getRoleString() {
    947955            if (roleString == null) {
    948956                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.
     2package org.openstreetmap.josm.gui.dialogs.properties;
     3
     4import static org.openstreetmap.josm.tools.I18n.tr;
     5
     6import java.util.Collection;
     7import java.util.List;
     8
     9import javax.swing.JOptionPane;
     10
     11import org.openstreetmap.josm.command.ChangeCommand;
     12import org.openstreetmap.josm.data.UndoRedoHandler;
     13import org.openstreetmap.josm.data.osm.DefaultNameFormatter;
     14import org.openstreetmap.josm.data.osm.Relation;
     15import org.openstreetmap.josm.data.osm.RelationMember;
     16import org.openstreetmap.josm.gui.MainApplication;
     17import org.openstreetmap.josm.tools.Utils;
     18
     19/**
     20 * Quickly change the relation roles of the selected members.
     21 */
     22final 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}