package org.openstreetmap.josm.plugins.photoadjust; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import java.util.ArrayList; import java.util.List; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.gui.MapFrame; import org.openstreetmap.josm.gui.layer.Layer; import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent; import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener; import org.openstreetmap.josm.gui.layer.geoimage.GeoImageLayer; import org.openstreetmap.josm.plugins.Plugin; import org.openstreetmap.josm.plugins.PluginInformation; /** * This is the main class for the photo adjust plugin. The plugin * allows to move photos on the map and to place photos without * coordinates (untagged photos) on the map. */ public class PhotoAdjustPlugin extends Plugin implements ActiveLayerChangeListener { private GeoImageLayer imageLayer = null; private MouseAdapter mouseAdapter = null; private MouseMotionAdapter mouseMotionAdapter = null; public PhotoAdjustWorker worker = null; /** * Will be invoked by JOSM to bootstrap the plugin. * * @param info information about the plugin and its local installation */ public PhotoAdjustPlugin(PluginInformation info) { super(info); GeoImageLayer.registerMenuAddition(new UntaggedGeoImageLayerAction()); new PhotoPropertyEditor(); worker = new PhotoAdjustWorker(); initAdapters(); } /** * Create mouse adapters that wait for activity on the GeoImageLayer. */ private void initAdapters() { mouseAdapter = new MouseAdapter() { @Override public void mousePressed(MouseEvent evt) { if (imageLayer != null) { List<GeoImageLayer> layers = new ArrayList<>(1); layers.add(imageLayer); worker.doMousePressed(evt, layers); } } @Override public void mouseReleased(MouseEvent evt) { if (imageLayer != null) { worker.doMouseReleased(evt); } } }; mouseMotionAdapter = new MouseMotionAdapter() { @Override public void mouseDragged(MouseEvent evt) { worker.doMouseDragged(evt); } }; } /** * Called when the JOSM map frame is created or destroyed. */ @Override public void mapFrameInitialized(MapFrame oldFrame, MapFrame newFrame) { if (oldFrame == null && newFrame != null) { Main.getLayerManager().addAndFireActiveLayerChangeListener(this); PhotoAdjustMapMode adjustMode = new PhotoAdjustMapMode(worker); adjustMode.installMapMode(newFrame); } else { Main.getLayerManager().removeActiveLayerChangeListener(this); } } @Override public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) { worker.reset(); Layer oldLayer = e.getPreviousActiveLayer(); Layer newLayer = Main.getLayerManager().getActiveLayer(); if ( oldLayer instanceof GeoImageLayer && newLayer instanceof GeoImageLayer) { imageLayer = (GeoImageLayer)newLayer; } else { if (oldLayer instanceof GeoImageLayer) { Main.map.mapView.removeMouseListener(mouseAdapter); Main.map.mapView.removeMouseMotionListener(mouseMotionAdapter); imageLayer = null; } if (newLayer instanceof GeoImageLayer) { imageLayer = (GeoImageLayer)newLayer; Main.map.mapView.addMouseListener(mouseAdapter); Main.map.mapView.addMouseMotionListener(mouseMotionAdapter); } } } }