/* Paging.java
{{IS_NOTE
Purpose:
Description:
History:
Thu Aug 17 15:26:06 2006, Created by tomyeh
}}IS_NOTE
Copyright (C) 2006 Potix Corporation. All Rights Reserved.
{{IS_RIGHT
}}IS_RIGHT
*/
package org.zkoss.zul;
import org.zkoss.zk.ui.WrongValueException;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zul.event.PagingEvent;
import org.zkoss.zul.event.ZulEvents;
import org.zkoss.zul.ext.Paginal;
import org.zkoss.zul.impl.XulElement;
/**
* Paging of long content.
*
* <p>Default {@link #getZclass}: z-paging. (since 3.5.0)
*
* @author tomyeh
*/
public class Paging extends XulElement implements Paginal {
/** # of items per page. */
private int _pgsz = 20;
/** total # of items. */
private int _ttsz = 0;
/** # of pages. */
private int _npg = 1;
/** the active page. */
private int _actpg = 0;
/** # of page anchors are visible */
private int _pginc = 10;
/** Whether to hide automatically if only one page is available. */
private boolean _autohide;
/** Whether to show detailed info. */
private boolean _detailed;
private boolean _disabled;
static {
addClientEvent(Paging.class, ZulEvents.ON_PAGING, CE_IMPORTANT);
}
public Paging() {
}
/** Constructor.
*
* @param totalsz the total # of items
* @param pagesz the # of items per page
*/
public Paging(int totalsz, int pagesz) {
this();
setTotalSize(totalsz);
setPageSize(pagesz);
}
//Paginal//
public int getPageSize() {
return _pgsz;
}
/**Sets the items to show in each page
*
*/
public void setPageSize(int size) throws WrongValueException {
if (size <= 0)
throw new WrongValueException("positive only");
if (_pgsz != size) {
_pgsz = size;
smartUpdate("pageSize", _pgsz);
updatePageNum();
// B50-ZK-345: speed up onPagingImpl to surpass onInitRender
Events.postEvent(10001, new PagingEvent("onPagingImpl", this, _actpg));
//onPagingImpl is used for implementation purpose only
}
}
public int getTotalSize() {
return _ttsz;
}
/**Sets total size of items
*
*/
public void setTotalSize(int size) throws WrongValueException {
if (size < 0)
throw new WrongValueException("non-negative only");
if (_ttsz != size) {
_ttsz = size;
smartUpdate("totalSize", _ttsz);
updatePageNum();
}
}
private void updatePageNum() {
int v = (_ttsz - 1) / _pgsz + 1;
if (v == 0)
v = 1;
if (v != _npg) {
_npg = v;
smartUpdate("pageCount", _npg);
if (_actpg >= _npg) {
_actpg = _npg - 1;
smartUpdate("activePage", _actpg);
}
}
}
public int getPageCount() {
return _npg;
}
public int getActivePage() {
return _actpg;
}
/**
* Set the active page
* <p>Note: In server side, active page starts from 0. But in browser UI, it starts from 1
*/
public void setActivePage(int pg) throws WrongValueException {
if (pg >= _npg || pg < 0)
throw new WrongValueException("Unable to set active page to " + pg + " since only " + _npg + " pages");
if (_actpg != pg) {
_actpg = pg;
smartUpdate("activePage", pg);
Events.postEvent(new PagingEvent("onPagingImpl", this, _actpg));
//onPagingImpl is used for implementation purpose only
}
}
public int getPageIncrement() {
return _pginc;
}
/**
* Sets the number of page list icon when mold is "os"
*/
public void setPageIncrement(int pginc) throws WrongValueException {
if (pginc <= 0)
throw new WrongValueException("Nonpositive is not allowed: " + pginc);
if (_pginc != pginc) {
_pginc = pginc;
smartUpdate("pageIncrement", pginc);
}
}
public boolean isDetailed() {
return _detailed;
}
/** Sets whether to show total size and index of items in current page
*
*/
public void setDetailed(boolean detailed) {
if (_detailed != detailed) {
_detailed = detailed;
smartUpdate("detailed", detailed);
}
}
//extra//
/** Returns whether to automatically hide this component if
* there is only one page available.
* <p>Default: false.
*/
public boolean isAutohide() {
return _autohide;
}
/** Sets whether to automatically hide this component if
* there is only one page available.
*/
public void setAutohide(boolean autohide) {
if (_autohide != autohide) {
_autohide = autohide;
smartUpdate("autohide", autohide);
}
}
// super
protected void renderProperties(org.zkoss.zk.ui.sys.ContentRenderer renderer) throws java.io.IOException {
super.renderProperties(renderer);
if (_ttsz != 0)
renderer.render("totalSize", _ttsz);
if (_pgsz != 20)
renderer.render("pageSize", _pgsz);
if (_actpg != 0)
renderer.render("activePage", _actpg);
if (_npg != 1)
renderer.render("pageCount", _npg);
if (_pginc != 10)
renderer.render("pageIncrement", _pginc);
render(renderer, "detailed", _detailed);
render(renderer, "autohide", isAutohide());
render(renderer, "disabled", _disabled);
}
public String getZclass() {
String added = "os".equals(getMold()) ? "-os" : "";
return _zclass == null ? "z-paging" + added : _zclass;
}
// -- Component --//
public boolean isVisible() {
return super.isVisible() && (_npg > 1 || !_autohide);
}
protected boolean isChildable() {
return false;
}
//-- ComponentCtrl --//
/** Processes an AU request.
*
* <p>Default: in addition to what are handled by {@link XulElement#service},
* it also handles onSelect.
* @since 5.0.0
*/
public void service(org.zkoss.zk.au.AuRequest request, boolean everError) {
final String name = request.getCommand();
if (name.equals(ZulEvents.ON_PAGING)) {
PagingEvent evt = PagingEvent.getPagingEvent(request);
setActivePage(evt.getActivePage());
Events.postEvent(evt);
} else
super.service(request, everError);
}
/** Returns whether it is disabled.
* <p>Default: false.
* @since 8.0.3
*/
public boolean isDisabled() {
return _disabled;
}
/** Sets whether it is disabled.
* @since 8.0.3
*/
public void setDisabled(boolean disabled) {
if (_disabled != disabled) {
_disabled = disabled;
smartUpdate("disabled", _disabled);
}
}
}