Delay updating the UI until a Screen instance is fully rendered
By switching all of our Screen uses to be gwtexpui's new View class
we are able to take advantage of ViewSite's off screen updating. In
a nutshell the next Screen is added to the DOM inside of an invisible
div, and then made visible only once all required RPCs have finished
and the browser has finished updating the DOM nodes within the new
Screen object.
Since screens are rendered off screen before presentation, we no
longer recycle screen instances. This may slightly reduce how
fast we can render individual screen transitions, but it has a
shorter code path and uses less DOM memory in the browser, so we
may have a relative wash in terms of render performance.
Bug: GERRIT-91
Signed-off-by: Shawn O. Pearce <sop@google.com>
diff --git a/pom.xml b/pom.xml
index b3369eb..033511b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -446,7 +446,7 @@
<dependency>
<groupId>gwtexpui</groupId>
<artifactId>gwtexpui</artifactId>
- <version>1.0.3</version>
+ <version>1.0.4-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
diff --git a/src/main/java/com/google/gerrit/client/Gerrit.java b/src/main/java/com/google/gerrit/client/Gerrit.java
index e4b154b..0f1200c 100644
--- a/src/main/java/com/google/gerrit/client/Gerrit.java
+++ b/src/main/java/com/google/gerrit/client/Gerrit.java
@@ -37,11 +37,10 @@
import com.google.gwt.user.client.ui.MenuItem;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwtexpui.user.client.UserAgent;
+import com.google.gwtexpui.user.client.ViewSite;
import com.google.gwtjsonrpc.client.JsonUtil;
import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.Map.Entry;
public class Gerrit implements EntryPoint {
/**
@@ -66,15 +65,7 @@
private static LinkMenuBar menuBar;
private static RootPanel siteHeader;
private static RootPanel siteFooter;
- private static RootPanel body;
- private static Screen currentScreen;
- private static final LinkedHashMap<Object, Screen> priorScreens =
- new LinkedHashMap<Object, Screen>(10, 0.75f, true) {
- @Override
- protected boolean removeEldestEntry(final Entry<Object, Screen> eldest) {
- return 3 <= size();
- }
- };
+ private static ViewSite<Screen> body;
static {
SYSTEM_SVC = GWT.create(SystemInfoService.class);
@@ -99,24 +90,9 @@
public static void display(final Screen view) {
if (view.isRequiresSignIn() && !isSignedIn()) {
doSignIn();
- return;
+ } else {
+ body.setView(view);
}
-
- if (currentScreen != null) {
- body.remove(currentScreen);
- final Object sct = currentScreen.getScreenCacheToken();
- if (sct != null) {
- priorScreens.put(sct, currentScreen);
- }
- }
-
- final Screen p = priorScreens.get(view.getScreenCacheToken());
- currentScreen = p != null ? p.recycleThis(view) : view;
- body.add(currentScreen);
- }
-
- public static void uncache(final Screen view) {
- priorScreens.remove(view.getScreenCacheToken());
}
/** @return the currently signed in user's account data; null if no account */
@@ -146,8 +122,9 @@
}
refreshMenuBar();
- if (currentScreen != null) {
- currentScreen.onSignOut();
+ final Screen cs = body.getView();
+ if (cs != null) {
+ cs.onSignOut();
}
}
@@ -174,9 +151,11 @@
topMenu.add(menuBar);
siteHeader = RootPanel.get("gerrit_header");
- body = RootPanel.get("gerrit_body");
siteFooter = RootPanel.get("gerrit_footer");
+ body = new ViewSite<Screen>();
+ RootPanel.get("gerrit_body").add(body);
+
JsonUtil.addRpcStatusListener(new RpcStatus(topMenu));
SYSTEM_SVC.loadGerritConfig(new GerritCallback<GerritConfig>() {
public void onSuccess(final GerritConfig result) {
@@ -298,8 +277,9 @@
l.onSignIn();
}
- if (currentScreen != null) {
- currentScreen.onSignIn();
+ final Screen cs = body.getView();
+ if (cs != null) {
+ cs.onSignIn();
}
if (ac != null) {
ac.onSuccess(null);
diff --git a/src/main/java/com/google/gerrit/client/GerritCss.css b/src/main/java/com/google/gerrit/client/GerritCss.css
index 882b00b..080c0ef 100644
--- a/src/main/java/com/google/gerrit/client/GerritCss.css
+++ b/src/main/java/com/google/gerrit/client/GerritCss.css
@@ -150,7 +150,7 @@
.gerrit-Screen {
}
-.gerrit-Screen h1 {
+.gerrit-ScreenHeader {
white-space: nowrap;
font-size: 16pt;
margin: 3px 0 8px;
diff --git a/src/main/java/com/google/gerrit/client/NotFoundScreen.java b/src/main/java/com/google/gerrit/client/NotFoundScreen.java
index 4c559c9..3be6bd2 100644
--- a/src/main/java/com/google/gerrit/client/NotFoundScreen.java
+++ b/src/main/java/com/google/gerrit/client/NotFoundScreen.java
@@ -27,4 +27,10 @@
DOM.setInnerText(body, Gerrit.C.notFoundBody());
DOM.appendChild(getElement(), body);
}
+
+ @Override
+ protected void onLoad() {
+ super.onLoad();
+ display();
+ }
}
diff --git a/src/main/java/com/google/gerrit/client/account/AccountSettings.java b/src/main/java/com/google/gerrit/client/account/AccountSettings.java
index a2918fb..3ecebbe 100644
--- a/src/main/java/com/google/gerrit/client/account/AccountSettings.java
+++ b/src/main/java/com/google/gerrit/client/account/AccountSettings.java
@@ -20,10 +20,9 @@
import com.google.gerrit.client.Link;
import com.google.gerrit.client.reviewdb.Account;
import com.google.gerrit.client.rpc.Common;
-import com.google.gerrit.client.rpc.GerritCallback;
+import com.google.gerrit.client.rpc.ScreenLoadCallback;
import com.google.gerrit.client.ui.AccountScreen;
import com.google.gerrit.client.ui.LazyTabChild;
-import com.google.gerrit.client.ui.Screen;
import com.google.gwt.i18n.client.LocaleInfo;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.SourcesTabEvents;
@@ -49,18 +48,6 @@
}
@Override
- public Object getScreenCacheToken() {
- return getClass();
- }
-
- @Override
- public Screen recycleThis(final Screen newScreen) {
- final AccountSettings s = (AccountSettings) newScreen;
- initialTabToken = s.initialTabToken;
- return this;
- }
-
- @Override
public void onLoad() {
if (info == null) {
initUI();
@@ -70,11 +57,10 @@
display(Gerrit.getUserAccount());
tabs.selectTab(tabTokens.indexOf(initialTabToken));
- Util.ACCOUNT_SVC.myAccount(new GerritCallback<Account>() {
- public void onSuccess(final Account result) {
- if (isAttached()) {
- display(result);
- }
+ Util.ACCOUNT_SVC.myAccount(new ScreenLoadCallback<Account>(this) {
+ @Override
+ protected void preDisplay(final Account result) {
+ display(result);
}
});
}
diff --git a/src/main/java/com/google/gerrit/client/account/NewAgreementScreen.java b/src/main/java/com/google/gerrit/client/account/NewAgreementScreen.java
index 209c383..9c055eb 100644
--- a/src/main/java/com/google/gerrit/client/account/NewAgreementScreen.java
+++ b/src/main/java/com/google/gerrit/client/account/NewAgreementScreen.java
@@ -151,11 +151,12 @@
private void postRPC() {
if (mySigned != null && available != null) {
+ renderSelf();
display();
}
}
- private void display() {
+ private void renderSelf() {
current = null;
agreementGroup.setVisible(false);
contactGroup.setVisible(false);
diff --git a/src/main/java/com/google/gerrit/client/account/ValidateEmailScreen.java b/src/main/java/com/google/gerrit/client/account/ValidateEmailScreen.java
index 57d7c1d..ade40e0c 100644
--- a/src/main/java/com/google/gerrit/client/account/ValidateEmailScreen.java
+++ b/src/main/java/com/google/gerrit/client/account/ValidateEmailScreen.java
@@ -15,7 +15,7 @@
package com.google.gerrit.client.account;
import com.google.gerrit.client.Link;
-import com.google.gerrit.client.rpc.GerritCallback;
+import com.google.gerrit.client.rpc.ScreenLoadCallback;
import com.google.gerrit.client.ui.AccountScreen;
import com.google.gwt.user.client.History;
import com.google.gwtjsonrpc.client.VoidResult;
@@ -32,8 +32,13 @@
public void onLoad() {
super.onLoad();
Util.ACCOUNT_SEC.validateEmail(magicToken,
- new GerritCallback<VoidResult>() {
- public void onSuccess(final VoidResult result) {
+ new ScreenLoadCallback<VoidResult>(this) {
+ @Override
+ protected void preDisplay(final VoidResult result) {
+ }
+
+ @Override
+ protected void postDisplay() {
History.newItem(Link.SETTINGS_CONTACT, true);
}
});
diff --git a/src/main/java/com/google/gerrit/client/admin/AccountGroupScreen.java b/src/main/java/com/google/gerrit/client/admin/AccountGroupScreen.java
index 46fbb48..9c3f9fa 100644
--- a/src/main/java/com/google/gerrit/client/admin/AccountGroupScreen.java
+++ b/src/main/java/com/google/gerrit/client/admin/AccountGroupScreen.java
@@ -19,6 +19,7 @@
import com.google.gerrit.client.reviewdb.AccountGroup;
import com.google.gerrit.client.reviewdb.AccountGroupMember;
import com.google.gerrit.client.rpc.GerritCallback;
+import com.google.gerrit.client.rpc.ScreenLoadCallback;
import com.google.gerrit.client.ui.AccountDashboardLink;
import com.google.gerrit.client.ui.AccountGroupSuggestOracle;
import com.google.gerrit.client.ui.AccountScreen;
@@ -81,8 +82,9 @@
super.onLoad();
Util.GROUP_SVC.groupDetail(groupId,
- new GerritCallback<AccountGroupDetail>() {
- public void onSuccess(final AccountGroupDetail result) {
+ new ScreenLoadCallback<AccountGroupDetail>(this) {
+ @Override
+ protected void preDisplay(final AccountGroupDetail result) {
enableForm(true);
saveName.setEnabled(false);
saveOwner.setEnabled(false);
diff --git a/src/main/java/com/google/gerrit/client/admin/GroupListScreen.java b/src/main/java/com/google/gerrit/client/admin/GroupListScreen.java
index b9c341b..c592a18 100644
--- a/src/main/java/com/google/gerrit/client/admin/GroupListScreen.java
+++ b/src/main/java/com/google/gerrit/client/admin/GroupListScreen.java
@@ -17,6 +17,7 @@
import com.google.gerrit.client.Link;
import com.google.gerrit.client.reviewdb.AccountGroup;
import com.google.gerrit.client.rpc.GerritCallback;
+import com.google.gerrit.client.rpc.ScreenLoadCallback;
import com.google.gerrit.client.ui.AccountScreen;
import com.google.gerrit.client.ui.FancyFlexTable;
import com.google.gerrit.client.ui.SmallHeading;
@@ -44,24 +45,19 @@
}
@Override
- public Object getScreenCacheToken() {
- return getClass();
- }
-
- @Override
public void onLoad() {
if (groups == null) {
initUI();
}
- Util.GROUP_SVC.ownedGroups(new GerritCallback<List<AccountGroup>>() {
- public void onSuccess(final List<AccountGroup> result) {
- if (isAttached()) {
- groups.display(result);
- groups.finishDisplay(true);
- }
- }
- });
+ Util.GROUP_SVC
+ .ownedGroups(new ScreenLoadCallback<List<AccountGroup>>(this) {
+ @Override
+ protected void preDisplay(final List<AccountGroup> result) {
+ groups.display(result);
+ groups.finishDisplay(true);
+ }
+ });
}
private void initUI() {
diff --git a/src/main/java/com/google/gerrit/client/admin/ProjectAdminScreen.java b/src/main/java/com/google/gerrit/client/admin/ProjectAdminScreen.java
index c275797..1ff8eea 100644
--- a/src/main/java/com/google/gerrit/client/admin/ProjectAdminScreen.java
+++ b/src/main/java/com/google/gerrit/client/admin/ProjectAdminScreen.java
@@ -18,7 +18,7 @@
import com.google.gerrit.client.Link;
import com.google.gerrit.client.reviewdb.Project;
import com.google.gerrit.client.reviewdb.ProjectRight;
-import com.google.gerrit.client.rpc.GerritCallback;
+import com.google.gerrit.client.rpc.ScreenLoadCallback;
import com.google.gerrit.client.ui.AccountScreen;
import com.google.gerrit.client.ui.LazyTabChild;
import com.google.gwt.user.client.ui.SourcesTabEvents;
@@ -54,8 +54,9 @@
tabs.selectTab(tabTokens.indexOf(initialTabToken));
Util.PROJECT_SVC.projectDetail(projectId,
- new GerritCallback<ProjectDetail>() {
- public void onSuccess(final ProjectDetail result) {
+ new ScreenLoadCallback<ProjectDetail>(this) {
+ @Override
+ protected void preDisplay(final ProjectDetail result) {
display(result);
}
});
diff --git a/src/main/java/com/google/gerrit/client/admin/ProjectListScreen.java b/src/main/java/com/google/gerrit/client/admin/ProjectListScreen.java
index 89959e2..ad0030c 100644
--- a/src/main/java/com/google/gerrit/client/admin/ProjectListScreen.java
+++ b/src/main/java/com/google/gerrit/client/admin/ProjectListScreen.java
@@ -16,7 +16,7 @@
import com.google.gerrit.client.Link;
import com.google.gerrit.client.reviewdb.Project;
-import com.google.gerrit.client.rpc.GerritCallback;
+import com.google.gerrit.client.rpc.ScreenLoadCallback;
import com.google.gerrit.client.ui.AccountScreen;
import com.google.gerrit.client.ui.FancyFlexTable;
import com.google.gerrit.client.ui.SmallHeading;
@@ -37,22 +37,16 @@
}
@Override
- public Object getScreenCacheToken() {
- return getClass();
- }
-
- @Override
public void onLoad() {
if (projects == null) {
initUI();
}
- Util.PROJECT_SVC.ownedProjects(new GerritCallback<List<Project>>() {
- public void onSuccess(final List<Project> result) {
- if (isAttached()) {
- projects.display(result);
- projects.finishDisplay(true);
- }
+ Util.PROJECT_SVC.ownedProjects(new ScreenLoadCallback<List<Project>>(this) {
+ @Override
+ protected void preDisplay(final List<Project> result) {
+ projects.display(result);
+ projects.finishDisplay(true);
}
});
}
diff --git a/src/main/java/com/google/gerrit/client/changes/AccountDashboardScreen.java b/src/main/java/com/google/gerrit/client/changes/AccountDashboardScreen.java
index 0d0d93e..c6b885b 100644
--- a/src/main/java/com/google/gerrit/client/changes/AccountDashboardScreen.java
+++ b/src/main/java/com/google/gerrit/client/changes/AccountDashboardScreen.java
@@ -37,18 +37,6 @@
}
@Override
- public Object getScreenCacheToken() {
- return getClass();
- }
-
- @Override
- public Screen recycleThis(final Screen newScreen) {
- ownerId = ((AccountDashboardScreen) newScreen).ownerId;
- setRequiresSignIn(ownerId == null);
- return this;
- }
-
- @Override
public void onLoad() {
if (ownerId == null) {
ownerId = Common.getAccountId();
@@ -67,12 +55,10 @@
table.setSavePointerId(Link.toAccountDashboard(ownerId));
super.onLoad();
Util.LIST_SVC.forAccount(ownerId,
- new ScreenLoadCallback<AccountDashboardInfo>() {
- public void onSuccess(final AccountDashboardInfo r) {
- // TODO Actually we want to cancel the RPC if detached.
- if (isAttached()) {
- display(r);
- }
+ new ScreenLoadCallback<AccountDashboardInfo>(this) {
+ @Override
+ protected void preDisplay(final AccountDashboardInfo r) {
+ display(r);
}
});
}
diff --git a/src/main/java/com/google/gerrit/client/changes/AllAbandonedChangesScreen.java b/src/main/java/com/google/gerrit/client/changes/AllAbandonedChangesScreen.java
index 7396e41..75a5da9 100644
--- a/src/main/java/com/google/gerrit/client/changes/AllAbandonedChangesScreen.java
+++ b/src/main/java/com/google/gerrit/client/changes/AllAbandonedChangesScreen.java
@@ -14,9 +14,7 @@
package com.google.gerrit.client.changes;
-import com.google.gerrit.client.data.SingleListChangeInfo;
import com.google.gerrit.client.reviewdb.Change;
-import com.google.gerrit.client.rpc.GerritCallback;
public class AllAbandonedChangesScreen extends AllSingleListScreen {
@@ -27,20 +25,12 @@
@Override
protected void loadPrev() {
Util.LIST_SVC.allClosedPrev(Change.Status.ABANDONED, pos, pageSize,
- new GerritCallback<SingleListChangeInfo>() {
- public void onSuccess(final SingleListChangeInfo result) {
- display(result);
- }
- });
+ loadCallback());
}
@Override
protected void loadNext() {
Util.LIST_SVC.allClosedNext(Change.Status.ABANDONED, pos, pageSize,
- new GerritCallback<SingleListChangeInfo>() {
- public void onSuccess(final SingleListChangeInfo result) {
- display(result);
- }
- });
+ loadCallback());
}
}
diff --git a/src/main/java/com/google/gerrit/client/changes/AllMergedChangesScreen.java b/src/main/java/com/google/gerrit/client/changes/AllMergedChangesScreen.java
index f9bf443..824299d 100644
--- a/src/main/java/com/google/gerrit/client/changes/AllMergedChangesScreen.java
+++ b/src/main/java/com/google/gerrit/client/changes/AllMergedChangesScreen.java
@@ -14,9 +14,7 @@
package com.google.gerrit.client.changes;
-import com.google.gerrit.client.data.SingleListChangeInfo;
import com.google.gerrit.client.reviewdb.Change;
-import com.google.gerrit.client.rpc.GerritCallback;
public class AllMergedChangesScreen extends AllSingleListScreen {
@@ -27,20 +25,12 @@
@Override
protected void loadPrev() {
Util.LIST_SVC.allClosedPrev(Change.Status.MERGED, pos, pageSize,
- new GerritCallback<SingleListChangeInfo>() {
- public void onSuccess(final SingleListChangeInfo result) {
- display(result);
- }
- });
+ loadCallback());
}
@Override
protected void loadNext() {
Util.LIST_SVC.allClosedNext(Change.Status.MERGED, pos, pageSize,
- new GerritCallback<SingleListChangeInfo>() {
- public void onSuccess(final SingleListChangeInfo result) {
- display(result);
- }
- });
+ loadCallback());
}
}
diff --git a/src/main/java/com/google/gerrit/client/changes/AllOpenChangesScreen.java b/src/main/java/com/google/gerrit/client/changes/AllOpenChangesScreen.java
index 389441e..1e66222 100644
--- a/src/main/java/com/google/gerrit/client/changes/AllOpenChangesScreen.java
+++ b/src/main/java/com/google/gerrit/client/changes/AllOpenChangesScreen.java
@@ -14,8 +14,6 @@
package com.google.gerrit.client.changes;
-import com.google.gerrit.client.data.SingleListChangeInfo;
-import com.google.gerrit.client.rpc.GerritCallback;
public class AllOpenChangesScreen extends AllSingleListScreen {
@@ -25,21 +23,11 @@
@Override
protected void loadPrev() {
- Util.LIST_SVC.allOpenPrev(pos, pageSize,
- new GerritCallback<SingleListChangeInfo>() {
- public void onSuccess(final SingleListChangeInfo result) {
- display(result);
- }
- });
+ Util.LIST_SVC.allOpenPrev(pos, pageSize, loadCallback());
}
@Override
protected void loadNext() {
- Util.LIST_SVC.allOpenNext(pos, pageSize,
- new GerritCallback<SingleListChangeInfo>() {
- public void onSuccess(final SingleListChangeInfo result) {
- display(result);
- }
- });
+ Util.LIST_SVC.allOpenNext(pos, pageSize, loadCallback());
}
}
diff --git a/src/main/java/com/google/gerrit/client/changes/AllSingleListScreen.java b/src/main/java/com/google/gerrit/client/changes/AllSingleListScreen.java
index 43f907f..efce05c 100644
--- a/src/main/java/com/google/gerrit/client/changes/AllSingleListScreen.java
+++ b/src/main/java/com/google/gerrit/client/changes/AllSingleListScreen.java
@@ -16,7 +16,9 @@
import com.google.gerrit.client.data.ChangeInfo;
import com.google.gerrit.client.data.SingleListChangeInfo;
+import com.google.gerrit.client.rpc.ScreenLoadCallback;
import com.google.gerrit.client.ui.Screen;
+import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Hyperlink;
@@ -47,19 +49,6 @@
}
@Override
- public Object getScreenCacheToken() {
- return anchorPrefix;
- }
-
- @Override
- public Screen recycleThis(final Screen newScreen) {
- final AllSingleListScreen o = (AllSingleListScreen) newScreen;
- useLoadPrev = o.useLoadPrev;
- pos = o.pos;
- return this;
- }
-
- @Override
public void onLoad() {
if (table == null) {
table = new ChangeTable();
@@ -95,7 +84,16 @@
protected abstract void loadNext();
- protected void display(final SingleListChangeInfo result) {
+ protected AsyncCallback<SingleListChangeInfo> loadCallback() {
+ return new ScreenLoadCallback<SingleListChangeInfo>(this) {
+ @Override
+ protected void preDisplay(final SingleListChangeInfo result) {
+ display(result);
+ }
+ };
+ }
+
+ private void display(final SingleListChangeInfo result) {
changes = result.getChanges();
if (!changes.isEmpty()) {
diff --git a/src/main/java/com/google/gerrit/client/changes/ApprovalTable.java b/src/main/java/com/google/gerrit/client/changes/ApprovalTable.java
index 7288246..d16fcf9 100644
--- a/src/main/java/com/google/gerrit/client/changes/ApprovalTable.java
+++ b/src/main/java/com/google/gerrit/client/changes/ApprovalTable.java
@@ -28,7 +28,6 @@
import com.google.gerrit.client.reviewdb.ChangeApproval;
import com.google.gerrit.client.rpc.Common;
import com.google.gerrit.client.rpc.GerritCallback;
-import com.google.gerrit.client.rpc.ScreenLoadCallback;
import com.google.gerrit.client.ui.AccountDashboardLink;
import com.google.gerrit.client.ui.AddMemberBox;
import com.google.gwt.user.client.ui.ClickListener;
@@ -205,7 +204,7 @@
addMemberBox.setEnabled(true);
addMemberBox.setText("");
Util.DETAIL_SVC.changeDetail(changeId,
- new ScreenLoadCallback<ChangeDetail>() {
+ new GerritCallback<ChangeDetail>() {
public void onSuccess(final ChangeDetail r) {
if (isAttached()) {
setAccountInfoCache(r.getAccounts());
diff --git a/src/main/java/com/google/gerrit/client/changes/ByProjectOpenChangesScreen.java b/src/main/java/com/google/gerrit/client/changes/ByProjectOpenChangesScreen.java
index c848783..e642f13 100644
--- a/src/main/java/com/google/gerrit/client/changes/ByProjectOpenChangesScreen.java
+++ b/src/main/java/com/google/gerrit/client/changes/ByProjectOpenChangesScreen.java
@@ -14,9 +14,7 @@
package com.google.gerrit.client.changes;
-import com.google.gerrit.client.data.SingleListChangeInfo;
import com.google.gerrit.client.reviewdb.Project;
-import com.google.gerrit.client.rpc.GerritCallback;
public class ByProjectOpenChangesScreen extends AllSingleListScreen {
@@ -31,21 +29,11 @@
@Override
protected void loadPrev() {
- Util.LIST_SVC.byProjectOpenPrev(projectKey, pos, pageSize,
- new GerritCallback<SingleListChangeInfo>() {
- public void onSuccess(final SingleListChangeInfo result) {
- display(result);
- }
- });
+ Util.LIST_SVC.byProjectOpenPrev(projectKey, pos, pageSize, loadCallback());
}
@Override
protected void loadNext() {
- Util.LIST_SVC.byProjectOpenNext(projectKey, pos, pageSize,
- new GerritCallback<SingleListChangeInfo>() {
- public void onSuccess(final SingleListChangeInfo result) {
- display(result);
- }
- });
+ Util.LIST_SVC.byProjectOpenNext(projectKey, pos, pageSize, loadCallback());
}
}
diff --git a/src/main/java/com/google/gerrit/client/changes/ChangeScreen.java b/src/main/java/com/google/gerrit/client/changes/ChangeScreen.java
index 977efd3..d5d0165 100644
--- a/src/main/java/com/google/gerrit/client/changes/ChangeScreen.java
+++ b/src/main/java/com/google/gerrit/client/changes/ChangeScreen.java
@@ -78,20 +78,6 @@
}
@Override
- public Object getScreenCacheToken() {
- return getClass();
- }
-
- @Override
- public Screen recycleThis(final Screen newScreen) {
- final ChangeScreen s = (ChangeScreen) newScreen;
- changeId = s.changeId;
- changeInfo = s.changeInfo;
- starred = s.starred;
- return this;
- }
-
- @Override
public void onSignIn() {
super.onSignIn();
if (refreshOnSignIn) {
@@ -124,13 +110,11 @@
public void refresh() {
Util.DETAIL_SVC.changeDetail(changeId,
- new ScreenLoadCallback<ChangeDetail>() {
- public void onSuccess(final ChangeDetail r) {
- // TODO Actually we want to cancel the RPC if detached.
- if (isAttached()) {
- setStarred(r.isStarred());
- display(r);
- }
+ new ScreenLoadCallback<ChangeDetail>(this) {
+ @Override
+ protected void preDisplay(final ChangeDetail r) {
+ setStarred(r.isStarred());
+ display(r);
}
});
}
diff --git a/src/main/java/com/google/gerrit/client/changes/MineDraftsScreen.java b/src/main/java/com/google/gerrit/client/changes/MineDraftsScreen.java
index 171b4c6..337e7db 100644
--- a/src/main/java/com/google/gerrit/client/changes/MineDraftsScreen.java
+++ b/src/main/java/com/google/gerrit/client/changes/MineDraftsScreen.java
@@ -15,8 +15,6 @@
package com.google.gerrit.client.changes;
import com.google.gerrit.client.Link;
-import com.google.gerrit.client.data.SingleListChangeInfo;
-import com.google.gerrit.client.rpc.GerritCallback;
public class MineDraftsScreen extends MineSingleListScreen {
@@ -27,11 +25,6 @@
@Override
public void onLoad() {
super.onLoad();
- Util.LIST_SVC
- .myDraftChanges(new GerritCallback<SingleListChangeInfo>() {
- public void onSuccess(final SingleListChangeInfo result) {
- display(result);
- }
- });
+ Util.LIST_SVC.myDraftChanges(loadCallback());
}
}
diff --git a/src/main/java/com/google/gerrit/client/changes/MineSingleListScreen.java b/src/main/java/com/google/gerrit/client/changes/MineSingleListScreen.java
index 67aa70c..2b6f88a 100644
--- a/src/main/java/com/google/gerrit/client/changes/MineSingleListScreen.java
+++ b/src/main/java/com/google/gerrit/client/changes/MineSingleListScreen.java
@@ -15,7 +15,9 @@
package com.google.gerrit.client.changes;
import com.google.gerrit.client.data.SingleListChangeInfo;
+import com.google.gerrit.client.rpc.ScreenLoadCallback;
import com.google.gerrit.client.ui.AccountScreen;
+import com.google.gwt.user.client.rpc.AsyncCallback;
public class MineSingleListScreen extends AccountScreen {
@@ -36,12 +38,16 @@
add(table);
}
- @Override
- public Object getScreenCacheToken() {
- return anchor;
+ protected AsyncCallback<SingleListChangeInfo> loadCallback() {
+ return new ScreenLoadCallback<SingleListChangeInfo>(this) {
+ @Override
+ protected void preDisplay(final SingleListChangeInfo result) {
+ display(result);
+ }
+ };
}
- protected void display(final SingleListChangeInfo result) {
+ private void display(final SingleListChangeInfo result) {
table.setAccountInfoCache(result.getAccounts());
drafts.display(result.getChanges());
table.finishDisplay(true);
diff --git a/src/main/java/com/google/gerrit/client/changes/MineStarredScreen.java b/src/main/java/com/google/gerrit/client/changes/MineStarredScreen.java
index ea94ed5..2354e72 100644
--- a/src/main/java/com/google/gerrit/client/changes/MineStarredScreen.java
+++ b/src/main/java/com/google/gerrit/client/changes/MineStarredScreen.java
@@ -15,8 +15,6 @@
package com.google.gerrit.client.changes;
import com.google.gerrit.client.Link;
-import com.google.gerrit.client.data.SingleListChangeInfo;
-import com.google.gerrit.client.rpc.GerritCallback;
public class MineStarredScreen extends MineSingleListScreen {
@@ -27,11 +25,6 @@
@Override
public void onLoad() {
super.onLoad();
- Util.LIST_SVC
- .myStarredChanges(new GerritCallback<SingleListChangeInfo>() {
- public void onSuccess(final SingleListChangeInfo result) {
- display(result);
- }
- });
+ Util.LIST_SVC.myStarredChanges(loadCallback());
}
}
diff --git a/src/main/java/com/google/gerrit/client/changes/PublishCommentScreen.java b/src/main/java/com/google/gerrit/client/changes/PublishCommentScreen.java
index cb595c0..0dea20d 100644
--- a/src/main/java/com/google/gerrit/client/changes/PublishCommentScreen.java
+++ b/src/main/java/com/google/gerrit/client/changes/PublishCommentScreen.java
@@ -28,6 +28,7 @@
import com.google.gerrit.client.reviewdb.PatchSet;
import com.google.gerrit.client.rpc.Common;
import com.google.gerrit.client.rpc.GerritCallback;
+import com.google.gerrit.client.rpc.ScreenLoadCallback;
import com.google.gerrit.client.ui.AccountScreen;
import com.google.gerrit.client.ui.PatchLink;
import com.google.gerrit.client.ui.SmallHeading;
@@ -61,6 +62,8 @@
public class PublishCommentScreen extends AccountScreen implements
ClickListener {
+ private static SavedState lastState;
+
private final PatchSet.Id patchSetId;
private Collection<ValueRadioButton> approvalButtons;
private ChangeDescriptionBlock descBlock;
@@ -69,7 +72,7 @@
private Panel draftsPanel;
private Button send;
private Button cancel;
- private boolean displayedOnce;
+ private boolean saveStateOnUnload = true;
public PublishCommentScreen(final PatchSet.Id psi) {
super(Util.M.publishComments(psi.getParentKey().get(), psi.get()));
@@ -78,12 +81,7 @@
}
@Override
- public Object getScreenCacheToken() {
- return new ScreenCacheToken(patchSetId);
- }
-
- @Override
- public void onLoad() {
+ protected void onLoad() {
if (message == null) {
approvalButtons = new ArrayList<ValueRadioButton>();
descBlock = new ChangeDescriptionBlock();
@@ -123,23 +121,38 @@
}
super.onLoad();
- message.setFocus(true);
send.setEnabled(false);
Util.DETAIL_SVC.patchSetPublishDetail(patchSetId,
- new GerritCallback<PatchSetPublishDetail>() {
- public void onSuccess(final PatchSetPublishDetail result) {
+ new ScreenLoadCallback<PatchSetPublishDetail>(this) {
+ @Override
+ protected void preDisplay(final PatchSetPublishDetail result) {
send.setEnabled(true);
display(result);
}
+
+ @Override
+ protected void postDisplay() {
+ message.setFocus(true);
+ }
});
}
+ @Override
+ protected void onUnload() {
+ super.onUnload();
+ if (saveStateOnUnload) {
+ lastState = new SavedState(this);
+ }
+ }
+
public void onClick(final Widget sender) {
if (send == sender) {
+ lastState = null;
onSend();
} else if (cancel == sender) {
- Gerrit.uncache(this);
+ lastState = null;
+ saveStateOnUnload = false;
goChange();
}
}
@@ -196,8 +209,16 @@
m.append(' ');
m.append(buttonValue.getName());
b.setText(m.toString());
- b.setChecked(prior != null ? buttonValue.getValue() == prior.getValue()
- : buttonValue.getValue() == 0);
+
+ if (lastState != null && patchSetId.equals(lastState.patchSetId)
+ && lastState.approvals.containsKey(buttonValue.getCategoryId())) {
+ b.setChecked(lastState.approvals.get(buttonValue.getCategoryId())
+ .equals(buttonValue));
+ } else {
+ b.setChecked(prior != null ? buttonValue.getValue() == prior.getValue()
+ : buttonValue.getValue() == 0);
+ }
+
approvalButtons.add(b);
vp.add(b);
}
@@ -207,10 +228,11 @@
private void display(final PatchSetPublishDetail r) {
descBlock.display(r.getChange(), r.getPatchSetInfo(), r.getAccounts());
- if (!displayedOnce) {
- if (r.getChange().getStatus().isOpen()) {
- initApprovals(r, approvalPanel);
- }
+ if (r.getChange().getStatus().isOpen()) {
+ initApprovals(r, approvalPanel);
+ }
+ if (lastState != null && patchSetId.equals(lastState.patchSetId)) {
+ message.setText(lastState.message);
}
draftsPanel.clear();
@@ -244,8 +266,6 @@
panel.add(m);
}
}
-
- displayedOnce = true;
}
private void onSend() {
@@ -299,25 +319,20 @@
}
}
- private static final class ScreenCacheToken {
- private final PatchSet.Id patchSetId;
+ private static class SavedState {
+ final PatchSet.Id patchSetId;
+ final String message;
+ final Map<ApprovalCategory.Id, ApprovalCategoryValue> approvals;
- ScreenCacheToken(final PatchSet.Id psi) {
- patchSetId = psi;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (obj instanceof ScreenCacheToken) {
- final ScreenCacheToken c = (ScreenCacheToken) obj;
- return patchSetId.equals(c.patchSetId);
+ SavedState(final PublishCommentScreen p) {
+ patchSetId = p.patchSetId;
+ message = p.message.getText();
+ approvals = new HashMap<ApprovalCategory.Id, ApprovalCategoryValue>();
+ for (final ValueRadioButton b : p.approvalButtons) {
+ if (b.isChecked()) {
+ approvals.put(b.value.getCategoryId(), b.value);
+ }
}
- return false;
- }
-
- @Override
- public int hashCode() {
- return patchSetId.hashCode();
}
}
}
diff --git a/src/main/java/com/google/gerrit/client/patches/PatchSideBySideScreen.java b/src/main/java/com/google/gerrit/client/patches/PatchSideBySideScreen.java
index 99ff685..93bda90 100644
--- a/src/main/java/com/google/gerrit/client/patches/PatchSideBySideScreen.java
+++ b/src/main/java/com/google/gerrit/client/patches/PatchSideBySideScreen.java
@@ -56,12 +56,10 @@
super.onLoad();
PatchUtil.DETAIL_SVC.sideBySidePatchDetail(patchId, null,
- new ScreenLoadCallback<SideBySidePatchDetail>() {
- public void onSuccess(final SideBySidePatchDetail r) {
- // TODO Actually we want to cancel the RPC if detached.
- if (isAttached()) {
- display(r);
- }
+ new ScreenLoadCallback<SideBySidePatchDetail>(this) {
+ @Override
+ protected void preDisplay(final SideBySidePatchDetail r) {
+ display(r);
}
});
}
diff --git a/src/main/java/com/google/gerrit/client/patches/PatchUnifiedScreen.java b/src/main/java/com/google/gerrit/client/patches/PatchUnifiedScreen.java
index 60c7c57..7d2422c 100644
--- a/src/main/java/com/google/gerrit/client/patches/PatchUnifiedScreen.java
+++ b/src/main/java/com/google/gerrit/client/patches/PatchUnifiedScreen.java
@@ -34,12 +34,10 @@
super.onLoad();
PatchUtil.DETAIL_SVC.unifiedPatchDetail(patchId,
- new ScreenLoadCallback<UnifiedPatchDetail>() {
- public void onSuccess(final UnifiedPatchDetail r) {
- // TODO Actually we want to cancel the RPC if detached.
- if (isAttached()) {
- display(r);
- }
+ new ScreenLoadCallback<UnifiedPatchDetail>(this) {
+ @Override
+ protected void preDisplay(final UnifiedPatchDetail r) {
+ display(r);
}
});
}
diff --git a/src/main/java/com/google/gerrit/client/rpc/ScreenLoadCallback.java b/src/main/java/com/google/gerrit/client/rpc/ScreenLoadCallback.java
index c2855fa..e5f36af 100644
--- a/src/main/java/com/google/gerrit/client/rpc/ScreenLoadCallback.java
+++ b/src/main/java/com/google/gerrit/client/rpc/ScreenLoadCallback.java
@@ -16,9 +16,29 @@
import com.google.gerrit.client.Gerrit;
import com.google.gerrit.client.NotFoundScreen;
+import com.google.gerrit.client.ui.Screen;
/** Callback switching {@link NoSuchEntityException} to {@link NotFoundScreen} */
public abstract class ScreenLoadCallback<T> extends GerritCallback<T> {
+ private final Screen screen;
+
+ public ScreenLoadCallback(final Screen s) {
+ screen = s;
+ }
+
+ public final void onSuccess(final T result) {
+ if (screen.isAttached()) {
+ preDisplay(result);
+ screen.display();
+ postDisplay();
+ }
+ }
+
+ protected abstract void preDisplay(T result);
+
+ protected void postDisplay() {
+ }
+
@Override
public void onFailure(final Throwable caught) {
if (isNoSuchEntity(caught)) {
diff --git a/src/main/java/com/google/gerrit/client/ui/Screen.java b/src/main/java/com/google/gerrit/client/ui/Screen.java
index 91a13f2..b460992 100644
--- a/src/main/java/com/google/gerrit/client/ui/Screen.java
+++ b/src/main/java/com/google/gerrit/client/ui/Screen.java
@@ -16,42 +16,44 @@
import com.google.gerrit.client.Gerrit;
import com.google.gerrit.client.Link;
-import com.google.gwt.user.client.DOM;
-import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.ui.FlowPanel;
+import com.google.gwt.user.client.ui.InlineLabel;
import com.google.gwt.user.client.ui.Widget;
+import com.google.gwtexpui.user.client.View;
-public class Screen extends FlowPanel {
+public class Screen extends View {
+ private final FlowPanel header;
+ private final InlineLabel headerText;
+ private final FlowPanel body;
private boolean requiresSignIn;
- private final Element headerElem;
- private Element headerText;
protected Screen() {
this("");
}
protected Screen(final String headingText) {
+ final FlowPanel me = new FlowPanel();
+ initWidget(me);
setStyleName("gerrit-Screen");
- headerElem = DOM.createElement("h1");
- headerText = headerElem;
- DOM.appendChild(getElement(), headerElem);
+ me.add(header = new FlowPanel());
+ me.add(body = new FlowPanel());
- setTitleText(headingText);
+ header.setStyleName("gerrit-ScreenHeader");
+ header.add(headerText = new InlineLabel(headingText));
}
public void setTitleText(final String text) {
- DOM.setInnerText(headerText, text);
+ headerText.setText(text);
}
protected void insertTitleWidget(final Widget w) {
- if (headerText == headerElem) {
- headerText = DOM.createElement("span");
- DOM.setInnerText(headerText, DOM.getInnerText(headerElem));
- DOM.appendChild(headerElem, headerText);
- }
- insert(w, headerElem, 0, true);
+ header.insert(w, 0);
+ }
+
+ protected final void add(final Widget w) {
+ body.add(w);
}
/** Set whether or not {@link Gerrit#isSignedIn()} must be true. */
@@ -74,29 +76,4 @@
/** Invoked if this screen is the current screen and the user signs in. */
public void onSignIn() {
}
-
- /** Get the token to cache this screen's widget; null if it shouldn't cache. */
- public Object getScreenCacheToken() {
- return null;
- }
-
- /**
- * Reconfigure this screen after being recycled.
- * <p>
- * This method is invoked on a cached screen instance just before it is
- * recycled into the UI. The returned screen instance is what will actually be
- * shown to the user.
- *
- * @param newScreen the screen object created by the Link class (or some other
- * form of screen constructor) and that was just passed into
- * {@link Gerrit#display(Screen)}. Its {@link #getScreenCacheToken()}
- * is equal to <code>this.getScreenCacheToken()</code> but it may have
- * other parameter information worth copying.
- * @return typically <code>this</code> to reuse the cached screen;
- * <code>newScreen</code> to discard the cached screen instance and
- * use the new one.
- */
- public Screen recycleThis(final Screen newScreen) {
- return this;
- }
}