blob: 4fd0eba60082dc3572c105c87a3248ae2994cb5b [file] [log] [blame]
package autotest.common.ui;
import autotest.common.SimpleCallback;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Panel;
import java.util.ArrayList;
import java.util.List;
/**
* A widget to faciliate pagination of tables. Shows currently displayed rows,
* total row count, and buttons for moving among pages.
*/
public class Paginator extends Composite {
static class LinkWithDisable extends Composite {
protected Panel panel = new FlowPanel();
protected Label label;
protected Anchor link;
public LinkWithDisable(String text) {
label = new Label(text);
link = new Anchor(text);
panel.add(link);
panel.add(label);
link.setStyleName("paginator-link");
label.setStyleName("paginator-link");
setEnabled(false); // default to not enabled
initWidget(panel);
}
public void setEnabled(boolean enabled) {
link.setVisible(enabled);
label.setVisible(!enabled);
}
public void addClickHandler(ClickHandler handler) {
link.addClickHandler(handler);
}
}
protected int resultsPerPage, numTotalResults;
protected List<SimpleCallback> callbacks = new ArrayList<SimpleCallback>();
protected int currentStart = 0;
protected HorizontalPanel mainPanel = new HorizontalPanel();
protected LinkWithDisable nextControl, prevControl,
firstControl, lastControl;
protected Label statusLabel = new Label();
public Paginator() {
prevControl = new LinkWithDisable("< Previous");
prevControl.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
currentStart -= Paginator.this.resultsPerPage;
notifyCallbacks();
}
});
nextControl = new LinkWithDisable("Next >");
nextControl.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
currentStart += Paginator.this.resultsPerPage;
notifyCallbacks();
}
});
firstControl = new LinkWithDisable("<< First");
firstControl.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
currentStart = 0;
notifyCallbacks();
}
});
lastControl = new LinkWithDisable("Last >>");
lastControl.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
currentStart = getLastPageStart();
notifyCallbacks();
}
});
statusLabel.setWidth("10em");
statusLabel.setHorizontalAlignment(Label.ALIGN_CENTER);
mainPanel.setVerticalAlignment(HorizontalPanel.ALIGN_MIDDLE);
mainPanel.add(firstControl);
mainPanel.add(prevControl);
mainPanel.add(statusLabel);
mainPanel.add(nextControl);
mainPanel.add(lastControl);
initWidget(mainPanel);
}
/**
* Get the current starting row index.
*/
public int getStart() {
return currentStart;
}
/**
* Get the current ending row index (one past the last currently displayed
* row).
*/
public int getEnd() {
int end = currentStart + resultsPerPage;
if (end < numTotalResults)
return end;
return numTotalResults;
}
/**
* Get the size of each page.
*/
public int getResultsPerPage() {
return resultsPerPage;
}
/**
* Set the size of a page.
*/
public void setResultsPerPage(int resultsPerPage) {
this.resultsPerPage = resultsPerPage;
}
/**
* Set the total number of results in the current working set.
*/
public void setNumTotalResults(int numResults) {
this.numTotalResults = numResults;
if (currentStart >= numResults)
currentStart = getLastPageStart();
}
/**
* Set the current starting index.
*/
public void setStart(int start) {
this.currentStart = start;
}
protected int getLastPageStart() {
// compute start of last page using truncation
return ((numTotalResults - 1) / resultsPerPage) * resultsPerPage;
}
public void update() {
boolean prevEnabled = !(currentStart == 0);
boolean nextEnabled = currentStart + resultsPerPage < numTotalResults;
firstControl.setEnabled(prevEnabled);
prevControl.setEnabled(prevEnabled);
nextControl.setEnabled(nextEnabled);
lastControl.setEnabled(nextEnabled);
int displayStart = getStart() + 1;
if(numTotalResults == 0)
displayStart = 0;
statusLabel.setText(displayStart + "-" + getEnd() +
" of " + numTotalResults);
}
public void addCallback(SimpleCallback callback) {
callbacks.add(callback);
}
public void removeCallback(SimpleCallback callback) {
callbacks.remove(callback);
}
protected void notifyCallbacks() {
for (SimpleCallback callback : callbacks) {
callback.doCallback(this);
}
}
}