package org.openswing.swing.wizard.client;
import java.beans.*;
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: Panel that contains two areas:
* - a list of panels showed alternatively and
* - a buttons panel, that typically contains a back, next and cancel buttons.
* A panel may optionally have at the left an image.
*
* As default setting, three buttons are showed in the panel: "Back", "Next" and "Cancel".
* The "Cancel" button is automatically renamed to "Finish" when the wizard shows the last panel.
*
* A programmer must add a list of WizardInnerPanel objects though the addPanel() method and
* could define navigation logic through the method setNavigationLogic(). If this method is not called
* then a default navigation logic is defined: shows panels from the first added to the last added.
*
* When user clicks on the "Next" button the WizardController.getNextPanelId() is called and the related panel is showed.
* If null is returned then no panel is showed (the current panel is still visible).
* When user clicks on the "Back" button the WizardController.getBackPanelId() is called and the related panel is showed.
* If null is returned then no panel is showed (the current panel is still visible).
* "Back" and "Next" buttons are enabled/disabled automatically, according to WizardController.getFirstPanelId() and
* WizardController.getLastPanelId() return values.
*
* When a panel is showed the init() method is automatically invoked (after "Back"/"Next" buttons abilitations).
* </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 WizardPanel extends JPanel implements ActionListener {
BorderLayout borderLayout1 = new BorderLayout();
JPanel mainPanel = new JPanel();
JPanel buttonsPanel = new JPanel();
CardLayout cardLayout1 = new CardLayout();
JButton backButton = new JButton();
JButton nextButton = new JButton();
JButton cancelButton = new JButton();
FlowLayout flowLayout1 = new FlowLayout();
/** list of action listeners linked to the buttons */
private ArrayList listeners = new ArrayList();
/** list of WizardInnerPanel objects */
private ArrayList panels = new ArrayList();
/** navigation logic controller */
private WizardController wizardController = new WizardController();
/** WizardInnerPanel panel currently showed */
private WizardInnerPanel currentVisiblePanel = null;
/** image panel, showed at the left of an inner panel */
private ImagePanel imagePanel = new ImagePanel();
/** (optional) image name to show in all inner panels; this setting is overrided by the getImageName() method defined for each inner panel */
private String imageName = null;
/** image name for "Back" button */
private String backImageName = "prev.gif";
/** image name for "Next" button */
private String nextImageName = "next.gif";
/** image name for "Cancel" button */
private String cancelImageName = "cancel.gif";
/** image name for "Finish" button */
private String finishImageName = "exec.gif";
public WizardPanel() {
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}
private void jbInit() throws Exception {
this.setLayout(borderLayout1);
mainPanel.setLayout(cardLayout1);
buttonsPanel.setBorder(BorderFactory.createEtchedBorder());
buttonsPanel.setLayout(flowLayout1);
mainPanel.setBorder(BorderFactory.createEtchedBorder());
backButton.setPreferredSize(new Dimension(120,30));
backButton.setMinimumSize(new Dimension(120,30));
backButton.setEnabled(false);
backButton.setEnabled(false);
backButton.setText(ClientSettings.getInstance().getResources().getResource("back"));
backButton.addActionListener(this);
nextButton.setPreferredSize(new Dimension(120,30));
nextButton.setMinimumSize(new Dimension(120,30));
nextButton.setEnabled(false);
nextButton.setText(ClientSettings.getInstance().getResources().getResource("next"));
nextButton.addActionListener(this);
cancelButton.setPreferredSize(new Dimension(120,30));
cancelButton.setMinimumSize(new Dimension(120,30));
cancelButton.setText(ClientSettings.getInstance().getResources().getResource("cancel"));
cancelButton.addActionListener(this);
flowLayout1.setAlignment(FlowLayout.RIGHT);
this.add(imagePanel, BorderLayout.WEST);
this.add(mainPanel, BorderLayout.CENTER);
this.add(buttonsPanel, BorderLayout.SOUTH);
buttonsPanel.add(backButton, null);
buttonsPanel.add(nextButton, null);
buttonsPanel.add(cancelButton, null);
}
/**
* Method called when the this panel is set to visible: it calls commitColumnContainer method.
*/
public final void addNotify() {
super.addNotify();
if (!Beans.isDesignTime() && currentVisiblePanel == null) {
String panelId = wizardController.getFirstPanelId(this);
if (panelId!=null) {
currentVisiblePanel = getPanel( panelId );
cardLayout1.show(mainPanel,currentVisiblePanel.getPanelId());
if (panels.size()>1)
nextButton.setEnabled(true);
imagePanel.setImage( imageName );
if (currentVisiblePanel.getImageName()!=null)
imagePanel.setImage( currentVisiblePanel.getImageName() );
backButton.setIcon(new ImageIcon(ClientUtils.getImage(backImageName)));
nextButton.setIcon(new ImageIcon(ClientUtils.getImage(nextImageName)));
cancelButton.setIcon(new ImageIcon(ClientUtils.getImage(cancelImageName)));
currentVisiblePanel.init();
}
}
}
/**
* @return buttons panel
*/
public final JPanel getButtonsPanel() {
return buttonsPanel;
}
/**
* Add a button in the specified position.
* @param button button to add
* @param pos position inside the buttons panel
*/
public final void addButton(JButton button,int pos) {
buttonsPanel.add(button,pos);
button.addActionListener(this);
}
/**
* Remove a button already added.
* @param button button to remove
*/
public final void removeButton(JButton button) {
buttonsPanel.remove(button);
buttonsPanel.revalidate();
buttonsPanel.repaint();
button.removeActionListener(this);
}
/**
* Add a listener of buttons clicking events.
* @param listener action listener
*/
public final void addActionListener(ActionListener listener) {
listeners.add(listener);
}
/**
* Remove a listener of buttons clicking events.
* @param listener action listener to remove
*/
public final void removeActionListener(ActionListener listener) {
listeners.remove(listener);
}
/**
* Listen for additional buttons clicks.
*/
public final void actionPerformed(ActionEvent actionEvent) {
for(int i=0;i<listeners.size();i++)
((ActionListener)listeners.get(i)).actionPerformed(actionEvent);
if (actionEvent.getSource().equals(backButton)) {
String panelId = wizardController.getBackPanelId(this);
if (panelId!=null) {
currentVisiblePanel = getPanel( panelId );
cardLayout1.show(mainPanel,panelId);
if (panelId.equals(wizardController.getFirstPanelId(this))) {
backButton.setEnabled(false);
nextButton.setEnabled(true);
}
else {
backButton.setEnabled(true);
nextButton.setEnabled(true);
}
cancelButton.setText(ClientSettings.getInstance().getResources().getResource("cancel"));
cancelButton.setIcon(new ImageIcon(ClientUtils.getImage(cancelImageName)));
buttonsPanel.revalidate();
buttonsPanel.repaint();
imagePanel.setImage( imageName );
if (currentVisiblePanel.getImageName()!=null)
imagePanel.setImage( currentVisiblePanel.getImageName() );
currentVisiblePanel.init();
}
}
else if (actionEvent.getSource().equals(nextButton)) {
String panelId = wizardController.getNextPanelId(this);
if (panelId!=null) {
currentVisiblePanel = getPanel( panelId );
cardLayout1.show(mainPanel,panelId);
if (panelId.equals(wizardController.getLastPanelId(this))) {
nextButton.setEnabled(false);
backButton.setEnabled(true);
cancelButton.setText(ClientSettings.getInstance().getResources().getResource("finish"));
cancelButton.setIcon(new ImageIcon(ClientUtils.getImage(finishImageName)));
buttonsPanel.revalidate();
buttonsPanel.repaint();
} else {
nextButton.setEnabled(true);
backButton.setEnabled(true);
}
imagePanel.setImage( imageName );
if (currentVisiblePanel.getImageName()!=null)
imagePanel.setImage( currentVisiblePanel.getImageName() );
currentVisiblePanel.init();
}
}
}
/**
* @return "Back" button
*/
public final JButton getBackButton() {
return backButton;
}
/**
* @return "Cancel/Finish" button
*/
public final JButton getCancelButton() {
return cancelButton;
}
/**
* @return "Next" button
*/
public final JButton getNextButton() {
return nextButton;
}
/**
* Register a panel that must be showed inside the wizard panel.
* @param panel panel to add
*/
public final void addPanel(WizardInnerPanel panel) {
panels.add(panel);
mainPanel.add(panel.getPanelId(),panel);
}
/**
* Define a navigation logic.
* If this method is not defined, then panels are showed in the same order used to add them to this.
*/
public final void setNavigationLogic(WizardController wizardController) {
this.wizardController = wizardController;
}
/**
* @return panes nagitation controller
*/
public final WizardController getNavigationLogic() {
return wizardController;
}
/**
* @return list of WizardInnerPanel currently registered.
*/
public WizardInnerPanel[] getPanels() {
return (WizardInnerPanel[])panels.toArray(new WizardInnerPanel[panels.size()]);
}
/**
* @return WizardInnerPanel panel currently showed
*/
public final WizardInnerPanel getCurrentVisiblePanel() {
return currentVisiblePanel;
}
/**
* @param panelId panel identifier
* @return WizardInnerPanel panel identified by the first argument
*/
public final WizardInnerPanel getPanel(String panelId) {
for(int i=0;i<panels.size();i++)
if (((WizardInnerPanel)panels.get(i)).getPanelId().equals(panelId))
return (WizardInnerPanel)panels.get(i);
return null;
}
/**
* This method allows to define an image that will be showed at the left of each inner panel
* This setting is overrided by the getImageName() method defined for each inner panel.
* @param imageName image name; null if no image is required
*/
public final void setImageName(String imageName) {
this.imageName = imageName;
}
/**
* @return image name
*/
public final String getImageName() {
return imageName;
}
/**
* @return image name for "Cancel" button
*/
public final String getCancelImageName() {
return cancelImageName;
}
/**
* Set image name for "Cancel" button.
* @param cancelImageName image name for "Cancel" button
*/
public final void setCancelImageName(String cancelImageName) {
this.cancelImageName = cancelImageName;
}
/**
* @return image name for "Back" button
*/
public final String getBackImageName() {
return backImageName;
}
/**
* Set image name for "Back" button.
* @param backImageName image name for "Back" button
*/
public final void setBackImageName(String backImageName) {
this.backImageName = backImageName;
}
/**
* @return image name for "Finish" button
*/
public final String getFinishImageName() {
return finishImageName;
}
/**
* Set image name for "Finish" button.
* @param finishImageName image name for "Finish" button
*/
public final void setFinishImageName(String finishImageName) {
this.finishImageName = finishImageName;
}
/**
* @return image name for "Next" button
*/
public final String getNextImageName() {
return nextImageName;
}
/**
* Set image name for "Next" button.
* @param nextImageName image name for "Next" button
*/
public final void setNextImageName(String nextImageName) {
this.nextImageName = nextImageName;
}
/**
* <p>Title: OpenSwing Framework</p>
* <p>Description: Inner class used to show an image.</p>
*/
class ImagePanel extends JPanel {
/** image to show */
private Image image = null;
/**
* Set image.
* @param imageName image name (it must be stored in "images" subfolder)
*/
public void setImage(String imageName) {
if (imageName==null) {
image = null;
setSize(0,0);
setPreferredSize(new Dimension(0,0));
setMinimumSize(new Dimension(0,0));
return;
}
image = ClientUtils.getImage(imageName);
if (image==null)
return;
setSize(image.getWidth(this),image.getHeight(this));
setPreferredSize(new Dimension(image.getWidth(this),image.getHeight(this)));
setMinimumSize(new Dimension(image.getWidth(this),image.getHeight(this)));
repaint();
}
public void paint(Graphics g) {
super.paint(g);
if (image!=null)
g.drawImage(image,0,0,image.getWidth(this),image.getHeight(this),this);
}
}
}