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}