package org.phylowidget.ui;
import java.util.HashMap;
import org.andrewberman.ui.UIEvent;
import org.andrewberman.ui.ifaces.UIListener;
import org.andrewberman.ui.menu.Menu;
import org.andrewberman.ui.menu.MenuItem;
import org.andrewberman.ui.unsorted.DelayedAction;
import org.andrewberman.ui.unsorted.JSCaller;
import org.andrewberman.ui.unsorted.Json;
import org.phylowidget.PWContext;
import org.phylowidget.PWPlatform;
import org.phylowidget.TreeManager;
import processing.core.PApplet;
public class Callback extends Menu implements UIListener
{
private PWContext pwc;
private TreeManager tm;
private PhyloContextMenu contextMenu;
private TreeClipboard clipboard;
private boolean addedClipboardListener;
private boolean addedContextListener;
private boolean addedTreeListener;
private JSCaller caller;
private DelayedAction action;
public Callback(PApplet app)
{
super(app);
caller = new JSCaller(app);
callbackNeeded = false;
action = new DelayedAction() {
@Override
protected void run()
{
fireJavascriptCallback();
}
};
}
private boolean callbackNeeded;
@Override
public synchronized void draw()
{
super.draw();
loadUIStuff();
if (callbackNeeded)
{
if (limitRate)
{
action.trigger(50);
} else
{
fireJavascriptCallback();
}
callbackNeeded = false;
}
}
private void loadUIStuff()
{
if (pwc == null)
pwc = PWPlatform.getInstance().getThisAppContext();
if (tm == null)
{
if (pwc != null)
{
tm = pwc.trees();
}
}
if (tm != null && !addedTreeListener)
{
tm.addListener(this);
addedTreeListener = true;
}
if (contextMenu == null)
{
if (pwc != null)
{
this.contextMenu = pwc.ui().contextMenu;
}
}
if (contextMenu != null && !addedContextListener)
{
contextMenu.addListener(this);
addedContextListener = true;
}
if (clipboard == null)
{
clipboard = pwc.ui().clipboard;
}
if (clipboard != null && !addedClipboardListener)
{
clipboard.addListener(this);
addedClipboardListener = true;
}
}
private boolean limitRate = true;
public void setLimitRate(boolean limitRate)
{
this.limitRate = limitRate;
}
private boolean includeNodeInfo = false;
public void setIncludeNodeInfo(boolean includeNodeInfo)
{
this.includeNodeInfo = includeNodeInfo;
}
private String callbackEvent;
public void setEvent(String event)
{
this.callbackEvent = event;
}
private String callback;
public void setCallback(String callback)
{
this.callback = callback;
}
private boolean isMyCallback(UIEvent e)
{
return isTreeCallback(e) || isGlowCallback(e) || isHoverCallback(e) || isOpenCallback(e) || isClipCallback(e);
}
private boolean isTreeCallback(UIEvent e)
{
return (e.getID() == TreeManager.TREE_CHANGE_EVENT && callbackEvent.toLowerCase().contains("tree"));
}
private boolean isGlowCallback(UIEvent e)
{
return (e.getID() == PhyloContextMenu.NODE_GLOW_EVENT && callbackEvent.toLowerCase().contains("glow"));
}
private boolean isHoverCallback(UIEvent e)
{
return (e.getID() == PhyloContextMenu.NODE_HOVER_EVENT && callbackEvent.toLowerCase().contains("hover"));
}
private boolean isOpenCallback(UIEvent e)
{
return (e.getID() == PhyloContextMenu.CONTEXT_OPEN_EVENT && callbackEvent.toLowerCase().contains("open"));
}
private boolean isClipCallback(UIEvent e)
{
return (e.getID() == TreeClipboard.CLIPBOARD_UPDATED && callbackEvent.toLowerCase().contains("clip"));
}
private void fireJavascriptCallback()
{
try {
// System.out.println(callback+" "+getName());
if (caller == null)
return;
if (callback == null)
return;
if (caller.reflectionWorking)
{
if (includeNodeInfo)
{
// System.out.println("Callback with node info!");
HashMap<String,Object> map = pwc.ui().getHoveredNode().getNodeInfo();
// System.out.println(map);
caller.call(callback,Json.hashToJson(map));
} else
{
caller.call(callback);
}
}
} catch (Exception e)
{
e.printStackTrace();
// System.err.println(e.getMessage());
}
}
@Override
public MenuItem create(String label)
{
return null;
}
public void uiEvent(UIEvent e)
{
if (isMyCallback(e))
{
callbackNeeded = true;
}
}
@Override
public void dispose()
{
super.dispose();
if (tm != null)
tm.removeListener(this);
if (contextMenu != null)
contextMenu.removeListener(this);
}
}