Author: [EMAIL PROTECTED] Date: Tue Oct 7 07:54:14 2008 New Revision: 3724
Modified: trunk/user/src/com/google/gwt/user/client/ui/DialogBox.java trunk/user/src/com/google/gwt/user/client/ui/PopupPanel.java Log: Let users drag DialogBoxes off the screen in any direction, but only as long as the mouse pointer stays in the window -- so you can't totally lose a DialogBox. patch by: ajr review by: rdayal suggested by: jgw Modified: trunk/user/src/com/google/gwt/user/client/ui/DialogBox.java ============================================================================== --- trunk/user/src/com/google/gwt/user/client/ui/DialogBox.java (original) +++ trunk/user/src/com/google/gwt/user/client/ui/DialogBox.java Tue Oct 7 07:54:14 2008 @@ -15,9 +15,12 @@ */ package com.google.gwt.user.client.ui; +import com.google.gwt.dom.client.Document; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.Event; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.WindowResizeListener; /** * A form of popup that has a caption area at the top and can be dragged by the @@ -69,6 +72,10 @@ private boolean dragging; private int dragStartX, dragStartY; private MouseListenerCollection mouseListeners = new MouseListenerCollection(); + private WindowResizeListener resizeListener; + private int windowWidth; + private int clientLeft; + private int clientTop; /** * Creates an empty dialog box. It should not be shown until its child widget @@ -114,6 +121,10 @@ // Set the style name setStyleName(DEFAULT_STYLENAME); sinkEvents(Event.MOUSEEVENTS); + + windowWidth = Window.getClientWidth(); + clientLeft = Document.get().getBodyOffsetLeft(); + clientTop = Document.get().getBodyOffsetTop(); } public String getHTML() { @@ -125,6 +136,12 @@ } @Override + public void hide() { + Window.removeWindowResizeListener(resizeListener); + super.hide(); + } + + @Override public void onBrowserEvent(Event event) { super.onBrowserEvent(event); @@ -178,6 +195,14 @@ if (dragging) { int absX = x + getAbsoluteLeft(); int absY = y + getAbsoluteTop(); + + // if the mouse is off the screen to the left, right, or top, don't + // move the dialog box. This would let users lose dialog boxes, which + // would be bad for modal popups. + if (absX < clientLeft || absX >= windowWidth || absY < clientTop) { + return; + } + setPopupPosition(absX - dragStartX, absY - dragStartY); } } @@ -209,6 +234,19 @@ */ public void setText(String text) { caption.setText(text); + } + + @Override + public void show() { + if (resizeListener == null) { + resizeListener = new WindowResizeListener() { + public void onWindowResized(int width, int height) { + windowWidth = width; + } + }; + } + Window.addWindowResizeListener(resizeListener); + super.show(); } @Override Modified: trunk/user/src/com/google/gwt/user/client/ui/PopupPanel.java ============================================================================== --- trunk/user/src/com/google/gwt/user/client/ui/PopupPanel.java (original) +++ trunk/user/src/com/google/gwt/user/client/ui/PopupPanel.java Tue Oct 7 07:54:14 2008 @@ -573,17 +573,6 @@ * @param top the top position, in pixels */ public void setPopupPosition(int left, int top) { - // Keep the popup within the browser's client area, so that they can't get - // 'lost' and become impossible to interact with. Note that we don't attempt - // to keep popups pegged to the bottom and right edges, as they will then - // cause scrollbars to appear, so the user can't lose them. - if (left < 0) { - left = 0; - } - if (top < 0) { - top = 0; - } - // Save the position of the popup leftPosition = left; topPosition = top; --~--~---------~--~----~------------~-------~--~----~ http://groups.google.com/group/Google-Web-Toolkit-Contributors -~----------~----~----~----~------~----~------~--~---