package com.opendoorlogistics.studio.components.map.plugins.utils;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.image.BufferedImage;
import java.beans.PropertyChangeListener;
import java.io.IOException;
import java.net.URL;
import java.util.LinkedList;
import javax.imageio.ImageIO;
import javax.swing.Action;
import javax.swing.SwingUtilities;
import com.opendoorlogistics.api.standardcomponents.map.MapActionFactory;
import com.opendoorlogistics.api.standardcomponents.map.MapApi;
import com.opendoorlogistics.api.standardcomponents.map.MapApiListeners.OnBuildContextMenu;
import com.opendoorlogistics.api.standardcomponents.map.MapApiListeners.OnBuildToolbarListener;
import com.opendoorlogistics.api.standardcomponents.map.MapApiListeners.OnObjectsChanged;
import com.opendoorlogistics.api.standardcomponents.map.MapPopupMenu;
import com.opendoorlogistics.api.standardcomponents.map.MapToolbar;
import com.opendoorlogistics.api.tables.ODLTable;
import com.opendoorlogistics.api.tables.ODLTableReadOnly;
import com.opendoorlogistics.api.tables.beans.BeanMappedRow;
import com.opendoorlogistics.core.gis.map.data.DrawableObject;
import com.opendoorlogistics.core.gis.map.data.DrawableObjectImpl;
import com.opendoorlogistics.core.tables.beans.BeanMapping.BeanTableMappingImpl;
import com.opendoorlogistics.utils.ui.Icons;
public class PluginUtils {
// final JPopupMenu wizardsPopupMenu = new JPopupMenu();
// JMenu wizardsMenu = new JMenu("Component wizard...");
// for(ODLAction action : wizardActions){
// wizardsPopupMenu.add(action);
// wizardsMenu.add(action);
// }
// wizardsMenuButton = new DropDownMenuButton(Icons.loadFromStandardPath("tools-wizard-2.png")) {
//
// @Override
// protected JPopupMenu getPopupMenu() {
// return wizardsPopupMenu;
// }
// };
// wizardsMenuButton.setToolTipText("Run the component wizard");
// toolBar.add(wizardsMenuButton);
// popup.add(wizardsMenu);
public static void registerActionFactory(final MapApi api,final MapActionFactory factory, int priority,final String group, final long needsFlags){
class WrapperAction implements Action{
final Action decorated;
final OnObjectsChanged assignedListener;
WrapperAction(OnObjectsChanged listener){
decorated = factory.create(api);
this.assignedListener = listener;
}
public void actionPerformed(ActionEvent e) {
decorated.actionPerformed(e);
}
public Object getValue(String key) {
return decorated.getValue(key);
}
public void putValue(String key, Object value) {
decorated.putValue(key, value);
}
public void setEnabled(boolean b) {
decorated.setEnabled(b);
}
public boolean isEnabled() {
return decorated.isEnabled();
}
public void addPropertyChangeListener(PropertyChangeListener listener) {
decorated.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
decorated.removePropertyChangeListener(listener);
}
public void updateEnabled(){
boolean enabled = getIsEnabled(api, needsFlags);
setEnabled(enabled);
}
}
// Create an OnObjectsChanged listener to update all WrapperActions
// in the map toolbar assigned to this listener.
final OnObjectsChanged listener = new OnObjectsChanged() {
@Override
public void onObjectsChanged(MapApi api) {
MapToolbar toolbar = api.getMapToolbar();
if(toolbar!=null){
for(Action action : toolbar.getActions()){
if(action!=null && WrapperAction.class.isInstance(action)){
WrapperAction wa = (WrapperAction)action;
if(wa.assignedListener == this){
wa.updateEnabled();
}
}
}
}
}
};
api.registerObjectsChangedListener(listener, 0);
api.registerOnBuildToolbarListener(new OnBuildToolbarListener() {
@Override
public void onBuildToolbar(MapApi api, MapToolbar toolBar) {
toolBar.add(new WrapperAction(listener), group);
}
}, priority);
api.registerOnBuildContextMenuListener(new OnBuildContextMenu() {
@Override
public void onBuildContextMenu(MapApi api, MapPopupMenu menu) {
WrapperAction action = new WrapperAction(listener);
action.updateEnabled();
menu.add(action, group);
}
}, priority);
}
public static void registerActionFactory(MapApi api,final MapActionFactory factory, int priority,final String group){
api.registerOnBuildToolbarListener(new OnBuildToolbarListener() {
@Override
public void onBuildToolbar(MapApi api, MapToolbar toolBar) {
toolBar.add(factory.create(api), group);
}
}, priority);
api.registerOnBuildContextMenuListener(new OnBuildContextMenu() {
@Override
public void onBuildContextMenu(MapApi api, MapPopupMenu menu) {
menu.add(factory.create(api), group);
}
}, priority);
}
public static void initAction(String name, String description, String iconName, Action action){
action.putValue(Action.NAME, name);
action.putValue(Action.SMALL_ICON, Icons.loadFromStandardPath(iconName));
action.putValue(Action.SHORT_DESCRIPTION, description);
action.putValue(Action.SHORT_DESCRIPTION, description);
}
public static Cursor createCursor(String imagefile, int xhotspot, int yhotspot){
Toolkit toolkit = Toolkit.getDefaultToolkit();
BufferedImage image;
try {
// Use own class loader to prevent problems when jar loaded by reflection
URL url = PluginUtils.class.getResource("/resources/icons/" + imagefile);
image = ImageIO.read(url);
} catch (IOException e) {
throw new RuntimeException();
}
// Image image = toolkit.getImage("/resources/icons/" + imagefile);
Cursor cursor = toolkit.createCustomCursor(image, new Point(xhotspot, yhotspot), imagefile);
return cursor;
}
public static void drawRectangle(Graphics2D g, Rectangle rectangle, Color fillColour) {
Color borderColour = new Color(0, 0, 0, 100);
g.setColor(borderColour);
g.draw(rectangle);
g.setColor(fillColour);
g.fill(rectangle);
}
public static LinkedList<DrawableObject> getVisibleDrawables(final MapApi api) {
ODLTableReadOnly drawablesTable = api.getMapDataApi().getFilteredAllLayersTable(true);
return toDrawables(drawablesTable);
}
public static LinkedList<DrawableObject> toDrawables(ODLTableReadOnly drawablesTable) {
BeanTableMappingImpl btm = DrawableObjectImpl.getBeanMapping().getTableMapping(0);
LinkedList<DrawableObject> list = new LinkedList<DrawableObject>();
for(BeanMappedRow r: btm.readObjectsFromTable(drawablesTable)){
list.add((DrawableObject)r);
}
return list;
}
public static boolean exitIfInMode(MapApi api, Class<?> modeClass){
if(api.getMapMode()!=null && modeClass.isInstance(api.getMapMode())&& api.getDefaultMapMode()!=null ){
api.setMapMode(api.getDefaultMapMode());
return true;
}
return false;
}
public static boolean getIsEnabled(final MapApi api, final long needsFlags) {
ODLTable table = api.getMapDataApi().getUnfilteredActiveTable();
boolean enabled = false;
if(table!=null){
enabled = (table.getFlags() & needsFlags) ==needsFlags;
}
return enabled;
}
public static void exitModeIfNeeded(MapApi api, final Class<?> modeClass, long needsFlags,final boolean clearSelection) {
if(!PluginUtils.getIsEnabled(api, needsFlags)){
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
PluginUtils.exitIfInMode(api, modeClass);
if(clearSelection){
api.clearSelection();
}
}
});
}
}
}