/* * Copyright 2010-2016, Sikuli.org, sikulix.com * Released under the MIT License. */ package org.sikuli.script; import java.lang.reflect.Array; import java.lang.reflect.Method; import java.util.EventListener; import org.sikuli.basics.Debug; import org.sikuli.util.JLangHelperInterface; import org.sikuli.util.JRubyHelper; import org.sikuli.util.JythonHelper; /** * Use this class to implement call back methods for the Region observers * onAppear, onVanish and onChange. <br> * by overriding the respective method appeared, vanished or changed * <pre> * example: * aRegion.onAppear(anImageOrPattern, * new ObserverCallBack() { * appeared(ObserveEvent e) { * // do something * } * } * ); * </pre> * when the image appears, your above call back appeared() will be called<br> * see {@link ObserveEvent} about the features available in the callback function */ public class ObserverCallBack implements EventListener { private Object callback = null; private ObserveEvent.Type obsType = ObserveEvent.Type.GENERIC; private JLangHelperInterface scriptHelper = null; private String scriptRunnerType = null; public ObserverCallBack() { } public ObserverCallBack(Object callback, ObserveEvent.Type obsType) { this.callback = callback; this.obsType = obsType; if (callback.getClass().getName().contains("org.python")) { scriptRunnerType = "jython"; scriptHelper = JythonHelper.get(); } else if (callback.getClass().getName().contains("org.jruby")) { scriptRunnerType = "jruby"; scriptHelper = JRubyHelper.get(); } else { Debug.error("ObserverCallBack: %s init: ScriptRunner not available for class %s", obsType, callback.getClass().getName()); } } public ObserveEvent.Type getType() { return obsType; } public void appeared(ObserveEvent e) { if (scriptHelper != null && ObserveEvent.Type.APPEAR.equals(obsType)) { run(e); } } public void vanished(ObserveEvent e) { if (scriptHelper != null && ObserveEvent.Type.VANISH.equals(obsType)) { run(e); } } public void changed(ObserveEvent e) { if (scriptHelper != null && ObserveEvent.Type.CHANGE.equals(obsType)) { run(e); } } public void happened(ObserveEvent e) { if (scriptHelper != null && ObserveEvent.Type.GENERIC.equals(obsType)) { run(e); } } public void findfailed(ObserveEvent e) { if (scriptHelper != null && ObserveEvent.Type.FINDFAILED.equals(obsType)) { run(e); } } public void missing(ObserveEvent e) { if (scriptHelper != null && ObserveEvent.Type.MISSING.equals(obsType)) { run(e); } } private void run(ObserveEvent e) { boolean success = true; Object[] args = new Object[]{callback, e}; if (scriptHelper != null) { success = scriptHelper.runObserveCallback(args); if (!success) { Debug.error("ObserverCallBack: problem with scripting handler: %s\n%s", scriptHelper.getClass().getName(), callback.getClass().getName()); } } } public void setType(ObserveEvent.Type givenType) { obsType = givenType; } }