diff options
author | David Ostrovsky <david@ostrovsky.org> | 2013-06-08 20:10:25 +0200 |
---|---|---|
committer | Shawn Pearce <sop@google.com> | 2013-06-14 04:35:23 +0000 |
commit | 5394b9fb1b16ebf5f21ff465bf70c311caf3d582 (patch) | |
tree | 64870fa5b7c356d42334efb9727e26d7655bed01 | |
parent | ea2a0d8c956c3e4f931143af1af126337f03841a (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.java | 18 | ||||
-rw-r--r-- | gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ListenableValue.java | 9 |
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); + } + } |