Fix: Two UI update issues in change screen.

Select the last patch set in the
"Old Version History" drop-down list, then
the buttons disappear together with the diff,
but selecting a different patch doesn't make
the buttons reappear.

Expand a collapsed patch set panel and re-close
it. Change the base item to another one, then
open it again and find the patch list can not
update automatically according to the new
selected base item.

This patchset fixed them.

Change-Id: Ibef98e9ffa3659a9ab6137d08f3e9d4e43df5c4a
Signed-off-by: Bruce Zu <bruce.zu@sonymobile.com>
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchSetComplexDisclosurePanel.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchSetComplexDisclosurePanel.java
index ca8aedf..77099ab 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchSetComplexDisclosurePanel.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchSetComplexDisclosurePanel.java
@@ -128,6 +128,12 @@
    * followed by the action buttons.
    */
   public void ensureLoaded(final PatchSetDetail detail) {
+    loadInfoTable(detail);
+    loadActionPanel(detail);
+    loadPatchTable(detail);
+  }
+
+  public void loadInfoTable(final PatchSetDetail detail) {
     infoTable = new Grid(R_CNT, 2);
     infoTable.setStyleName(Gerrit.RESOURCES.css().infoBlock());
     infoTable.addStyleName(Gerrit.RESOURCES.css().patchSetInfoBlock());
@@ -153,15 +159,13 @@
     displayDownload();
 
     body.add(infoTable);
+  }
 
+  public void loadActionPanel(final PatchSetDetail detail) {
     if (!patchSet.getId().equals(diffBaseId)) {
-      patchTable = new PatchTable();
-      patchTable.setSavePointerId("PatchTable " + patchSet.getId());
-      patchTable.display(diffBaseId, detail);
-
       actionsPanel = new FlowPanel();
       actionsPanel.setStyleName(Gerrit.RESOURCES.css().patchSetActions());
-      body.add(actionsPanel);
+      actionsPanel.setVisible(true);
       if (Gerrit.isSignedIn()) {
         if (changeDetail.canEdit()) {
           populateReviewAction();
@@ -173,18 +177,28 @@
           if (changeDetail.canPublish()) {
             populatePublishAction();
           }
-          if (changeDetail.canDeleteDraft() &&
-              changeDetail.getPatchSets().size() > 1) {
+          if (changeDetail.canDeleteDraft()
+              && changeDetail.getPatchSets().size() > 1) {
             populateDeleteDraftPatchSetAction();
           }
         }
       }
       populateDiffAllActions(detail);
-      body.add(patchTable);
+      body.add(actionsPanel);
+    }
+  }
 
-      for(ClickHandler clickHandler : registeredClickHandler) {
+  public void loadPatchTable(final PatchSetDetail detail) {
+    if (!patchSet.getId().equals(diffBaseId)) {
+      patchTable = new PatchTable();
+      patchTable.setSavePointerId("PatchTable " + patchSet.getId());
+      patchTable.display(diffBaseId, detail);
+      for (ClickHandler clickHandler : registeredClickHandler) {
         patchTable.addClickHandler(clickHandler);
       }
+      patchTable.setRegisterKeys(true);
+      setActive(true);
+      body.add(patchTable);
     }
   }
 
@@ -644,34 +658,45 @@
   }
 
   public void refresh() {
-    AccountDiffPreference diffPrefs;
-    if (patchTable == null) {
-      diffPrefs = new ListenableAccountDiffPreference().get();
+    if (patchSet.getId().equals(diffBaseId)) {
+      if (patchTable != null) {
+        patchTable.setVisible(false);
+      }
+      if (actionsPanel != null) {
+        actionsPanel.setVisible(false);
+      }
     } else {
-      diffPrefs = patchTable.getPreferences().get();
-    }
+      if (patchTable != null) {
+        if (patchTable.getBase() == null && diffBaseId == null
+            || patchTable.getBase() != null
+            && patchTable.getBase().equals(diffBaseId)) {
+          actionsPanel.setVisible(true);
+          patchTable.setVisible(true);
+          return;
+        }
+      }
 
-    Util.DETAIL_SVC.patchSetDetail2(diffBaseId, patchSet.getId(), diffPrefs,
-        new GerritCallback<PatchSetDetail>() {
-          @Override
-          public void onSuccess(PatchSetDetail result) {
-            if (patchSet.getId().equals(diffBaseId)) {
-              patchTable.setVisible(false);
-              actionsPanel.setVisible(false);
-            } else {
-              if (patchTable != null) {
-                patchTable.removeFromParent();
-              }
-              patchTable = new PatchTable();
-              patchTable.display(diffBaseId, result);
-              body.add(patchTable);
+      AccountDiffPreference diffPrefs;
+      if (patchTable == null) {
+        diffPrefs = new ListenableAccountDiffPreference().get();
+      } else {
+        diffPrefs = patchTable.getPreferences().get();
+        patchTable.setVisible(false);
+      }
 
-              for (ClickHandler clickHandler : registeredClickHandler) {
-                patchTable.addClickHandler(clickHandler);
+      Util.DETAIL_SVC.patchSetDetail2(diffBaseId, patchSet.getId(), diffPrefs,
+          new GerritCallback<PatchSetDetail>() {
+            @Override
+            public void onSuccess(PatchSetDetail result) {
+              if (actionsPanel != null) {
+                actionsPanel.setVisible(true);
+              } else {
+                loadActionPanel(result);
               }
+              loadPatchTable(result);
             }
-          }
-        });
+          });
+    }
   }
 
   @Override
@@ -687,8 +712,8 @@
       Util.DETAIL_SVC.patchSetDetail2(diffBaseId, patchSet.getId(), diffPrefs,
           new GerritCallback<PatchSetDetail>() {
             public void onSuccess(final PatchSetDetail result) {
-              ensureLoaded(result);
-              patchTable.setRegisterKeys(true);
+              loadInfoTable(result);
+              loadActionPanel(result);
             }
           });
     }
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchSetsBlock.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchSetsBlock.java
index f206d6e..005423f 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchSetsBlock.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchSetsBlock.java
@@ -89,12 +89,6 @@
     for (final PatchSet ps : patchSets) {
       final PatchSetComplexDisclosurePanel p =
           new PatchSetComplexDisclosurePanel(ps, ps == currps);
-      if (diffBaseId != null) {
-        p.setDiffBaseId(diffBaseId);
-        if (ps == currps) {
-          p.refresh();
-        }
-      }
       add(p);
       patchSetPanelsList.add(p);
     }
@@ -175,7 +169,6 @@
         deactivate();
         PatchSetComplexDisclosurePanel patchSetPanel =
             patchSetPanels.get(patchSetId);
-        patchSetPanel.setOpen(true);
         patchSetPanel.setActive(true);
         activePatchSetId = patchSetId;
       }
@@ -226,6 +219,9 @@
     public void onOpen(OpenEvent<DisclosurePanel> event) {
       // when a patch set panel is opened by the user
       // it should automatically become active
+      PatchSetComplexDisclosurePanel patchSetPanel =
+          patchSetPanels.get(patchSetId);
+      patchSetPanel.refresh();
       activate(patchSetId);
     }
 
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchTable.java
index b228cf2..b8acd56 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchTable.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchTable.java
@@ -119,6 +119,10 @@
     }
   }
 
+  public PatchSet.Id getBase() {
+    return base;
+  }
+
   public void setSavePointerId(final String id) {
     savePointerId = id;
   }