com.google.gwt.query.client.plugins.UiPlugin.java Source code

Java tutorial

Introduction

Here is the source code for com.google.gwt.query.client.plugins.UiPlugin.java

Source

/*
 * Copyright 2011, The gwtquery team.
 * 
 * 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.query.client.plugins;

import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Element;
import com.google.gwt.event.shared.GwtEvent;
import com.google.gwt.event.shared.HasHandlers;
import com.google.gwt.query.client.Function;
import com.google.gwt.query.client.GQuery;
import com.google.gwt.query.client.Predicate;

/**
 * GWT clone of jQueryUi-core. This class define some function present in the
 * jQuery-ui core and not directly in jQuery
 * 
 */
public class UiPlugin extends GQuery {

    /**
     * A POJO used to store dimension of an element
     * 
     */
    public static class Dimension {
        private int height = 0;
        private int width = 0;

        public Dimension(Element e) {
            width = e.getOffsetWidth();
            height = e.getOffsetHeight();
        }

        public Dimension(int width, int height) {
            this.width = width;
            this.height = height;
        }

        /**
         * return the height value.
         */
        public int getHeight() {
            return height;
        }

        /**
         * return the width value
         */
        public int getWidth() {
            return width;
        }
    }

    private static class GQueryUiImpl {

        public GQuery scrollParent(final UiPlugin gQueryUi) {
            GQuery scrollParent;

            if ("fixed".equals(gQueryUi.css("position", false))) {
                return GQuery.$(getViewportElement());
            }

            if (scrollParentPositionTest(gQueryUi)) {
                scrollParent = gQueryUi.parents().filter(new Predicate() {

                    public boolean f(Element e, int index) {
                        GQuery $e = GQuery.$(e);
                        String position = $e.css("position", true);
                        return ("relative".equals(position) || "absolute".equals(position)
                                || "fixed".equals(position)) && isOverflowEnabled($e);
                    }
                });

            } else {
                scrollParent = gQueryUi.parents().filter(new Predicate() {

                    public boolean f(Element e, int index) {
                        return isOverflowEnabled(GQuery.$(e));
                    }
                });
            }
            return scrollParent.length() > 0 ? $(scrollParent.get(0)) : $(getViewportElement());

        }

        protected boolean scrollParentPositionTest(UiPlugin gQueryUi) {
            return "absolute".equals(gQueryUi.css("position"));
        }

        private final Element getViewportElement() {
            return GQuery.document.isCSS1Compat() ? GQuery.document.getDocumentElement()
                    : GQuery.document.getBody();
        }

        private boolean isOverflowEnabled(GQuery e) {
            String overflow = e.css("overflow", true) + e.css("overflow-x", true) + e.css("overflow-y", true);
            return overflow.contains("auto") || overflow.contains("scroll");
        }

    }

    @SuppressWarnings("unused")
    private static class GQueryUiImplTrident extends GQueryUiImpl {

        @Override
        protected boolean scrollParentPositionTest(UiPlugin gQueryUi) {
            String position = gQueryUi.css("position", false);
            return ("absolute".equals(position) || "relative".equals(position) || "static".equals(position));
        }

    }

    public static Class<UiPlugin> GQueryUi = UiPlugin.class;

    // Register the plugin in GQuery
    static {
        GQuery.registerPlugin(UiPlugin.class, new Plugin<UiPlugin>() {
            public UiPlugin init(GQuery gq) {
                return new UiPlugin(gq);
            }
        });
    }

    /**
     * Return true if the <code>descendant</code> is a child of the parent. Return false elsewhere.
     */
    public static boolean contains(Element parent, Element descendant) {
        return parent != descendant && parent.isOrHasChild(descendant);
    }

    protected static void trigger(GwtEvent<?> e, Function callback, Element element, HasHandlers handlerManager) {
        if (handlerManager != null && e != null) {
            handlerManager.fireEvent(e);
        }
        if (callback != null) {
            callback.f(element.<com.google.gwt.dom.client.Element>cast());
        }
    }

    protected HasHandlers eventBus;

    private GQueryUiImpl impl = GWT.create(GQueryUiImpl.class);

    protected UiPlugin(GQuery gq) {
        super(gq);
    }

    /**
     * Return the immediate scrolling parent.
     */
    public GQuery scrollParent() {
        return impl.scrollParent(this);
    }

    /**
     * fire event and call callback function.
     * 
     */
    protected void trigger(GwtEvent<?> e, Function callback, Element element) {
        trigger(e, callback, element, eventBus);
    }

}