Automatically reposition/resize file browser if window changes

Signed-off-by: Shawn O. Pearce <sop@google.com>
diff --git a/src/main/java/com/google/gerrit/client/patches/PatchBrowserPopup.java b/src/main/java/com/google/gerrit/client/patches/PatchBrowserPopup.java
index 30ec97a..214eb9a 100644
--- a/src/main/java/com/google/gerrit/client/patches/PatchBrowserPopup.java
+++ b/src/main/java/com/google/gerrit/client/patches/PatchBrowserPopup.java
@@ -17,6 +17,9 @@
 import com.google.gerrit.client.changes.PatchTable;
 import com.google.gerrit.client.changes.Util;
 import com.google.gerrit.client.reviewdb.Patch;
+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.user.client.Command;
 import com.google.gwt.user.client.Window;
 import com.google.gwt.user.client.ui.FlowPanel;
@@ -25,10 +28,12 @@
 import com.google.gwtexpui.globalkey.client.GlobalKey;
 import com.google.gwtexpui.user.client.PluginSafeDialogBox;
 
-class PatchBrowserPopup extends PluginSafeDialogBox implements PositionCallback {
+class PatchBrowserPopup extends PluginSafeDialogBox implements
+    PositionCallback, ResizeHandler {
   private final Patch.Key callerKey;
   private final PatchTable fileList;
   private final ScrollPanel sp;
+  private HandlerRegistration regWindowResize;
 
   PatchBrowserPopup(final Patch.Key pk, final PatchTable fl) {
     super(true/* autohide */, false/* modal */);
@@ -61,13 +66,30 @@
     setPopupPosition(sLeft + dLeft, (sTop + cHeight) - (myHeight + 10));
   }
 
-  public void open() {
+  @Override
+  public void onResize(final ResizeEvent event) {
     sp.setWidth((Window.getClientWidth() - 60) + "px");
-    if (!fileList.isLoaded()) {
-      sp.setHeight("22px");
+    setPosition(getOffsetWidth(), getOffsetHeight());
+  }
+
+  @Override
+  public void hide() {
+    if (regWindowResize != null) {
+      regWindowResize.removeHandler();
+      regWindowResize = null;
     }
-    setPopupPositionAndShow(this);
+    super.hide();
+  }
+
+  @Override
+  public void show() {
+    super.show();
+    if (regWindowResize == null) {
+      regWindowResize = Window.addResizeHandler(this);
+    }
+
     GlobalKey.dialog(this);
+
     if (fileList.isLoaded()) {
       installFileList();
     } else {
@@ -82,6 +104,14 @@
     }
   }
 
+  public void open() {
+    if (!fileList.isLoaded()) {
+      sp.setHeight("22px");
+    }
+    sp.setWidth((Window.getClientWidth() - 60) + "px");
+    setPopupPositionAndShow(this);
+  }
+
   private void installFileList() {
     fileList.setRegisterKeys(true);
     fileList.movePointerTo(callerKey);