mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Gaetan Boismal
28.21.2015 c49cdeba466abea9cebd03b2b2d73e20644d25d0
OPENDJ-2044 Code cleanup

* src/main/java/org/opends/quicksetup/installer/ui/SuffixesToReplicatePanel.java
** Autorefactor'ed file + Reformat
** Use straight return
** Use interface instead of concrete class for local variable which are collections
** Use ternary operator

* src/main/java/org/opends/admin/ads/SuffixDescriptor.java
** Autorefactor'ed file + Reformat

* src/main/java/org/opends/quicksetup/installer/SuffixesToReplicateOptions.java
** Autorefactor'ed file + Reformat
** Simplify constructor code

* src/main/java/org/opends/quicksetup/ui/UIFactory.java
** Autorefactor'ed file + Reformat
** Use straight return
** Format javadoc
** Add some generic statement to prevent warnings
4 files modified
1461 ■■■■■ changed files
opendj-server-legacy/src/main/java/org/opends/admin/ads/SuffixDescriptor.java 29 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/quicksetup/installer/SuffixesToReplicateOptions.java 87 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/quicksetup/installer/ui/SuffixesToReplicatePanel.java 149 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/quicksetup/ui/UIFactory.java 1196 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/admin/ads/SuffixDescriptor.java
@@ -24,24 +24,24 @@
 *      Copyright 2008 Sun Microsystems, Inc.
 *      Portions Copyright 2015 ForgeRock AS
 */
package org.opends.admin.ads;
import java.util.HashSet;
import java.util.Set;
/**
 * The object of this class represent a topology of replicas across servers
 * that have the same suffix DN.  If there is more than one replica on the
 * suffix, the contents of the replicas are replicated.
 * The object of this class represent a topology of replicas across servers that
 * have the same suffix DN. If there is more than one replica on the suffix, the
 * contents of the replicas are replicated.
 */
public class SuffixDescriptor
{
  private String suffixDN;
  private Set<ReplicaDescriptor> replicas = new HashSet<>();
  private final Set<ReplicaDescriptor> replicas = new HashSet<>();
  /**
   * Returns the DN associated with this suffix descriptor.
   *
   * @return the DN associated with this suffix descriptor.
   */
  public String getDN()
@@ -51,7 +51,9 @@
  /**
   * Sets the DN associated with this suffix descriptor.
   * @param suffixDN the DN associated with this suffix descriptor.
   *
   * @param suffixDN
   *          the DN associated with this suffix descriptor.
   */
  public void setDN(String suffixDN)
  {
@@ -60,8 +62,9 @@
  /**
   * Returns the replicas associated with this SuffixDescriptor.
   *
   * @return a Set containing the replicas associated with this
   * SuffixDescriptor.
   *         SuffixDescriptor.
   */
  public Set<ReplicaDescriptor> getReplicas()
  {
@@ -70,8 +73,10 @@
  /**
   * Sets the replicas associated with this SuffixDescriptor.
   * @param replicas a Set containing the replicas associated with this
   * SuffixDescriptor.
   *
   * @param replicas
   *          a Set containing the replicas associated with this
   *          SuffixDescriptor.
   */
  public void setReplicas(Set<ReplicaDescriptor> replicas)
  {
@@ -80,8 +85,9 @@
  }
  /**
   * Returns the Set of Replication servers for the whole suffix topology.  The
   * Returns the Set of Replication servers for the whole suffix topology. The
   * servers are provided in their String representation.
   *
   * @return the Set of Replication servers for the whole suffix topology.
   */
  public Set<String> getReplicationServers()
@@ -94,7 +100,7 @@
    return replicationServers;
  }
  /** {@inheritDoc} */
  @Override
  public int hashCode()
  {
    return getId().hashCode();
@@ -102,6 +108,7 @@
  /**
   * Returns an Id that is unique for this suffix.
   *
   * @return an Id that is unique for this suffix.
   */
  public String getId()
opendj-server-legacy/src/main/java/org/opends/quicksetup/installer/SuffixesToReplicateOptions.java
@@ -24,8 +24,6 @@
 *      Copyright 2006-2010 Sun Microsystems, Inc.
 *      Portions Copyright 2015 ForgeRock AS
 */
package org.opends.quicksetup.installer;
import java.util.LinkedHashSet;
@@ -36,28 +34,22 @@
/**
 * This class is used to provide a data model for the Suffix to Replicate
 * Options panel of the installer.
 *
 */
public class SuffixesToReplicateOptions
{
  /**
   * This enumeration is used to know what the user wants to do for the data
   * (import data or not, what use as source of the data...).
   *
   */
  public enum Type
  {
    /**
     * Do not replicate suffix.
     */
    /** Do not replicate suffix. */
    NO_SUFFIX_TO_REPLICATE,
    /**
     * This is a new suffix in topology..
     */
    /** This is a new suffix in topology.. */
    NEW_SUFFIX_IN_TOPOLOGY,
    /**
     * Replicate Contents of the new Suffix with existings server.
     */
    /** Replicate Contents of the new Suffix with existings server. */
    REPLICATE_WITH_EXISTING_SUFFIXES
  }
@@ -68,55 +60,19 @@
  /**
   * Constructor for the SuffixesToReplicateOptions object.
   *
   * If the Data Replicate Options is NO_SUFFIX_TO_REPLICATE or
   * NEW_SUFFIX_IN_TOPOLOGY no args are considered.
   *
   * If the Data Options is REPLICATE_WITH_EXISTING_SUFFIXES a Set of
   * SuffixDescriptor is passed as argument.
   *
   * @param type the Type of DataReplicationOptions.
   * @param args the different argument objects (depending on the Type
   * specified)
   * @param type
   *          the Type of DataReplicationOptions.
   * @param availableSuffixes
   *          The set of suffixes which are available for replication.
   * @param suffixesToReplicate
   *          The set of suffixes which user wants to replicate.
   */
  public SuffixesToReplicateOptions(Type type, Object... args)
  public SuffixesToReplicateOptions(Type type, Set<SuffixDescriptor> availableSuffixes,
      Set<SuffixDescriptor> suffixesToReplicate)
  {
    this.type = type;
    switch (type)
    {
    case REPLICATE_WITH_EXISTING_SUFFIXES:
      Set<?> s = (Set<?>)args[0];
      availableSuffixes = new LinkedHashSet<SuffixDescriptor>();
      for (Object o: s)
      {
        availableSuffixes.add((SuffixDescriptor)o);
      }
      s = (Set<?>)args[1];
      suffixesToReplicate = new LinkedHashSet<SuffixDescriptor>();
      for (Object o: s)
      {
        suffixesToReplicate.add((SuffixDescriptor)o);
      }
      break;
    default:
      // If there is something put it.
      if ((args != null) && (args.length > 0))
      {
        s = (Set<?>)args[0];
        availableSuffixes = new LinkedHashSet<SuffixDescriptor>();
        for (Object o: s)
        {
          availableSuffixes.add((SuffixDescriptor)o);
        }
        s = (Set<?>)args[1];
        suffixesToReplicate = new LinkedHashSet<SuffixDescriptor>();
        for (Object o: s)
        {
          suffixesToReplicate.add((SuffixDescriptor)o);
        }
      }
    }
    this.availableSuffixes = new LinkedHashSet<>(availableSuffixes);
    this.suffixesToReplicate = new LinkedHashSet<>(suffixesToReplicate);
  }
  /**
@@ -131,25 +87,22 @@
  }
  /**
   * Returns the set of suffixes that we must replicate with.
   * If there are no suffixes to replicate with returns null.
   * Returns the set of suffixes available for replication.
   *
   * @return the set of suffixes that we must replicate with.
   * @return the set of suffixes available for replication.
   */
  public Set<SuffixDescriptor> getAvailableSuffixes()
  {
    return new LinkedHashSet<SuffixDescriptor>(availableSuffixes);
    return availableSuffixes;
  }
  /**
   * Returns the set of suffixes that we must replicate with.
   * If there are no suffixes to replicate with returns null.
   * The set of suffixes that we must replicate with.
   *
   * @return the set of suffixes that we must replicate with.
   */
  public Set<SuffixDescriptor> getSuffixes()
  {
    return new LinkedHashSet<SuffixDescriptor>(suffixesToReplicate);
    return suffixesToReplicate;
  }
}
opendj-server-legacy/src/main/java/org/opends/quicksetup/installer/ui/SuffixesToReplicatePanel.java
@@ -26,12 +26,15 @@
 */
package org.opends.quicksetup.installer.ui;
import static org.opends.messages.QuickSetupMessages.*;
import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
@@ -43,11 +46,12 @@
import javax.swing.JScrollPane;
import javax.swing.SwingConstants;
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.i18n.LocalizableMessageBuilder;
import org.opends.admin.ads.ADSContext;
import org.opends.admin.ads.ReplicaDescriptor;
import org.opends.admin.ads.ServerDescriptor;
import org.opends.admin.ads.SuffixDescriptor;
import org.opends.quicksetup.Constants;
import org.opends.quicksetup.UserData;
import org.opends.quicksetup.installer.AuthenticationData;
@@ -58,22 +62,16 @@
import org.opends.quicksetup.ui.UIFactory;
import org.opends.quicksetup.util.Utils;
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.i18n.LocalizableMessageBuilder;
import static org.opends.messages.QuickSetupMessages.*;
/**
 * This class is used to provide a data model for the list of suffixes that
 * we have to replicate on the new server.
 * This class is used to provide a data model for the list of suffixes that we
 * have to replicate on the new server.
 */
public class SuffixesToReplicatePanel extends QuickSetupStepPanel
implements Comparator<SuffixDescriptor>
public class SuffixesToReplicatePanel extends QuickSetupStepPanel implements Comparator<SuffixDescriptor>
{
  private static final long serialVersionUID = -8051367953737385327L;
  private TreeSet<SuffixDescriptor> orderedSuffixes =
    new TreeSet<SuffixDescriptor>(this);
  private HashMap<String, JCheckBox> hmCheckBoxes =
    new HashMap<String, JCheckBox>();
  private final Set<SuffixDescriptor> orderedSuffixes = new TreeSet<>(this);
  private final Map<String, JCheckBox> hmCheckBoxes = new HashMap<>();
  /**
   * The display of the server the user provided in the replication options
   * panel.
@@ -87,8 +85,10 @@
  /**
   * Constructor of the panel.
   * @param application Application represented by this panel and used to
   * initialize the fields of the panel.
   *
   * @param application
   *          Application represented by this panel and used to initialize the
   *          fields of the panel.
   */
  public SuffixesToReplicatePanel(GuiApplication application)
  {
@@ -96,32 +96,30 @@
    createComponents();
  }
  /** {@inheritDoc} */
  @Override
  public Object getFieldValue(FieldName fieldName)
  {
    Object value = null;
    if (fieldName == FieldName.SUFFIXES_TO_REPLICATE_OPTIONS)
    {
      value = SuffixesToReplicateOptions.Type.REPLICATE_WITH_EXISTING_SUFFIXES;
      return SuffixesToReplicateOptions.Type.REPLICATE_WITH_EXISTING_SUFFIXES;
    }
    else if (fieldName == FieldName.SUFFIXES_TO_REPLICATE)
    {
      Set<SuffixDescriptor> suffixes = new HashSet<SuffixDescriptor>();
      for (SuffixDescriptor suffix:orderedSuffixes)
      Set<SuffixDescriptor> suffixes = new HashSet<>();
      for (SuffixDescriptor suffix : orderedSuffixes)
      {
        if (hmCheckBoxes.get(suffix.getId()).isSelected())
        {
          suffixes.add(suffix);
        }
      }
      value = suffixes;
      return suffixes;
    }
    return value;
    return null;
  }
  /** {@inheritDoc} */
  @Override
  public int compare(SuffixDescriptor desc1, SuffixDescriptor desc2)
  {
    int result = compareSuffixDN(desc1, desc2);
@@ -132,7 +130,7 @@
    return result;
  }
  /** {@inheritDoc} */
  @Override
  protected Component createInputPanel()
  {
    JPanel panel = new JPanel(new GridBagLayout());
@@ -175,46 +173,36 @@
    return panel;
  }
  /** {@inheritDoc} */
  @Override
  protected boolean requiresScroll()
  {
    return false;
  }
  /** {@inheritDoc} */
  @Override
  protected LocalizableMessage getInstructions()
  {
    return INFO_SUFFIXES_TO_REPLICATE_PANEL_INSTRUCTIONS.get();
  }
  /** {@inheritDoc} */
  @Override
  protected LocalizableMessage getTitle()
  {
    return INFO_SUFFIXES_TO_REPLICATE_PANEL_TITLE.get();
  }
  /** {@inheritDoc} */
  @Override
  public void beginDisplay(UserData data)
  {
    TreeSet<SuffixDescriptor> array = orderSuffixes(
        data.getSuffixesToReplicateOptions().getAvailableSuffixes());
    AuthenticationData authData =
      data.getReplicationOptions().getAuthenticationData();
    Set<SuffixDescriptor> array = orderSuffixes(data.getSuffixesToReplicateOptions().getAvailableSuffixes());
    AuthenticationData authData = data.getReplicationOptions().getAuthenticationData();
    String newServerDisplay;
    if (authData != null)
    {
      newServerDisplay = authData.getHostName()+":"+authData.getPort();
    }
    else
    {
      newServerDisplay = "";
    }
    if (!array.equals(orderedSuffixes) ||
        !newServerDisplay.equals(serverToConnectDisplay))
    newServerDisplay = authData != null ? authData.getHostName() + ":" + authData.getPort() : "";
    if (!array.equals(orderedSuffixes) || !newServerDisplay.equals(serverToConnectDisplay))
    {
      serverToConnectDisplay = newServerDisplay;
      HashMap<String, Boolean> hmOldValues = new HashMap<String, Boolean>();
      Map<String, Boolean> hmOldValues = new HashMap<>();
      for (String id : hmCheckBoxes.keySet())
      {
        hmOldValues.put(id, hmCheckBoxes.get(id).isSelected());
@@ -222,10 +210,9 @@
      orderedSuffixes.clear();
      for (SuffixDescriptor suffix : array)
      {
        if (!Utils.areDnsEqual(suffix.getDN(),
            ADSContext.getAdministrationSuffixDN()) &&
            !Utils.areDnsEqual(suffix.getDN(), Constants.SCHEMA_DN) &&
            !Utils.areDnsEqual(suffix.getDN(), Constants.REPLICATION_CHANGES_DN))
        if (!Utils.areDnsEqual(suffix.getDN(), ADSContext.getAdministrationSuffixDN())
            && !Utils.areDnsEqual(suffix.getDN(), Constants.SCHEMA_DN)
            && !Utils.areDnsEqual(suffix.getDN(), Constants.REPLICATION_CHANGES_DN))
        {
          orderedSuffixes.add(suffix);
        }
@@ -234,8 +221,7 @@
      for (SuffixDescriptor suffix : orderedSuffixes)
      {
        JCheckBox cb = UIFactory.makeJCheckBox(LocalizableMessage.raw(suffix.getDN()),
            INFO_SUFFIXES_TO_REPLICATE_DN_TOOLTIP.get(),
            UIFactory.TextStyle.SECONDARY_FIELD_VALID);
                INFO_SUFFIXES_TO_REPLICATE_DN_TOOLTIP.get(), UIFactory.TextStyle.SECONDARY_FIELD_VALID);
        cb.setOpaque(false);
        Boolean v = hmOldValues.get(suffix.getId());
        if (v != null)
@@ -246,21 +232,18 @@
      }
      populateCheckBoxPanel();
    }
    boolean display = orderedSuffixes.size() > 0;
    boolean display = !orderedSuffixes.isEmpty();
    noSuffixLabel.setVisible(!display);
    labelGlue.setVisible(!display);
    scroll.setVisible(display);
  }
  /**
   * Creates the components of this panel.
   */
  /** Creates the components of this panel. */
  private void createComponents()
  {
    noSuffixLabel = UIFactory.makeJLabel(UIFactory.IconType.NO_ICON,
        INFO_SUFFIX_LIST_EMPTY.get(),
        UIFactory.TextStyle.SECONDARY_FIELD_VALID);
    noSuffixLabel = UIFactory.makeJLabel(
        UIFactory.IconType.NO_ICON, INFO_SUFFIX_LIST_EMPTY.get(), UIFactory.TextStyle.SECONDARY_FIELD_VALID);
  }
  private void populateCheckBoxPanel()
@@ -290,19 +273,16 @@
      JEditorPane l = UIFactory.makeTextPane(
              LocalizableMessage.raw(getSuffixString(suffix)),
              UIFactory.TextStyle.SECONDARY_FIELD_VALID);
      l.setOpaque(false);
      /* Use a prototype label to get the additional insets */
      JEditorPane proto = UIFactory.makeTextPane(
              LocalizableMessage.raw(suffix.getDN()),
          UIFactory.TextStyle.SECONDARY_FIELD_VALID);
      JEditorPane proto =
          UIFactory.makeTextPane(LocalizableMessage.raw(suffix.getDN()), UIFactory.TextStyle.SECONDARY_FIELD_VALID);
      gbc.insets.top += Math.abs(cb.getPreferredSize().height -
          proto.getPreferredSize().height) / 2;
      gbc.insets.top += Math.abs(cb.getPreferredSize().height - proto.getPreferredSize().height) / 2;
      gbc.gridx = 1;
      checkBoxPanel.add(l, gbc);
      first = false;
      gbc.gridy ++;
      gbc.gridy++;
    }
    gbc.weighty = 1.0;
    gbc.insets = UIFactory.getEmptyInsets();
@@ -312,13 +292,13 @@
  private String getSuffixString(SuffixDescriptor desc)
  {
    TreeSet<LocalizableMessage> replicaDisplays = new TreeSet<LocalizableMessage>();
    for (ReplicaDescriptor rep: desc.getReplicas())
    Set<LocalizableMessage> replicaDisplays = new TreeSet<>();
    for (ReplicaDescriptor rep : desc.getReplicas())
    {
      replicaDisplays.add(getReplicaDisplay(rep));
    }
    LocalizableMessageBuilder buf = new LocalizableMessageBuilder();
    for (LocalizableMessage display: replicaDisplays)
    for (LocalizableMessage display : replicaDisplays)
    {
      if (buf.length() > 0)
      {
@@ -331,42 +311,28 @@
  private LocalizableMessage getReplicaDisplay(ReplicaDescriptor replica)
  {
    LocalizableMessage display;
    ServerDescriptor server = replica.getServer();
    String serverDisplay;
    if (server.getHostPort(false).equalsIgnoreCase(serverToConnectDisplay))
    {
      serverDisplay = serverToConnectDisplay;
    }
    else
    {
      serverDisplay = server.getHostPort(true);
    }
    boolean isServerToConnect = server.getHostPort(false).equalsIgnoreCase(serverToConnectDisplay);
    String serverDisplay = isServerToConnect ? serverToConnectDisplay : server.getHostPort(true);
    int nEntries = replica.getEntries();
    if (nEntries > 0)
    {
      display = INFO_SUFFIX_LIST_REPLICA_DISPLAY_ENTRIES.get(serverDisplay, nEntries);
      return INFO_SUFFIX_LIST_REPLICA_DISPLAY_ENTRIES.get(serverDisplay, nEntries);
    }
    else if (nEntries == 0)
    {
      display = INFO_SUFFIX_LIST_REPLICA_DISPLAY_NO_ENTRIES.get(serverDisplay);
      return INFO_SUFFIX_LIST_REPLICA_DISPLAY_NO_ENTRIES.get(serverDisplay);
    }
    else
    {
      display = INFO_SUFFIX_LIST_REPLICA_DISPLAY_ENTRIES_NOT_AVAILABLE.get(serverDisplay);
      return INFO_SUFFIX_LIST_REPLICA_DISPLAY_ENTRIES_NOT_AVAILABLE.get(serverDisplay);
    }
    return display;
  }
  private TreeSet<SuffixDescriptor> orderSuffixes(
      Set<SuffixDescriptor> suffixes)
  private Set<SuffixDescriptor> orderSuffixes(Set<SuffixDescriptor> suffixes)
  {
    TreeSet<SuffixDescriptor> ordered = new TreeSet<SuffixDescriptor>(this);
    Set<SuffixDescriptor> ordered = new TreeSet<>(this);
    ordered.addAll(suffixes);
    return ordered;
@@ -377,10 +343,9 @@
    return desc1.getDN().compareTo(desc2.getDN());
  }
  private int compareSuffixStrings(SuffixDescriptor desc1,
      SuffixDescriptor desc2)
  private int compareSuffixStrings(SuffixDescriptor desc1, SuffixDescriptor desc2)
  {
    return getSuffixString(desc1).compareTo(getSuffixString(desc2));
  }
}
}
opendj-server-legacy/src/main/java/org/opends/quicksetup/ui/UIFactory.java
@@ -24,204 +24,156 @@
 *      Copyright 2006-2010 Sun Microsystems, Inc.
 *      Portions Copyright 2013-2015 ForgeRock AS.
 */
package org.opends.quicksetup.ui;
import org.forgerock.i18n.LocalizableMessage;
import static org.opends.messages.QuickSetupMessages.*;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
import javax.swing.text.JTextComponent;
import javax.swing.text.html.HTMLEditorKit;
import java.awt.*;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.Image;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.util.HashMap;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JRadioButton;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ListCellRenderer;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
import javax.swing.text.JTextComponent;
import javax.swing.text.html.HTMLEditorKit;
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.i18n.slf4j.LocalizedLogger;
import static org.opends.messages.QuickSetupMessages.*;
/**
 * This class provides constants an methods to create Swing objects and to
 * generate UI elements with a common look and feel.
 *
 * <p>
 * When we want to change a color, a background or a font this is the class
 * that should be modified.
 *
 */
public class UIFactory
{
  private static boolean initialized;
  private static String parentPackagePath;
  private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
  /**
   * Specifies the horizontal insets between buttons.
   */
  /** Specifies the horizontal insets between buttons. */
  public static final int HORIZONTAL_INSET_BETWEEN_BUTTONS = 5;
  /**
   * Specifies the top inset for the steps.
   */
  /** Specifies the top inset for the steps. */
  public static final int TOP_INSET_STEP = 15;
  /**
   * Specifies the left inset for the steps.
   */
  /** Specifies the left inset for the steps. */
  public static final int LEFT_INSET_STEP = 5;
  /**
   * Specifies the extra left inset for the sub-steps.
   */
  /** Specifies the extra left inset for the sub-steps. */
  public static final int LEFT_INSET_SUBSTEP = 20;
  /**
   * Specifies the top inset for the instructions sub panel.
   */
  /** Specifies the top inset for the instructions sub panel. */
  public static final int TOP_INSET_INSTRUCTIONS_SUBPANEL = 5;
  /**
   * Specifies the top inset for input subpanel.
   */
  /** Specifies the top inset for input subpanel. */
  public static final int TOP_INSET_INPUT_SUBPANEL = 10;
  /**
   * Specifies the top inset for a primary field.
   */
  /** Specifies the top inset for a primary field. */
  public static final int TOP_INSET_PRIMARY_FIELD = 10;
  /**
   * Specifies the top inset for a secondary field.
   */
  /** Specifies the top inset for a secondary field. */
  public static final int TOP_INSET_SECONDARY_FIELD = 5;
  /**
   * Specifies the top inset for a radio button.
   */
  /** Specifies the top inset for a radio button. */
  public static final int TOP_INSET_RADIOBUTTON = 0;
  /**
   * Specifies the top inset for a radio button subordinate panel.
   */
  /** Specifies the top inset for a radio button subordinate panel. */
  public static final int TOP_INSET_RADIO_SUBORDINATE = 0;
  /**
   * Specifies the top inset for the progress bar.
   */
  /** Specifies the top inset for the progress bar. */
  public static final int TOP_INSET_PROGRESS_BAR = 5;
  /**
   * Specifies the top inset for the progress text area.
   */
  /** Specifies the top inset for the progress text area. */
  public static final int TOP_INSET_PROGRESS_TEXTAREA = 4;
  /**
   * Specifies the top inset for the background image.
   */
  /** Specifies the top inset for the background image. */
  public static final int TOP_INSET_BACKGROUND = 70;
  /**
   * Specifies the top inset for the error message.
   */
  /** Specifies the top inset for the error message. */
  public static final int TOP_INSET_ERROR_MESSAGE = 10;
  /**
   * Specifies the top inset for the browse button.
   */
  /** Specifies the top inset for the browse button. */
  public static final int TOP_INSET_BROWSE = 5;
  /**
   * Specifies the right inset for background image.
   */
  /** Specifies the right inset for background image. */
  public static final int RIGHT_INSET_BACKGROUND = 20;
  /**
   * Specifies the left inset for the primary field.
   */
  /** Specifies the left inset for the primary field. */
  public static final int LEFT_INSET_PRIMARY_FIELD = 10;
  /**
   * Specifies the left inset for the browse button.
   */
  /** Specifies the left inset for the browse button. */
  public static final int LEFT_INSET_BROWSE = 10;
  /**
   * Specifies the left inset for radio subordinate panel.
   */
  /** Specifies the left inset for radio subordinate panel. */
  public static final int LEFT_INSET_RADIO_SUBORDINATE = 35;
  /**
   * Specifies the left inset for the secondary field.
   */
  /** Specifies the left inset for the secondary field. */
  public static final int LEFT_INSET_SECONDARY_FIELD = 5;
  /**
   * Specifies the left inset for the background image.
   */
  /** Specifies the left inset for the background image. */
  public static final int LEFT_INSET_BACKGROUND = 20;
  /**
   * Specifies the left inset for the copy url button.
   */
  /** Specifies the left inset for the copy url button. */
  public static final int LEFT_INSET_COPY_BUTTON = 10;
  /**
   * Specifies the left inset for a subordinate subpanel.
   */
  /** Specifies the left inset for a subordinate subpanel. */
  public static final int LEFT_INSET_SUBPANEL_SUBORDINATE = 30;
  /**
   * Specifies the left inset for the progress bar.
   */
  /** Specifies the left inset for the progress bar. */
  public static final int BOTTOM_INSET_PROGRESS_BAR = 10;
  /**
   * Specifies the bottom inset for the background image.
   */
  /** Specifies the bottom inset for the background image. */
  public static final int BOTTOM_INSET_BACKGROUND = 30;
  /**
   * Specifies the top inset for a secondary field.
   */
  /** Specifies the top inset for a secondary field. */
  public static final int BOTTOM_INSET_SECONDARY_FIELD = 5;
  /**
   * Specifies the number of columns of a text field for a path.
   */
  /** Specifies the number of columns of a text field for a path. */
  public static final int PATH_FIELD_SIZE = 20;
  /**
   * Specifies the number of columns of a text field for a relative path.
   */
  /** Specifies the number of columns of a text field for a relative path. */
  public static final int RELATIVE_PATH_FIELD_SIZE = 10;
  /**
   * Specifies the number of columns of a text field for a host name.
   */
  /** Specifies the number of columns of a text field for a host name. */
  public static final int HOST_FIELD_SIZE = 20;
  /**
   * Specifies the number of columns of a text field for a UID.
   */
  /** Specifies the number of columns of a text field for a UID. */
  public static final int UID_FIELD_SIZE = 15;
  /**
   * Specifies the number of columns of a text field for a port.
   */
  /** Specifies the number of columns of a text field for a port. */
  public static final int PORT_FIELD_SIZE = 5;
  /**
   * Specifies the number of columns of a text field for a dn.
   */
  /** Specifies the number of columns of a text field for a dn. */
  public static final int DN_FIELD_SIZE = 20;
  /**
   * Specifies the number of columns of a text field for a password.
   */
  /** Specifies the number of columns of a text field for a password. */
  public static final int PASSWORD_FIELD_SIZE = 15;
  /**
@@ -229,14 +181,12 @@
   */
  public static final int NUMBER_ENTRIES_FIELD_SIZE = 7;
  /**
   * Specifies the number of points for the width of the progress bar.
   */
  /** Specifies the number of points for the width of the progress bar. */
  public static final int PROGRESS_BAR_SIZE = 220;
  /**
   * Specifies the number of extra points that we add to the minimum size of
   * the dialog.
   * Specifies the number of extra points that we add to the minimum size of the
   * dialog.
   */
  public static final int EXTRA_DIALOG_HEIGHT = 75;
@@ -244,257 +194,150 @@
  private static final Insets STEPS_PANEL_INSETS = new Insets(15, 10, 5, 10);
  private static final Insets CURRENT_STEP_PANEL_INSETS =
      new Insets(15, 15, 15, 15);
  private static final Insets CURRENT_STEP_PANEL_INSETS = new Insets(15, 15, 15, 15);
  private static final Insets EMPTY_INSETS = new Insets(0, 0, 0, 0);
  /**
   * Specifies the default background color.
   */
  public static final Color DEFAULT_BACKGROUND =
          getColor(INFO_DEFAULT_BACKGROUND_COLOR.get());
  /** Specifies the default background color. */
  public static final Color DEFAULT_BACKGROUND = getColor(INFO_DEFAULT_BACKGROUND_COLOR.get());
  /**
   * Specifies the current step background color.
   */
  public static final Color CURRENT_STEP_PANEL_BACKGROUND =
          getColor(INFO_CURRENT_STEP_PANEL_BACKGROUND_COLOR.get());
  /** Specifies the current step background color. */
  public static final Color CURRENT_STEP_PANEL_BACKGROUND = getColor(INFO_CURRENT_STEP_PANEL_BACKGROUND_COLOR.get());
  /**
   * Specifies the default label color.
   */
  public static final Color DEFAULT_LABEL_COLOR =
          getColor(INFO_DEFAULT_LABEL_COLOR.get());
  /** Specifies the default label color. */
  public static final Color DEFAULT_LABEL_COLOR = getColor(INFO_DEFAULT_LABEL_COLOR.get());
  /**
   * Specifies the valid field color.
   */
  public static final Color FIELD_VALID_COLOR =
          getColor(INFO_FIELD_VALID_COLOR.get());
  /** Specifies the valid field color. */
  public static final Color FIELD_VALID_COLOR = getColor(INFO_FIELD_VALID_COLOR.get());
  /**
   * Specifies the invalid field color.
   */
  public static final Color FIELD_INVALID_COLOR =
          getColor(INFO_FIELD_INVALID_COLOR.get());
  /** Specifies the invalid field color. */
  public static final Color FIELD_INVALID_COLOR = getColor(INFO_FIELD_INVALID_COLOR.get());
  /**
   * Specifies the read only text color.
   */
  public static final Color READ_ONLY_COLOR =
          getColor(INFO_READ_ONLY_COLOR.get());
  /** Specifies the read only text color. */
  public static final Color READ_ONLY_COLOR = getColor(INFO_READ_ONLY_COLOR.get());
  /**
   * Specifies the check box text color.
   */
  public static final Color CHECKBOX_COLOR =
          getColor(INFO_CHECKBOX_COLOR.get());
  /** Specifies the check box text color. */
  public static final Color CHECKBOX_COLOR = getColor(INFO_CHECKBOX_COLOR.get());
  /**
   * Specifies the progress text color.
   */
  public static final Color PROGRESS_COLOR =
          getColor(INFO_PROGRESS_COLOR.get());
  /** Specifies the progress text color. */
  public static final Color PROGRESS_COLOR = getColor(INFO_PROGRESS_COLOR.get());
  /**
   * Specifies the instructions text color.
   */
  public static final Color INSTRUCTIONS_COLOR =
          getColor(INFO_INSTRUCTIONS_COLOR.get());
  /** Specifies the instructions text color. */
  public static final Color INSTRUCTIONS_COLOR = getColor(INFO_INSTRUCTIONS_COLOR.get());
  /**
   * Specifies the text field text color.
   */
  public static final Color TEXTFIELD_COLOR =
          getColor(INFO_TEXTFIELD_COLOR.get());
  /** Specifies the text field text color. */
  public static final Color TEXTFIELD_COLOR = getColor(INFO_TEXTFIELD_COLOR.get());
  /**
   * Specifies the password field text color.
   */
  public static final Color PASSWORDFIELD_COLOR =
          getColor(INFO_PASSWORDFIELD_COLOR.get());
  /** Specifies the password field text color. */
  public static final Color PASSWORDFIELD_COLOR = getColor(INFO_PASSWORDFIELD_COLOR.get());
  /**
   * Specifies the in-line help text color.
   */
  public static final Color INLINE_HELP_COLOR =
          getColor(INFO_INLINE_HELP_COLOR.get());
  /** Specifies the in-line help text color. */
  public static final Color INLINE_HELP_COLOR = getColor(INFO_INLINE_HELP_COLOR.get());
  /**
   * Specifies the panel border color.
   */
  public static final Color PANEL_BORDER_COLOR =
          getColor(INFO_PANEL_BORDER_COLOR.get());
  /** Specifies the panel border color. */
  public static final Color PANEL_BORDER_COLOR = getColor(INFO_PANEL_BORDER_COLOR.get());
  /**
   * Specifies the current step panel border.
   */
  /** Specifies the current step panel border. */
  public static final Border CURRENT_STEP_PANEL_BORDER =
          BorderFactory.createMatteBorder(0, 2, 2, 0, PANEL_BORDER_COLOR);
      BorderFactory.createMatteBorder(0, 2, 2, 0, PANEL_BORDER_COLOR);
  /**
   * Specifies the text area border.
   */
  /** Specifies the text area border. */
  public static final Border TEXT_AREA_BORDER =
          BorderFactory.createMatteBorder(1, 1, 1, 1,
                  getColor(INFO_TEXT_AREA_BORDER_COLOR.get()));
      BorderFactory.createMatteBorder(1, 1, 1, 1, getColor(INFO_TEXT_AREA_BORDER_COLOR.get()));
  /**
   * Specifies the dialog border.
   */
  public static final Border DIALOG_PANEL_BORDER =
    BorderFactory.createMatteBorder(0, 0, 2, 0, PANEL_BORDER_COLOR);
  /** Specifies the dialog border. */
  public static final Border DIALOG_PANEL_BORDER = BorderFactory.createMatteBorder(0, 0, 2, 0, PANEL_BORDER_COLOR);
  private static Font defaultFont;
  private static Font DEFAULT_FONT;
  static
  {
    try
    {
      defaultFont = UIManager.getFont("Label.font").deriveFont(Font.PLAIN).
      deriveFont(12f);
      DEFAULT_FONT = UIManager.getFont("Label.font").deriveFont(Font.PLAIN).deriveFont(12f);
    }
    catch (Throwable t)
    {
      defaultFont = Font.decode("SansSerif-PLAIN-12");
      DEFAULT_FONT = Font.decode("SansSerif-PLAIN-12");
    }
  }
  /**
   * Specifies the font for the step which is not the current one in the steps
   * panel.
   */
  public static final Font NOT_CURRENT_STEP_FONT = defaultFont.deriveFont(14f);
  public static final Font NOT_CURRENT_STEP_FONT = DEFAULT_FONT.deriveFont(14f);
  /**
   * Specifies the font for the step which is the current one in the steps
   * panel.
   */
  public static final Font CURRENT_STEP_FONT =
    defaultFont.deriveFont(14f).deriveFont(Font.BOLD);
  public static final Font CURRENT_STEP_FONT = DEFAULT_FONT.deriveFont(14f).deriveFont(Font.BOLD);
  /**
   * Specifies the font for the title of the current panel.
   */
  public static final Font TITLE_FONT =
    defaultFont.deriveFont(14f).deriveFont(Font.BOLD);
  /** Specifies the font for the title of the current panel. */
  public static final Font TITLE_FONT = DEFAULT_FONT.deriveFont(14f).deriveFont(Font.BOLD);
  /**
   * Specifies the font for the instructions of the current panel.
   */
  public static final Font INSTRUCTIONS_FONT = defaultFont;
  /** Specifies the font for the instructions of the current panel. */
  public static final Font INSTRUCTIONS_FONT = DEFAULT_FONT;
  /**
   * Specifies the font for the instructions of the current panel.
   */
  public static final Font INSTRUCTIONS_MONOSPACE_FONT =
    Font.decode("Monospaced-PLAIN-14");
  /** Specifies the font for the instructions of the current panel. */
  public static final Font INSTRUCTIONS_MONOSPACE_FONT = Font.decode("Monospaced-PLAIN-14");
  /**
   * Specifies the font for the primary valid field.
   */
  public static final Font PRIMARY_FIELD_VALID_FONT =
    defaultFont.deriveFont(Font.BOLD);
  /** Specifies the font for the primary valid field. */
  public static final Font PRIMARY_FIELD_VALID_FONT = DEFAULT_FONT.deriveFont(Font.BOLD);
  /**
   * Specifies the font for the secondary valid field.
   */
  public static final Font SECONDARY_FIELD_VALID_FONT = defaultFont;
  /** Specifies the font for the secondary valid field. */
  public static final Font SECONDARY_FIELD_VALID_FONT = DEFAULT_FONT;
  /**
   * Specifies the font for the primary invalid field.
   */
  public static final Font PRIMARY_FIELD_INVALID_FONT =
    defaultFont.deriveFont(Font.BOLD | Font.ITALIC);
  /** Specifies the font for the primary invalid field. */
  public static final Font PRIMARY_FIELD_INVALID_FONT = DEFAULT_FONT.deriveFont(Font.BOLD | Font.ITALIC);
  /**
   * Specifies the font for the secondary invalid field.
   */
  public static final Font SECONDARY_FIELD_INVALID_FONT =
    defaultFont.deriveFont(Font.ITALIC);
  /** Specifies the font for the secondary invalid field. */
  public static final Font SECONDARY_FIELD_INVALID_FONT = DEFAULT_FONT.deriveFont(Font.ITALIC);
  /**
   * Specifies the font for the secondary status field.
   */
  public static final Font SECONDARY_STATUS_FONT =
    defaultFont.deriveFont(Font.ITALIC);
  /** Specifies the font for the secondary status field. */
  public static final Font SECONDARY_STATUS_FONT = DEFAULT_FONT.deriveFont(Font.ITALIC);
  /**
   * Specifies the font for read only text.
   */
  public static final Font READ_ONLY_FONT = defaultFont;
  /** Specifies the font for read only text. */
  public static final Font READ_ONLY_FONT = DEFAULT_FONT;
  /**
   * Specifies the font for the check box text.
   */
  public static final Font CHECKBOX_FONT = defaultFont;
  /** Specifies the font for the check box text. */
  public static final Font CHECKBOX_FONT = DEFAULT_FONT;
  /**
   * Specifies the font for the progress text.
   */
  public static final Font PROGRESS_FONT = defaultFont;
  /** Specifies the font for the progress text. */
  public static final Font PROGRESS_FONT = DEFAULT_FONT;
  /**
   * Specifies the font for the text field text.
   */
  public static final Font TEXTFIELD_FONT = defaultFont;
  /** Specifies the font for the text field text. */
  public static final Font TEXTFIELD_FONT = DEFAULT_FONT;
  /**
   * Specifies the font for the password field text.
   */
  public static final Font PASSWORD_FIELD_FONT = defaultFont;
  /** Specifies the font for the password field text. */
  public static final Font PASSWORD_FIELD_FONT = DEFAULT_FONT;
  /**
   * Specifies the font for the points '....' in the progress panel.
   */
  public static final Font PROGRESS_POINTS_FONT =
    defaultFont.deriveFont(Font.BOLD);
  /** Specifies the font for the points '....' in the progress panel. */
  public static final Font PROGRESS_POINTS_FONT = DEFAULT_FONT.deriveFont(Font.BOLD);
  /**
   * Specifies the font for the done text 'Done' in the progress panel.
   */
  /** Specifies the font for the done text 'Done' in the progress panel. */
  public static final Font PROGRESS_DONE_FONT = PROGRESS_POINTS_FONT;
  /**
   * Specifies the font for the log messages in the progress panel.
   */
  public static final Font PROGRESS_LOG_FONT =
      Font.decode("Monospaced-PLAIN-12");
  /** Specifies the font for the log messages in the progress panel. */
  public static final Font PROGRESS_LOG_FONT = Font.decode("Monospaced-PLAIN-12");
  /**
   * Specifies the font for the error log messages in the progress panel.
   */
  public static final Font PROGRESS_LOG_ERROR_FONT =
      Font.decode("Monospaced-PLAIN-12");
  /** Specifies the font for the error log messages in the progress panel. */
  public static final Font PROGRESS_LOG_ERROR_FONT = Font.decode("Monospaced-PLAIN-12");
  /**
   * Specifies the font for the error messages in the progress panel.
   */
  public static final Font PROGRESS_ERROR_FONT =
    defaultFont.deriveFont(Font.BOLD);
  /** Specifies the font for the error messages in the progress panel. */
  public static final Font PROGRESS_ERROR_FONT = DEFAULT_FONT.deriveFont(Font.BOLD);
  /**
   * Specifies the font for the warning messages in the progress panel.
   */
  public static final Font PROGRESS_WARNING_FONT =
    defaultFont.deriveFont(Font.BOLD);
  /** Specifies the font for the warning messages in the progress panel. */
  public static final Font PROGRESS_WARNING_FONT = DEFAULT_FONT.deriveFont(Font.BOLD);
  /**
   * Specifies the font for the stack trace in the progress panel.
   */
  public static final Font STACK_FONT = defaultFont;
  /** Specifies the font for the stack trace in the progress panel. */
  public static final Font STACK_FONT = DEFAULT_FONT;
  /**
   * Specifies the font for the text in the WebBrowserErrorDialog.
   */
  public static final Font ERROR_DIALOG_FONT = defaultFont;
  /** Specifies the font for the text in the WebBrowserErrorDialog. */
  public static final Font ERROR_DIALOG_FONT = DEFAULT_FONT;
  /**
   * Specifies the font for the text in the in-line help.
   */
  public static final Font INLINE_HELP_FONT = defaultFont.deriveFont(
      (float)(defaultFont.getSize() - 2));
  /** Specifies the font for the text in the in-line help. */
  public static final Font INLINE_HELP_FONT = DEFAULT_FONT.deriveFont((float) (DEFAULT_FONT.getSize() - 2));
  private static final String SPAN_CLOSE = "</span>";
@@ -510,8 +353,7 @@
    INFO_DIV_OPEN_ERROR_BACKGROUND_3_COLOR.get()+
    ";vertical-align:middle;text-align:left\">";
  private static final String DIV_OPEN_WARNING_BACKGROUND =
      DIV_OPEN_ERROR_BACKGROUND;
  private static final String DIV_OPEN_WARNING_BACKGROUND = DIV_OPEN_ERROR_BACKGROUND;
  private static final String DIV_OPEN_SUCCESSFUL_BACKGROUND =
    "<div style=\"color:#"+
@@ -523,195 +365,119 @@
    INFO_DIV_OPEN_SUCCESSFUL_BACKGROUND_3_COLOR.get()+
    ";vertical-align:middle;text-align:left\">";
  /**
   * An HTML separator text that can be used in the progress panel.
   */
  /** An HTML separator text that can be used in the progress panel. */
  public static final String HTML_SEPARATOR =
    "<div style=\"font-size:1px;background-color:#"+
    INFO_HTML_SEPARATOR_COLOR.get()+
    ";margin:10px 5px 10px 5px;\"></div>";
  private static final HashMap<IconType, ImageIcon> hmIcons =
      new HashMap<IconType, ImageIcon>();
  private static final HashMap<IconType, ImageIcon> hmIcons = new HashMap<>();
  /**
   * The following enumeration contains the different icons that we can have.
   *
   */
  /** The following enumeration contains the different icons that we can have. */
  public enum IconType
  {
    /**
     * Splash Icon.
     */
    /** Splash Icon. */
    SPLASH,
    /**
     * Current Step Icon.
     */
    /** Current Step Icon. */
    CURRENT_STEP,
    /**
     * The icon displayed by the OS when the dialog is minimized.
     */
    /** The icon displayed by the OS when the dialog is minimized. */
    MINIMIZED,
    /**
     * The icon displayed by the Mac OS when the dialog is minimized.
     */
    /** The icon displayed by the Mac OS when the dialog is minimized. */
    MINIMIZED_MAC,
    /**
     * The background icon.
     */
    /** The background icon. */
    BACKGROUND,
    /**
     * The warning icon.
     */
    /** The warning icon. */
    WARNING,
    /**
     * The warning large icon.
     */
    /** The warning large icon. */
    WARNING_LARGE,
    /**
     * The error icon.
     */
    /** The error icon. */
    ERROR,
    /**
     * The error large icon.
     */
    /** The error large icon. */
    ERROR_LARGE,
    /**
     * The information icon.
     */
    /** The information icon. */
    INFORMATION,
    /**
     * The information large icon.
     */
    /** The information large icon. */
    INFORMATION_LARGE,
    /**
     * Icon to create subsection title in Status Panel.
     */
    /** Icon to create subsection title in Status Panel. */
    SUBSECTION_LEFT,
    /**
     * Icon to create subsection title in Status Panel.
     */
    /** Icon to create subsection title in Status Panel. */
    SUBSECTION_RIGHT,
    /**
     * Question icon.
     */
    /** Question icon. */
    HELP_SMALL,
    /**
     * Hourglass to display when the user must wait.
     */
    /** Hourglass to display when the user must wait. */
    WAIT,
    /**
     * 8 x 8 Hourglass to display when the user must wait.
     */
    /** 8 x 8 Hourglass to display when the user must wait. */
    WAIT_TINY,
    /**
     * No icon.
     */
    /** No icon. */
    NO_ICON
  }
  /**
   * The following enumeration contains the different text styles that we can
   * have.  A text style basically specifies the font and color to be used to
   * have. A text style basically specifies the font and color to be used to
   * render the text.
   *
   */
  public enum TextStyle
  {
    /**
     * Current Step label style for the steps panel.
     */
    /** Current Step label style for the steps panel. */
    CURRENT_STEP,
    /**
     * Not current Step label style for the steps panel.
     */
    /** Not current Step label style for the steps panel. */
    NOT_CURRENT_STEP,
    /**
     * Title label style for the current step panel.
     */
    /** Title label style for the current step panel. */
    TITLE,
    /**
     * Primary field valid label style for the current step panel.
     */
    /** Primary field valid label style for the current step panel. */
    PRIMARY_FIELD_VALID,
    /**
     * Primary field invalid text style for the current step panel.
     */
    /** Primary field invalid text style for the current step panel. */
    PRIMARY_FIELD_INVALID,
    /**
     * Secondary field valid text style for the current step panel.
     */
    /** Secondary field valid text style for the current step panel. */
    SECONDARY_FIELD_VALID,
    /**
     * Secondary field invalid text style for the current step panel.
     */
    /** Secondary field invalid text style for the current step panel. */
    SECONDARY_FIELD_INVALID,
    /**
     * Status messages that appear near components.
     */
    /** Status messages that appear near components. */
    SECONDARY_STATUS,
    /**
     * Textfield text style for the current step panel.
     */
    /** Textfield text style for the current step panel. */
    TEXTFIELD,
    /**
     * Password text style for the current step panel.
     */
    /** Password text style for the current step panel. */
    PASSWORD_FIELD,
    /**
     * Read only text style for the current step panel.
     */
    /** Read only text style for the current step panel. */
    READ_ONLY,
    /**
     * Check box text text style for the current step panel.
     */
    /** Check box text text style for the current step panel. */
    CHECKBOX,
    /**
     * Progress messages text style for the current step panel.
     */
    /** Progress messages text style for the current step panel. */
    PROGRESS,
    /**
     * Text style for the instructions.
     */
    /** Text style for the instructions. */
    INSTRUCTIONS,
    /**
     * In-line help style.
     */
    /** In-line help style. */
    INLINE_HELP,
    /**
     * No text style.
     */
    /** No text style. */
    NO_STYLE
  }
  /**
   * This method initialize the look and feel.
   * @throws Throwable if there is a problem initializing the look and feel.
   *
   * @throws Throwable
   *           if there is a problem initializing the look and feel.
   */
  public static void initializeLookAndFeel() throws Throwable
  {
    final Throwable[] ts = {null};
    final Throwable[] ts = { null };
    Runnable r = new Runnable()
    {
      @Override
      public void run()
      {
        System.setProperty("swing.aatext", "true");
        try
        {
          String lf = UIManager.getSystemLookAndFeelClassName();
          if (lf.equalsIgnoreCase(
              "com.sun.java.swing.plaf.motif.MotifLookAndFeel"))
          if ("com.sun.java.swing.plaf.motif.MotifLookAndFeel".equalsIgnoreCase(lf))
          {
            lf = UIManager.getCrossPlatformLookAndFeelClassName();
          }
          UIManager.setLookAndFeel(lf);
        } catch (Throwable t)
        }
        catch (Throwable t)
        {
          ts[0] = t;
        }
@@ -740,9 +506,11 @@
  }
  /**
   * This method initialize the look and feel and UI settings specific to
   * quick setup.
   * @throws Throwable if there is a problem initializing the look and feel.
   * This method initialize the look and feel and UI settings specific to quick
   * setup.
   *
   * @throws Throwable
   *           if there is a problem initializing the look and feel.
   */
  public static void initialize() throws Throwable
  {
@@ -750,17 +518,14 @@
    {
      try
      {
        UIManager.put("OptionPane.background",
            getColor(INFO_OPTIONPANE_BACKGROUND_COLOR.get()));
        UIManager.put("Panel.background",
            getColor(INFO_PANEL_BACKGROUND_COLOR.get()));
        UIManager.put("ComboBox.background",
            getColor(INFO_COMBOBOX_BACKGROUND_COLOR.get()));
        UIManager.put("OptionPane.background", getColor(INFO_OPTIONPANE_BACKGROUND_COLOR.get()));
        UIManager.put("Panel.background", getColor(INFO_PANEL_BACKGROUND_COLOR.get()));
        UIManager.put("ComboBox.background", getColor(INFO_COMBOBOX_BACKGROUND_COLOR.get()));
      }
      catch (Throwable t)
      {
        // This might occur when we do not get the display
        logger.warn(LocalizableMessage.raw("Error updating UIManager: "+t, t));
        logger.warn(LocalizableMessage.raw("Error updating UIManager: " + t, t));
      }
      initializeLookAndFeel();
      initialized = true;
@@ -769,9 +534,11 @@
  /**
   * Creates a new JPanel.
   *
   * @return JPanel newly created
   */
  public static JPanel makeJPanel() {
  public static JPanel makeJPanel()
  {
    JPanel pnl = new JPanel();
    pnl.setOpaque(false);
    return pnl;
@@ -779,8 +546,11 @@
  /**
   * Creates a JButton with the given label and tooltip.
   * @param label the text of the button.
   * @param tooltip the tooltip of the button.
   *
   * @param label
   *          the text of the button.
   * @param tooltip
   *          the tooltip of the button.
   * @return a JButton with the given label and tooltip.
   */
  public static JButton makeJButton(LocalizableMessage label, LocalizableMessage tooltip)
@@ -804,7 +574,9 @@
  /**
   * Commodity method that returns a JLabel based on a LabelFieldDescriptor.
   * @param desc the LabelFieldDescriptor describing the JLabel.
   *
   * @param desc
   *          the LabelFieldDescriptor describing the JLabel.
   * @return a JLabel based on a LabelFieldDescriptor.
   */
  public static JLabel makeJLabel(LabelFieldDescriptor desc)
@@ -813,7 +585,8 @@
    if (desc.getLabelType() == LabelFieldDescriptor.LabelType.PRIMARY)
    {
      style = UIFactory.TextStyle.PRIMARY_FIELD_VALID;
    } else
    }
    else
    {
      style = UIFactory.TextStyle.SECONDARY_FIELD_VALID;
    }
@@ -822,13 +595,16 @@
  /**
   * Creates a JLabel with the given icon, text and text style.
   * @param iconName the icon.
   * @param text the label text.
   * @param style the text style.
   *
   * @param iconName
   *          the icon.
   * @param text
   *          the label text.
   * @param style
   *          the text style.
   * @return a JLabel with the given icon, text and text style.
   */
  public static JLabel makeJLabel(IconType iconName, LocalizableMessage text,
      TextStyle style)
  public static JLabel makeJLabel(IconType iconName, LocalizableMessage text, TextStyle style)
  {
    JLabel l = new JLabel();
@@ -853,60 +629,54 @@
  /**
   * Commodity method that returns a JTextComponent based on a
   * LabelFieldDescriptor.
   * @param desc the LabelFieldDescriptor describing the JTextField.
   * @param defaultValue the default value used to initialize the
   * JTextComponent.
   * @return a JTextComponent based on a
   * LabelFieldDescriptor.
   *
   * @param desc
   *          the LabelFieldDescriptor describing the JTextField.
   * @param defaultValue
   *          the default value used to initialize the JTextComponent.
   * @return a JTextComponent based on a LabelFieldDescriptor.
   */
  public static JTextComponent makeJTextComponent(LabelFieldDescriptor desc,
      String defaultValue)
  public static JTextComponent makeJTextComponent(LabelFieldDescriptor desc, String defaultValue)
  {
    if (defaultValue == null)
    {
      defaultValue = "";
    }
    JTextComponent field;
    switch (desc.getType())
    {
    case TEXTFIELD:
      field =
          makeJTextField(LocalizableMessage.raw(defaultValue), desc.getTooltip(), desc
              .getSize(), TextStyle.TEXTFIELD);
      break;
      return makeJTextField(
          LocalizableMessage.raw(defaultValue), desc.getTooltip(), desc.getSize(), TextStyle.TEXTFIELD);
    case PASSWORD:
      field =
          makeJPasswordField(LocalizableMessage.raw(defaultValue), desc.getTooltip(), desc
              .getSize(), TextStyle.PASSWORD_FIELD);
      break;
      return makeJPasswordField(
          LocalizableMessage.raw(defaultValue), desc.getTooltip(), desc.getSize(), TextStyle.PASSWORD_FIELD);
    case READ_ONLY:
      field =
          makeTextPane(LocalizableMessage.raw(defaultValue), TextStyle.READ_ONLY);
      break;
      return makeTextPane(LocalizableMessage.raw(defaultValue), TextStyle.READ_ONLY);
    default:
      throw new IllegalArgumentException("Unknown type: " + desc.getType());
    }
    return field;
  }
  /**
   * Creates a JTextField with the given icon, tooltip text, size and text
   * style.
   * @param text the text.
   * @param tooltip the tooltip text.
   * @param size the number of columns of the JTextField.
   * @param style the text style.
   *
   * @param text
   *          the text.
   * @param tooltip
   *          the tooltip text.
   * @param size
   *          the number of columns of the JTextField.
   * @param style
   *          the text style.
   * @return a JTextField with the given icon, tooltip text, size and text
   * style.
   *         style.
   */
  public static JTextField makeJTextField(LocalizableMessage text, LocalizableMessage tooltip,
      int size, TextStyle style)
  public static JTextField makeJTextField(
      LocalizableMessage text, LocalizableMessage tooltip, int size, TextStyle style)
  {
    JTextField f = new JTextField();
    updateTextFieldComponent(f, text, tooltip, size, style);
@@ -917,15 +687,20 @@
  /**
   * Creates a JPasswordField with the given icon, tooltip text, size and text
   * style.
   * @param text the text.
   * @param tooltip the tooltip text.
   * @param size the number of columns of the JPasswordField.
   * @param style the text style.
   *
   * @param text
   *          the text.
   * @param tooltip
   *          the tooltip text.
   * @param size
   *          the number of columns of the JPasswordField.
   * @param style
   *          the text style.
   * @return a JPasswordField with the given icon, tooltip text, size and text
   * style.
   *         style.
   */
  public static JPasswordField makeJPasswordField(LocalizableMessage text, LocalizableMessage tooltip,
      int size, TextStyle style)
  public static JPasswordField makeJPasswordField(
      LocalizableMessage text, LocalizableMessage tooltip, int size, TextStyle style)
  {
    JPasswordField f = new JPasswordField();
    updateTextFieldComponent(f, text, tooltip, size, style);
@@ -934,16 +709,17 @@
  }
  /**
   * Creates a JRadioButton with the given text, tooltip text and text
   * style.
   * @param text the text of the radio button.
   * @param tooltip the tooltip text.
   * @param style the text style.
   * @return a JRadioButton with the given text, tooltip text and text
   * style.
   * Creates a JRadioButton with the given text, tooltip text and text style.
   *
   * @param text
   *          the text of the radio button.
   * @param tooltip
   *          the tooltip text.
   * @param style
   *          the text style.
   * @return a JRadioButton with the given text, tooltip text and text style.
   */
  public static JRadioButton makeJRadioButton(LocalizableMessage text, LocalizableMessage tooltip,
      TextStyle style)
  public static JRadioButton makeJRadioButton(LocalizableMessage text, LocalizableMessage tooltip, TextStyle style)
  {
    JRadioButton rb = new JRadioButton();
    rb.setOpaque(false);
@@ -962,16 +738,17 @@
  }
  /**
   * Creates a JCheckBox with the given text, tooltip text and text
   * style.
   * @param text the text of the radio button.
   * @param tooltip the tooltip text.
   * @param style the text style.
   * @return a JCheckBox with the given text, tooltip text and text
   * style.
   * Creates a JCheckBox with the given text, tooltip text and text style.
   *
   * @param text
   *          the text of the radio button.
   * @param tooltip
   *          the tooltip text.
   * @param style
   *          the text style.
   * @return a JCheckBox with the given text, tooltip text and text style.
   */
  public static JCheckBox makeJCheckBox(LocalizableMessage text, LocalizableMessage tooltip,
      TextStyle style)
  public static JCheckBox makeJCheckBox(LocalizableMessage text, LocalizableMessage tooltip, TextStyle style)
  {
    JCheckBox cb = new JCheckBox();
    cb.setOpaque(false);
@@ -992,20 +769,26 @@
  /**
   * Creates a JList.
   *
   * @param textStyle the style to be used for the renderer.
   * @param textStyle
   *          the style to be used for the renderer.
   * @param <T>
   *          The type of the JList elements
   * @return a JList.
   */
  public static JList makeJList(TextStyle textStyle)
  public static <T> JList<T> makeJList(TextStyle textStyle)
  {
    JList list = new JList();
    final JList<T> list = new JList<T>();
    list.setCellRenderer(makeCellRenderer(textStyle));
    return list;
  }
  /**
   * Sets the specified text style to the component passed as parameter.
   * @param l the component to update.
   * @param style the text style to use.
   *
   * @param l
   *          the component to update.
   * @param style
   *          the text style to use.
   */
  public static void setTextStyle(JComponent l, TextStyle style)
  {
@@ -1097,51 +880,50 @@
  /**
   * Returns the HTML string representing the provided IconType.
   * @param iconType the IconType for which we want the HTML representation.
   *
   * @param iconType
   *          the IconType for which we want the HTML representation.
   * @return the HTML string representing the provided IconType.
   */
  public static String getIconHtml(IconType iconType)
  {
    String url =
        String.valueOf(UIFactory.class.getClassLoader().getResource(
            getIconPath(iconType)));
    String url = String.valueOf(UIFactory.class.getClassLoader().getResource(getIconPath(iconType)));
    LocalizableMessage description = getIconDescription(iconType);
    LocalizableMessage title = getIconTooltip(iconType);
    return "<img src=\"" + url + "\" alt=\"" + description +
    "\" align=\"middle\" title=\"" + title + "\" >";
    return "<img src=\"" + url + "\" alt=\"" + description + "\" align=\"middle\" title=\"" + title + "\" >";
  }
  /**
   * Returns an ImageIcon object for the provided IconType.
   * @param iconType the IconType for which we want to obtain the ImageIcon.
   *
   * @param iconType
   *          the IconType for which we want to obtain the ImageIcon.
   * @return the ImageIcon.
   */
  public static ImageIcon getImageIcon(IconType iconType)
  {
    if (iconType == null) {
    if (iconType == null)
    {
      iconType = IconType.NO_ICON;
    }
    ImageIcon icon = hmIcons.get(iconType);
    if ((icon == null) && (iconType != IconType.NO_ICON))
    if (icon == null && iconType != IconType.NO_ICON)
    {
      String path = getIconPath(iconType);
      LocalizableMessage description = getIconDescription(iconType);
      try
      {
        Image im =
            Toolkit.getDefaultToolkit().createImage(
                UIFactory.class.getClassLoader().getResource(path));
        Image im = Toolkit.getDefaultToolkit().createImage(UIFactory.class.getClassLoader().getResource(path));
        icon = new ImageIcon(im);
        String ds = description != null ? description.toString() : null;
        icon.setDescription(ds);
        hmIcons.put(iconType, icon);
      } catch (Exception ex)
      }
      catch (Exception ex)
      {
        ex.printStackTrace(); // A bug: this should not happen
        throw new IllegalStateException("Could not load icon for path " + path,
            ex);
        throw new IllegalStateException("Could not load icon for path " + path, ex);
      }
    }
@@ -1150,8 +932,10 @@
  /**
   * Returns a JEditorPane that works with the provided scroll.
   *
   * @see ProgressJEditorPane
   * @param scroll the scroll that will contain the JEditorPane.
   * @param scroll
   *          the scroll that will contain the JEditorPane.
   * @return a JEditorPane that works with the provided scroll.
   */
  public static JEditorPane makeProgressPane(JScrollPane scroll)
@@ -1161,11 +945,14 @@
  /**
   * Returns a read only JEditorPane containing the provided text with the
   * provided font.  The JEditorPane will assume that the text is HTML text.
   * @param text the text to be used to initialize the JEditorPane contents.
   * @param font the font to be used.
   * provided font. The JEditorPane will assume that the text is HTML text.
   *
   * @param text
   *          the text to be used to initialize the JEditorPane contents.
   * @param font
   *          the font to be used.
   * @return a read only JEditorPane containing the provided text with the
   * provided font.
   *         provided font.
   */
  public static JEditorPane makeHtmlPane(LocalizableMessage text, Font font)
  {
@@ -1174,18 +961,23 @@
  /**
   * Returns a read only JEditorPane containing the provided text with the
   * provided font.  The JEditorPane will assume that the text is HTML text.
   * @param text the text to be used to initialize the JEditorPane contents.
   * @param ek HTMLEditor kit used for the new HTML pane
   * @param font the font to be used.
   * provided font. The JEditorPane will assume that the text is HTML text.
   *
   * @param text
   *          the text to be used to initialize the JEditorPane contents.
   * @param ek
   *          HTMLEditor kit used for the new HTML pane
   * @param font
   *          the font to be used.
   * @return a read only JEditorPane containing the provided text with the
   * provided font.
   *         provided font.
   */
  public static JEditorPane makeHtmlPane(LocalizableMessage text, HTMLEditorKit ek,
                                         Font font)
  public static JEditorPane makeHtmlPane(LocalizableMessage text, HTMLEditorKit ek, Font font)
  {
    JEditorPane pane = new JEditorPane();
    if (ek != null) pane.setEditorKit(ek);
    if (ek != null) {
        pane.setEditorKit(ek);
    }
    pane.setContentType("text/html");
    String s = text != null ? String.valueOf(text) : null;
    pane.setText(applyFontToHtmlWithDiv(s, font));
@@ -1196,12 +988,15 @@
  /**
   * Returns a read only JEditorPane containing the provided text with the
   * provided TextStyle.  The JEditorPane will assume that the text is plain
   * provided TextStyle. The JEditorPane will assume that the text is plain
   * text.
   * @param text the text to be used to initialize the JEditorPane contents.
   * @param style the TextStyle to be used.
   *
   * @param text
   *          the text to be used to initialize the JEditorPane contents.
   * @param style
   *          the TextStyle to be used.
   * @return a read only JEditorPane containing the provided text with the
   * provided TextStyle.
   *         provided TextStyle.
   */
  public static JEditorPane makeTextPane(LocalizableMessage text, TextStyle style)
  {
@@ -1215,11 +1010,13 @@
  }
  /**
   * Returns a JScrollPane that contains the provided component.  The scroll
   * pane will not contain any border.
   * @param comp the component contained in the scroll pane.
   * @return a JScrollPane that contains the provided component.  The scroll
   * pane will not contain any border.
   * Returns a JScrollPane that contains the provided component. The scroll pane
   * will not contain any border.
   *
   * @param comp
   *          the component contained in the scroll pane.
   * @return a JScrollPane that contains the provided component. The scroll pane
   *         will not contain any border.
   */
  public static JScrollPane createBorderLessScrollBar(Component comp)
  {
@@ -1236,7 +1033,9 @@
  /**
   * Sets the scroll increment unit for the scroll.
   * @param scroll the scroll to be updated.
   *
   * @param scroll
   *          the scroll to be updated.
   */
  public static void setScrollIncrementUnit(JScrollPane scroll)
  {
@@ -1252,6 +1051,7 @@
  /**
   * Return empty insets.
   *
   * @return empty insets.
   */
  public static Insets getEmptyInsets()
@@ -1261,6 +1061,7 @@
  /**
   * Returns the insets to be used for the button panel.
   *
   * @return the insets to be used for the button panel.
   */
  public static Insets getButtonsPanelInsets()
@@ -1270,6 +1071,7 @@
  /**
   * Returns the insets to be used for the steps panel.
   *
   * @return the insets to be used for the steps panel.
   */
  public static Insets getStepsPanelInsets()
@@ -1279,6 +1081,7 @@
  /**
   * Returns the insets to be used for the current step panel.
   *
   * @return the insets to be used for the current step panel.
   */
  public static Insets getCurrentStepPanelInsets()
@@ -1288,58 +1091,58 @@
  /**
   * Returns a String that contains the html passed as parameter with a span
   * applied.  The span style corresponds to the Font specified as parameter.
   * The goal of this method is to be able to specify a font for an HTML string.
   * applied. The span style corresponds to the Font specified as parameter. The
   * goal of this method is to be able to specify a font for an HTML string.
   *
   * @param html the original html text.
   * @param font the font to be used to generate the new HTML.
   * @param html
   *          the original html text.
   * @param font
   *          the font to be used to generate the new HTML.
   * @return a string that represents the original HTML with the font specified
   * as parameter.
   *         as parameter.
   */
  public static String applyFontToHtml(String html, Font font)
  {
    StringBuilder buf = new StringBuilder();
    buf.append("<span style=\"").append(getFontStyle(font)).append("\">")
        .append(html).append(SPAN_CLOSE);
    buf.append("<span style=\"").append(getFontStyle(font)).append("\">").append(html).append(SPAN_CLOSE);
    return buf.toString();
  }
  /**
   * Returns a String that contains the html passed as parameter with a div
   * applied.  The div style corresponds to the Font specified as parameter.
   * The goal of this method is to be able to specify a font for an HTML string.
   * applied. The div style corresponds to the Font specified as parameter. The
   * goal of this method is to be able to specify a font for an HTML string.
   *
   * @param html the original html text.
   * @param font the font to be used to generate the new HTML.
   * @param html
   *          the original html text.
   * @param font
   *          the font to be used to generate the new HTML.
   * @return a string that represents the original HTML with the font specified
   * as parameter.
   *         as parameter.
   */
  public static String applyFontToHtmlWithDiv(String html, Font font)
  {
    StringBuilder buf = new StringBuilder();
    buf.append("<div style=\"").append(getFontStyle(font)).append("\">")
        .append(html).append(DIV_CLOSE);
    buf.append("<div style=\"").append(getFontStyle(font)).append("\">").append(html).append(DIV_CLOSE);
    return buf.toString();
  }
  /**
   * Returns the HTML style representation for the given font.
   * @param font the font for which we want to get an HTML style representation.
   *
   * @param font
   *          the font for which we want to get an HTML style representation.
   * @return the HTML style representation for the given font.
   */
  private static String getFontStyle(Font font)
  {
    StringBuilder buf = new StringBuilder();
    buf.append("font-family:")
        .append(font.getName())
        .append(";font-size:")
        .append(font.getSize())
        .append("pt");
    buf.append("font-family:").append(font.getName()).append(";font-size:").append(font.getSize()).append("pt");
    if (font.isItalic())
    {
@@ -1355,11 +1158,13 @@
  }
  /**
   * Returns the html text passed as parameter with the error background
   * applied to it.
   * @param html the original html.
   * @return the html text passed as parameter with the error background
   * applied to it.
   * Returns the html text passed as parameter with the error background applied
   * to it.
   *
   * @param html
   *          the original html.
   * @return the html text passed as parameter with the error background applied
   *         to it.
   */
  public static String applyErrorBackgroundToHtml(String html)
  {
@@ -1369,55 +1174,67 @@
  /**
   * Returns the html text passed as parameter with the warning background
   * applied to it.
   * @param html the original html.
   *
   * @param html
   *          the original html.
   * @return the html text passed as parameter with the warning background
   * applied to it.
   *         applied to it.
   */
  public static String applyWarningBackgroundToHtml(String html)
  {
    return DIV_OPEN_WARNING_BACKGROUND + html + DIV_CLOSE;
  }
  /**
   * Returns the html text passed as parameter with the success background
   * applied to it.
   * @param html the original html.
   *
   * @param html
   *          the original html.
   * @return the html text passed as parameter with the success background
   * applied to it.
   *         applied to it.
   */
  public static String applySuccessfulBackgroundToHtml(String html)
  {
    return DIV_OPEN_SUCCESSFUL_BACKGROUND + html + DIV_CLOSE;
  }
  /**
   * Returns the html text passed as parameter with some added margin.
   * @param html the original html text.
   * @param top the top margin.
   * @param right the right margin.
   * @param bottom the bottom margin.
   * @param left the left margin.
   *
   * @param html
   *          the original html text.
   * @param top
   *          the top margin.
   * @param right
   *          the right margin.
   * @param bottom
   *          the bottom margin.
   * @param left
   *          the left margin.
   * @return the html text passed as parameter with some added margin.
   */
  public static String applyMargin(String html, int top, int right, int bottom,
      int left)
  public static String applyMargin(String html, int top, int right, int bottom, int left)
  {
    return "<div style=\"margin:" + top + "px " + right + "px " + bottom + "px "
        + left + "px;\">" + html + DIV_CLOSE;
    return "<div style=\"margin:" + top + "px " + right + "px " + bottom + "px " + left + "px;\">" + html + DIV_CLOSE;
  }
  /**
   * Updates the provided field with all the other arguments.
   * @param field the field to be modified.
   * @param text the new text of the field.
   * @param tooltip the new tooltip text of the field.
   * @param size the new size of the field.
   * @param textStyle the new TextStyle of the field.
   *
   * @param field
   *          the field to be modified.
   * @param text
   *          the new text of the field.
   * @param tooltip
   *          the new tooltip text of the field.
   * @param size
   *          the new size of the field.
   * @param textStyle
   *          the new TextStyle of the field.
   */
  private static void updateTextFieldComponent(JTextField field, LocalizableMessage text,
      LocalizableMessage tooltip, int size, TextStyle textStyle)
  private static void updateTextFieldComponent(
      JTextField field, LocalizableMessage text, LocalizableMessage tooltip, int size, TextStyle textStyle)
  {
    field.setColumns(size);
    if (text != null)
@@ -1446,8 +1263,9 @@
  }
  /**
   * Returns the parent package path.  This is used to retrieve the icon
   * Returns the parent package path. This is used to retrieve the icon
   * qualified names.
   *
   * @return the parent package path.
   */
  private static String getParentPackagePath()
@@ -1464,7 +1282,9 @@
  /**
   * Returns the path of the icon for the given IconType.
   * @param iconType the IconType for which we want to get the path.
   *
   * @param iconType
   *          the IconType for which we want to get the path.
   * @return the path of the icon for the given IconType.
   */
  private static String getIconPath(IconType iconType)
@@ -1544,190 +1364,141 @@
  /**
   * Returns the icon description for the given IconType.
   * @param iconType the IconType for which we want to get the description.
   *
   * @param iconType
   *          the IconType for which we want to get the description.
   * @return the icon description for the given IconType.
   */
  private static LocalizableMessage getIconDescription(IconType iconType)
  {
    LocalizableMessage description;
    switch (iconType)
    {
    case CURRENT_STEP:
      description = INFO_CURRENT_STEP_ICON_DESCRIPTION.get();
      break;
      return INFO_CURRENT_STEP_ICON_DESCRIPTION.get();
    case SPLASH:
      description = INFO_SPLASH_ICON_DESCRIPTION.get();
      break;
      return INFO_SPLASH_ICON_DESCRIPTION.get();
    case BACKGROUND:
      description = INFO_BACKGROUND_ICON_DESCRIPTION.get();
      break;
      return INFO_BACKGROUND_ICON_DESCRIPTION.get();
    case MINIMIZED:
      description = INFO_MINIMIZED_ICON_DESCRIPTION.get();
      break;
      return INFO_MINIMIZED_ICON_DESCRIPTION.get();
    case MINIMIZED_MAC:
      description = INFO_MINIMIZED_ICON_DESCRIPTION.get();
      break;
      return INFO_MINIMIZED_ICON_DESCRIPTION.get();
    case WARNING:
      description = INFO_WARNING_ICON_DESCRIPTION.get();
      break;
      return INFO_WARNING_ICON_DESCRIPTION.get();
    case WARNING_LARGE:
      description = INFO_WARNING_ICON_DESCRIPTION.get();
      break;
      return INFO_WARNING_ICON_DESCRIPTION.get();
    case ERROR:
      description = INFO_ERROR_ICON_DESCRIPTION.get();
      break;
      return INFO_ERROR_ICON_DESCRIPTION.get();
    case ERROR_LARGE:
      description = INFO_ERROR_ICON_DESCRIPTION.get();
      break;
      return INFO_ERROR_ICON_DESCRIPTION.get();
    case INFORMATION:
      description = INFO_INFORMATION_ICON_DESCRIPTION.get();
      break;
      return INFO_INFORMATION_ICON_DESCRIPTION.get();
    case INFORMATION_LARGE:
      description = INFO_INFORMATION_ICON_DESCRIPTION.get();
      break;
      return INFO_INFORMATION_ICON_DESCRIPTION.get();
    case SUBSECTION_LEFT:
      description = INFO_SUBSECTION_LEFT_ICON_DESCRIPTION.get();
      break;
      return INFO_SUBSECTION_LEFT_ICON_DESCRIPTION.get();
    case SUBSECTION_RIGHT:
      description = INFO_SUBSECTION_RIGHT_ICON_DESCRIPTION.get();
      break;
      return INFO_SUBSECTION_RIGHT_ICON_DESCRIPTION.get();
    case HELP_SMALL:
      description = INFO_HELP_SMALL_ICON_DESCRIPTION.get();
      break;
      return INFO_HELP_SMALL_ICON_DESCRIPTION.get();
    case WAIT_TINY:
      description = INFO_HELP_WAIT_DESCRIPTION.get();
      break;
      return INFO_HELP_WAIT_DESCRIPTION.get();
    case WAIT:
      description = INFO_HELP_WAIT_DESCRIPTION.get();
      break;
      return INFO_HELP_WAIT_DESCRIPTION.get();
    case NO_ICON:
      description = null;
      break;
      return null;
    default:
      throw new IllegalArgumentException("Unknown iconName: " + iconType);
    }
    return description;
  }
  /**
   * Returns the icon tooltip text for the given IconType.
   * @param iconType the IconType for which we want to get the tooltip text.
   *
   * @param iconType
   *          the IconType for which we want to get the tooltip text.
   * @return the icon tooltip text for the given IconType.
   */
  private static LocalizableMessage getIconTooltip(IconType iconType)
  {
    if (iconType == null) {
    if (iconType == null)
    {
      iconType = IconType.NO_ICON;
    }
    LocalizableMessage tooltip;
    switch (iconType)
    {
    case CURRENT_STEP:
      tooltip = INFO_CURRENT_STEP_ICON_TOOLTIP.get();
      break;
      return INFO_CURRENT_STEP_ICON_TOOLTIP.get();
    case SPLASH:
      tooltip = INFO_SPLASH_ICON_TOOLTIP.get();
      break;
      return INFO_SPLASH_ICON_TOOLTIP.get();
    case BACKGROUND:
      tooltip = INFO_BACKGROUND_ICON_TOOLTIP.get();
      break;
      return INFO_BACKGROUND_ICON_TOOLTIP.get();
    case MINIMIZED:
      tooltip = INFO_MINIMIZED_ICON_TOOLTIP.get();
      break;
      return INFO_MINIMIZED_ICON_TOOLTIP.get();
    case MINIMIZED_MAC:
      tooltip = INFO_MINIMIZED_ICON_TOOLTIP.get();
      break;
      return INFO_MINIMIZED_ICON_TOOLTIP.get();
    case WARNING:
      tooltip = INFO_WARNING_ICON_TOOLTIP.get();
      break;
      return INFO_WARNING_ICON_TOOLTIP.get();
    case WARNING_LARGE:
      tooltip = INFO_WARNING_ICON_TOOLTIP.get();
      break;
      return INFO_WARNING_ICON_TOOLTIP.get();
    case ERROR:
      tooltip = INFO_ERROR_ICON_TOOLTIP.get();
      break;
      return INFO_ERROR_ICON_TOOLTIP.get();
    case ERROR_LARGE:
      tooltip = INFO_ERROR_ICON_TOOLTIP.get();
      break;
      return INFO_ERROR_ICON_TOOLTIP.get();
    case INFORMATION:
      tooltip = INFO_INFORMATION_ICON_TOOLTIP.get();
      break;
      return INFO_INFORMATION_ICON_TOOLTIP.get();
    case INFORMATION_LARGE:
      tooltip = INFO_INFORMATION_ICON_TOOLTIP.get();
      break;
      return INFO_INFORMATION_ICON_TOOLTIP.get();
    case SUBSECTION_LEFT:
      tooltip = null;
      break;
    case SUBSECTION_RIGHT:
      tooltip = null;
      break;
    case HELP_SMALL:
      tooltip = null;
      break;
    case WAIT_TINY:
      tooltip = null;
      break;
    case WAIT:
      tooltip = null;
      break;
    case NO_ICON:
      tooltip = null;
      break;
      return null;
    default:
      throw new IllegalArgumentException("Unknown iconName: " + iconType);
    }
    return tooltip;
  }
  private static ListCellRenderer makeCellRenderer(final TextStyle textStyle)
  private static <T> ListCellRenderer<T> makeCellRenderer(final TextStyle textStyle)
  {
    return new ListCellRenderer()
    return new ListCellRenderer<T>()
    {
      public Component getListCellRendererComponent(JList list,
          Object value,
          int index,
          boolean isSelected,
      @Override
      public Component getListCellRendererComponent(JList<? extends T> list, T value, int index, boolean isSelected,
          boolean cellHasFocus)
      {
        JLabel l =
            makeJLabel(IconType.NO_ICON, LocalizableMessage.raw(value
                .toString()), textStyle);
        final JLabel l = makeJLabel(IconType.NO_ICON, LocalizableMessage.raw(value.toString()), textStyle);
        l.setBorder(new EmptyBorder(TOP_INSET_SECONDARY_FIELD, 0, 0, 0));
        return l;
      }
@@ -1738,32 +1509,33 @@
/**
 * This class has been written to have a better behaviour with the scroll pane
 * than the one we have by default in the case of the progress panel.
 *
 * <p>
 * With the default scroll pane behaviour when we set a new text in a
 * JEditorPane the scroll bar goes systematically up.  With this implementation
 * the expected behaviour is:
 *
 * <p>
 * If the scroll bar is at the bottom we will display the latest text contained
 * in the pane.
 *
 * <p>
 * If the scroll bar is not at the bottom we will keep on displaying the same
 * thing that the user is viewing.
 *
 * <p>
 * This behaviour allows the user to check the log content even when the
 * installation/uninstallation is still running and sending new log messages.
 *
 */
class ProgressJEditorPane extends JEditorPane
{
  private static final long serialVersionUID = 1221976708322628818L;
  private JScrollPane scroll;
  private final JScrollPane scroll;
  private boolean ignoreScrollToVisible;
  /**
   * Constructor for the ProgressJEditorPane.
   * @param scroll the JScrollPane that will contain this editor pane.
   *
   * @param scroll
   *          the JScrollPane that will contain this editor pane.
   */
  public ProgressJEditorPane(JScrollPane scroll)
  {
@@ -1773,29 +1545,26 @@
    setBorder(new EmptyBorder(3, 3, 3, 3));
  }
  /** {@inheritDoc} */
  @Override
  public void setText(String text)
  {
    // Scroll can be null in constructor
    if (scroll != null)
    {
      /* We apply the following policy: if the user is displaying the latest
       * part of the JTextArea we assume that when we add text (s)he wants
       * to see the text that is added, if not we assume that (s)he want to keep
      /*
       * We apply the following policy: if the user is displaying the latest
       * part of the JTextArea we assume that when we add text (s)he wants to
       * see the text that is added, if not we assume that (s)he want to keep
       * viewing what is visible and so we ignore the next scrollRectToVisible
       * call (that will be done inside JTextArea.setText method).
       */
      JScrollBar vBar = scroll.getVerticalScrollBar();
      ignoreScrollToVisible =
          (vBar != null)
              && ((vBar.getValue() + vBar.getVisibleAmount()) < 0.97 * vBar
                  .getMaximum());
          vBar != null && vBar.getValue() + vBar.getVisibleAmount() < 0.97 * vBar.getMaximum();
      super.setText(text);
    }
  }
  /** {@inheritDoc} */
  @Override
  public void scrollRectToVisible(Rectangle rect)
  {
@@ -1808,25 +1577,28 @@
}
/**
 * A class used to be able to select the contents of the text field when
 * it gets the focus.
 *
 * A class used to be able to select the contents of the text field when it gets
 * the focus.
 */
class TextFieldFocusListener implements FocusListener
{
  private JTextField tf;
  private final JTextField tf;
  /**
   * The constructor for this listener.
   * @param tf the text field associated with this listener.
   *
   * @param tf
   *          the text field associated with this listener.
   */
  TextFieldFocusListener(JTextField tf)
  {
    this.tf = tf;
  }
  /** {@inheritDoc} */
  @Override
  public void focusGained(FocusEvent e)
  {
    if ((tf.getText() == null) || "".equals(tf.getText()))
    if (tf.getText() == null || "".equals(tf.getText()))
    {
      tf.setText(" ");
      tf.selectAll();
@@ -1838,7 +1610,7 @@
    }
  }
  /** {@inheritDoc} */
  @Override
  public void focusLost(FocusEvent e)
  {
  }