/*
 * 特别声明：本技术材料受《中华人民共和国著作权法》、《计算机软件保护条例》等法律、法规、行政
 *   规章以及有关国际条约的保护，赞同科技享有知识产权、保留一切权利并视其为技术秘密。未经本公司书
 *  *面许可，任何人不得擅自（包括但不限于：以非法的方式复制、传播、展示、镜像、上载、下载）使用，
 *   不得向第三方泄露、透露、披露。否则，本公司将依法追究侵权者的法律责任。特此声明！
 *
 *   Special Declaration: These technical material reserved as the technical secrets by AGREE
 *  *TECHNOLOGY have been protected by the "Copyright Law" "ordinances on Protection of Computer
 *   Software" and other relevant administrative regulations and international treaties. Without
 *   the written permission of the Company, no person may use (including but not limited to the
 *   illegal copy, distribute, display, image, upload, and download) and disclose the above
 *  technical documents to any third party. Otherwise, any infringer shall afford the legal
 *  liability to the company.
 */

package cn.com.agree;

import cn.com.agree.adore.AbstractAdoreBrowser;
import cn.com.agree.adore.IAdoreBrowser;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.browser.BrowserFunction;
import org.eclipse.swt.widgets.Display;

import java.io.File;

/**
 * Created by 余雄伟 on 2016-11-3.
 */
public class XulrunnerAdoreBrowser extends AbstractAdoreBrowser {

    private Browser browser;

    private static String homePageURL = "file://" + new File("http/www/index.html").getAbsolutePath();

    private IAdoreBrowserMessageHandler messageHandler;
    MessageCallback callback;

    public XulrunnerAdoreBrowser(Browser browser){
        this.browser = browser;
        callback =  new MessageCallback(this.browser,"dispatch");

    }

    @Override
    public void addMessageHandler(IAdoreBrowserMessageHandler messageHandler) {
        this.messageHandler = messageHandler;
        callback.setMessageHandler(messageHandler);
    }

    @Override
    public void loadHomePage() {
        Display.getDefault().asyncExec(new Runnable(){

            @Override
            public void run() {
                browser.setUrl(homePageURL);
            }
        });
    }

    @Override
    public void jsReadyCallback() {

    }

    @Override
    public void evaluateJavascript(final String script) {
        System.out.println(script);
        Display.getDefault().syncExec(new Runnable() {

            @Override
            public void run() {
                browser.evaluate(script);
            }
        });
    }
}


class MessageCallback extends BrowserFunction {

    private IAdoreBrowser.IAdoreBrowserMessageHandler messageHandler;

    public void setMessageHandler(IAdoreBrowser.IAdoreBrowserMessageHandler messageHandler){
        this.messageHandler = messageHandler;
    }

    public MessageCallback(Browser browser, String name) {
        super(browser, name);
    }

    @Override
    public Object function(Object[] arguments) {
        String msg =(String) arguments[0];
        System.out.println(msg);
        return messageHandler.onMessage(msg);
    }
}