package org.openstreetmap.josm.plugins.osminspector.gui;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.Arrays;
import javax.swing.AbstractAction;
import javax.swing.DefaultListModel;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
import javax.swing.ScrollPaneConstants;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.data.coor.LatLon;
import org.openstreetmap.josm.gui.SideButton;
import org.openstreetmap.josm.gui.dialogs.ToggleDialog;
import org.openstreetmap.josm.gui.layer.Layer;
import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
import org.openstreetmap.josm.plugins.osminspector.OsmInspectorLayer;
import org.openstreetmap.josm.plugins.osminspector.OsmInspectorLayer.BugInfo;
import org.openstreetmap.josm.tools.Shortcut;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.Point;
public class OsmInspectorDialog extends ToggleDialog implements LayerChangeListener, ActiveLayerChangeListener {
private OsmInspectorLayer layer;
private JList<String> bugsList;
private OsmInspectorNextAction actNext;
private OsmInspectorPrevAction actPrev;
private DefaultListModel<String> model;
private OsmInspectorBugInfoDialog bugInfoDialog;
public void updateNextPrevAction(OsmInspectorLayer l) {
this.actNext.inspectlayer = l;
this.actPrev.inspectlayer = l;
}
/**
* Builds the content panel for this dialog
*/
protected void buildContentPanel() {
Main.map.addToggleDialog(this, true);
model = new DefaultListModel<>();
refreshModel();
bugsList = new JList<>(model);
bugsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
bugsList.setLayoutOrientation(JList.VERTICAL_WRAP);
bugsList.setVisibleRowCount(-1);
JScrollPane scroll = new JScrollPane(bugsList,
ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
bugsList.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
layer.setOsmiIndex(e.getFirstIndex());
BugInfo next = layer.getOsmiIndex().getItemPointedByNext();
layer.setOsmiIndex((e.getFirstIndex() + 1) % layer.getOsmiBugInfo().size());
Geometry geom = next.getGeom();
Point centroid = geom.getCentroid();
LatLon center = new LatLon(centroid.getY(), centroid.getX());
Main.map.mapView.zoomTo(center);
layer.selectFeatures(center);
bugInfoDialog.setBugDescription(next);
}
});
// refreshBugList();
// the next action
final SideButton nextButton = new SideButton(
actNext = new OsmInspectorNextAction(layer));
nextButton.createArrow(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int index = bugsList.getSelectedIndex();
Geometry geom = layer.getOsmBugGeometry(index);
Point centroid = geom.getCentroid();
LatLon center = new LatLon(centroid.getY(), centroid.getX());
Main.map.mapView.zoomTo(center);
layer.selectFeatures(center);
}
});
// the previous button
final SideButton prevButton = new SideButton(
actPrev = new OsmInspectorPrevAction(layer));
prevButton.createArrow(new ActionListener() {
public void actionPerformed(ActionEvent e) {
}
});
createLayout(scroll, true,
Arrays.asList(new SideButton[] { nextButton, prevButton }));
this.add(scroll);
Shortcut sprev = Shortcut.registerShortcut("osmi:prev", tr("Prev OSMI bug"),
KeyEvent.VK_J, Shortcut.CTRL_SHIFT);
Main.registerActionShortcut(actPrev, sprev);
Shortcut snext = Shortcut.registerShortcut("osmi:next", tr("Next OSMI bug"),
KeyEvent.VK_K, Shortcut.CTRL_SHIFT);
Main.registerActionShortcut(actNext, snext);
}
public void refreshModel() {
model.clear();
for (Object b : layer.getOsmiBugInfo().keySet()) {
if (b instanceof BugInfo) {
model.addElement(b.toString());
}
}
}
public OsmInspectorDialog(OsmInspectorLayer layer) {
super(tr("OSM Inspector Bugs"), "selectionlist",
tr("Open a OSM Inspector selection list window."), Shortcut.registerShortcut("subwindow:osminspector",
tr("Toggle: {0}", tr("OSM Inspector Bugs")),
KeyEvent.VK_W, Shortcut.ALT_SHIFT), 150, // default height
true // default is "show dialog"
);
this.layer = layer;
buildContentPanel();
bugInfoDialog = new OsmInspectorBugInfoDialog(layer);
bugInfoDialog.setTitle(tr("Selected Bug Info"));
}
public void updateDialog(OsmInspectorLayer l) {
this.layer = l;
bugInfoDialog.updateDialog(l);
refreshModel();
refreshBugList();
}
@Override
public void showNotify() {
super.showNotify();
}
@Override
public void hideNotify() {
if (dialogsPanel != null) {
super.hideNotify();
}
}
public class OsmInspectorNextAction extends AbstractAction {
private OsmInspectorLayer inspectlayer;
public OsmInspectorNextAction(Layer inspector) {
super("next");
inspectlayer = (OsmInspectorLayer) inspector;
}
@Override
public void actionPerformed(ActionEvent e) {
inspectlayer.getOsmiIndex().next();
BugInfo next = inspectlayer.getOsmiIndex().getItemPointedByNext();
Geometry geom = next.getGeom();
Point centroid = geom.getCentroid();
LatLon center = new LatLon(centroid.getY(), centroid.getX());
Main.map.mapView.zoomTo(center);
inspectlayer.selectFeatures(center);
bugInfoDialog.setBugDescription(next);
updateSelection(next);
}
}
private void updateSelection(BugInfo prev) {
int idx = layer.getOsmiIndex().indexOf(prev);
if (idx >= 0) {
bugsList.setSelectedIndex(idx);
}
}
private class OsmInspectorPrevAction extends AbstractAction {
private OsmInspectorLayer inspectlayer;
public OsmInspectorPrevAction(Layer inspector) {
super("prev");
inspectlayer = (OsmInspectorLayer) inspector;
}
@Override
public void actionPerformed(ActionEvent e) {
inspectlayer.getOsmiIndex().prev();
BugInfo prev = inspectlayer.getOsmiIndex().getItemPointedByPrev();
Geometry geom = prev.getGeom();
Point centroid = geom.getCentroid();
LatLon center = new LatLon(centroid.getY(), centroid.getX());
Main.map.mapView.zoomTo(center);
inspectlayer.selectFeatures(center);
bugInfoDialog.setBugDescription(prev);
updateSelection(prev);
}
}
@Override
public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
Layer newLayer = Main.getLayerManager().getActiveLayer();
if (newLayer instanceof OsmInspectorLayer) {
this.layer = (OsmInspectorLayer) newLayer;
refreshModel();
refreshBugList();
}
}
private void refreshBugList() {
bugsList.clearSelection();
bugsList = new JList<>(model);
}
@Override
public void layerAdded(LayerAddEvent e) {
if (layer instanceof OsmInspectorLayer) {
refreshModel();
refreshBugList();
}
}
@Override
public void layerRemoving(LayerRemoveEvent e) {
if (layer instanceof OsmInspectorLayer) {
bugsList.clearSelection();
model.clear();
}
}
@Override
public void layerOrderChanged(LayerOrderChangeEvent e) {
}
}