// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.waypointSearch;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.awt.BorderLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.swing.DefaultListModel;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.gui.dialogs.ToggleDialog;
import org.openstreetmap.josm.gui.layer.markerlayer.Marker;
import org.openstreetmap.josm.tools.Shortcut;
class SelectWaypointDialog extends ToggleDialog implements KeyListener, MouseListener {
private JTextField searchPattern = new JTextField(20);
private DefaultListModel<String> listModel = new DefaultListModel<>();
private JList<String> searchResult = new JList<>(listModel);
private transient List<Marker> searchResultObjectCache = new ArrayList<>();
private boolean firstTimeSearch = true;
SelectWaypointDialog(String name, String iconName, String tooltip,
Shortcut shortcut, int preferredHeight) {
super(name, iconName, tooltip, shortcut, preferredHeight);
build();
}
protected void build() {
//add panel - all the gui of the plugin goes in here
JPanel panel = new JPanel(new BorderLayout());
//search field
searchPattern.setText(tr("Enter search expression here.."));
searchPattern.addKeyListener(this);
searchPattern.addMouseListener(this);
panel.add(searchPattern, BorderLayout.NORTH);
//add result table
searchResult.setLayoutOrientation(JList.VERTICAL);
searchResult.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
searchResult.addMouseListener(this);
JScrollPane scrollPane = new JScrollPane(searchResult);
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
panel.add(scrollPane, BorderLayout.CENTER);
//add label
JLabel label = new JLabel(tr("Select waypoint to move map"));
panel.add(label, BorderLayout.SOUTH);
//add panel to JOSM gui
createLayout(panel, false, null);
}
void updateSearchResults() {
String searchfor = "";
listModel.clear();
searchResultObjectCache.clear();
if (!firstTimeSearch) {
searchfor = searchPattern.getText();
}
for (Iterator<Marker> i = Engine.searchGpxWaypoints(searchfor).iterator(); i.hasNext();) {
Marker marker = i.next();
listModel.addElement(marker.getText());
searchResultObjectCache.add(marker);
}
}
@Override
public void keyPressed(KeyEvent e) {
// Do nothing
}
@Override
public void keyReleased(KeyEvent e) {
updateSearchResults();
}
@Override
public void keyTyped(KeyEvent e) {
firstTimeSearch = false;
}
@Override
public void mouseClicked(MouseEvent e) {
if (e.getSource() == searchResult) {
//click on the search result box
int idx = searchResult.getSelectedIndex();
if (idx >= 0) {
Marker marker = searchResultObjectCache.get(idx);
Main.map.mapView.zoomTo(marker.getCoor());
}
}
}
@Override
public void mouseEntered(MouseEvent e) {
// Do nothing
}
@Override
public void mouseExited(MouseEvent e) {
// Do nothing
}
@Override
public void mousePressed(MouseEvent e) {
if (searchPattern.getSelectedText() == null) {
searchPattern.selectAll();
}
}
@Override
public void mouseReleased(MouseEvent e) {
// Do nothing
}
}