// 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 ChangeTable2 table; private ChangeTable2.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 ChangeTable2() { { 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 ChangeTable2.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()); } } } }