com.allen_sauer.gwt.dnd.client.util.WidgetArea.java Source code

Java tutorial

Introduction

Here is the source code for com.allen_sauer.gwt.dnd.client.util.WidgetArea.java

Source

/*
 * Copyright 2009 Fred Sauer
 *
 * 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.allen_sauer.gwt.dnd.client.util;

import com.google.gwt.dom.client.Element;
import com.google.gwt.user.client.ui.Widget;

/*
 * * Class to represent a rectangular region of a widget relative to another
 * widget. Also keeps
 * track of the size of the widget borders and its inner width and height.
 */
public class WidgetArea extends AbstractArea {

    public WidgetArea(Widget widget, Widget reference) {
        setLeft(widget.getAbsoluteLeft());
        setTop(widget.getAbsoluteTop());

        if (reference != null) {
            setLeft(getLeft() - reference.getAbsoluteLeft() - DOMUtil.getBorderLeft(reference.getElement()));
            setTop(getTop() - reference.getAbsoluteTop() - DOMUtil.getBorderTop(reference.getElement()));
        }
        setRight(getLeft() + widget.getOffsetWidth());
        setBottom(getTop() + widget.getOffsetHeight());

        Element elem = widget.getElement().getOffsetParent();
        Element p;

        while (elem != null && (p = elem.getOffsetParent()) != null) {
            if (!"visible".equals(DOMUtil.getEffectiveStyle(elem, "overflow"))) {
                int left = elem.getAbsoluteLeft();

                if (getLeft() < left) {
                    setLeft(left);
                }

                int top = elem.getAbsoluteTop();
                if (getTop() < top) {
                    setTop(top);
                }

                int bottom = top + elem.getOffsetHeight();
                if (getBottom() > bottom) {
                    setBottom(Math.max(getTop(), bottom));
                }

                int right = left + elem.getOffsetWidth();
                if (getRight() > right) {
                    setRight(Math.max(getLeft(), right));
                }
            }

            elem = p;
        }
    }

}