com.google.gwt.query.client.plugins.UiPlugin Maven / Gradle / Ivy
/*
* 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 GQueryUi = UiPlugin.class;
// Register the plugin in GQuery
static {
GQuery.registerPlugin(UiPlugin.class, new Plugin() {
public UiPlugin init(GQuery gq) {
return new UiPlugin(gq);
}
});
}
/**
* Return true if the descendant
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.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);
}
}