001/*
002 * ModeShape (http://www.modeshape.org)
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *       http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.modeshape.web.client.grid;
017
018import com.smartgwt.client.types.VerticalAlignment;
019import com.smartgwt.client.widgets.Label;
020import com.smartgwt.client.widgets.events.ClickEvent;
021import com.smartgwt.client.widgets.events.ClickHandler;
022import com.smartgwt.client.widgets.form.DynamicForm;
023import com.smartgwt.client.widgets.form.fields.TextItem;
024import com.smartgwt.client.widgets.layout.HLayout;
025
026/**
027 * Pager control element.
028 * 
029 * @author kulikov
030 */
031public abstract class Pager extends HLayout {
032    
033    private final Label[] pageNumber = new Label[10];
034    private final TextItem itemsPerPageEditor = new TextItem("Nodes per page");
035    
036    private int pageTotal;
037
038    public Pager() {
039        super();
040        setHeight(30);
041        
042        final Label pageLabel = new Label();
043        pageLabel.setContents("<b>Page:</b>");
044        pageLabel.setMargin(3);
045        pageLabel.setAutoWidth();
046        addMember(pageLabel);
047        
048        for (int i = 0; i < pageNumber.length; i++) {
049            pageNumber[i] = new Label();
050            pageNumber[i].setAutoWidth();
051            pageNumber[i].addClickHandler(new ClickHandler() {
052                @Override
053                public void onClick(ClickEvent event) {
054                    Label label = (Label) event.getSource();
055                    String indexStr = label.getContents();
056                    if (indexStr.equals("..")) {
057                        return;
058                    }
059                    int index = Integer.parseInt(indexStr) - 1;
060                    fetch(index);
061                    draw(index);
062                }
063            });
064            pageNumber[i].setMargin(3);
065            addMember(pageNumber[i]);
066        }
067        
068        itemsPerPageEditor.setWidth(50);
069        itemsPerPageEditor.setValue("10");
070        
071        DynamicForm form = new DynamicForm();
072        form.setHeight100();
073        form.setWidth(200);
074        form.setLayoutAlign(VerticalAlignment.CENTER);
075        form.setItems(itemsPerPageEditor);
076        
077        Label strut = new Label();
078        strut.setHeight100();
079        strut.setWidth100();
080        
081        addMember(strut);
082        addMember(form);
083    }
084
085    /**
086     * Assigns total number of records.
087     * 
088     * @param amount 
089     */
090    public void setRecordsAmount(int amount) {
091        int ipp = Integer.parseInt(itemsPerPageEditor.getValueAsString());
092        pageTotal = amount % ipp == 0? amount / ipp : amount / ipp + 1;
093        draw(0);
094    }
095    
096    /**
097     * Gets amount of records displayed by one page.
098     * 
099     * @return 
100     */
101    public int getRecordsPerPage() {
102        return Integer.parseInt(itemsPerPageEditor.getValueAsString());
103    }
104    /**
105     * Fetches records from source.
106     * 
107     * @param index page index
108     */
109    public abstract void fetch(int index);
110
111    private void draw(int index) {
112        for (int i = 0; i < pageNumber.length; i++) {
113            pageNumber[i].setVisible(false);
114        }
115
116        if (pageTotal <= pageNumber.length) {
117            for (int i = 0; i < pageTotal; i++) {
118                pageNumber[i].setContents(Integer.toString(i + 1));
119                pageNumber[i].setVisible(true);
120            }
121        } else if (index < pageTotal / 2) {
122            pageNumber[0].setContents("1");
123            pageNumber[0].setVisible(true);
124
125            for (int i = 1; i < pageNumber.length - 1; i++) {
126                pageNumber[i].setContents(Integer.toString(i + 1));
127                pageNumber[i].setVisible(true);
128            }
129
130            pageNumber[pageNumber.length - 2].setContents("..");
131            pageNumber[pageNumber.length - 2].setVisible(true);
132
133            pageNumber[pageNumber.length - 1].setContents(Integer.toString(pageTotal));
134            pageNumber[pageNumber.length - 1].setVisible(true);
135
136        } else {
137
138            pageNumber[0].setContents("1");
139            pageNumber[0].setVisible(true);
140
141            pageNumber[1].setContents("..");
142            pageNumber[1].setVisible(true);
143
144            for (int i = 2; i < pageNumber.length - 1; i++) {
145                pageNumber[i].setContents(Integer.toString(i + 1));
146                pageNumber[i].setVisible(true);
147            }
148
149        }
150        
151        String idx = Integer.toString(index + 1);
152        for (int i = 0; i < pageNumber.length; i++) {
153            if (pageNumber[i].getContents().equals(idx)) {
154                pageNumber[i].setStyleName("page-index-selected");
155            } else {
156                pageNumber[i].setStyleName("page-index");
157            }
158        }
159    }
160}