Home | History | Annotate | Download | only in ui
      1 package autotest.common.ui;
      2 
      3 import autotest.common.SimpleCallback;
      4 
      5 import com.google.gwt.event.dom.client.ClickEvent;
      6 import com.google.gwt.event.dom.client.ClickHandler;
      7 import com.google.gwt.user.client.ui.Anchor;
      8 import com.google.gwt.user.client.ui.Composite;
      9 import com.google.gwt.user.client.ui.FlowPanel;
     10 import com.google.gwt.user.client.ui.HorizontalPanel;
     11 import com.google.gwt.user.client.ui.Label;
     12 import com.google.gwt.user.client.ui.Panel;
     13 
     14 import java.util.ArrayList;
     15 import java.util.List;
     16 
     17 /**
     18  * A widget to faciliate pagination of tables.  Shows currently displayed rows,
     19  * total row count, and buttons for moving among pages.
     20  */
     21 public class Paginator extends Composite {
     22     static class LinkWithDisable extends Composite {
     23         protected Panel panel = new FlowPanel();
     24         protected Label label;
     25         protected Anchor link;
     26 
     27         public LinkWithDisable(String text) {
     28             label = new Label(text);
     29             link = new Anchor(text);
     30             panel.add(link);
     31             panel.add(label);
     32             link.setStyleName("paginator-link");
     33             label.setStyleName("paginator-link");
     34             setEnabled(false); // default to not enabled
     35             initWidget(panel);
     36         }
     37 
     38         public void setEnabled(boolean enabled) {
     39             link.setVisible(enabled);
     40             label.setVisible(!enabled);
     41         }
     42 
     43         public void addClickHandler(ClickHandler handler) {
     44             link.addClickHandler(handler);
     45         }
     46     }
     47 
     48     protected int resultsPerPage, numTotalResults;
     49     protected List<SimpleCallback> callbacks = new ArrayList<SimpleCallback>();
     50     protected int currentStart = 0;
     51 
     52     protected HorizontalPanel mainPanel = new HorizontalPanel();
     53     protected LinkWithDisable nextControl, prevControl,
     54                               firstControl, lastControl;
     55     protected Label statusLabel = new Label();
     56 
     57     public Paginator() {
     58         prevControl = new LinkWithDisable("< Previous");
     59         prevControl.addClickHandler(new ClickHandler() {
     60             public void onClick(ClickEvent event) {
     61                 currentStart -= Paginator.this.resultsPerPage;
     62                 notifyCallbacks();
     63             }
     64         });
     65         nextControl = new LinkWithDisable("Next >");
     66         nextControl.addClickHandler(new ClickHandler() {
     67             public void onClick(ClickEvent event) {
     68                 currentStart += Paginator.this.resultsPerPage;
     69                 notifyCallbacks();
     70             }
     71         });
     72         firstControl = new LinkWithDisable("<< First");
     73         firstControl.addClickHandler(new ClickHandler() {
     74             public void onClick(ClickEvent event) {
     75                 currentStart = 0;
     76                 notifyCallbacks();
     77             }
     78         });
     79         lastControl = new LinkWithDisable("Last >>");
     80         lastControl.addClickHandler(new ClickHandler() {
     81             public void onClick(ClickEvent event) {
     82                 currentStart = getLastPageStart();
     83                 notifyCallbacks();
     84             }
     85         });
     86 
     87         statusLabel.setWidth("10em");
     88         statusLabel.setHorizontalAlignment(Label.ALIGN_CENTER);
     89 
     90         mainPanel.setVerticalAlignment(HorizontalPanel.ALIGN_MIDDLE);
     91         mainPanel.add(firstControl);
     92         mainPanel.add(prevControl);
     93         mainPanel.add(statusLabel);
     94         mainPanel.add(nextControl);
     95         mainPanel.add(lastControl);
     96 
     97         initWidget(mainPanel);
     98     }
     99 
    100     /**
    101      * Get the current starting row index.
    102      */
    103     public int getStart() {
    104         return currentStart;
    105     }
    106 
    107     /**
    108      * Get the current ending row index (one past the last currently displayed
    109      * row).
    110      */
    111     public int getEnd() {
    112         int end = currentStart + resultsPerPage;
    113         if (end < numTotalResults)
    114             return end;
    115         return numTotalResults;
    116     }
    117 
    118     /**
    119      * Get the size of each page.
    120      */
    121     public int getResultsPerPage() {
    122         return resultsPerPage;
    123     }
    124 
    125     /**
    126      * Set the size of a page.
    127      */
    128     public void setResultsPerPage(int resultsPerPage) {
    129         this.resultsPerPage = resultsPerPage;
    130     }
    131 
    132     /**
    133      * Set the total number of results in the current working set.
    134      */
    135     public void setNumTotalResults(int numResults) {
    136         this.numTotalResults = numResults;
    137         if (currentStart >= numResults)
    138             currentStart = getLastPageStart();
    139     }
    140 
    141     /**
    142      * Set the current starting index.
    143      */
    144     public void setStart(int start) {
    145         this.currentStart = start;
    146     }
    147 
    148     protected int getLastPageStart() {
    149         // compute start of last page using truncation
    150         return ((numTotalResults - 1) / resultsPerPage) * resultsPerPage;
    151     }
    152 
    153     public void update() {
    154         boolean prevEnabled = !(currentStart == 0);
    155         boolean nextEnabled = currentStart + resultsPerPage < numTotalResults;
    156         firstControl.setEnabled(prevEnabled);
    157         prevControl.setEnabled(prevEnabled);
    158         nextControl.setEnabled(nextEnabled);
    159         lastControl.setEnabled(nextEnabled);
    160         int displayStart = getStart() + 1;
    161         if(numTotalResults == 0)
    162             displayStart = 0;
    163         statusLabel.setText(displayStart + "-" + getEnd() +
    164                             " of " + numTotalResults);
    165     }
    166 
    167     public void addCallback(SimpleCallback callback) {
    168         callbacks.add(callback);
    169     }
    170 
    171     public void removeCallback(SimpleCallback callback) {
    172         callbacks.remove(callback);
    173     }
    174 
    175     protected void notifyCallbacks() {
    176         for (SimpleCallback callback : callbacks) {
    177             callback.doCallback(this);
    178         }
    179     }
    180 }
    181