package com.opendoorlogistics.studio.components.geocoder;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import javax.swing.AbstractAction;
import javax.swing.Action;
import com.opendoorlogistics.api.geometry.LatLong;
import com.opendoorlogistics.api.standardcomponents.map.MapActionFactory;
import com.opendoorlogistics.api.standardcomponents.map.MapApi;
import com.opendoorlogistics.api.standardcomponents.map.MapPlugin;
import com.opendoorlogistics.api.standardcomponents.map.StandardMapMenuOrdering;
import com.opendoorlogistics.api.ui.Disposable;
import com.opendoorlogistics.studio.components.geocoder.model.GeocodeModel;
import com.opendoorlogistics.studio.components.map.AbstractMapMode;
import com.opendoorlogistics.studio.components.map.MapApiImpl;
import com.opendoorlogistics.studio.components.map.plugins.PanMapPlugin;
import com.opendoorlogistics.studio.components.map.plugins.RenderCheckboxesPlugin;
import com.opendoorlogistics.studio.components.map.plugins.utils.PluginUtils;
public class NominatimMap implements Disposable{
private final GeocodeModel model;
private final MapApiImpl map;
NominatimMap(GeocodeModel model){
this.model = model;
ArrayList<MapPlugin> plugins = new ArrayList<MapPlugin>();
plugins.add(new PanMapPlugin());
plugins.add(new MyMovePlugin());
plugins.add(new RenderCheckboxesPlugin());
map = new MapApiImpl(plugins, null, null, GeocoderMapObjects.createDrawableDs(model));
map.getPanel().setPreferredSize(new Dimension(600, 200));
}
Component getComponent(){
return map.getPanel();
}
void update(){
map.setObjects(GeocoderMapObjects.createDrawableDs(model));
map.repaint(false);
}
void zoomBestFit(){
map.setViewToBestFit(map.getMapDataApi().getUnfilteredActiveTable());
}
private class MyMovePlugin implements MapPlugin, MapActionFactory{
@Override
public String getId() {
return "nominatim-move-geocode-plugin";
}
@Override
public void initMap(MapApi api) {
PluginUtils.registerActionFactory(api, this, StandardMapMenuOrdering.MOVE_MODE, "mapmode",0);
}
@Override
public Action create(MapApi api) {
AbstractAction action = new AbstractAction()
{
@Override
public void actionPerformed(ActionEvent e) {
if(!PluginUtils.exitIfInMode(api, NominatimMovePoint.class)){
api.setMapMode(new NominatimMovePoint());
}
}
};
PluginUtils.initAction("Move point","Move the geocoded point around by clicking on its new position", "tool-move-16x16.png", action);
return action;
}
}
private class NominatimMovePoint extends AbstractMapMode {
@Override
public Cursor getCursor() {
return PluginUtils.createCursor("tool-move.png", 17, 15);
}
@Override
public void mouseDragged(MouseEvent evt) {
super.mouseDragged(evt);
if(isDragging()){
movePoint(evt);
}
}
@Override
public void mouseClicked(MouseEvent e) {
movePoint(e);
}
private void movePoint(MouseEvent evt) {
LatLong ll = map.createImmutableConverter().getLongLat(evt.getX(), evt.getY());
model.setGeocode(ll);
}
}
@Override
public void dispose() {
map.dispose();
}
}