/*
* JavaXYQ Engine
*
* javaxyq@2008 all rights.
* http://www.javaxyq.com
*/
package com.javaxyq.tools;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.event.EventListenerList;
import org.jdesktop.application.Action;
import org.jdesktop.application.Application;
import org.jdesktop.application.ApplicationAction;
import org.jdesktop.application.ApplicationActionMap;
import org.jdesktop.application.Task;
import org.jdesktop.application.Task.BlockingScope;
import com.jidesoft.action.CommandBar;
import com.jidesoft.dialog.JideOptionPane;
import com.jidesoft.swing.JideButton;
/**
* @author ����ΰ
* @history 2008-6-28 ����ΰ �½�
*/
public class PaginationBar {
private CommandBar toolbar = new CommandBar();
private JButton firstButton;
private JButton prevButton;
private JButton nextButton;
private JButton lastButton;
private JTextField pageField = new JTextField();
private EventListenerList listenerList = new EventListenerList();
private int pageNo = 1;
private int pageSize = 20;
private int pageCount = 0;
private int totalCount;
private ApplicationActionMap actionMap;
public PaginationBar(int pageNo, int pageSize, int totalCount) {
actionMap = Application.getInstance().getContext().getActionMap(this);
firstButton = createButton("first");
prevButton = createButton("prev");
nextButton = createButton("next");
lastButton = createButton("last");
pageField.setAction(actionMap.get("reload"));
//pageField.setFocusable(false);
pageField.setPreferredSize(new Dimension(100, 20));
pageField.addFocusListener(new FocusListener() {
public void focusGained(FocusEvent e) {
pageField.setText("" + PaginationBar.this.pageNo);
pageField.selectAll();
}
public void focusLost(FocusEvent e) {
updatePageField();
}
});
pageField.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyChar() == KeyEvent.VK_ENTER) {
int pageNo = Integer.parseInt(pageField.getText());
PaginationBar.this.setPageNo(pageNo);
}
}
});
toolbar.add(firstButton);
toolbar.add(prevButton);
toolbar.add(pageField);
toolbar.add(nextButton);
toolbar.add(lastButton);
toolbar.addSeparator();
toolbar.add(actionMap.get("setting"));
this.init(pageNo, pageSize, totalCount);
//updatePageField();
}
public PaginationBar() {
this(1, 30, 0);
}
public void init(int pageNo, int pageSize, int totalCount) {
this.pageNo = pageNo;
this.totalCount = totalCount;
this.pageCount = (totalCount + pageSize - 1) / pageSize;
this.pageSize = pageSize;
updatePageField();
updateActions();
}
private JButton createButton(String actionKey) {
JButton button = new JideButton();
button.setAction(actionMap.get(actionKey));
button.setText("");
button.setFocusable(false);
return button;
}
public ApplicationActionMap getActionMap() {
return actionMap;
}
public void registerKeyboardAction(JComponent c, int condition) {
javax.swing.Action firstAction = actionMap.get("first");
javax.swing.Action prevAction = actionMap.get("prev");
javax.swing.Action nextAction = actionMap.get("next");
javax.swing.Action lastAction = actionMap.get("last");
//ctrl home
c.registerKeyboardAction(firstAction, KeyStroke.getKeyStroke(KeyEvent.VK_HOME,
KeyEvent.CTRL_DOWN_MASK), condition);
//ctrl pageUp
c.registerKeyboardAction(prevAction, KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP,
KeyEvent.CTRL_DOWN_MASK), condition);
//ctrl left
c.registerKeyboardAction(prevAction, KeyStroke.getKeyStroke(KeyEvent.VK_LEFT,
KeyEvent.CTRL_DOWN_MASK), condition);
//ctrl right
c.registerKeyboardAction(nextAction, KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT,
KeyEvent.CTRL_DOWN_MASK), condition);
//ctrl pageDown
c.registerKeyboardAction(nextAction, KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN,
KeyEvent.CTRL_DOWN_MASK), condition);
//ctrl end
c.registerKeyboardAction(lastAction, KeyStroke.getKeyStroke(KeyEvent.VK_END,
KeyEvent.CTRL_DOWN_MASK), condition);
}
private void updatePageField() {
pageField.setText(pageNo + "/" + pageCount);
}
public CommandBar getComponent() {
return toolbar;
}
public void addPaginationListener(PaginationListener l) {
listenerList.add(PaginationListener.class, l);
}
public void removePaginationListener(PaginationListener l) {
listenerList.remove(PaginationListener.class, l);
}
@Action(block = BlockingScope.ACTION)
public Task first() {
this.pageNo = 1;
PaginationEvent e = new PaginationEvent(this, pageNo, pageSize);
return new LoadTask(Application.getInstance(), e);
}
@Action(block = BlockingScope.ACTION)
public Task prev() {
if (this.pageNo > 1) {
this.pageNo--;
PaginationEvent e = new PaginationEvent(this, pageNo, pageSize);
return new LoadTask(Application.getInstance(), e);
}
return null;
}
@Action(block = BlockingScope.ACTION)
public Task next() {
if (this.pageNo < this.pageCount) {
this.pageNo++;
PaginationEvent e = new PaginationEvent(this, pageNo, pageSize);
return new LoadTask(Application.getInstance(), e);
}
return null;
}
@Action(block = BlockingScope.ACTION)
public Task last() {
this.pageNo = this.pageCount;
PaginationEvent e = new PaginationEvent(this, pageNo, pageSize);
return new LoadTask(Application.getInstance(), e);
}
public int getPageNo() {
return pageNo;
}
public void setPageNo(int pageNo) {
if (pageNo > pageCount) {
pageNo = pageCount;
}
if (pageNo < 1) {
pageNo = 1;
}
this.pageNo = pageNo;
updatePageField();
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getPageCount() {
return pageCount;
}
public void setPageCount(int pageCount) {
this.pageCount = pageCount;
}
public int getStartNo() {
return (pageNo - 1) * pageSize;
}
public int getEndNo() {
int end = pageNo * pageSize;
return end > totalCount ? totalCount : end;
}
@Action(block = BlockingScope.ACTION)
public Task reload() {
PaginationEvent e = new PaginationEvent(this, pageNo, pageSize);
return new LoadTask(Application.getInstance(), e);
//Application.getInstance().getContext().
}
private class LoadTask extends Task<Void, Void> {
private PaginationEvent event;
public LoadTask(Application application, PaginationEvent e) {
super(application);
this.event = e;
}
@Override
protected Void doInBackground() throws Exception {
setMessage("loading...");
updatePageField();
PaginationListener[] listeners = listenerList.getListeners(PaginationListener.class);
for (int i = 0; i < listeners.length; i++) {
PaginationListener listener = listeners[i];
try {
listener.loadPage(event);
} catch (Exception e) {
System.out.println("execute pagination listener error!");
e.printStackTrace();
}
}
return null;
}
@Override
protected void succeeded(Void result) {
setMessage("loaded.");
}
@Override
protected void failed(Throwable cause) {
setMessage("failed! "+cause.getMessage());
cause.printStackTrace();
}
@Override
protected void cancelled() {
setMessage("user cancelled.");
}
@Override
protected void finished() {
updateActions();
}
}
public void doAction(String actionKey) {
ApplicationAction action = (ApplicationAction) getActionMap().get(actionKey);
action.actionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, null));
}
private void updateActions() {
try {
actionMap.get("first").setEnabled(pageNo > 1);
actionMap.get("prev").setEnabled(pageNo > 1);
actionMap.get("next").setEnabled(pageNo < pageCount);
actionMap.get("last").setEnabled(pageNo < pageCount);
} catch (Exception e) {
e.printStackTrace();
}
}
public void doReload() {
this.doAction("reload");
}
public void doFirst() {
this.doAction("first");
}
@Action
public void setting() {
String strSize = JideOptionPane.showInputDialog("������ÿҳ��ʾ�ļ�¼��:", this.pageSize);
try {
this.pageSize = Integer.parseInt(strSize);
doReload();
} catch (NumberFormatException e) {
e.printStackTrace();
}
}
}