Changeset 18842 in josm for trunk/src/org/openstreetmap


Ignore:
Timestamp:
2023-09-25T17:34:00+02:00 (16 months ago)
Author:
taylor.smock
Message:

Fix #23191: NPE in AddTagsDialog

This is caused when a new layer is added via Remote Control while the add tag
dialog is open.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java

    r18692 r18842  
    7373import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
    7474import org.openstreetmap.josm.data.osm.Tag;
     75import org.openstreetmap.josm.data.osm.Tagged;
    7576import org.openstreetmap.josm.data.osm.search.SearchCompiler;
    7677import org.openstreetmap.josm.data.osm.search.SearchParseError;
     
    8283import org.openstreetmap.josm.data.preferences.StringProperty;
    8384import org.openstreetmap.josm.data.tagging.ac.AutoCompletionItem;
     85import org.openstreetmap.josm.gui.ConditionalOptionPaneUtil;
    8486import org.openstreetmap.josm.gui.ExtendedDialog;
    8587import org.openstreetmap.josm.gui.IExtendedDialog;
     
    278280        try {
    279281            activeDataSet.beginUpdate();
    280             sel = OsmDataManager.getInstance().getInProgressSelection();
    281             if (Utils.isEmpty(sel))
     282            Collection<OsmPrimitive> selection = OsmDataManager.getInstance().getInProgressSelection();
     283            this.sel = selection;
     284            if (Utils.isEmpty(selection))
    282285                return;
    283286
     
    287290
    288291            addDialog.destroyActions();
    289             if (addDialog.getValue() == 1)
    290                 addDialog.performTagAdding();
    291             else
     292            // Remote control can cause the selection to change, see #23191.
     293            if (addDialog.getValue() == 1 && (selection == sel || warnSelectionChanged())) {
     294                addDialog.performTagAdding(selection);
     295            } else {
    292296                addDialog.undoAllTagsAdding();
     297            }
    293298        } finally {
    294299            activeDataSet.endUpdate();
     
    373378    public void loadTagsIfNeeded() {
    374379        loadTagsToIgnore();
    375         if (PROPERTY_REMEMBER_TAGS.get() && recentTags.isEmpty()) {
     380        if (Boolean.TRUE.equals(PROPERTY_REMEMBER_TAGS.get()) && recentTags.isEmpty()) {
    376381            recentTags.loadFromPreference(PROPERTY_RECENT_TAGS);
    377382        }
     
    407412     */
    408413    public void saveTagsIfNeeded() {
    409         if (PROPERTY_REMEMBER_TAGS.get() && !recentTags.isEmpty()) {
     414        if (Boolean.TRUE.equals(PROPERTY_REMEMBER_TAGS.get()) && !recentTags.isEmpty()) {
    410415            recentTags.saveToPreference(PROPERTY_RECENT_TAGS);
    411416        }
     
    449454            return selectedItem.toString();
    450455        return getEditItem(cb);
     456    }
     457
     458    /**
     459     * Warn user about a selection change
     460     * @return {@code true} if the user wants to apply the tag change to the old selection
     461     */
     462    private static boolean warnSelectionChanged() {
     463        return ConditionalOptionPaneUtil.showConfirmationDialog("properties.selection-changed",
     464                MainApplication.getMainFrame(),
     465                tr("Data selection has changed since the dialog was opened"),
     466                tr("Apply tag change to old selection?"),
     467                JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, JOptionPane.YES_OPTION);
    451468    }
    452469
     
    506523                /**
    507524                 * This hack allows the comboboxes to have their own orientation.
    508                  *
     525                 * <p>
    509526                 * The problem is that
    510527                 * {@link org.openstreetmap.josm.gui.ExtendedDialog#showDialog ExtendedDialog} calls
    511528                 * {@code applyComponentOrientation} very late in the dialog construction process
    512529                 * thus overwriting the orientation the components have chosen for themselves.
    513                  *
     530                 * <p>
    514531                 * This stops the propagation of {@code applyComponentOrientation}, thus all
    515532                 * components may (and have to) set their own orientation.
     
    794811                /**
    795812                 * This hack allows the comboboxes to have their own orientation.
    796                  *
     813                 * <p>
    797814                 * The problem is that
    798815                 * {@link org.openstreetmap.josm.gui.ExtendedDialog#showDialog ExtendedDialog} calls
    799816                 * {@code applyComponentOrientation} very late in the dialog construction process
    800817                 * thus overwriting the orientation the components have chosen for themselves.
    801                  *
     818                 * <p>
    802819                 * This stops the propagation of {@code applyComponentOrientation}, thus all
    803820                 * components may (and have to) set their own orientation.
     
    11871204         */
    11881205        public final void performTagAdding() {
     1206            Collection<OsmPrimitive> selection = sel;
     1207            if (!Utils.isEmpty(selection)) {
     1208                performTagAdding(selection);
     1209            }
     1210        }
     1211
     1212        /**
     1213         * Read tags from comboboxes and add it to all selected objects
     1214         * @param selection The selection to perform tag adding on
     1215         * @since 18842
     1216         */
     1217        private void performTagAdding(Collection<OsmPrimitive> selection) {
    11891218            String key = getEditItem(keys);
    11901219            String value = getEditItem(values);
    11911220            if (key.isEmpty() || value.isEmpty())
    11921221                return;
    1193             for (OsmPrimitive osm : sel) {
     1222            for (Tagged osm : selection) {
    11941223                String val = osm.get(key);
    11951224                if (val != null && !val.equals(value)) {
     
    12031232            }
    12041233            recentTags.add(new Tag(key, value));
    1205             valueCount.put(key, new TreeMap<String, Integer>());
     1234            valueCount.put(key, new TreeMap<>());
    12061235            AutoCompletionManager.rememberUserInput(key, value, false);
    12071236            commandCount++;
    1208             UndoRedoHandler.getInstance().add(new ChangePropertyCommand(sel, key, value));
     1237            UndoRedoHandler.getInstance().add(new ChangePropertyCommand(selection, key, value));
    12091238            changedKey = key;
    12101239            clearEntries();
     
    12161245        }
    12171246
     1247        /**
     1248         * Undo all tag add commands that this dialog has created
     1249         */
    12181250        public void undoAllTagsAdding() {
    12191251            UndoRedoHandler.getInstance().undo(commandCount);
Note: See TracChangeset for help on using the changeset viewer.