| /* |
| * Copyright 2010 Google Inc. |
| * |
| * 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.gwt.user.cellview.client; |
| |
| import com.google.gwt.event.dom.client.ClickEvent; |
| import com.google.gwt.event.dom.client.ClickHandler; |
| import com.google.gwt.uibinder.client.UiConstructor; |
| import com.google.gwt.user.client.ui.Anchor; |
| import com.google.gwt.user.client.ui.FlexTable; |
| import com.google.gwt.view.client.HasRows; |
| import com.google.gwt.view.client.Range; |
| |
| /** |
| * A simple pager that controls the page size. |
| */ |
| public class PageSizePager extends AbstractPager { |
| |
| /** |
| * The increment by which to grow or shrink the page size. |
| */ |
| private final int increment; |
| |
| /** |
| * The main layout widget. |
| */ |
| private final FlexTable layout = new FlexTable(); |
| |
| // TODO(jlabanca): I18N button text. |
| private final Anchor showMoreButton = new Anchor("Show More"); |
| private final Anchor showLessButton = new Anchor("Show Less"); |
| |
| /** |
| * Construct a PageSizePager with a given increment. |
| * |
| * @param increment the amount by which to increase the page size |
| */ |
| @UiConstructor |
| public PageSizePager(final int increment) { |
| this.increment = increment; |
| initWidget(layout); |
| layout.setCellPadding(0); |
| layout.setCellSpacing(0); |
| |
| // Show more button. |
| showMoreButton.addClickHandler(new ClickHandler() { |
| public void onClick(ClickEvent event) { |
| // Display should be non-null, but we check defensively. |
| HasRows display = getDisplay(); |
| if (display != null) { |
| Range range = display.getVisibleRange(); |
| int pageSize = Math.min(range.getLength() + increment, |
| display.getRowCount() |
| + (display.isRowCountExact() ? 0 : increment)); |
| display.setVisibleRange(range.getStart(), pageSize); |
| } |
| } |
| }); |
| showLessButton.addClickHandler(new ClickHandler() { |
| public void onClick(ClickEvent event) { |
| // Display should be non-null, but we check defensively. |
| HasRows display = getDisplay(); |
| if (display != null) { |
| Range range = display.getVisibleRange(); |
| int pageSize = Math.max(range.getLength() - increment, increment); |
| display.setVisibleRange(range.getStart(), pageSize); |
| } |
| } |
| }); |
| |
| // Add the buttons to the pager. |
| layout.setWidget(0, 0, showLessButton); |
| layout.setText(0, 1, " | "); |
| layout.setWidget(0, 2, showMoreButton); |
| |
| // Hide the buttons by default. |
| setDisplay(null); |
| } |
| |
| @Override |
| public void setDisplay(HasRows display) { |
| // Hide the buttons if the display is null. If the display is non-null, the |
| // buttons will be displayed in onRangeOrRowCountChanged(). |
| if (display == null) { |
| showLessButton.setVisible(false); |
| showMoreButton.setVisible(false); |
| } |
| super.setDisplay(display); |
| } |
| |
| @Override |
| public void setPageSize(int pageSize) { |
| super.setPageSize(pageSize); |
| } |
| |
| @Override |
| protected void onRangeOrRowCountChanged() { |
| // Assumes a page start index of 0. |
| HasRows display = getDisplay(); |
| int pageSize = display.getVisibleRange().getLength(); |
| boolean hasLess = pageSize > increment; |
| boolean hasMore = !display.isRowCountExact() |
| || pageSize < display.getRowCount(); |
| showLessButton.setVisible(hasLess); |
| showMoreButton.setVisible(hasMore); |
| layout.setText(0, 1, (hasLess && hasMore) ? " | " : ""); |
| } |
| |
| /** |
| * Visible for testing. |
| */ |
| boolean isShowLessButtonVisible() { |
| return showLessButton.isVisible(); |
| } |
| |
| /** |
| * Visible for testing. |
| */ |
| boolean isShowMoreButtonVisible() { |
| return showMoreButton.isVisible(); |
| } |
| } |