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.JOptionPane; 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 MovePointPlugin implements MapPlugin, MapActionFactory{ private static final long NEEDS_FLAGS = TableFlags.UI_SET_ALLOWED; @Override public void initMap(MapApi api) { PluginUtils.registerActionFactory(api, this, StandardMapMenuOrdering.MOVE_MODE, "mapmode",NEEDS_FLAGS); } @Override public String getId(){ return "com.opendoorlogistics.studio.components.map.plugins.MovePointPlugin"; } @Override public Action create(final MapApi api) { AbstractAction action = new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { if(!PluginUtils.exitIfInMode(api, MovePointMode.class)){ api.setMapMode(new MovePointMode(api)); } } }; PluginUtils.initAction("Move point","Move the selected point around by clicking on its new position", "tool-move-16x16.png", action); return action; } private static class MovePointMode extends AbstractMapMode { private final MapApi api; public MovePointMode(MapApi api) { this.api = api; } @Override public Cursor getCursor() { return PluginUtils.createCursor("tool-move.png", 17, 15); } @Override public void onObjectsChanged(MapApi api) { PluginUtils.exitModeIfNeeded(api, MovePointMode.class, NEEDS_FLAGS,false); } @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) { final long [] selectedIds = api.getSelectedIds(); if(selectedIds == null || selectedIds.length == 0 ){ JOptionPane.showMessageDialog(api.getMapWindowComponent(), "No point selected to move"); } else if (selectedIds.length>1){ JOptionPane.showMessageDialog(api.getMapWindowComponent(), "Cannot move more than one point at a time."); } else{ final MapDataApi mdapi = api.getMapDataApi(); mdapi.runTransactionOnGlobalDatastore(new Callable<Boolean>() { @Override public Boolean call() throws Exception { LatLong ll = api.createImmutableConverter().getLongLat(evt.getX(), evt.getY()); ODLTable drawables = mdapi.getUnfilteredActiveTable(); if(drawables!=null){ long id = selectedIds[0]; drawables.setValueById(ll.getLatitude(), id, mdapi.getLatitudeColumn()); drawables.setValueById(ll.getLongitude(), id, mdapi.getLongitudeColumn()); } return true; } }); } } } }