blob: 9527c36d97f2929379bb17dbcecf20e0e663c483 [file] [log] [blame]
// Copyright (C) 2008 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.gerrit.client.changes;
import com.google.gerrit.client.Gerrit;
import com.google.gerrit.client.rpc.ScreenLoadCallback;
import com.google.gerrit.client.ui.Hyperlink;
import com.google.gerrit.client.ui.Screen;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwtexpui.globalkey.client.KeyCommand;
public abstract class PagedSingleListScreen extends Screen {
protected final int pageSize;
protected final int start;
private final String anchorPrefix;
protected ChangeList changes;
private ChangeTable table;
private ChangeTable.Section section;
private Hyperlink prev;
private Hyperlink next;
protected PagedSingleListScreen(String anchorToken, int start) {
anchorPrefix = anchorToken;
this.start = start;
if (Gerrit.isSignedIn()) {
final AccountGeneralPreferences p =
Gerrit.getUserAccount().getGeneralPreferences();
final short m = p.getMaximumPageSize();
pageSize = 0 < m ? m : AccountGeneralPreferences.DEFAULT_PAGESIZE;
} else {
pageSize = AccountGeneralPreferences.DEFAULT_PAGESIZE;
}
}
@Override
protected void onInitUI() {
super.onInitUI();
prev = new Hyperlink(Util.C.pagedChangeListPrev(), true, "");
prev.setVisible(false);
next = new Hyperlink(Util.C.pagedChangeListNext(), true, "");
next.setVisible(false);
table = new ChangeTable() {
{
keysNavigation.add(
new DoLinkCommand(0, 'p', Util.C.changeTablePagePrev(), prev),
new DoLinkCommand(0, 'n', Util.C.changeTablePageNext(), next));
keysNavigation.add(
new DoLinkCommand(0, '[', Util.C.changeTablePagePrev(), prev),
new DoLinkCommand(0, ']', Util.C.changeTablePageNext(), next));
keysNavigation.add(new KeyCommand(0, 'R', Util.C.keyReloadSearch()) {
@Override
public void onKeyPress(final KeyPressEvent event) {
Gerrit.display(getToken());
}
});
}
};
section = new ChangeTable.Section();
table.addSection(section);
table.setSavePointerId(anchorPrefix);
add(table);
final HorizontalPanel buttons = new HorizontalPanel();
buttons.setStyleName(Gerrit.RESOURCES.css().changeTablePrevNextLinks());
buttons.add(prev);
buttons.add(next);
add(buttons);
}
@Override
public void registerKeys() {
super.registerKeys();
table.setRegisterKeys(true);
}
protected AsyncCallback<ChangeList> loadCallback() {
return new ScreenLoadCallback<ChangeList>(this) {
@Override
protected void preDisplay(ChangeList result) {
display(result);
}
};
}
protected void display(ChangeList result) {
changes = result;
if (changes.length() != 0) {
if (start > 0) {
int p = start - pageSize;
prev.setTargetHistoryToken(anchorPrefix + (p > 0 ? "," + p : ""));
prev.setVisible(true);
} else {
prev.setVisible(false);
}
int n = start + changes.length();
next.setTargetHistoryToken(anchorPrefix + "," + n);
next.setVisible(changes.get(changes.length() - 1)._more_changes());
}
table.updateColumnsForLabels(result);
section.display(result);
table.finishDisplay();
}
private static final class DoLinkCommand extends KeyCommand {
private final Hyperlink link;
private DoLinkCommand(int mask, char key, String help, Hyperlink l) {
super(mask, key, help);
link = l;
}
@Override
public void onKeyPress(final KeyPressEvent event) {
if (link.isVisible()) {
History.newItem(link.getTargetHistoryToken());
}
}
}
}