Author: jlaba...@google.com
Date: Wed Jan  7 09:20:26 2009
New Revision: 4394

Modified:
     
releases/1.6/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForPopupEvents.java
    releases/1.6/user/src/com/google/gwt/user/client/ui/PopupPanel.java
    releases/1.6/user/src/com/google/gwt/user/datepicker/client/DateBox.java
    releases/1.6/user/test/com/google/gwt/user/client/ui/PopupTest.java

Log:
Replaced PopupPanel#setAutoHidePartner() with  
PopupPanel#addAutoHidePartner() so multiple partners can be specified.

Patch by: jlabanca
Review by: ecc
Issue: 3254



Modified:  
releases/1.6/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForPopupEvents.java
==============================================================================
---  
releases/1.6/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForPopupEvents.java
     
(original)
+++  
releases/1.6/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForPopupEvents.java
     
Wed Jan  7 09:20:26 2009
@@ -24,12 +24,14 @@
  import com.google.gwt.user.client.Window;
  import com.google.gwt.user.client.ui.Button;
  import com.google.gwt.user.client.ui.HTML;
+import com.google.gwt.user.client.ui.HorizontalPanel;
+import com.google.gwt.user.client.ui.Label;
  import com.google.gwt.user.client.ui.PopupPanel;
  import com.google.gwt.user.client.ui.VerticalPanel;
  import com.google.gwt.user.client.ui.Widget;

  /**
- * A simple tree used to quickly exercise tree behavior.
+ * Visual tests for {...@link PopupPanel}.
   */
  public class VisualsForPopupEvents extends AbstractIssue {
    static int xPos = 0;
@@ -37,10 +39,26 @@
    @Override
    public Widget createIssue() {
      VerticalPanel panel = new VerticalPanel();
+    panel.setSpacing(3);
+    {
+      PopupPanel popup = createButton(true, false, panel);
+      Label partner0 = new Label("AutoHide Partner 0");
+      Label partner1 = new Label("AutoHide Partner 1");
+      popup.addAutoHidePartner(partner0.getElement());
+      popup.addAutoHidePartner(partner1.getElement());
+
+      HorizontalPanel hPanel = new HorizontalPanel();
+      hPanel.setBorderWidth(1);
+      hPanel.setSpacing(3);
+      hPanel.add(partner0);
+      hPanel.add(partner1);
+      panel.add(new Label(
+          "Clicking on partners should not autoHide this popup:"));
+      panel.add(hPanel);
+    }
      createButton(true, true, panel);
-    createButton(true, false, panel);
-    createButton(false, true, panel);
      createButton(false, false, panel);
+    createButton(false, true, panel);
      return panel;
    }

@@ -59,7 +77,8 @@
      return false;
    }

-  private void createButton(boolean autoHide, boolean modal, VerticalPanel  
panel) {
+  private PopupPanel createButton(boolean autoHide, boolean modal,
+      VerticalPanel panel) {
      final String text = " popup " + (modal ? " modal " : " non-modal ")
          + (autoHide ? "auto hide" : " persistent");
      panel.add(new HTML("<h2>" + text + "</h2>"));
@@ -85,5 +104,7 @@
              + event.isAutoClosed());
        }
      });
+
+    return p;
    }
  }

Modified:  
releases/1.6/user/src/com/google/gwt/user/client/ui/PopupPanel.java
==============================================================================
--- releases/1.6/user/src/com/google/gwt/user/client/ui/PopupPanel.java  
(original)
+++ releases/1.6/user/src/com/google/gwt/user/client/ui/PopupPanel.java Wed  
Jan  7 09:20:26 2009
@@ -34,6 +34,9 @@
  import com.google.gwt.user.client.Event.NativePreviewHandler;
  import com.google.gwt.user.client.ui.impl.PopupImpl;

+import java.util.ArrayList;
+import java.util.List;
+
  /**
   * A panel that can "pop up" over other widgets. It overlays the browser's
   * client area (and any previously-created popups).
@@ -280,7 +283,7 @@

    private boolean isAnimationEnabled = false;

-  private Element autoHidePartner;
+  private List<Element> autoHidePartners;

    /**
     * The {...@link ResizeAnimation} used to open and close the {...@link  
PopupPanel}s.
@@ -334,6 +337,20 @@
      this.modal = modal;
    }

+  /**
+   * Mouse events that occur within an autoHide partner will not hide a  
panel
+   * set to autoHide.
+   *
+   * @param partner the auto hide partner to add
+   */
+  public void addAutoHidePartner(Element partner) {
+    assert partner != null : "partner cannot be null";
+    if (autoHidePartners == null) {
+      autoHidePartners = new ArrayList<Element>();
+    }
+    autoHidePartners.add(partner);
+  }
+
    public HandlerRegistration addCloseHandler(CloseHandler<PopupPanel>  
handler) {
      return addHandler(handler, CloseEvent.getType());
    }
@@ -536,6 +553,18 @@
      return true;
    }

+  /**
+   * Remove an autoHide partner.
+   *
+   * @param partner the auto hide partner to remove
+   */
+  public void removeAutoHidePartner(Element partner) {
+    assert partner != null : "partner cannot be null";
+    if (autoHidePartners != null) {
+      autoHidePartners.remove(partner);
+    }
+  }
+
    @Deprecated
    public void removePopupListener(PopupListener listener) {
      ListenerWrapper.Popup.remove(this, listener);
@@ -556,16 +585,6 @@
    }

    /**
-   * If the auto hide partner is non null, its mouse events will not hide a
-   * panel set to autohide.
-   *
-   * @param element new auto hide partner
-   */
-  public void setAutoHidePartner(Element element) {
-    this.autoHidePartner = element;
-  }
-
-  /**
     * Sets the height of the panel's child widget. If the panel's child  
widget
     * has not been set, the height passed in will be cached and used to set  
the
     * height immediately after the child widget is set.
@@ -834,14 +853,23 @@
    }-*/;

    /**
-   * Does the event target the partner element?
+   * Does the event target one of the partner elements?
     *
     * @param event the native event
-   * @return true if the event targets the partner
+   * @return true if the event targets a partner
     */
    private boolean eventTargetsPartner(Event event) {
-    return autoHidePartner != null
-        && autoHidePartner.isOrHasChild(event.getTarget());
+    if (autoHidePartners == null) {
+      return false;
+    }
+
+    Element target = event.getTarget();
+    for (Element elem : autoHidePartners) {
+      if (elem.isOrHasChild(target)) {
+        return true;
+      }
+    }
+    return false;
    }

    /**
@@ -855,7 +883,7 @@
    }

    /**
-   * Get the element that {...@link PopupImpl} uses.  PopupImpl creates an  
element
+   * Get the element that {...@link PopupImpl} uses. PopupImpl creates an  
element
     * that goes inside of the outer element, so all methods in PopupImpl are
     * relative to the first child of the outer element, not the outer  
element
     * itself.
@@ -867,7 +895,8 @@
    }

    /**
-   * Positions the popup, called after the offset width and height of the  
popup are known.
+   * Positions the popup, called after the offset width and height of the  
popup
+   * are known.
     *
     * @param relativeObject the ui object to position relative to
     * @param offsetWidth the drop down's offset width

Modified:  
releases/1.6/user/src/com/google/gwt/user/datepicker/client/DateBox.java
==============================================================================
---  
releases/1.6/user/src/com/google/gwt/user/datepicker/client/DateBox.java        
 
(original)
+++  
releases/1.6/user/src/com/google/gwt/user/datepicker/client/DateBox.java        
 
Wed Jan  7 09:20:26 2009
@@ -267,7 +267,7 @@
      this.format = format;

      popup.setAutoHideEnabled(true);
-    popup.setAutoHidePartner(box.getElement());
+    popup.addAutoHidePartner(box.getElement());
      popup.setWidget(picker);
      popup.setStyleName("dateBoxPopup");


Modified:  
releases/1.6/user/test/com/google/gwt/user/client/ui/PopupTest.java
==============================================================================
--- releases/1.6/user/test/com/google/gwt/user/client/ui/PopupTest.java  
(original)
+++ releases/1.6/user/test/com/google/gwt/user/client/ui/PopupTest.java Wed  
Jan  7 09:20:26 2009
@@ -15,6 +15,8 @@
   */
  package com.google.gwt.user.client.ui;

+import com.google.gwt.dom.client.DivElement;
+import com.google.gwt.dom.client.Document;
  import com.google.gwt.junit.client.GWTTestCase;
  import com.google.gwt.user.client.Element;
  import com.google.gwt.user.client.Timer;
@@ -80,6 +82,18 @@
      assertTrue(popup.isPreviewingAllNativeEvents());
      popup.setPreviewingAllNativeEvents(false);
      assertFalse(popup.isPreviewingAllNativeEvents());
+  }
+
+  public void testAutoHidePartner() {
+    final PopupPanel popup = new PopupPanel();
+
+    // Add a partner
+    DivElement partner0 = Document.get().createDivElement();
+    popup.addAutoHidePartner(partner0);
+    popup.addAutoHidePartner(Document.get().createDivElement());
+
+    // Remove a partner
+    popup.removeAutoHidePartner(partner0);
    }

    /**

--~--~---------~--~----~------------~-------~--~----~
http://groups.google.com/group/Google-Web-Toolkit-Contributors
-~----------~----~----~----~------~----~------~--~---

Reply via email to