package com.opendoorlogistics.studio.components.map.plugins;
import java.awt.Cursor;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.util.concurrent.Callable;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.SwingUtilities;
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.MapDataApi;
import com.opendoorlogistics.api.standardcomponents.map.MapPlugin;
import com.opendoorlogistics.api.standardcomponents.map.StandardMapMenuOrdering;
import com.opendoorlogistics.api.tables.ODLTable;
import com.opendoorlogistics.api.tables.TableFlags;
import com.opendoorlogistics.studio.components.map.AbstractMapMode;
import com.opendoorlogistics.studio.components.map.plugins.utils.PluginUtils;
public class CreatePointPlugin implements MapPlugin, MapActionFactory{
private final static long NEEDS_FLAGS = TableFlags.UI_INSERT_ALLOWED | TableFlags.UI_SET_ALLOWED;
@Override
public String getId(){
return "com.opendoorlogistics.studio.components.map.plugins.CreatePointPlugin";
}
@Override
public void initMap(MapApi api) {
PluginUtils.registerActionFactory(api, this, StandardMapMenuOrdering.ADD_MODE, "mapmode",NEEDS_FLAGS);
}
@Override
public Action create(final MapApi api) {
AbstractAction action = new AbstractAction()
{
@Override
public void actionPerformed(ActionEvent e) {
if(!PluginUtils.exitIfInMode(api, AddMode.class)){
api.setMapMode(new AddMode(api));
}
}
};
PluginUtils.initAction("Create point", "Create new points by clicking on the map.", "new_item_16x16.png", action);
return action;
}
private static class AddMode extends AbstractMapMode {
private final MapApi api;
public AddMode(MapApi api) {
this.api = api;
}
@Override
public Cursor getCursor() {
return PluginUtils.createCursor("new_item_32x32.png", 17, 16);
}
@Override
public void mousePressed(MouseEvent e) {
super.mousePressed(e);
MapDataApi mdapi = api.getMapDataApi();
mdapi.runTransactionOnGlobalDatastore(new Callable<Boolean>() {
@Override
public Boolean call() throws Exception {
ODLTable table = mdapi.getUnfilteredActiveTable();
if(table!=null){
final int rowIndx = table.createEmptyRow(-1);
if(rowIndx==-1){
return false;
}
LatLong ll = api.createImmutableConverter().getLongLat(e.getX(), e.getY());
table.setValueAt(ll.getLatitude(), rowIndx, mdapi.getLatitudeColumn());
table.setValueAt(ll.getLongitude(), rowIndx, mdapi.getLongitudeColumn());
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
api.setSelectedIds(new long[]{table.getRowId(rowIndx)});
}
});
}
return true;
}
});
}
@Override
public void onObjectsChanged(MapApi api) {
PluginUtils.exitModeIfNeeded(api, AddMode.class, NEEDS_FLAGS,false);
}
}
}