com.google.gwt.gwtai.applet.client.AppletJSUtil.java Source code

Java tutorial

Introduction

Here is the source code for com.google.gwt.gwtai.applet.client.AppletJSUtil.java

Source

/*
 * Copyright 2010 Adrian Buerki
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */

package com.google.gwt.gwtai.applet.client;

import java.util.HashMap;

import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Element;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Widget;

/**
 * GWT-side utility class.
 * 
 * @author Adrian Buerki <a.buerki@gmail.com>
 */
public class AppletJSUtil {

    static {
        CallbackUtil.defineBridgeMethod();
    }

    /**
     * Constructs an <code>HTML</code> element which contains an applet tag. The HTML specification
     * states that the <code>applet</code> tag is deprecated. But the browser support for the <code>object</code>
     * and <code>embed</code> tag is currently inconsistent. So using the <code>applet</code> tag is the only 
     * consistent way to deploy a Java Applet across browsers on all platforms.
     *
     * @param applet The <code>Applet</code> to take the information from.
     * @return An <code>HTML</code> element which contains an applet tag.
     */
    public static Widget createAppletWidget(Applet applet) {
        String htmlCode = createAppletHTML(applet);

        if (htmlCode != null) {
            return new HTML(htmlCode);
        }

        return null;
    }

    /**
     * Constructs an applet tag. The HTML specification states that the <code>applet</code> tag is deprecated.
     * But the browser support for the <code>object</code> and <code>embed</code> tag is currently
     * inconsistent. So using the <code>applet</code> tag is the only consistent way to deploy a Java Applet
     * across browsers on all platforms.
     *
     * @param applet The <code>Applet</code> to take the information from.
     * @return The applet tag.
     */
    public static String createAppletHTML(Applet applet) {
        if (applet instanceof AppletAccomplice) {
            AppletAccomplice aapplet = (AppletAccomplice) applet;

            String htmlCode = "<applet mayscript='true'" + " code='" + aapplet.getCode() + "' width='"
                    + aapplet.getWidth() + "' height='" + aapplet.getHeight() + "' name='" + aapplet.getName()
                    + "' id='" + aapplet.getName()
                    + "' alt='Java Runtime Environment is not working on your system'";

            if (null != aapplet.getCodebase()) {
                htmlCode += "codebase='" + aapplet.getCodebase() + "'";
            }

            if (null != aapplet.getArchive()) {
                htmlCode += "archive='" + aapplet.getArchive() + "'";
            }

            if (null != aapplet.getAlign()) {
                htmlCode += "align='" + aapplet.getAlign() + "'";
            }

            htmlCode += ">";

            HashMap<String, String> parameters = aapplet.getParameters();

            if (parameters != null && !parameters.isEmpty()) {
                for (String name : parameters.keySet()) {
                    htmlCode += createParamTag(name, parameters.get(name));
                }
            }

            htmlCode += createParamTag("java_version", aapplet.getJavaVersion());
            htmlCode += createParamTag("java_arguments", aapplet.getJavaArguments());
            htmlCode += createParamTag("separate_jvm", aapplet.hasSeparateJVM());
            htmlCode += createParamTag("image", aapplet.getLoadingImage());
            htmlCode += createParamTag("applet_name", aapplet.getName());

            htmlCode += "</applet>";

            return htmlCode;
        }

        return null;
    }

    public static Widget createAppletWidget(Applet applet, String forceJavaVersion) {
        if (applet instanceof AppletAccomplice) {
            AppletAccomplice aapplet = (AppletAccomplice) applet;

            String codebase = GWT.getModuleBaseURL();

            String htmlCode = "<p style='text-align: center;'><script src='http://java.com/js/deployJava.js'></script>"
                    + "<script>deployJava.runApplet({codebase:'" + codebase + "', ";

            if (null != aapplet.getArchive()) {
                htmlCode += "archive:'" + aapplet.getArchive() + "', ";
            }

            htmlCode += "code:'" + aapplet.getCode() + "', width:'" + aapplet.getWidth() + "', Height:'"
                    + aapplet.getHeight() + "'}, null, '" + forceJavaVersion + "');" + "</script></p>";

            return new HTML(htmlCode);
        }

        return null;
    }

    /**
     * Registers an instance of your <code>AppletCallback</code>
     * implementation to listen for callbacks coming from the given
     * <code>Applet</code>. The actual <code>Applet</code> implementation
     * can check whether an <code>AppletCallback</code> handler is installed,
     * if so it can notify the given <code>AppletCallback</code> instance
     * about updates or events.
     * 
     * Example:
     * 
     * First, register a listening <code>AppletCallback</code> object:
     * <code>AppletJSUtil.registerAppletCallback(stopWatchApplet,
     * new StopWatchCallback(panelLaps));</code>
     * 
     * Then callback to GWT from your <code>Applet</code> implementation
     * (Java):
     * <code>AppletUtil.callback(StopWatchAppletImpl.this, _swLabel.getText());</code>
     * 
     * @param applet -
     *            The <code>Applet</code> instance to listen to.
     * @param appletCallback -
     *            The <code>AppletCallback</code> instance to notify once a
     *            callback is coming.
     */
    public static void registerAppletCallback(Applet applet, AppletCallback<? extends Object> appletCallback) {
        if (applet instanceof AppletAccomplice) {
            AppletAccomplice aapplet = (AppletAccomplice) applet;

            CallbackUtil.registerCallback(aapplet.getName(), appletCallback);
        }
    }

    /**
     * Calls the method with the given name on the <code>Applet</code>
     * instance.
     * 
     * @param applet -
     *            The <code>Applet</code> instance to call the method on.
     * @param methodName -
     *            The name of the method to call.
     */
    public static void call(Applet applet, String methodName) {
        if (applet instanceof AppletAccomplice) {
            String id = ((AppletAccomplice) applet).getId();
            Element elem = DOM.getElementById(id);

            call(elem, methodName);
        }
    }

    /**
     * Calls the method with the given name on the <code>Applet</code>
     * instance.
     * 
     * @param applet -
     *            The <code>Applet</code> instance to call the method on.
     * @param methodName -
     *            The name of the method to call.
     * @param args -
     *            The method arguments.
     */
    public static void call(Applet applet, String methodName, Object[] args) {
        if (applet instanceof AppletAccomplice) {
            String id = ((AppletAccomplice) applet).getId();
            Element elem = DOM.getElementById(id);

            call(elem, methodName, args);
        }
    }

    /**
     * Helper-method to create a param tag.
     */
    private static String createParamTag(String name, Object value) {
        if (value != null) {
            return "<param name='" + name + "' value='" + value + "'>";
        }

        return "";
    }

    /**
     * Helper-method to do the actual calling.
     */
    private static native Object call(Element elem, String methodName) /*-{
                                                                       var theFunc = elem[methodName];
                                                                       return theFunc();
                                                                       }-*/;

    /**
     * Helper-method to do the actual calling.
     */
    private static native Object call(Element elem, String methodName, Object args) /*-{
                                                                                    var theFunc = elem[methodName];
                                                                                    return theFunc(args);
                                                                                    }-*/;

}