Ticket #14228: 14228.patch

File 14228.patch, 3.8 KB (added by GerdP, 6 years ago)
  • src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java

     
    1515import java.util.Collection;
    1616import java.util.Collections;
    1717import java.util.EnumSet;
    18 import java.util.HashSet;
     18import java.util.LinkedHashSet;
    1919import java.util.LinkedList;
    2020import java.util.List;
    2121import java.util.Map;
     
    3333import javax.swing.SwingUtilities;
    3434
    3535import org.openstreetmap.josm.actions.AdaptableAction;
     36import org.openstreetmap.josm.actions.CreateMultipolygonAction;
    3637import org.openstreetmap.josm.command.ChangePropertyCommand;
    3738import org.openstreetmap.josm.command.Command;
    3839import org.openstreetmap.josm.command.SequenceCommand;
     
    4546import org.openstreetmap.josm.data.osm.Relation;
    4647import org.openstreetmap.josm.data.osm.RelationMember;
    4748import org.openstreetmap.josm.data.osm.Tag;
     49import org.openstreetmap.josm.data.osm.Way;
    4850import org.openstreetmap.josm.data.osm.search.SearchCompiler;
    4951import org.openstreetmap.josm.data.osm.search.SearchCompiler.Match;
    5052import org.openstreetmap.josm.data.osm.search.SearchParseError;
     
    5254import org.openstreetmap.josm.gui.MainApplication;
    5355import org.openstreetmap.josm.gui.Notification;
    5456import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
     57import org.openstreetmap.josm.gui.dialogs.relation.sort.RelationSorter;
    5558import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
    5659import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
    5760import org.openstreetmap.josm.gui.preferences.ToolbarPreferences;
     
    6770import org.openstreetmap.josm.tools.GBC;
    6871import org.openstreetmap.josm.tools.ImageProvider;
    6972import org.openstreetmap.josm.tools.Logging;
     73import org.openstreetmap.josm.tools.Pair;
    7074import org.openstreetmap.josm.tools.Utils;
    7175import org.openstreetmap.josm.tools.template_engine.ParseError;
    7276import org.openstreetmap.josm.tools.template_engine.TemplateEntry;
     
    413417                UndoRedoHandler.getInstance().add(cmd);
    414418            }
    415419        } else if (answer == DIALOG_ANSWER_NEW_RELATION) {
    416             final Relation r = new Relation();
    417             final Collection<RelationMember> members = new HashSet<>();
     420            Relation calculated = null;
     421            if (getChangedTags().stream().anyMatch(t -> "boundary".equals(t.get("type")) || "multipolygon".equals(t.get("type")))) {
     422                Pair<SequenceCommand, Relation> res = CreateMultipolygonAction.createMultipolygonCommand(ds.getSelectedWays(), null);
     423                if (res != null) {
     424                    calculated = res.b;
     425                }
     426            }
     427            final Relation r = calculated != null ? calculated : new Relation();
     428            final Collection<RelationMember> members = new LinkedHashSet<>();
     429            members.addAll(r.getMembers());
    418430            for (Tag t : getChangedTags()) {
    419431                r.put(t.getKey(), t.getValue());
    420432            }
    421433            for (OsmPrimitive osm : ds.getSelected()) {
     434                if (r == calculated && osm instanceof Way)
     435                    continue;
    422436                String role = suggestRoleForOsmPrimitive(osm);
    423437                RelationMember rm = new RelationMember(role == null ? "" : role, osm);
    424438                r.addMember(rm);
    425439                members.add(rm);
    426440            }
     441            if (r.isMultipolygon() && r != calculated) {
     442                r.setMembers(RelationSorter.sortMembersByConnectivity(r.getMembers()));
     443            }
    427444            SwingUtilities.invokeLater(() -> RelationEditor.getEditor(
    428445                    MainApplication.getLayerManager().getEditLayer(), r, members).setVisible(true));
    429446        }