package ch.unifr.pai.twice.dragndrop.client.configuration; /* * Copyright 2013 Oliver Schmid * 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. */ import ch.unifr.pai.twice.dragndrop.client.factories.DropHandlerFactory; import ch.unifr.pai.twice.dragndrop.client.intf.DragNDropHandler; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Widget; /** * This configures the way how a drag can be visualized and restricted. * * @author Oliver Schmid * */ public class DragConfiguration { /** * The drag and drop handler to be used to react on drag events */ private final DragNDropHandler handler; /** * A boundary box. A dragged widget can not leave this widget */ private final Widget boundaryBox; /** * A HTML representation of the drag proxy (the semi-transparent visualization of a currently dragged widget) */ private Element dragProxy; /** * If a drag proxy shall be used */ private final boolean withProxy; /** * @return a default configuration without a drag proxy - the widget will be dragged itself (it does therefore not remain in its original position) */ public static DragConfiguration withoutProxy() { return withoutProxy(null, null); } /** * @return a default configuration with a drag proxy */ public static DragConfiguration withProxy() { return withProxy(null, null); } /** * @param handler * @return a default configuration with a custom {@link DragNDropHandler} without a drag proxy - the widget will be dragged itself (it does therefore not * remain in its original position) */ public static DragConfiguration withoutProxy(DragNDropHandler handler) { return withoutProxy(handler, null); } /** * @param handler * @return a default configuration with a custom {@link DragNDropHandler} with a proxy */ public static DragConfiguration withProxy(DragNDropHandler handler) { return withProxy(handler, null); } /** * @param boundaryBox * @return a default configuration with a boundary box and without a drag proxy - the widget will be dragged itself (it does therefore not remain in its * original position) */ public static DragConfiguration withoutProxy(Widget boundaryBox) { return withoutProxy(null, boundaryBox); } /** * @param boundaryBox * @return a default configuration with a boundary box and with a drag proxy */ public static DragConfiguration withProxy(Widget boundaryBox) { return withProxy(null, boundaryBox); } /** * @param handler * @param boundaryBox * @return a default configuration with a custom {@link DragNDropHandler}, a boundary box and without a drag proxy - the widget will be dragged itself (it * does therefore not remain in its original position */ public static DragConfiguration withoutProxy(DragNDropHandler handler, Widget boundaryBox) { return new DragConfiguration(handler, boundaryBox, false); } /** * @param handler * @param boundaryBox * @return a default configuration with a custom {@link DragNDropHandler}, a boundary box and with a drag proxy */ public static DragConfiguration withProxy(DragNDropHandler handler, Widget boundaryBox) { return new DragConfiguration(handler, boundaryBox, true); } /** * A private constructor - use the static factory methods for instantiation * * @param handler * - if null, the {@link DropHandlerFactory#defaultHandler()} will be used. * @param boundaryBox * @param withProxy */ private DragConfiguration(DragNDropHandler handler, Widget boundaryBox, boolean withProxy) { this.handler = handler != null ? handler : DropHandlerFactory.defaultHandler(); this.boundaryBox = boundaryBox; this.withProxy = withProxy; } /** * @return the assigned drag and drop handler */ public DragNDropHandler getDragNDropHandler() { return handler; } /** * @return the boundaries of permitted drags - if no boundary box is provided, this is 0 */ public int getMinX() { return boundaryBox != null ? boundaryBox.getAbsoluteLeft() : 0; } /** * @return the boundaries of permitted drags - if no boundary box is provided, this equals to the client width */ public int getMaxX() { return boundaryBox != null ? boundaryBox.getAbsoluteLeft() + boundaryBox.getOffsetWidth() : Window.getClientWidth(); } /** * @return the boundaries of permitted drags - if no boundary box is provided, this is 0 */ public int getMinY() { return boundaryBox != null ? boundaryBox.getAbsoluteTop() : 0; } /** * @return the boundaries of permitted drags - if no boundary box is provided, this equals to the client height */ public int getMaxY() { return boundaryBox != null ? boundaryBox.getAbsoluteTop() + boundaryBox.getOffsetHeight() : Window.getClientHeight(); } /** * @return if this drag configuration contains a proxy */ public boolean isWithProxy() { return withProxy; } /** * @return the drag proxy */ public Element getDragProxy() { return dragProxy; } /** * @param dragProxy */ public void setDragProxy(Element dragProxy) { if (dragProxy.getId() != null && !dragProxy.getId().equals("")) dragProxy.setId(dragProxy.getId() + "PROXY"); this.dragProxy = dragProxy; } }