// License: GPL. For details, see LICENSE file.
package org.insignificant.josm.plugins.imagewaypoint;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.Action;
import javax.swing.Icon;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.data.Bounds;
import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
import org.openstreetmap.josm.gui.MapView;
import org.openstreetmap.josm.gui.layer.Layer;
import org.openstreetmap.josm.tools.ImageProvider;
public final class ImageWayPointLayer extends Layer {
private static final class ImageWayPointMouseListener extends MouseAdapter {
private final ImageWayPointLayer layer;
ImageWayPointMouseListener(final ImageWayPointLayer layer) {
this.layer = layer;
}
@Override
public void mouseClicked(final MouseEvent event) {
if (MouseEvent.BUTTON1 == event.getButton() && this.layer.isVisible()) {
final ImageEntry[] images = ImageEntries.getInstance()
.getImages();
if (null != images) {
boolean found = false;
// Note: the images are checked in the *reverse* order to
// which they're painted - this means than an image which
// partly obscures another will match the click first
for (int index = images.length - 1; !found && index >= 0; index--) {
final Rectangle bounds = images[index].getBounds(Main.map.mapView);
if (null != bounds && bounds.contains(event.getPoint())) {
found = true;
ImageEntries.getInstance()
.setCurrentImageEntry(images[index]);
}
}
}
}
}
}
private static final class ImageChangeListener implements IImageChangeListener {
@Override
public void onAvailableImageEntriesChanged(final ImageEntries entries) {
Main.map.repaint();
}
@Override
public void onSelectedImageEntryChanged(final ImageEntries entries) {
Main.map.repaint();
}
}
private final MouseListener layerMouseListener;
private final IImageChangeListener imageChangeListener;
public ImageWayPointLayer() {
super(tr("Imported Images"));
Main.getLayerManager().addLayer(this);
this.layerMouseListener = new ImageWayPointMouseListener(this);
Main.map.mapView.addMouseListener(this.layerMouseListener);
this.imageChangeListener = new ImageChangeListener();
ImageEntries.getInstance().addListener(this.imageChangeListener);
}
@Override
public Icon getIcon() {
return ImageProvider.get("dialogs/imagewaypoint");
}
@Override
public Object getInfoComponent() {
return null;
}
@Override
public Action[] getMenuEntries() {
return new Action[0];
}
@Override
public String getToolTipText() {
// TODO
return "";
}
@Override
public boolean isMergable(final Layer other) {
// TODO
return false;
}
@Override
public void mergeFrom(final Layer from) {
// TODO not supported yet
}
@Override
public void paint(final Graphics2D graphics, final MapView mapView, Bounds box) {
final ImageEntry[] images = ImageEntries.getInstance().getImages();
if (null != images) {
final ImageEntry currentImage = ImageEntries.getInstance()
.getCurrentImageEntry();
for (int index = 0; index < images.length; index++) {
final Rectangle bounds = images[index].getBounds(mapView);
if (null != bounds) {
if (images[index] == currentImage) {
ImageEntry.SELECTED_ICON.paintIcon(mapView,
graphics,
bounds.x,
bounds.y);
} else {
ImageEntry.ICON.paintIcon(mapView,
graphics,
bounds.x,
bounds.y);
}
}
}
}
}
@Override
public void visitBoundingBox(final BoundingXYVisitor visitor) {
final ImageEntry[] images = ImageEntries.getInstance().getImages();
if (null != images) {
for (int index = 0; index < images.length; index++) {
final ImageEntry imageEntry = images[index];
if (imageEntry.getWayPoint() != null)
visitor.visit(imageEntry.getWayPoint().getCoor());
}
}
}
@Override
public void destroy() {
super.destroy();
Main.map.mapView.removeMouseListener(this.layerMouseListener);
ImageEntries.getInstance().removeListener(this.imageChangeListener);
}
}