- Timestamp:
- 2023-09-21T19:04:05+02:00 (14 months ago)
- Location:
- trunk
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/gui/NoteInputDialog.java
r16435 r18839 45 45 */ 46 46 public void showNoteDialog(String message, Icon icon) { 47 showNoteDialog(message, icon, ""); 48 } 49 50 /** 51 * Displays the dialog to the user 52 * @param message Translated message to display to the user as input prompt 53 * @param icon Icon to display in the action button 54 * @param text Default text of the note's comment 55 * @since xxx 56 */ 57 public void showNoteDialog(String message, Icon icon, String text) { 58 textArea.setText(text); 47 59 textArea.setRows(6); 48 60 textArea.setColumns(30); -
trunk/src/org/openstreetmap/josm/gui/dialogs/NotesDialog.java
r18715 r18839 15 15 import java.util.Arrays; 16 16 import java.util.Collection; 17 import java.util.Collections; 17 18 import java.util.List; 18 19 import java.util.Objects; 19 20 import java.util.function.Predicate; 21 import java.util.regex.Matcher; 20 22 import java.util.regex.Pattern; 21 23 import java.util.stream.Collectors; … … 41 43 import org.openstreetmap.josm.data.notes.Note.State; 42 44 import org.openstreetmap.josm.data.notes.NoteComment; 45 import org.openstreetmap.josm.data.osm.Changeset; 46 import org.openstreetmap.josm.data.osm.ChangesetCache; 43 47 import org.openstreetmap.josm.data.osm.NoteData; 44 48 import org.openstreetmap.josm.data.osm.NoteData.NoteDataUpdateListener; … … 58 62 import org.openstreetmap.josm.gui.widgets.JosmTextField; 59 63 import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher; 64 import org.openstreetmap.josm.io.OsmApi; 60 65 import org.openstreetmap.josm.spi.preferences.Config; 61 66 import org.openstreetmap.josm.tools.ImageProvider; … … 423 428 @Override 424 429 public void actionPerformed(ActionEvent e) { 430 Note note = displayList.getSelectedValue(); 431 final List<String> changesetUrls = note == null ? Collections.emptyList() : getRelatedChangesetUrls(note.getId()); 425 432 NoteInputDialog dialog = new NoteInputDialog(MainApplication.getMainFrame(), tr("Close note"), tr("Close note")); 426 dialog.showNoteDialog(tr("Close note with message:"), ImageProvider.get("dialogs/notes", "note_closed")); 433 dialog.showNoteDialog(tr("Close note with message:"), ImageProvider.get("dialogs/notes", "note_closed"), 434 String.join("\n", changesetUrls)); 427 435 if (dialog.getValue() != 1) { 428 436 return; 429 437 } 430 Note note = displayList.getSelectedValue();431 438 if (note != null) { 432 439 int selectedIndex = displayList.getSelectedIndex(); … … 443 450 444 451 /** 452 * Get a list of changeset urls that may have fixed a note 453 * @param noteId The note ID to look for 454 * @return A list of changeset URLs 455 */ 456 static List<String> getRelatedChangesetUrls(long noteId) { 457 final List<String> changesetUrls = new ArrayList<>(); 458 final int patternFlags = Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CHARACTER_CLASS; 459 final Matcher noteMatcher = Pattern.compile("note " + noteId + "( |$)", patternFlags).matcher(""); 460 final Matcher shortOsmMatcher = Pattern.compile("osm.org/note/" + noteId + "( |$)", patternFlags).matcher(""); 461 final String hostUrl = Pattern.compile("https?://(www\\.)?") 462 .matcher(Config.getUrls().getBaseBrowseUrl()) 463 .replaceFirst(""); 464 final Matcher longOsmMatcher = Pattern.compile(hostUrl + "/note/" + noteId + "( |$)", patternFlags).matcher(""); 465 final boolean isUsingDefaultOsmApi = Config.getUrls().getDefaultOsmApiUrl().equals(OsmApi.getOsmApi().getServerUrl()); 466 for (Changeset cs: ChangesetCache.getInstance().getChangesets()) { 467 final String comment = cs.getComment(); 468 if ((isUsingDefaultOsmApi && (shortOsmMatcher.reset(comment).find() || noteMatcher.reset(comment).find())) 469 || longOsmMatcher.reset(comment).find()) { 470 changesetUrls.add(Config.getUrls().getBaseBrowseUrl() + "/changeset/" + cs.getId()); 471 } 472 } 473 return changesetUrls; 474 } 475 476 /** 445 477 * Create a new note 446 478 */ -
trunk/test/unit/org/openstreetmap/josm/gui/dialogs/NotesDialogTest.java
r18454 r18839 9 9 10 10 import java.time.Instant; 11 import java.util.Arrays; 11 12 import java.util.Collections; 13 import java.util.List; 14 import java.util.stream.Stream; 12 15 13 16 import javax.swing.JLabel; … … 16 19 import org.junit.jupiter.api.Test; 17 20 import org.junit.jupiter.api.extension.RegisterExtension; 21 import org.junit.jupiter.params.ParameterizedTest; 22 import org.junit.jupiter.params.provider.Arguments; 23 import org.junit.jupiter.params.provider.MethodSource; 18 24 import org.junit.platform.commons.util.ReflectionUtils; 19 25 import org.openstreetmap.josm.TestUtils; … … 21 27 import org.openstreetmap.josm.data.notes.Note; 22 28 import org.openstreetmap.josm.data.notes.NoteComment; 29 import org.openstreetmap.josm.data.osm.Changeset; 30 import org.openstreetmap.josm.data.osm.ChangesetCache; 23 31 import org.openstreetmap.josm.data.osm.User; 24 32 import org.openstreetmap.josm.gui.ExtendedDialog; … … 27 35 import org.openstreetmap.josm.gui.layer.NoteLayer; 28 36 import org.openstreetmap.josm.gui.widgets.JosmTextField; 37 import org.openstreetmap.josm.spi.preferences.Config; 29 38 import org.openstreetmap.josm.testutils.JOSMTestRules; 30 39 import org.openstreetmap.josm.testutils.annotations.BasicPreferences; … … 97 106 assertDoesNotThrow(() -> closeAction.actionPerformed(null)); 98 107 } 108 109 static Stream<Arguments> testCloseActionGetRelatedChangesetUrls() { 110 return Stream.of( 111 Arguments.of(1, 0, Collections.singletonList("/note/123")), 112 Arguments.of(1, 0, Collections.singletonList("/note/231")), 113 Arguments.of(1, 1, Collections.singletonList("/note/1")), 114 Arguments.of(1, 2, Arrays.asList("/note/1", "/note/1 again")), 115 Arguments.of(1, 2, Arrays.asList("/note/1", "/note/1 again", "/note/12 here")), 116 Arguments.of(1, 2, Arrays.asList("/note/1", "/note/12 again", "/note/1 here")), 117 Arguments.of(1, 2, Arrays.asList("/note/12", "/note/1 again", "/note/1 here")), 118 Arguments.of(1, 3, Arrays.asList("/note/1", "/note/1 again", "/note/1 here")), 119 Arguments.of(1, 3, Arrays.asList("note 1", "note 1 again", "note 1 here")) 120 ); 121 } 122 123 @ParameterizedTest 124 @MethodSource 125 void testCloseActionGetRelatedChangesetUrls(long noteId, int expectedChangesets, List<String> changesetComments) { 126 try { 127 Config.getPref().put("osm-server.url", null); 128 final String[] apiList = {"osm.org", "openstreetmap.org", Config.getUrls().getBaseBrowseUrl()}; 129 for (int i = 0; i < changesetComments.size(); i++) { 130 final String comment = changesetComments.get(i); 131 final Changeset cs = new Changeset(i + 1); 132 cs.put("comment", apiList[i % 3] + comment); 133 ChangesetCache.getInstance().update(cs); 134 } 135 final List<String> changesetUrls = NotesDialog.getRelatedChangesetUrls(noteId); 136 assertEquals(expectedChangesets, changesetUrls.size()); 137 } finally { 138 ChangesetCache.getInstance().clear(); 139 } 140 } 99 141 } -
trunk/test/unit/org/openstreetmap/josm/gui/dialogs/layer/DeleteLayerActionTest.java
r18837 r18839 1 // License: GPL. For details, see LICENSE file. 1 2 package org.openstreetmap.josm.gui.dialogs.layer; 2 3
Note:
See TracChangeset
for help on using the changeset viewer.