// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.actions;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.actions.downloadtasks.DownloadNotesTask;
import org.openstreetmap.josm.gui.ExtendedDialog;
import org.openstreetmap.josm.gui.Notification;
import org.openstreetmap.josm.gui.widgets.HistoryComboBox;
import org.openstreetmap.josm.io.OsmApi;
import org.openstreetmap.josm.tools.Utils;
/**
* Action to use the Notes search API to download all notes matching a given search term.
* @since 8071
*/
public class SearchNotesDownloadAction extends JosmAction {
private static final String HISTORY_KEY = "osm.notes.searchHistory";
/** Constructs a new note search action */
public SearchNotesDownloadAction() {
super(tr("Search Notes..."), "note_search", tr("Download notes from the note search API"), null, false);
}
@Override
public void actionPerformed(ActionEvent e) {
HistoryComboBox searchTermBox = new HistoryComboBox();
List<String> searchHistory = new LinkedList<>(Main.pref.getCollection(HISTORY_KEY, new LinkedList<String>()));
Collections.reverse(searchHistory);
searchTermBox.setPossibleItems(searchHistory);
JPanel contentPanel = new JPanel(new GridBagLayout());
GridBagConstraints gc = new GridBagConstraints();
gc.fill = GridBagConstraints.HORIZONTAL;
gc.weightx = 1.0;
gc.anchor = GridBagConstraints.FIRST_LINE_START;
contentPanel.add(new JLabel(tr("Search the OSM API for notes containing words:")), gc);
gc.gridy = 1;
contentPanel.add(searchTermBox, gc);
ExtendedDialog ed = new ExtendedDialog(Main.parent, tr("Search for notes"),
new String[] {tr("Search for notes"), tr("Cancel")});
ed.setContent(contentPanel);
ed.setButtonIcons(new String[] {"note_search", "cancel"});
ed.showDialog();
if (ed.getValue() != 1) {
return;
}
String searchTerm = searchTermBox.getText();
if (searchTerm == null || searchTerm.trim().isEmpty()) {
Notification notification = new Notification(tr("You must enter a search term"));
notification.setIcon(JOptionPane.WARNING_MESSAGE);
notification.show();
return;
}
searchTermBox.addCurrentItemToHistory();
Main.pref.putCollection(HISTORY_KEY, searchTermBox.getHistory());
performSearch(searchTerm);
}
/**
* Perform search.
* @param searchTerm search term
*/
public void performSearch(String searchTerm) {
String trimmedSearchTerm = searchTerm.trim();
try {
final long id = Long.parseLong(trimmedSearchTerm);
new DownloadNotesTask().download(id, null);
return;
} catch (NumberFormatException ignore) {
Main.trace(ignore);
}
int noteLimit = Main.pref.getInteger("osm.notes.downloadLimit", 1000);
int closedLimit = Main.pref.getInteger("osm.notes.daysClosed", 7);
StringBuilder sb = new StringBuilder(128);
sb.append(OsmApi.getOsmApi().getBaseUrl())
.append("notes/search?limit=")
.append(noteLimit)
.append("&closed=")
.append(closedLimit)
.append("&q=")
.append(Utils.encodeUrl(trimmedSearchTerm));
new DownloadNotesTask().loadUrl(false, sb.toString(), null);
}
}