/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at
* trunk/opends/resource/legal-notices/OpenDS.LICENSE
* or https://OpenDS.dev.java.net/OpenDS.LICENSE.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at
* trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
* add the following below this CDDL HEADER, with the fields enclosed
* by brackets "[]" replaced with your own identifying information:
* Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*
*
* Copyright 2006-2008 Sun Microsystems, Inc.
*/
package org.opends.quicksetup.ui;
import org.opends.messages.Message;
import static org.opends.messages.QuickSetupMessages.*;
import org.opends.quicksetup.ButtonName;
import org.opends.quicksetup.WizardStep;
import org.opends.quicksetup.LicenseFile;
import org.opends.quicksetup.event.ButtonActionListener;
import org.opends.quicksetup.event.ButtonEvent;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashSet;
/**
* This class contains the buttons in the bottom of the Install/Uninstall
* dialog. There is only one of this instances for the QuickSetupDialog.
* The layout is updated calling setCurrentStep method.
*
*/
public class ButtonsPanel extends QuickSetupPanel
{
private static final long serialVersionUID = -8460400337486357976L;
private HashSet<ButtonActionListener> buttonListeners =
new HashSet<ButtonActionListener>();
private JButton nextButton;
private JButton previousButton;
private JButton quitButton;
private JButton closeButton;
private JButton finishButton;
/**
* Default constructor.
* @param application Application running in QuickSetup
*
*/
public ButtonsPanel(GuiApplication application)
{
super(application);
createButtons();
layoutButtons();
}
/**
* Adds a button listener. All the button listeners will be notified when
* the buttons are clicked (by the user or programatically).
* @param l the ButtonActionListener to be added.
*/
public void addButtonActionListener(ButtonActionListener l)
{
buttonListeners.add(l);
}
/**
* Removes a button listener.
* @param l the ButtonActionListener to be removed.
*/
public void removeButtonActionListener(ButtonActionListener l)
{
buttonListeners.remove(l);
}
/**
* Updates the layout of the panel so that it corresponds to the Step passed
* as parameter.
*
* @param step the step in the wizard.
*/
public void updateButtons(WizardStep step)
{
GuiApplication application = getApplication();
previousButton.setVisible(application.canGoBack(step));
if (application.canFinish(step)) {
finishButton.setVisible(true);
nextButton.setVisible(false);
} else {
finishButton.setVisible(false);
nextButton.setVisible(application.canGoForward(step));
}
// The quit button appears on all the panels leading up
// to the progress panel
quitButton.setVisible(!step.isProgressStep() && !step.isFinishedStep());
// The close button is only used on the progress panel and
// is only enabled once progress has finished or cancelled.
closeButton.setVisible(step.isProgressStep() || step.isFinishedStep());
closeButton.setEnabled(application.getCurrentProgressStep().isLast());
// The next button is always enabled in all steps except the license step.
// In that step, the next button will be enabled only if the user has
// approved the license
nextButton.setEnabled(!step.isLicenseStep() || LicenseFile.getApproval());
}
/**
* Returns the button corresponding to the buttonName.
* @param buttonName the ButtonName for which we want to get the button.
* @return the button corresponding to the buttonName.
*/
public JButton getButton(ButtonName buttonName)
{
JButton b = null;
if (buttonName != null) {
switch (buttonName) {
case NEXT:
b = nextButton;
break;
case PREVIOUS:
b = previousButton;
break;
case QUIT:
b = quitButton;
break;
case CLOSE:
b = closeButton;
break;
case FINISH:
b = finishButton;
break;
default:
throw new IllegalArgumentException("Unknown button name: " +
buttonName);
}
}
return b;
}
/*
* Create the buttons.
*/
private void createButtons()
{
GuiApplication application = getApplication();
nextButton = createButton(
INFO_NEXT_BUTTON_LABEL.get(),
INFO_NEXT_BUTTON_TOOLTIP.get(),
ButtonName.NEXT);
previousButton = createButton(
INFO_PREVIOUS_BUTTON_LABEL.get(),
INFO_PREVIOUS_BUTTON_TOOLTIP.get(),
ButtonName.PREVIOUS);
quitButton = createButton(
INFO_QUIT_BUTTON_LABEL.get(),
application.getQuitButtonToolTip(),
ButtonName.QUIT);
closeButton = createButton(
INFO_CLOSE_BUTTON_LABEL.get(),
application.getCloseButtonToolTip(),
ButtonName.CLOSE);
finishButton = createButton(
application.getFinishButtonLabel(),
application.getFinishButtonToolTip(),
ButtonName.FINISH);
}
/**
* Do the layout of the panel.
*
*/
private void layoutButtons()
{
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
GridBagConstraints gbcAux = new GridBagConstraints();
gbcAux.gridwidth = GridBagConstraints.REMAINDER;
gbcAux.fill = GridBagConstraints.HORIZONTAL;
JPanel previousPanel = new JPanel(new GridBagLayout());
// Set as opaque to inherit the background color of ButtonsPanel
previousPanel.setOpaque(false);
previousPanel.add(previousButton, gbcAux);
int width = (int) previousButton.getPreferredSize().getWidth();
previousPanel.add(Box.createHorizontalStrut(width), gbcAux);
gbc.gridwidth = 5;
gbc.weightx = 0.0;
gbc.weighty = 0.0;
gbc.insets.bottom = 0;
gbc.insets.right = UIFactory.HORIZONTAL_INSET_BETWEEN_BUTTONS;
gbc.anchor = GridBagConstraints.WEST;
gbc.fill = GridBagConstraints.NONE;
add(previousPanel, gbc);
gbc.gridwidth--;
JPanel nextFinishPanel = new JPanel(new GridBagLayout());
// Set as opaque to inherit the background color of ButtonsPanel
nextFinishPanel.setOpaque(false);
nextFinishPanel.add(nextButton, gbcAux);
if (getApplication().finishOnLeft()) {
nextFinishPanel.add(finishButton, gbcAux);
}
width =
(int) Math.max(nextButton.getPreferredSize().getWidth(), finishButton
.getPreferredSize().getWidth());
nextFinishPanel.add(Box.createHorizontalStrut(width), gbcAux);
add(nextFinishPanel, gbc);
gbc.gridwidth--;
gbc.weightx = 1.0;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.insets.right = 0;
add(Box.createHorizontalGlue(), gbc);
gbc.gridwidth = GridBagConstraints.RELATIVE;
gbc.weightx = 0.0;
gbc.fill = GridBagConstraints.NONE;
gbc.insets.left = UIFactory.HORIZONTAL_INSET_BETWEEN_BUTTONS;
if (!getApplication().finishOnLeft()) {
gbc.insets.right = UIFactory.HORIZONTAL_INSET_BETWEEN_BUTTONS;
add(finishButton, gbc);
gbc.insets.right = 0;
}
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.weightx = 0.0;
gbc.fill = GridBagConstraints.NONE;
gbc.insets.left = 0;
JPanel quitClosePanel = new JPanel(new GridBagLayout());
// Set as opaque to inherit the background color of ButtonsPanel
quitClosePanel.setOpaque(false);
quitClosePanel.add(
Box.createHorizontalStrut(UIFactory.HORIZONTAL_INSET_BETWEEN_BUTTONS),
gbcAux);
quitClosePanel.add(quitButton, gbcAux);
quitClosePanel.add(closeButton, gbcAux);
width =
(int) Math.max(quitButton.getPreferredSize().getWidth(), closeButton
.getPreferredSize().getWidth());
quitClosePanel.add(Box.createHorizontalStrut(width), gbcAux);
add(quitClosePanel, gbc);
}
/**
* Create a button.
* @param label the label of the button.
* @param tooltip the tooltip of the button.
* @param buttonName the ButtonName.
* @return a new button with the specified parameters.
*/
private JButton createButton(Message label, Message tooltip,
ButtonName buttonName)
{
JButton b = UIFactory.makeJButton(label, tooltip);
final ButtonName fButtonName = buttonName;
ActionListener actionListener = new ActionListener()
{
public void actionPerformed(ActionEvent ev)
{
ButtonEvent be = new ButtonEvent(ev.getSource(), fButtonName);
for (ButtonActionListener li : buttonListeners)
{
li.buttonActionPerformed(be);
}
}
};
b.addActionListener(actionListener);
return b;
}
}