AppletJSUtil.java :  » GWT » gwtai » com » google » gwt » gwtai » applet » client » Java Open Source

Java Open Source » GWT » gwtai 
gwtai » com » google » gwt » gwtai » applet » client » AppletJSUtil.java
/*
 * 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);
  }-*/;

}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.