/* * Copyright (c) 2008 TouK.pl * * 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 pl.touk.tola.gwt.client.widgets.grid; import com.extjs.gxt.ui.client.widget.toolbar.PagingToolBar; import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem; import com.extjs.gxt.ui.client.widget.toolbar.LabelToolItem; import com.extjs.gxt.ui.client.store.ListStore; import com.extjs.gxt.ui.client.event.*; import com.extjs.gxt.ui.client.data.BaseModelData; import pl.touk.tola.gwt.client.widgets.ComboBoxWithMemory; import java.util.List; import java.util.ArrayList; /** * Nieco zmodyfikowany paging toolbar. Dodaje on dodatkowo mozliwosc ustawiania ilosci wierszywyswietlanych na stronie. * Combo wyswieltajace opcje wyboru jest zbudowane na bazie ComboBoxWithMemory wiec zapamietuje w cistac ostatnio wybrany * index * * @author Lukasz Kucharski - lkc@touk.pl * @since 0.3.1 */ public class VariablePageSizePagingToolBar extends PagingToolBar { private ChoosePageSizeComboBox pageSizeComboBox; /** * Jedyny konstruktor * * @param uniqueName unikalna nazwa wykorzystana jako klucz do zapisu wybranej wartosci w cisteczkach */ public VariablePageSizePagingToolBar(String uniqueName) { super(PageSize.DEFAULT_SET.get(0).getSize()); add(new SeparatorToolItem()); add(new LabelToolItem("Wyników na stronie:")); pageSizeComboBox = new ChoosePageSizeComboBox(uniqueName); // jesli pageSizeComboBox zwroci -1 to znaczy ze nie znalazlo w ciastach poprzednio zaznaczonego indexu if (pageSizeComboBox.getGridPageSize() != -1) { this.setPageSize(pageSizeComboBox.getGridPageSize()); } else { pageSizeComboBox.selectFirstOption(); this.setPageSize(pageSizeComboBox.getGridPageSize()); } pageSizeComboBox.setWidth(60); add(pageSizeComboBox); } @Override public void setPageSize(int pageSize) { super.setPageSize(pageSize); getPageSizeComboBox().setRawValue(""+pageSize); } @Override protected void afterRender() { super.afterRender(); // przy zmianie wartosci w comboboxie zawsze przewijaj do pierwszej strony i ustaw nowo wybrana wartosc jako page size getPageSizeComboBox().addListener(Events.Select, new Listener<BaseEvent>() { public void handleEvent(BaseEvent be) { VariablePageSizePagingToolBar.this.setPageSize(getPageSizeComboBox().getValue().getSize()); VariablePageSizePagingToolBar.this.first(); } }); // pageSizeComboBox.addSelectionChangedListener(new SelectionChangedListener<PageSize>() { // @Override // public void selectionChanged(SelectionChangedEvent<PageSize> se) { // if (se.getType() == Events.Select) { // VariablePageSizePagingToolBar.this.setPageSize(pageSizeComboBox.getValue().getSize()); // VariablePageSizePagingToolBar.this.first(); // } // } // }); } /** * @return the pageSizeComboBox */ public ChoosePageSizeComboBox getPageSizeComboBox() { return pageSizeComboBox; } /** * Zmodyfikowany ComboBoxWithMemory tak aby przechowywal tylko wartosci wyboru dla ilosci * wierszy na stronie */ public static class ChoosePageSizeComboBox extends ComboBoxWithMemory<PageSize> { protected ListStore<PageSize> pageSizeStore = new ListStore<PageSize>(); /** * Ustawia store z wyborem elementow inny niz domyslny */ public void setPageSizeStore(ListStore pageSizeStore) { this.pageSizeStore = pageSizeStore; } public ChoosePageSizeComboBox(String uniqueName) { super(uniqueName); pageSizeStore.add(PageSize.DEFAULT_SET); this.setStore(pageSizeStore); this.setEditable(false); this.setDisplayField("size"); this.setTriggerAction(TriggerAction.ALL); } /** * Wybiera pierwszy element z combo. Pamietajcie ze ta akcja strzela eventami */ public void selectFirstOption(){ this.setValue(getStore().getAt(0)); } public void selectLastOption() { this.setValue(getStore().getAt(5)); } // jesli value jest nullem tzn ze w ciastkach podczas inicializacji klasa bazowa nie znalazla wartosci // elementu ktory powinien byc zaznaczony public int getGridPageSize(){ return getValue() != null ? getValue().getSize() : -1; } } /** * Domyslne wartosci dla wyboru ilości wierszy na stronie * * @author Lukasz Kucharski - lkc@touk.pl */ public static class PageSize extends BaseModelData { public static final List<PageSize> DEFAULT_SET = new ArrayList<PageSize>(); static { DEFAULT_SET.add(new PageSize(10)); DEFAULT_SET.add(new PageSize(15)); DEFAULT_SET.add(new PageSize(20)); DEFAULT_SET.add(new PageSize(30)); DEFAULT_SET.add(new PageSize(50)); DEFAULT_SET.add(new PageSize(100)); } private int size; public PageSize(int size) { this.size = size; this.set("size", size); } public int getSize() { return size; } } }