Merge "ChangeScreen2: Simplify update available bar"
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen2.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen2.java
index 2f9a670..3536abc 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen2.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen2.java
@@ -45,9 +45,9 @@
 import com.google.gerrit.client.ui.UserActivityMonitor;
 import com.google.gerrit.common.changes.ListChangesOption;
 import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Change.Status;
 import com.google.gerrit.reviewdb.client.PatchSet;
 import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.Change.Status;
 import com.google.gerrit.reviewdb.client.Project.SubmitType;
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.core.client.JsArray;
@@ -57,8 +57,6 @@
 import com.google.gwt.dom.client.NativeEvent;
 import com.google.gwt.event.dom.client.ClickEvent;
 import com.google.gwt.event.dom.client.KeyPressEvent;
-import com.google.gwt.event.logical.shared.CloseEvent;
-import com.google.gwt.event.logical.shared.CloseHandler;
 import com.google.gwt.event.logical.shared.ValueChangeEvent;
 import com.google.gwt.event.shared.HandlerRegistration;
 import com.google.gwt.resources.client.CssResource;
@@ -71,7 +69,6 @@
 import com.google.gwt.user.client.ui.Button;
 import com.google.gwt.user.client.ui.FlowPanel;
 import com.google.gwt.user.client.ui.HTMLPanel;
-import com.google.gwt.user.client.ui.PopupPanel;
 import com.google.gwt.user.client.ui.ToggleButton;
 import com.google.gwtexpui.clippy.client.CopyableLabel;
 import com.google.gwtexpui.globalkey.client.GlobalKey;
@@ -203,10 +200,6 @@
 
   @Override
   protected void onUnload() {
-    if (updateAvailable != null) {
-      updateAvailable.hide(true);
-      updateAvailable = null;
-    }
     if (updateCheck != null) {
       updateCheck.cancel();
       updateCheck = null;
@@ -742,18 +735,12 @@
           lastDisplayedUpdate = newTime;
         }
       };
-      updateAvailable.addCloseHandler(new CloseHandler<PopupPanel>() {
-        @Override
-        public void onClose(CloseEvent<PopupPanel> event) {
-          updateAvailable = null;
-        }
-      });
     }
     updateAvailable.set(
         Natives.asList(nm).subList(om.length(), nm.length()),
         newInfo.updated());
-    if (!updateAvailable.isShowing()) {
-      updateAvailable.popup();
+    if (!updateAvailable.isAttached()) {
+      add(updateAvailable);
     }
   }
 
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/UpdateAvailableBar.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/UpdateAvailableBar.java
index 2837b15..1dece8b 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/UpdateAvailableBar.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/UpdateAvailableBar.java
@@ -14,52 +14,34 @@
 
 package com.google.gerrit.client.change;
 
-import com.google.gerrit.client.Gerrit;
 import com.google.gerrit.client.changes.ChangeInfo.MessageInfo;
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.dom.client.Element;
 import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.event.logical.shared.ResizeEvent;
-import com.google.gwt.event.logical.shared.ResizeHandler;
-import com.google.gwt.event.shared.HandlerRegistration;
-import com.google.gwt.resources.client.CssResource;
 import com.google.gwt.uibinder.client.UiBinder;
 import com.google.gwt.uibinder.client.UiField;
 import com.google.gwt.uibinder.client.UiHandler;
-import com.google.gwt.user.client.Window;
-import com.google.gwt.user.client.Window.ScrollEvent;
-import com.google.gwt.user.client.Window.ScrollHandler;
 import com.google.gwt.user.client.ui.Anchor;
+import com.google.gwt.user.client.ui.Composite;
 import com.google.gwt.user.client.ui.HTMLPanel;
-import com.google.gwt.user.client.ui.PopupPanel;
-import com.google.gwt.user.client.ui.RootPanel;
 
 import java.sql.Timestamp;
 import java.util.HashSet;
 import java.util.List;
 
 /** Displays the "New Message From ..." panel in bottom right on updates. */
-abstract class UpdateAvailableBar extends PopupPanel {
+abstract class UpdateAvailableBar extends Composite {
   interface Binder extends UiBinder<HTMLPanel, UpdateAvailableBar> {}
   private static final Binder uiBinder = GWT.create(Binder.class);
 
-  static interface Style extends CssResource {
-    String popup();
-  }
-
   private Timestamp updated;
-  private HandlerRegistration resizer;
-  private HandlerRegistration scroller;
 
-  @UiField Style style;
   @UiField Element author;
   @UiField Anchor show;
   @UiField Anchor ignore;
 
   UpdateAvailableBar() {
-    super(/* autoHide = */ false, /* modal = */ false);
-    add(uiBinder.createAndBindUi(this));
-    setStyleName(style.popup());
+    initWidget(uiBinder.createAndBindUi(this));
   }
 
   void set(List<MessageInfo> newMessages, Timestamp newTime) {
@@ -76,63 +58,6 @@
     }
     author.setInnerText(r.toString());
     updated = newTime;
-
-    if (isShowing()) {
-      setPopupPosition(
-          Window.getScrollLeft() + Window.getClientWidth() - getOffsetWidth(),
-          Window.getScrollTop() + Window.getClientHeight() - getOffsetHeight());
-    }
-  }
-
-  void popup() {
-    setPopupPositionAndShow(new PositionCallback() {
-      @Override
-      public void setPosition(int w, int h) {
-        w += 7; // Initial information is wrong, adjust with some slop.
-        h += 19;
-        setPopupPosition(
-            Window.getScrollLeft() + Window.getClientWidth() - w,
-            Window.getScrollTop() + Window.getClientHeight() - h);
-      }
-    });
-    if (resizer == null) {
-      resizer = Window.addResizeHandler(new ResizeHandler() {
-        @Override
-        public void onResize(ResizeEvent event) {
-          setPopupPosition(
-              Window.getScrollLeft() + event.getWidth() - getOffsetWidth(),
-              Window.getScrollTop() + event.getHeight() - getOffsetHeight());
-        }
-      });
-    }
-    if (scroller == null) {
-      scroller = Window.addWindowScrollHandler(new ScrollHandler() {
-        @Override
-        public void onWindowScroll(ScrollEvent event) {
-          RootPanel b = Gerrit.getBottomMenu();
-          int br = b.getAbsoluteLeft() + b.getOffsetWidth();
-          int bp = b.getAbsoluteTop() + b.getOffsetHeight();
-          int wr = event.getScrollLeft() + Window.getClientWidth();
-          int wp = event.getScrollTop() + Window.getClientHeight();
-          setPopupPosition(
-              Math.min(br, wr) - getOffsetWidth(),
-              Math.min(bp, wp) - getOffsetHeight());
-        }
-      });
-    }
-  }
-
-  @Override
-  public void hide() {
-    if (resizer != null) {
-      resizer.removeHandler();
-      resizer = null;
-    }
-    if (scroller != null) {
-      scroller.removeHandler();
-      scroller = null;
-    }
-    super.hide();
   }
 
   @UiHandler("show")
@@ -143,7 +68,7 @@
   @UiHandler("ignore")
   void onIgnore(ClickEvent e) {
     onIgnore(updated);
-    hide();
+    removeFromParent();
   }
 
   abstract void onShow();
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/UpdateAvailableBar.ui.xml b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/UpdateAvailableBar.ui.xml
index a6cd124..1c46b8c 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/UpdateAvailableBar.ui.xml
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/UpdateAvailableBar.ui.xml
@@ -18,8 +18,12 @@
     xmlns:ui='urn:ui:com.google.gwt.uibinder'
     xmlns:c='urn:import:com.google.gwtexpui.globalkey.client'
     xmlns:g='urn:import:com.google.gwt.user.client.ui'>
-  <ui:style type='com.google.gerrit.client.change.UpdateAvailableBar.Style'>
+  <ui:style>
     .popup {
+      position: fixed;
+      bottom: 0;
+      right: 0;
+      z-index: 10;
       padding: 5px;
     }
     .bar {
@@ -39,21 +43,23 @@
       margin-left: 0.5em;
     }
   </ui:style>
-  <g:HTMLPanel styleName='{style.bar}'>
-    <ui:msg>Update from <span ui:field='author'/></ui:msg>
-    <g:Anchor ui:field='show'
-        styleName='{style.action}'
-        href='javascript:;'
-        title='Refresh screen and display updates'>
-      <ui:attribute name='title'/>
-      <ui:msg>Show</ui:msg>
-    </g:Anchor>
-    <g:Anchor ui:field='ignore'
-        styleName='{style.action}'
-        href='javascript:;'
-        title='Ignore this update'>
-      <ui:attribute name='title'/>
-      <ui:msg>Ignore</ui:msg>
-    </g:Anchor>
+  <g:HTMLPanel styleName='{style.popup}'>
+    <div class='{style.bar}'>
+      <ui:msg>Update from <span ui:field='author'/></ui:msg>
+      <g:Anchor ui:field='show'
+          styleName='{style.action}'
+          href='javascript:;'
+          title='Refresh screen and display updates'>
+        <ui:attribute name='title'/>
+        <ui:msg>Show</ui:msg>
+      </g:Anchor>
+      <g:Anchor ui:field='ignore'
+          styleName='{style.action}'
+          href='javascript:;'
+          title='Ignore this update'>
+        <ui:attribute name='title'/>
+        <ui:msg>Ignore</ui:msg>
+      </g:Anchor>
+    </div>
   </g:HTMLPanel>
 </ui:UiBinder>