package org.openswing.swing.client; import java.util.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import org.openswing.swing.util.client.*; /** * <p>Title: OpenSwing Framework</p> * <p>Description: Navigator bar: contains first, previous, next and last buttons. * This class must be used inside a GridControl.</p> * <p>Copyright: Copyright (C) 2006 Mauro Carniel</p> * * <p> This file is part of OpenSwing Framework. * This library is free software; you can redistribute it and/or * modify it under the terms of the (LGPL) Lesser General Public * License as published by the Free Software Foundation; * * GNU LESSER GENERAL PUBLIC LICENSE * Version 2.1, February 1999 * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * The author may be contacted at: * maurocarniel@tin.it</p> * * @author Mauro Carniel * @version 1.0 */ public class NavigatorBar extends JPanel { /** load the first block of records into the grid */ private JButton firstButton = new GenericButton(new ImageIcon(ClientUtils.getImage("first.gif"))); /** select the previous row in the grid */ private JButton prevButton = new GenericButton(new ImageIcon(ClientUtils.getImage("prev.gif"))); /** select the next row in the grid */ private JButton nextButton = new GenericButton(new ImageIcon(ClientUtils.getImage("next.gif"))); /** load the last block of records into the grid */ private JButton lastButton = new GenericButton(new ImageIcon(ClientUtils.getImage("last.gif"))); /** load the next block of records from the grid */ private JButton nextPgButton = new GenericButton(new ImageIcon(ClientUtils.getImage("nextpg.gif"))); /** load the previous block of records from the grid */ private JButton prevPgButton = new GenericButton(new ImageIcon(ClientUtils.getImage("prevpg.gif"))); /** grid control */ private NavigatorBarController resultSetController = null; /** list of ActionListeners registered to this navigator bar; these listeners will be called AFTER a navigator button has been pressed (AFTER selecting row event) */ private ArrayList afterActionListeners = new ArrayList(); /** list of ActionListeners registered to this navigator bar; these listeners will be called as the first instruction when a navigator button is being pressed (BEFORE selecting row event) */ private ArrayList beforeActionListeners = new ArrayList(); public static final String FIRST_BUTTON = "FIRST_BUTTON"; public static final String PREV_BUTTON = "PREV_BUTTON"; public static final String NEXT_BUTTON = "NEXT_BUTTON"; public static final String LAST_BUTTON = "LAST_BUTTON"; public static final String NEXT_PG_BUTTON = "NEXT_PG_BUTTON"; public static final String PREV_PG_BUTTON = "PREV_PG_BUTTON"; public static final String UP_KEY = "UP_KEY"; public static final String DOWN_KEY = "DOWN_KEY"; public static final String LEFT_MOUSE_BUTTON = "LEFT_MOUSE_BUTTON"; /** optional input field used to specify the page number to load; only in case of loading one page per time */ private NumericControl controlPageNr = new NumericControl(); /** current page number */ private int currentPageNr = -1; /** panel that contains page number field */ private JPanel pageNrPanel = new JPanel(); /** <code>true</code> to show pagination buttons in navigator bar; <code>false</code> to do not show them; default value: <code>ClientSettings.SHOW_PAGINATION_BUTTONS_ON_NAVBAR</code> */ private boolean showPaginationButtons = ClientSettings.SHOW_PAGINATION_BUTTONS_ON_NAVBAR; /** <code>true</code> to show page number input field in navigator bar (note: it is automatically hided if result set is fully loaded in grid, independently from this setting); <code>false</code> to do not show it; default value: <code>true</code> */ private boolean showPageNumber = true; public NavigatorBar() { try { jbInit(); controlPageNr.setColumns(3); controlPageNr.setValue(new Integer(1)); controlPageNr.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (controlPageNr.getDouble()==null) controlPageNr.setValue(new Integer(1)); if (!checkValidPage()) return; currentPageNr = controlPageNr.getDouble().intValue(); gotoPage(); } }); controlPageNr.addFocusListener(new FocusAdapter() { public void focusGained(FocusEvent e) { if (controlPageNr.getDouble()==null) controlPageNr.setValue(new Integer(1)); currentPageNr = controlPageNr.getDouble().intValue(); } public void focusLost(FocusEvent e) { if (controlPageNr.getDouble()==null) controlPageNr.setValue(new Integer(1)); if (!checkValidPage()) return; int lastValue = currentPageNr; currentPageNr = controlPageNr.getDouble().intValue(); if (lastValue!=currentPageNr) gotoPage(); } }); firstButton.setToolTipText(ClientSettings.getInstance().getResources().getResource("Load the first block of records")); firstButton.setPreferredSize(new Dimension(32,32)); prevPgButton.setToolTipText(ClientSettings.getInstance().getResources().getResource("Load the previous block of records")); prevPgButton.setPreferredSize(new Dimension(32,32)); prevButton.setToolTipText(ClientSettings.getInstance().getResources().getResource("Select the previous row in grid")); prevButton.setPreferredSize(new Dimension(32,32)); nextButton.setToolTipText(ClientSettings.getInstance().getResources().getResource("Select the next row in grid")); nextButton.setPreferredSize(new Dimension(32,32)); nextPgButton.setToolTipText(ClientSettings.getInstance().getResources().getResource("Load the next block of records")); nextPgButton.setPreferredSize(new Dimension(32,32)); lastButton.setToolTipText(ClientSettings.getInstance().getResources().getResource("Load the last block of records")); lastButton.setPreferredSize(new Dimension(32,32)); } catch(Exception e) { e.printStackTrace(); } } private boolean checkValidPage() { if (resultSetController!=null && resultSetController.getTotalResultSetLength()!=-1 && resultSetController.getBlockSize()!=-1 && controlPageNr.getDouble().intValue()>resultSetController.getTotalResultSetLength()/resultSetController.getBlockSize()) { controlPageNr.setValue(new Integer(currentPageNr)); return false; } return true; } /** * Reload grid, starting from the specified page. */ private void gotoPage() { if (currentPageNr>0 && resultSetController!=null) resultSetController.loadPage(currentPageNr); } /** * Show/update/hide page number field, according to loading policy and current data length. */ public final void updatePageNumber(int pageNr) { controlPageNr.setValue(new Integer(pageNr)); pageNrPanel.removeAll(); if (pageNr>0 && showPageNumber) pageNrPanel.add(controlPageNr); pageNrPanel.revalidate(); this.repaint(); } private void jbInit() throws Exception { pageNrPanel.setLayout(new FlowLayout(FlowLayout.LEFT,0,0)); firstButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { firstButton_actionPerformed(e); } }); prevButton.setActionCommand(PREV_BUTTON); prevButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { prevButton_actionPerformed(e); } }); prevPgButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { prevPgButton_actionPerformed(e); } }); nextPgButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { nextPgButton_actionPerformed(e); } }); nextButton.setActionCommand(NEXT_BUTTON); nextButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { nextButton_actionPerformed(e); } }); lastButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { lastButton_actionPerformed(e); } }); this.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0)); this.add(firstButton,null); if (showPaginationButtons) this.add(prevPgButton,null); this.add(prevButton,null); this.add(pageNrPanel,null); this.add(nextButton,null); if (showPaginationButtons) this.add(nextPgButton,null); this.add(lastButton,null); } public void firstButton_actionPerformed(ActionEvent e) { if (resultSetController!=null) { for(int i=0;i<beforeActionListeners.size();i++) ((ActionListener)beforeActionListeners.get(i)).actionPerformed(new ActionEvent( this, ActionEvent.ACTION_PERFORMED, FIRST_BUTTON )); resultSetController.firstRow(this); } } public void prevPgButton_actionPerformed(ActionEvent e) { if (resultSetController!=null) { for(int i=0;i<beforeActionListeners.size();i++) ((ActionListener)beforeActionListeners.get(i)).actionPerformed(new ActionEvent( this, ActionEvent.ACTION_PERFORMED, PREV_PG_BUTTON )); resultSetController.previousPage(this); } } public void prevButton_actionPerformed(ActionEvent e) { if (resultSetController!=null) { for(int i=0;i<beforeActionListeners.size();i++) ((ActionListener)beforeActionListeners.get(i)).actionPerformed(new ActionEvent( this, ActionEvent.ACTION_PERFORMED, e.getActionCommand() )); resultSetController.previousRow(this,e); } } public void nextButton_actionPerformed(ActionEvent e) { if (resultSetController!=null) { for(int i=0;i<beforeActionListeners.size();i++) ((ActionListener)beforeActionListeners.get(i)).actionPerformed(new ActionEvent( this, ActionEvent.ACTION_PERFORMED, e.getActionCommand() )); resultSetController.nextRow(this,e); } } public void nextPgButton_actionPerformed(ActionEvent e) { if (resultSetController!=null) { for(int i=0;i<beforeActionListeners.size();i++) ((ActionListener)beforeActionListeners.get(i)).actionPerformed(new ActionEvent( this, ActionEvent.ACTION_PERFORMED, NEXT_PG_BUTTON )); resultSetController.nextPage(this); } } public void lastButton_actionPerformed(ActionEvent e) { if (resultSetController!=null) { for(int i=0;i<beforeActionListeners.size();i++) ((ActionListener)beforeActionListeners.get(i)).actionPerformed(new ActionEvent( this, ActionEvent.ACTION_PERFORMED, LAST_BUTTON )); resultSetController.lastRow(this); } } /** * Method called by grid component each time a row is selected. */ public void setFirstRow(boolean isFirstRecord) { firstButton.setEnabled(!isFirstRecord); prevPgButton.setEnabled(!isFirstRecord); prevButton.setEnabled(!isFirstRecord); controlPageNr.setEnabled(true); // controlPageNr.setEnabled(resultSetController.getTotalResultSetLength()!=-1); } /** * Method called by grid component each time a row is selected. */ public void setLastRow(boolean isLastRecord) { lastButton.setEnabled(!isLastRecord); nextButton.setEnabled(!isLastRecord); nextPgButton.setEnabled(!isLastRecord); controlPageNr.setEnabled(true); // controlPageNr.setEnabled(resultSetController.getTotalResultSetLength()!=-1); } public void setEnabled(boolean enabled) { controlPageNr.setEnabled(enabled); // if (!enabled) // controlPageNr.setEnabled(false); // else // controlPageNr.setEnabled(resultSetController.getTotalResultSetLength()!=-1); firstButton.setEnabled(enabled); prevPgButton.setEnabled(enabled); prevButton.setEnabled(enabled); nextButton.setEnabled(enabled); nextPgButton.setEnabled(enabled); lastButton.setEnabled(enabled); } public void initNavigator(NavigatorBarController resultSetController){ this.resultSetController = resultSetController; } public boolean isFirstButtonEnabled() { return firstButton.isEnabled(); } public boolean isPrevButtonEnabled() { return prevButton.isEnabled(); } public boolean isNextButtonEnabled() { return nextButton.isEnabled(); } public boolean isLastButtonEnabled() { return lastButton.isEnabled(); } /** * Add an ActionListener that will be called AFTER a navigator button has been pressed (AFTER selecting row event). * @param listener ActionListener to register. */ public final void addAfterActionListener(ActionListener listener) { afterActionListeners.add(listener); } /** * Remove the specified ActionListener. * @param listener ActionListener to remove. */ public final void removeAfterActionListener(ActionListener listener) { afterActionListeners.remove(listener); } /** * Method invoked by the grid control when pressing a navigator button. * @param buttonType possible values: NavigatorBar.xxx_BUTTON */ public final void fireButtonPressedEvent(String buttonType) { for(int i=0;i<afterActionListeners.size();i++) ((ActionListener)afterActionListeners.get(i)).actionPerformed(new ActionEvent( this, ActionEvent.ACTION_PERFORMED, buttonType )); } /** * Add an ActionListener that will be called as the first instruction when a navigator button is being pressed (BEFORE selecting row event). * @param listener ActionListener to register. */ public final void addBeforeActionListener(ActionListener listener) { beforeActionListeners.add(listener); } /** * Remove the specified ActionListener. * @param listener ActionListener to remove. */ public final void removeBeforerActionListener(ActionListener listener) { beforeActionListeners.remove(listener); } /** * @return <code>true</code> to show pagination buttons in navigator bar; <code>false</code> to do not show them */ public final boolean isShowPaginationButtons() { return showPaginationButtons; } /** * Show/hide pagination buttons in navigator bar; <code>false</code> to do not show them. * @param showPaginationButtons <code>true</code> to show pagination buttons in navigator bar; <code>false</code> to do not show them */ public final void setShowPaginationButtons(boolean showPaginationButtons) { if (!this.showPaginationButtons && showPaginationButtons) { this.add(prevPgButton,null); this.add(nextPgButton,null); this.revalidate(); this.repaint(); } else if (this.showPaginationButtons && !showPaginationButtons) { this.remove(prevPgButton); this.remove(nextPgButton); this.revalidate(); this.repaint(); } this.showPaginationButtons = showPaginationButtons; } /** * @return boolean <code>true</code> to show page number input field in navigator bar; <code>false</code> to do not show it; default value: <code>true</code> */ public final boolean isShowPageNumber() { return showPageNumber; } /** * <code>true</code> to show page number input field in navigator bar; <code>false</code> to do not show it. * Note: it is automatically hided if result set is fully loaded in grid, independently from this setting. * @param showPageNumber <code>true</code> to show page number input field in navigator bar; <code>false</code> to do not show it */ public final void setShowPageNumber(boolean showPageNumber) { this.showPageNumber = showPageNumber; } }