Ticket #20935: 20935-v2.patch

File 20935-v2.patch, 14.2 KB (added by Bjoeni, 5 years ago)
  • src/org/openstreetmap/josm/actions/SplitWayAction.java

     
    3535import org.openstreetmap.josm.data.osm.PrimitiveId;
    3636import org.openstreetmap.josm.data.osm.Way;
    3737import org.openstreetmap.josm.data.osm.WaySegment;
     38import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
     39import org.openstreetmap.josm.data.osm.event.DataChangedEvent;
     40import org.openstreetmap.josm.data.osm.event.DataSetListener;
     41import org.openstreetmap.josm.data.osm.event.NodeMovedEvent;
     42import org.openstreetmap.josm.data.osm.event.PrimitivesAddedEvent;
     43import org.openstreetmap.josm.data.osm.event.PrimitivesRemovedEvent;
     44import org.openstreetmap.josm.data.osm.event.RelationMembersChangedEvent;
     45import org.openstreetmap.josm.data.osm.event.TagsChangedEvent;
     46import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent;
    3847import org.openstreetmap.josm.gui.ExtendedDialog;
    3948import org.openstreetmap.josm.gui.MainApplication;
    4049import org.openstreetmap.josm.gui.MapFrame;
     
    145154            final Way wayToKeep = SplitWayCommand.Strategy.keepLongestChunk().determineWayToKeep(newWays);
    146155
    147156            if (ExpertToggleAction.isExpert() && !selectedWay.isNew()) {
    148                 final ExtendedDialog dialog = new SegmentToKeepSelectionDialog(selectedWay, newWays, wayToKeep, sel);
     157                final ExtendedDialog dialog = new SegmentToKeepSelectionDialog(selectedWay, newWays, wayToKeep, selectedNodes, sel);
    149158                dialog.toggleEnable("way.split.segment-selection-dialog");
    150159                if (!dialog.toggleCheckState()) {
    151160                    dialog.setModal(false);
     
    164173     */
    165174    static class SegmentToKeepSelectionDialog extends ExtendedDialog {
    166175        static final AtomicInteger DISPLAY_COUNT = new AtomicInteger();
    167         final transient Way selectedWay;
    168         final transient List<Way> newWays;
    169176        final JList<Way> list;
     177        transient Way selectedWay;
     178        transient List<Way> newWays;
     179        transient Way wayToKeep;
    170180        final transient List<OsmPrimitive> selection;
    171         final transient Way wayToKeep;
     181        final transient List<Node> selectedNodes;
     182        private final SplitWayDataSetListener dataSetListener;
    172183
    173         SegmentToKeepSelectionDialog(Way selectedWay, List<Way> newWays, Way wayToKeep, List<OsmPrimitive> selection) {
     184        SegmentToKeepSelectionDialog(Way selectedWay, List<Way> newWays, Way wayToKeep, List<Node> selectedNodes, List<OsmPrimitive> selection) {
    174185            super(MainApplication.getMainFrame(), tr("Which way segment should reuse the history of {0}?", selectedWay.getId()),
    175186                    new String[]{tr("Ok"), tr("Cancel")}, true);
    176187
    177188            this.selectedWay = selectedWay;
    178189            this.newWays = newWays;
     190            this.selectedNodes = selectedNodes;
    179191            this.selection = selection;
    180192            this.wayToKeep = wayToKeep;
    181193            this.list = new JList<>(newWays.toArray(new Way[0]));
     194            this.dataSetListener = new SplitWayDataSetListener();
     195
    182196            configureList();
    183197
    184198            setButtonIcons("ok", "cancel");
     
    209223        }
    210224
    211225        protected void setHighlightedWaySegments(Collection<WaySegment> segments) {
    212             selectedWay.getDataSet().setHighlightedWaySegments(segments);
    213             MainApplication.getMap().mapView.repaint();
     226            DataSet ds = selectedWay.getDataSet();
     227            if (ds != null) {
     228                ds.setHighlightedWaySegments(segments);
     229                MainApplication.getMap().mapView.repaint();
     230            }
    214231        }
    215232
    216233        @Override
    217234        public void setVisible(boolean visible) {
    218235            super.setVisible(visible);
     236            DataSet ds = selectedWay.getDataSet();
    219237            if (visible) {
    220238                DISPLAY_COUNT.incrementAndGet();
    221239                list.setSelectedValue(wayToKeep, true);
     240                if (ds != null) {
     241                    ds.addDataSetListener(dataSetListener);
     242                }
    222243            } else {
     244                if (ds != null) {
     245                    ds.removeDataSetListener(dataSetListener);
     246                }
    223247                setHighlightedWaySegments(Collections.emptyList());
    224248                DISPLAY_COUNT.decrementAndGet();
    225249                if (getValue() != 1) {
     
    232256        protected void buttonAction(int buttonIndex, ActionEvent evt) {
    233257            super.buttonAction(buttonIndex, evt);
    234258            toggleSaveState(); // necessary since #showDialog() does not handle it due to the non-modal dialog
    235             if (getValue() == 1) {
     259            if (getValue() == 1 && selectedWay.getDataSet() != null) {
    236260                doSplitWay(selectedWay, list.getSelectedValue(), newWays, selection);
    237261            }
    238262        }
     263
     264        private class SplitWayDataSetListener implements DataSetListener {
     265
     266            @Override
     267            public void primitivesAdded(PrimitivesAddedEvent event) {
     268            }
     269
     270            @Override
     271            public void primitivesRemoved(PrimitivesRemovedEvent event) {
     272                if (event.getPrimitives().stream().anyMatch(p -> p instanceof Way)) {
     273                    updateWaySegments();
     274                }
     275            }
     276
     277            @Override
     278            public void tagsChanged(TagsChangedEvent event) {}
     279
     280            @Override
     281            public void nodeMoved(NodeMovedEvent event) {}
     282
     283            @Override
     284            public void wayNodesChanged(WayNodesChangedEvent event) {
     285                updateWaySegments();
     286            }
     287
     288            @Override
     289            public void relationMembersChanged(RelationMembersChangedEvent event) {}
     290
     291            @Override
     292            public void otherDatasetChange(AbstractDatasetChangedEvent event) {}
     293
     294            @Override
     295            public void dataChanged(DataChangedEvent event) {}
     296
     297            private void updateWaySegments() {
     298                if (!selectedWay.isUsable()) {
     299                    setVisible(false);
     300                    return;
     301                }
     302
     303                List<List<Node>> chunks = SplitWayCommand.buildSplitChunks(selectedWay, selectedNodes);
     304                if (chunks == null) {
     305                    setVisible(false);
     306                    return;
     307                }
     308
     309                newWays = SplitWayCommand.createNewWaysFromChunks(selectedWay, chunks);
     310                if (list.getSelectedIndex() < newWays.size()) {
     311                    wayToKeep = newWays.get(list.getSelectedIndex());
     312                } else {
     313                    wayToKeep = SplitWayCommand.Strategy.keepLongestChunk().determineWayToKeep(newWays);
     314                }
     315                list.setListData(newWays.toArray(new Way[0]));
     316                list.setSelectedValue(wayToKeep, true);
     317            }
     318
     319        }
    239320    }
    240321
    241322    static class SegmentListCellRenderer extends DefaultListCellRenderer {