All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.extjs.gxt.ui.client.widget.toolbar.PagingToolBar Maven / Gradle / Ivy

There is a newer version: 2.3.1-gwt22
Show newest version
/*
 * Sencha GXT 2.3.1a - Sencha for GWT
 * Copyright(c) 2007-2013, Sencha, Inc.
 * [email protected]
 * 
 * http://www.sencha.com/products/gxt/license/
 */
 package com.extjs.gxt.ui.client.widget.toolbar;

import com.extjs.gxt.ui.client.GXT;
import com.extjs.gxt.ui.client.data.ListLoader;
import com.extjs.gxt.ui.client.data.LoadEvent;
import com.extjs.gxt.ui.client.data.PagingLoadConfig;
import com.extjs.gxt.ui.client.data.PagingLoadResult;
import com.extjs.gxt.ui.client.data.PagingLoader;
import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.ComponentEvent;
import com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.LoadListener;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.util.Format;
import com.extjs.gxt.ui.client.util.IconHelper;
import com.extjs.gxt.ui.client.util.Util;
import com.extjs.gxt.ui.client.widget.Component;
import com.extjs.gxt.ui.client.widget.WidgetComponent;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyDownEvent;
import com.google.gwt.event.dom.client.KeyDownHandler;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.DeferredCommand;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.ui.AbstractImagePrototype;
import com.google.gwt.user.client.ui.TextBox;

/**
 * A specialized toolbar that is bound to a {@link ListLoader} and provides
 * automatic paging controls.
 * 
 * 
*
Inherited Events:
*
Component Enable
*
Component Disable
*
Component BeforeHide
*
Component Hide
*
Component BeforeShow
*
Component Show
*
Component Attach
*
Component Detach
*
Component BeforeRender
*
Component Render
*
Component BrowserEvent
*
Component BeforeStateRestore
*
Component StateRestore
*
Component BeforeStateSave
*
Component SaveState
*
*/ @SuppressWarnings("deprecation") public class PagingToolBar extends ToolBar { /** * PagingToolBar images. */ public static class PagingToolBarImages { private AbstractImagePrototype first = GXT.isHighContrastMode ? IconHelper.create("gxt/themes/access/images/grid/page-first.gif") : GXT.IMAGES.paging_toolbar_first(); private AbstractImagePrototype firstDisabled = GXT.IMAGES.paging_toolbar_first_disabled(); private AbstractImagePrototype last = GXT.isHighContrastMode ? IconHelper.create("gxt/themes/access/images/grid/page-last.gif") : GXT.IMAGES.paging_toolbar_last(); private AbstractImagePrototype lastDisabled = GXT.IMAGES.paging_toolbar_last_disabled(); private AbstractImagePrototype next = GXT.isHighContrastMode ? IconHelper.create("gxt/themes/access/images/grid/page-next.gif") : GXT.IMAGES.paging_toolbar_next(); private AbstractImagePrototype nextDisabled = GXT.IMAGES.paging_toolbar_next_disabled(); private AbstractImagePrototype prev = GXT.isHighContrastMode ? IconHelper.create("gxt/themes/access/images/grid/page-prev.gif") : GXT.IMAGES.paging_toolbar_prev(); private AbstractImagePrototype prevDisabled = GXT.IMAGES.paging_toolbar_prev_disabled(); private AbstractImagePrototype refresh = GXT.isHighContrastMode ? IconHelper.create("gxt/themes/access/images/grid/refresh.gif") : GXT.IMAGES.paging_toolbar_refresh(); public AbstractImagePrototype getFirst() { return first; } public AbstractImagePrototype getFirstDisabled() { return firstDisabled; } public AbstractImagePrototype getLast() { return last; } public AbstractImagePrototype getLastDisabled() { return lastDisabled; } public AbstractImagePrototype getNext() { return next; } public AbstractImagePrototype getNextDisabled() { return nextDisabled; } public AbstractImagePrototype getPrev() { return prev; } public AbstractImagePrototype getPrevDisabled() { return prevDisabled; } public AbstractImagePrototype getRefresh() { return refresh; } public void setFirst(AbstractImagePrototype first) { this.first = first; } public void setFirstDisabled(AbstractImagePrototype firstDisabled) { this.firstDisabled = firstDisabled; } public void setLast(AbstractImagePrototype last) { this.last = last; } public void setLastDisabled(AbstractImagePrototype lastDisabled) { this.lastDisabled = lastDisabled; } public void setNext(AbstractImagePrototype next) { this.next = next; } public void setNextDisabled(AbstractImagePrototype nextDisabled) { this.nextDisabled = nextDisabled; } public void setPrev(AbstractImagePrototype prev) { this.prev = prev; } public void setPrevDisabled(AbstractImagePrototype prevDisabled) { this.prevDisabled = prevDisabled; } public void setRefresh(AbstractImagePrototype refresh) { this.refresh = refresh; } } /** * PagingToolBar messages. */ public static class PagingToolBarMessages { private String afterPageText; private String beforePageText = GXT.MESSAGES.pagingToolBar_beforePageText(); private String displayMsg; private String emptyMsg = GXT.MESSAGES.pagingToolBar_emptyMsg(); private String firstText = GXT.MESSAGES.pagingToolBar_firstText(); private String lastText = GXT.MESSAGES.pagingToolBar_lastText(); private String nextText = GXT.MESSAGES.pagingToolBar_nextText(); private String prevText = GXT.MESSAGES.pagingToolBar_prevText(); private String refreshText = GXT.MESSAGES.pagingToolBar_refreshText(); /** * Returns the after page text. * * @return the after page text */ public String getAfterPageText() { return afterPageText; } /** * Returns the before page text. * * @return the before page text */ public String getBeforePageText() { return beforePageText; } /** * Returns the display message. * * @return the display message. */ public String getDisplayMsg() { return displayMsg; } /** * Returns the empty message. * * @return the empty message */ public String getEmptyMsg() { return emptyMsg; } public String getFirstText() { return firstText; } /** * Returns the last text. * * @return the last text */ public String getLastText() { return lastText; } /** * Returns the next text. * * @return the next ext */ public String getNextText() { return nextText; } /** * Returns the previous text. * * @return the previous text */ public String getPrevText() { return prevText; } /** * Returns the refresh text. * * @return the refresh text */ public String getRefreshText() { return refreshText; } /** * Customizable piece of the default paging text (defaults to "of {0}"). * * @param afterPageText the after page text */ public void setAfterPageText(String afterPageText) { this.afterPageText = afterPageText; } /** * Customizable piece of the default paging text (defaults to "Page"). * * @param beforePageText the before page text */ public void setBeforePageText(String beforePageText) { this.beforePageText = beforePageText; } /** * The paging status message to display (defaults to "Displaying {0} - {1} * of {2}"). Note that this string is formatted using the braced numbers 0-2 * as tokens that are replaced by the values for start, end and total * respectively. These tokens should be preserved when overriding this * string if showing those values is desired. * * @param displayMsg the display message */ public void setDisplayMsg(String displayMsg) { this.displayMsg = displayMsg; } /** * The message to display when no records are found (defaults to "No data to * display"). * * @param emptyMsg the empty message */ public void setEmptyMsg(String emptyMsg) { this.emptyMsg = emptyMsg; } /** * Customizable piece of the default paging text (defaults to "First Page"). * * @param firstText the first text */ public void setFirstText(String firstText) { this.firstText = firstText; } /** * Customizable piece of the default paging text (defaults to "Last Page"). * * @param lastText the last text */ public void setLastText(String lastText) { this.lastText = lastText; } /** * Customizable piece of the default paging text (defaults to "Next Page"). * * @param nextText the next text */ public void setNextText(String nextText) { this.nextText = nextText; } /** * Customizable piece of the default paging text (defaults to "Previous * Page"). * * @param prevText the prev text */ public void setPrevText(String prevText) { this.prevText = prevText; } /** * Customizable piece of the default paging text (defaults to "Refresh"). * * @param refreshText the refresh text */ public void setRefreshText(String refreshText) { this.refreshText = refreshText; } } protected int activePage = -1, pages; protected LabelToolItem afterText; protected LabelToolItem beforePage; protected PagingLoadConfig config; protected LabelToolItem displayText; protected Button first, prev, next, last, refresh; protected PagingToolBarImages images; protected Listener listener = new Listener() { public void handleEvent(ComponentEvent be) { Component c = be.getComponent(); if (be.getType() == Events.Disable) { if (c == first) { first.setIcon(getImages().getFirstDisabled()); } else if (c == prev) { prev.setIcon(getImages().getPrevDisabled()); } else if (c == next) { next.setIcon(getImages().getNextDisabled()); } else if (c == last) { last.setIcon(getImages().getLastDisabled()); } } else { if (c == first) { first.setIcon(getImages().getFirst()); } else if (c == prev) { prev.setIcon(getImages().getPrev()); } else if (c == next) { next.setIcon(getImages().getNext()); } else if (c == last) { last.setIcon(getImages().getLast()); } } } }; protected PagingLoader loader; protected LoadListener loadListener; protected PagingToolBarMessages msgs; protected TextBox pageText; protected boolean showToolTips = true; protected int start, pageSize, totalLength; private LoadEvent renderEvent; private boolean reuseConfig = true; private boolean savedEnableState = true; /** * Creates a new paging tool bar with the given page size. * * @param pageSize the page size */ public PagingToolBar(final int pageSize) { this.pageSize = pageSize; first = new Button(); first.addListener(Events.Disable, listener); first.addListener(Events.Enable, listener); first.addSelectionListener(new SelectionListener() { public void componentSelected(ButtonEvent ce) { first(); } }); prev = new Button(); prev.addListener(Events.Disable, listener); prev.addListener(Events.Enable, listener); prev.addSelectionListener(new SelectionListener() { public void componentSelected(ButtonEvent ce) { previous(); } }); next = new Button(); next.addListener(Events.Disable, listener); next.addListener(Events.Enable, listener); next.addSelectionListener(new SelectionListener() { public void componentSelected(ButtonEvent ce) { next(); } }); last = new Button(); last.addListener(Events.Disable, listener); last.addListener(Events.Enable, listener); last.addSelectionListener(new SelectionListener() { public void componentSelected(ButtonEvent ce) { last(); } }); refresh = new Button(); refresh.addSelectionListener(new SelectionListener() { public void componentSelected(ButtonEvent ce) { refresh(); } }); beforePage = new LabelToolItem(); beforePage.setStyleName("my-paging-text"); afterText = new LabelToolItem(); afterText.setStyleName("my-paging-text"); pageText = new TextBox(); if (GXT.isAriaEnabled()) pageText.setTitle("Page"); pageText.addKeyDownHandler(new KeyDownHandler() { public void onKeyDown(KeyDownEvent event) { if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) { onPageChange(); } } }); pageText.setWidth("30px"); displayText = new LabelToolItem(); displayText.setId(getId() + "-display"); displayText.setStyleName("my-paging-display"); add(first); add(prev); add(new SeparatorToolItem()); add(beforePage); add(new WidgetComponent(pageText)); add(afterText); add(new SeparatorToolItem()); add(next); add(last); add(new SeparatorToolItem()); add(refresh); add(new FillToolItem()); add(displayText); setMessages(new PagingToolBarMessages()); setImages(new PagingToolBarImages()); } /** * Binds the toolbar to the loader. * * @param loader the loader */ public void bind(PagingLoader loader) { if (this.loader != null) { this.loader.removeLoadListener(loadListener); } this.loader = loader; if (loader != null) { loader.setLimit(pageSize); if (loadListener == null) { loadListener = new LoadListener() { public void loaderBeforeLoad(final LoadEvent le) { savedEnableState = isEnabled(); setEnabled(false); refresh.setIcon(IconHelper.createStyle("x-tbar-loading")); DeferredCommand.addCommand(new Command() { public void execute() { if (le.isCancelled()) { refresh.setIcon(getImages().getRefresh()); setEnabled(savedEnableState); } } }); } public void loaderLoad(LoadEvent le) { refresh.setIcon(getImages().getRefresh()); setEnabled(savedEnableState); onLoad(le); } public void loaderLoadException(LoadEvent le) { refresh.setIcon(getImages().getRefresh()); setEnabled(savedEnableState); } }; } loader.addLoadListener(loadListener); } } /** * Clears the current toolbar text. */ public void clear() { if (rendered) { pageText.setText(""); afterText.setHtml(""); displayText.setHtml(""); } } /** * Moves to the first page. */ public void first() { doLoadRequest(0, pageSize); } /** * Returns the active page. * * @return the active page */ public int getActivePage() { return activePage; } public PagingToolBarImages getImages() { if (images == null) { images = new PagingToolBarImages(); } return images; } /** * Returns the tool bar's messages. * * @return the messages */ public PagingToolBarMessages getMessages() { return msgs; } /** * Returns the current page size. * * @return the page size */ public int getPageSize() { return pageSize; } /** * Returns the total number of pages. * * @return the */ public int getTotalPages() { return pages; } /** * Returns true if the previous load config is reused. * * @return the reuse config state */ public boolean isReuseConfig() { return reuseConfig; } /** * Returns true if tooltip are enabled. * * @return the show tooltip state */ public boolean isShowToolTips() { return showToolTips; } /** * Moves to the last page. */ public void last() { if (totalLength > 0) { int extra = totalLength % pageSize; int lastStart = extra > 0 ? (totalLength - extra) : totalLength - pageSize; doLoadRequest(lastStart, pageSize); } } /** * Moves to the last page. */ public void next() { doLoadRequest(start + pageSize, pageSize); } /** * Moves the the previous page. */ public void previous() { doLoadRequest(Math.max(0, start - pageSize), pageSize); } /** * Refreshes the data using the current configuration. */ public void refresh() { doLoadRequest(start, pageSize); } /** * Sets the active page (1 to page count inclusive). * * @param page the page */ public void setActivePage(int page) { if (page > pages) { last(); return; } if (page != activePage && page > 0 && page <= pages) { doLoadRequest(--page * pageSize, pageSize); } else { pageText.setText(String.valueOf((int) activePage)); } } public void setImages(PagingToolBarImages images) { this.images = images; refresh.setIcon(getImages().getRefresh()); last.setIcon(last.isEnabled() ? getImages().getLast() : getImages().getLastDisabled()); first.setIcon(first.isEnabled() ? getImages().getFirst() : getImages().getFirstDisabled()); prev.setIcon(prev.isEnabled() ? getImages().getPrev() : getImages().getPrevDisabled()); next.setIcon(next.isEnabled() ? getImages().getNext() : getImages().getNextDisabled()); } /** * Sets the tool bar's messages. * * @param messages the messages */ public void setMessages(PagingToolBarMessages messages) { msgs = messages; if (showToolTips) { first.setToolTip(msgs.getFirstText()); prev.setToolTip(msgs.getPrevText()); next.setToolTip(msgs.getNextText()); last.setToolTip(msgs.getLastText()); refresh.setToolTip(msgs.getRefreshText()); } else { first.removeToolTip(); prev.removeToolTip(); next.removeToolTip(); last.removeToolTip(); refresh.removeToolTip(); } if (GXT.isAriaEnabled()) { first.getAriaSupport().setLabel(msgs.getFirstText()); prev.getAriaSupport().setLabel(msgs.getPrevText()); next.getAriaSupport().setLabel(msgs.getNextText()); last.getAriaSupport().setLabel(msgs.getLastText()); refresh.getAriaSupport().setLabel(msgs.getRefreshText()); } beforePage.setHtml(msgs.getBeforePageText()); } /** * Sets the current page size. This method does not effect the data currently * being displayed. The new page size will not be used until the next load * request. * * @param pageSize the new page size */ public void setPageSize(int pageSize) { this.pageSize = pageSize; } /** * True to reuse the previous load config (defaults to true). * * @param reuseConfig true to reuse the load config */ public void setReuseConfig(boolean reuseConfig) { this.reuseConfig = reuseConfig; } /** * Sets if the button tool tips should be displayed (defaults to true, * pre-render). * * @param showToolTips true to show tool tips */ public void setShowToolTips(boolean showToolTips) { this.showToolTips = showToolTips; } protected void doLoadRequest(int offset, int limit) { if (reuseConfig && config != null) { config.setOffset(offset); config.setLimit(pageSize); loader.load(config); } else { loader.setLimit(pageSize); loader.load(offset, limit); } } protected void onLoad(LoadEvent event) { if (!rendered) { renderEvent = event; return; } config = (PagingLoadConfig) event.getConfig(); PagingLoadResult result = event.getData(); start = result.getOffset(); totalLength = result.getTotalLength(); activePage = (int) Math.ceil((double) (start + pageSize) / pageSize); pages = totalLength < pageSize ? 1 : (int) Math.ceil((double) totalLength / pageSize); if (activePage > pages && totalLength > 0) { last(); return; } else if (activePage > pages) { start = 0; activePage = 1; } pageText.setText(String.valueOf((int) activePage)); String after = null, display = null; if (msgs.getAfterPageText() != null) { after = Format.substitute(msgs.getAfterPageText(), "" + pages); } else { after = GXT.MESSAGES.pagingToolBar_afterPageText(pages); } afterText.setHtml(after); first.setEnabled(activePage != 1); prev.setEnabled(activePage != 1); next.setEnabled(activePage != pages); last.setEnabled(activePage != pages); int temp = activePage == pages ? totalLength : start + pageSize; if (msgs.getDisplayMsg() != null) { String[] params = new String[] {"" + (start + 1), "" + temp, "" + totalLength}; display = Format.substitute(msgs.getDisplayMsg(), (Object[]) params); } else { display = GXT.MESSAGES.pagingToolBar_displayMsg(start + 1, (int) temp, (int) totalLength); } String msg = display; if (totalLength == 0) { msg = msgs.getEmptyMsg(); } displayText.setHtml(msg); } protected void onPageChange() { String value = pageText.getText(); if (value.equals("") || !Util.isInteger(value)) { pageText.setText(String.valueOf((int) activePage)); return; } int p = Integer.parseInt(value); setActivePage(p); } @Override protected void onRender(Element target, int index) { super.onRender(target, index); if (renderEvent != null) { onLoad(renderEvent); renderEvent = null; } if (GXT.isAriaEnabled()) { getAriaSupport().setDescribedBy(displayText.getId()); } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy