Package cing.client

Source Code of cing.client.StyleSheetLoader$StyleTesterTimer

/*
* Copyright 2008 Google Inc.
*
* 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 cing.client;

import com.google.gwt.dom.client.Document;
import com.google.gwt.dom.client.HeadElement;
import com.google.gwt.dom.client.LinkElement;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.DeferredCommand;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;

/**
* A utility class that loads style sheets.
*/
public class StyleSheetLoader {
  /**
   * A {@link Timer} that creates a small reference widget used to determine
   * when a new style sheet has finished loading. The widget has a natural
   * width of 0px, but when the style sheet is loaded, the width changes to
   * 5px. The style sheet should contain a style definition that is passed
   * into the constructor that defines a height and width greater than 0px.
   */
  private static class StyleTesterTimer extends Timer {
    private Command callback;
    private Label refWidget;

    /**
     * Create a new {@link StyleTesterTimer}.
     *
     * @param refStyleName
     *            the reference style name
     * @param callback
     *            the callback to execute when the style sheet loads
     */
    public StyleTesterTimer(String refStyleName, Command callback) {
      this.callback = callback;

      // Create the reference Widget
      refWidget = new Label();
      refWidget.setStyleName(refStyleName);
      refWidget.getElement().getStyle().setProperty("position", "absolute");
      refWidget.getElement().getStyle().setProperty("visibility", "hidden");
      refWidget.getElement().getStyle().setProperty("display", "inline");
      refWidget.getElement().getStyle().setPropertyPx("padding", 0);
      refWidget.getElement().getStyle().setPropertyPx("margin", 0);
      refWidget.getElement().getStyle().setPropertyPx("border", 0);
      refWidget.getElement().getStyle().setPropertyPx("top", 0);
      refWidget.getElement().getStyle().setPropertyPx("left", 0);
      RootPanel.get().add(refWidget);
    }

    @Override
    public void run() {
      // Redisplay the reference widget so it redraws itself
      refWidget.setVisible(false);
      refWidget.setVisible(true);

      // Check the dimensions of the reference widget
      if (refWidget.getOffsetWidth() > 0) {
        RootPanel.get().remove(refWidget);

        // Fire the callback in a DeferredCommand to ensure the browser
        // has
        // enough time to parse the styles. Otherwise, we'll get weird
        // styling
        // issues.
        DeferredCommand.addCommand(callback);
      } else {
        schedule(10);
      }
    }
  }

  /**
   * Convenience method for getting the document's head element.
   *
   * @return the document's head element
   */
  public static native HeadElement getHeadElement()
  /*-{
    return $doc.getElementsByTagName("head")[0];
  }-*/;

  /**
   * Load a style sheet onto the page.
   *
   * @param href
   *            the url of the style sheet
   */
  public static void loadStyleSheet(String href) {
    LinkElement linkElem = Document.get().createLinkElement();
    linkElem.setRel("stylesheet");
    linkElem.setType("text/css");
    linkElem.setHref(href);
    getHeadElement().appendChild(linkElem);
  }

  /**
   * Load a style sheet onto the page and fire a callback when it has loaded.
   * The style sheet should contain a style definition called refStyleName
   * that defines a height and width greater than 0px.
   *
   * @param href
   *            the url of the style sheet
   * @param refStyleName
   *            the style name of the reference element
   * @param callback
   *            the callback executed when the style sheet has loaded
   */
  public static void loadStyleSheet(String href, String refStyleName, Command callback) {
    loadStyleSheet(href);
    waitForStyleSheet(refStyleName, callback);
  }

  /**
   * Detect when a style sheet has loaded by placing an element on the page
   * that is affected by a rule in the style sheet, as described in
   * {@link #loadStyleSheet(String, String, Command)}. When the style sheet
   * has loaded, the callback will be executed.
   *
   * @param refStyleName
   *            the style name of the reference element
   * @param callback
   *            the callback executed when the style sheet has loaded
   */
  public static void waitForStyleSheet(String refStyleName, Command callback) {
    new StyleTesterTimer(refStyleName, callback).run();
  }
}
TOP

Related Classes of cing.client.StyleSheetLoader$StyleTesterTimer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.