summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Ostrovsky <david@ostrovsky.org>2013-06-08 20:10:25 +0200
committerShawn Pearce <sop@google.com>2013-06-14 04:35:23 +0000
commit5394b9fb1b16ebf5f21ff465bf70c311caf3d582 (patch)
tree64870fa5b7c356d42334efb9727e26d7655bed01
parentea2a0d8c956c3e4f931143af1af126337f03841a (diff)
Only handle last value change event for attached change screens
Bug: issue 1801 Change-Id: I2993a833d7547a234bdb6c36694f85913215b323 (cherry picked from 47d612e4fb0dc97b14553e1c048841a05e4baeaa)
-rw-r--r--gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeScreen.java18
-rw-r--r--gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ListenableValue.java9
2 files changed, 25 insertions, 2 deletions
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeScreen.java
index bee8ac48da..7983512898 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeScreen.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeScreen.java
@@ -83,6 +83,7 @@ public class ChangeScreen extends Screen
private KeyCommandSet keysAction;
private HandlerRegistration regNavigation;
private HandlerRegistration regAction;
+ private HandlerRegistration regDetailCache;
private Grid patchesGrid;
private ListBox patchesList;
@@ -127,6 +128,10 @@ public class ChangeScreen extends Screen
regAction.removeHandler();
regAction = null;
}
+ if (regDetailCache != null) {
+ regDetailCache.removeHandler();
+ regDetailCache = null;
+ }
super.onUnload();
}
@@ -147,7 +152,7 @@ public class ChangeScreen extends Screen
ChangeCache cache = ChangeCache.get(changeId);
detailCache = cache.getChangeDetailCache();
- detailCache.addValueChangeHandler(this);
+ regDetailCache = detailCache.addValueChangeHandler(this);
addStyleName(Gerrit.RESOURCES.css().changeScreen());
addStyleName(Gerrit.RESOURCES.css().screenNoHeader());
@@ -258,7 +263,7 @@ public class ChangeScreen extends Screen
@Override
public void onValueChange(final ValueChangeEvent<ChangeDetail> event) {
- if (isAttached()) {
+ if (isAttached() && isLastValueChangeHandler()) {
// Until this screen is fully migrated to the new API, this call must be
// sequential, because we can't start an async get at the source of every
// call that might trigger a value change.
@@ -274,6 +279,15 @@ public class ChangeScreen extends Screen
}
}
+ // Find the last attached screen.
+ // When DialogBox is used (i. e. CommentedActionDialog) then the original
+ // ChangeScreen is still in attached state.
+ // Use here the fact, that the handlers (ChangeScreen) are sorted.
+ private boolean isLastValueChangeHandler() {
+ int count = detailCache.getHandlerCount();
+ return count > 0 && detailCache.getHandler(count - 1) == this;
+ }
+
private void display(final ChangeDetail detail) {
displayTitle(detail.getChange().getKey(), detail.getChange().getSubject());
discardDiffBaseIfNotApplicable(detail.getChange().getId());
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ListenableValue.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ListenableValue.java
index 6dad875b60..d834eb21fb 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ListenableValue.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ListenableValue.java
@@ -45,4 +45,13 @@ public class ListenableValue<T> implements HasValueChangeHandlers<T> {
ValueChangeHandler<T> handler) {
return manager.addHandler(ValueChangeEvent.getType(), handler);
}
+
+ public int getHandlerCount() {
+ return manager.getHandlerCount(ValueChangeEvent.getType());
+ }
+
+ public ValueChangeHandler<?> getHandler(int index) {
+ return manager.getHandler(ValueChangeEvent.getType(), index);
+ }
+
}