From 2de14135050c3d24e9df81832049d269cd5d1596 Mon Sep 17 00:00:00 2001
From: Jiri Vlasak <jiri.hubacek@gmail.com>
Date: Tue, 19 Sep 2023 01:02:05 +0200
Subject: [PATCH v3] Include changeset in note comment if feasible

When closing a note, check for the changeset in the changeset cache. If
there is a changeset with the comment that contains a link to the note
being closed, put the link to the changeset as the default text of the
closing note comment.
---
 .../openstreetmap/josm/gui/NoteInputDialog.java | 12 ++++++++++++
 .../josm/gui/dialogs/NotesDialog.java           | 17 +++++++++++++++--
 2 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/src/org/openstreetmap/josm/gui/NoteInputDialog.java b/src/org/openstreetmap/josm/gui/NoteInputDialog.java
index 779959b856..c2881d5d13 100644
--- a/src/org/openstreetmap/josm/gui/NoteInputDialog.java
+++ b/src/org/openstreetmap/josm/gui/NoteInputDialog.java
@@ -44,6 +44,18 @@ public class NoteInputDialog extends ExtendedDialog {
      * @param icon Icon to display in the action button
      */
     public void showNoteDialog(String message, Icon icon) {
+        showNoteDialog(message, icon, "");
+    }
+
+    /**
+     * Displays the dialog to the user
+     * @param message Translated message to display to the user as input prompt
+     * @param icon Icon to display in the action button
+     * @param text Default text of the note's comment
+     * @param since xxx
+     */
+    public void showNoteDialog(String message, Icon icon, String text) {
+        textArea.setText(text);
         textArea.setRows(6);
         textArea.setColumns(30);
         textArea.setLineWrap(true);
diff --git a/src/org/openstreetmap/josm/gui/dialogs/NotesDialog.java b/src/org/openstreetmap/josm/gui/dialogs/NotesDialog.java
index 6e0fc7e8ff..65ab6289d5 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/NotesDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/NotesDialog.java
@@ -40,6 +40,8 @@ import org.openstreetmap.josm.actions.mapmode.AddNoteAction;
 import org.openstreetmap.josm.data.notes.Note;
 import org.openstreetmap.josm.data.notes.Note.State;
 import org.openstreetmap.josm.data.notes.NoteComment;
+import org.openstreetmap.josm.data.osm.Changeset;
+import org.openstreetmap.josm.data.osm.ChangesetCache;
 import org.openstreetmap.josm.data.osm.NoteData;
 import org.openstreetmap.josm.data.osm.NoteData.NoteDataUpdateListener;
 import org.openstreetmap.josm.gui.MainApplication;
@@ -57,6 +59,7 @@ import org.openstreetmap.josm.gui.widgets.DisableShortcutsOnFocusGainedTextField
 import org.openstreetmap.josm.gui.widgets.FilterField;
 import org.openstreetmap.josm.gui.widgets.JosmTextField;
 import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
+import org.openstreetmap.josm.io.OsmApi;
 import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.OpenBrowser;
@@ -422,12 +425,22 @@ public class NotesDialog extends ToggleDialog implements LayerChangeListener, No
 
         @Override
         public void actionPerformed(ActionEvent e) {
+            Note note = displayList.getSelectedValue();
+            String changesetUrl = "";
+            if (note != null) {
+                String noteUrlShort = "osm.org/note/" + note.getId();
+                String noteUrlLong = OsmApi.getOsmApi().getHost().substring(4) + "/note/" + note.getId();
+                for (Changeset cs: ChangesetCache.getInstance().getChangesets()) {
+                    if (cs.getComment().indexOf(noteUrlShort) > -1 || cs.getComment().indexOf(noteUrlLong) > -1) {
+                        changesetUrl = "https://www.osm.org/changeset/" + cs.getId();
+                    }
+                }
+            }
             NoteInputDialog dialog = new NoteInputDialog(MainApplication.getMainFrame(), tr("Close note"), tr("Close note"));
-            dialog.showNoteDialog(tr("Close note with message:"), ImageProvider.get("dialogs/notes", "note_closed"));
+            dialog.showNoteDialog(tr("Close note with message:"), ImageProvider.get("dialogs/notes", "note_closed"), changesetUrl);
             if (dialog.getValue() != 1) {
                 return;
             }
-            Note note = displayList.getSelectedValue();
             if (note != null) {
                 int selectedIndex = displayList.getSelectedIndex();
                 noteData.closeNote(note, dialog.getInputText());
-- 
2.30.2

