/* * 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-2009 Sun Microsystems, Inc. */ package org.opends.quicksetup.ui; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.util.HashMap; import java.util.LinkedHashSet; import javax.swing.Box; import javax.swing.JLabel; import javax.swing.JPanel; import org.opends.quicksetup.UserData; import org.opends.quicksetup.WizardStep; import org.opends.messages.Message; /** * This class displays the different steps of the wizard. It appears on the * left of the dialog. * * The current step is highlighted using a different label style and an icon. * The current displayed step can be changed calling the method setCurrentStep. * */ public class StepsPanel extends QuickSetupPanel { private static final long serialVersionUID = -2003945907121690657L; HashMap<WizardStep, JLabel> hmLabels = new HashMap<WizardStep, JLabel>(); HashMap<WizardStep, JLabel> hmIcons = new HashMap<WizardStep, JLabel>(); HashMap<WizardStep, JPanel> hmSubPanels = new HashMap<WizardStep, JPanel>(); /** * Creates a StepsPanel. * @param app Application whose steps this class represents */ public StepsPanel(GuiApplication app) { super(app); createLayout(app); } /** * Updates the layout of the panel so that it corresponds to the Step passed * as parameter. * * @param step the step in the wizard. * @param userData the data provided by the user. */ public void setDisplayedStep(WizardStep step, UserData userData) { for (WizardStep s : getApplication().getWizardSteps()) { if (s.equals(step)) { getIcon(s).setVisible(true); UIFactory.setTextStyle(getLabel(s), UIFactory.TextStyle.CURRENT_STEP); } else { if (getIcon(s) != null) { getIcon(s).setVisible(false); } if (getLabel(s) != null) { UIFactory.setTextStyle(getLabel(s), UIFactory.TextStyle.NOT_CURRENT_STEP); } } setStepVisible(s, getApplication().isVisible(s, userData)); } } /** * Updates the visibility of the steps depending on the current contents * of the panels (uses the QuickSetup to know what is displayed in the * panels). * * @param qs the QuickSetup object. */ public void updateStepVisibility(QuickSetup qs) { for (WizardStep s : getApplication().getWizardSteps()) { setStepVisible(s, getApplication().isVisible(s, qs)); } } /** * Creates the layout of the panel. * @param app Application whose steps this class represents */ private void createLayout(GuiApplication app) { setLayout(new GridBagLayout()); JPanel mainPanel = new JPanel(new GridBagLayout()); mainPanel.setOpaque(false); GridBagConstraints gbc = new GridBagConstraints(); gbc.weightx = 0.0; gbc.weighty = 0.0; gbc.fill = GridBagConstraints.HORIZONTAL; gbc.anchor = GridBagConstraints.WEST; HashMap<WizardStep, Message> hmText = new HashMap<WizardStep, Message>(); LinkedHashSet<WizardStep> orderedSteps = app.getOrderedSteps(); boolean first = true; for (WizardStep s : orderedSteps) { hmText.put(s, s.getDisplayMessage()); JPanel subPanel = new JPanel(new GridBagLayout()); subPanel.setOpaque(false); if (!first) { gbc.insets.top = UIFactory.TOP_INSET_STEP; } GridBagConstraints gbcAux = new GridBagConstraints(); gbcAux.gridwidth = GridBagConstraints.REMAINDER; gbcAux.fill = GridBagConstraints.HORIZONTAL; JPanel auxPanel = new JPanel(new GridBagLayout()); auxPanel.setOpaque(false); JLabel iconLabel = UIFactory.makeJLabel(UIFactory.IconType.CURRENT_STEP, null, UIFactory.TextStyle.NO_STYLE); gbcAux.insets.left = 0; auxPanel.add(iconLabel, gbcAux); int width = (int) iconLabel.getPreferredSize().getWidth(); if (getApplication().isSubStep(s)) { width += UIFactory.LEFT_INSET_SUBSTEP; } gbcAux.insets.left = 0; auxPanel.add(Box.createHorizontalStrut(width), gbcAux); hmIcons.put(s, iconLabel); gbc.gridwidth = 3; gbc.weightx = 0.0; subPanel.add(auxPanel, gbc); JLabel stepLabel = UIFactory.makeJLabel(UIFactory.IconType.NO_ICON, hmText.get(s), UIFactory.TextStyle.CURRENT_STEP); hmLabels.put(s, stepLabel); gbc.insets.left = UIFactory.LEFT_INSET_STEP; gbc.gridwidth = GridBagConstraints.RELATIVE; subPanel.add(stepLabel, gbc); gbc.insets = UIFactory.getEmptyInsets(); gbc.gridwidth = GridBagConstraints.REMAINDER; gbc.weightx = 1.0; subPanel.add(Box.createHorizontalGlue(), gbc); mainPanel.add(subPanel, gbc); hmSubPanels.put(s, subPanel); stepLabel.setLabelFor(this); iconLabel.setLabelFor(stepLabel); first = false; } gbc.insets.left = 0; gbc.insets.top = 0; gbc.weightx = 1.0; gbc.weighty = 0.0; gbc.fill = GridBagConstraints.NONE; gbc.gridwidth = GridBagConstraints.REMAINDER; gbc.anchor = GridBagConstraints.NORTHWEST; add(mainPanel, gbc); int mainWidth = (int) mainPanel.getPreferredSize().getWidth(); // We are creating all the labels with the style // UIFactory.LabelStyle.CURRENT_STEP which is the one // that takes more space. But once we display the dialog only one // of the labels will have that style and the other will have // UIFactory.LabelStyle.NOT_CURRENT_STEP. Adding the strut guarantees // that the width of the panel will always be enough to display the // longest label using UIFactory.LabelStyle.CURRENT_STEP. add(Box.createHorizontalStrut(mainWidth), gbc); gbc.fill = GridBagConstraints.VERTICAL; gbc.weighty = 1.0; add(Box.createVerticalGlue(), gbc); } /** * Returns the label associated with the given step. * @param step the step for which we want to retrieve the JLabel. * @return the label associated with the given step. */ private JLabel getLabel(WizardStep step) { return hmLabels.get(step); } /** * Returns the icon associated with the given step. * @param step the step for which we want to retrieve the Icon. * @return the icon associated with the given step. */ private JLabel getIcon(WizardStep step) { return hmIcons.get(step); } /** * Returns the sub-panel associated with the given step. * @param step the step for which we want to retrieve the sub-panel. * @return the sub-panel associated with the given step. */ private JPanel getSubPanel(WizardStep step) { return hmSubPanels.get(step); } private void setStepVisible(WizardStep step, boolean visible) { JPanel subPanel = getSubPanel(step); // Check done to minimize possible flickering. if (visible != subPanel.isVisible()) { subPanel.setVisible(visible); } } }