/*
 * 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 legal-notices/CDDLv1_0.txt
 * or http://forgerock.org/license/CDDLv1.0.html.
 * 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 legal-notices/CDDLv1_0.txt.
 * 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 java.awt.AlphaComposite;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.Box;
import javax.swing.Icon;
import javax.swing.JPanel;

/**
 * This class is the panel that is displayed in the QuickSetupDialog.  It
 * contains 3 panels that are passed in the constructor: the steps panel,
 * the buttons panel and the current step panel (the main panel of the three).
 *
 * The only remarkable thing of this class is that is responsible for
 * implementing the background.  The three subpanels are transparent and
 * this class sets a background (with the Open DS logo) and uses some basic
 * transparency effects.
 *
 */
public class FramePanel extends JPanel
{
  private static final long serialVersionUID = 7733658951410876078L;

  private Icon backgroundIcon;

  private Component stepsPanel;

  private Component buttonsPanel;

  private int buttonsPanelVerticalInsets;

  private int stepsPanelHorizontalInsets;
  /**
   * The constructor of the FramePanel.
   * @param stepsPanel the steps panel that on the top-left side of the
   * QuickSetupDialog.
   * @param currentStepPanel the current step panel (the panel that displays
   * what is associated to the current step).  Is the panel that contains all
   * the input fields and is located on the top-right side of the
   * QuickSetupDialog.
   * @param buttonsPanel the buttons panel that appears on the bottom of the
   * QuickSetupDialog.
   */
  public FramePanel(Component stepsPanel, Component currentStepPanel,
      Component buttonsPanel)
  {
    super(new GridBagLayout());
    setBackground(UIFactory.DEFAULT_BACKGROUND);
    GridBagConstraints gbc = new GridBagConstraints();

    gbc.gridwidth = GridBagConstraints.RELATIVE;
    gbc.weightx = 0.0;
    gbc.weighty = 1.0;
    gbc.anchor = GridBagConstraints.NORTHWEST;
    gbc.fill = GridBagConstraints.VERTICAL;
    gbc.insets = UIFactory.getStepsPanelInsets();
    add(stepsPanel, gbc);

    stepsPanelHorizontalInsets = gbc.insets.left + gbc.insets.right;

    JPanel currentPanelContainer = new JPanel(new GridBagLayout());
    currentPanelContainer.setBorder(UIFactory.CURRENT_STEP_PANEL_BORDER);
    currentPanelContainer
        .setBackground(UIFactory.CURRENT_STEP_PANEL_BACKGROUND);
    currentPanelContainer.setOpaque(false);

    gbc.gridwidth = GridBagConstraints.REMAINDER;
    gbc.weightx = 1.0;
    gbc.weighty = 1.0;
    gbc.anchor = GridBagConstraints.NORTHWEST;
    gbc.fill = GridBagConstraints.BOTH;
    gbc.insets = UIFactory.getCurrentStepPanelInsets();
    currentPanelContainer.add(currentStepPanel, gbc);
    gbc.insets = UIFactory.getEmptyInsets();
    add(currentPanelContainer, gbc);

    gbc.gridwidth = GridBagConstraints.RELATIVE;
    gbc.anchor = GridBagConstraints.WEST;
    gbc.weightx = 0.0;
    gbc.weighty = 0.0;
    add(Box.createHorizontalGlue(), gbc);

    gbc.gridwidth = GridBagConstraints.REMAINDER;
    gbc.weightx = 1.0;
    gbc.weighty = 0.0;
    gbc.anchor = GridBagConstraints.NORTHWEST;
    gbc.fill = GridBagConstraints.HORIZONTAL;
    gbc.insets = UIFactory.getButtonsPanelInsets();
    add(buttonsPanel, gbc);

    buttonsPanelVerticalInsets = gbc.insets.top + gbc.insets.bottom;

    backgroundIcon =
      UIFactory.getImageIcon(UIFactory.IconType.BACKGROUND);

    int backGroundIconWidth = 0;
    int backGroundIconHeight = 0;
    if (backgroundIcon != null)
    {
      backGroundIconWidth = backgroundIcon.getIconWidth();
      backGroundIconHeight = backgroundIcon.getIconHeight();
    }

    this.buttonsPanel = buttonsPanel;
    this.stepsPanel = stepsPanel;
    int width =
        Math.max((int) getPreferredSize().getWidth(), backGroundIconWidth
            + UIFactory.LEFT_INSET_BACKGROUND
            + UIFactory.RIGHT_INSET_BACKGROUND);
    int height =
        Math.max((int) getPreferredSize().getHeight(), backGroundIconHeight
            + UIFactory.TOP_INSET_BACKGROUND
            + UIFactory.BOTTOM_INSET_BACKGROUND);
    setPreferredSize(new Dimension(width, height));
  }

  /**
   * {@inheritDoc}
   *
   * This method has been overwritten to be able to have a transparency effect
   * with the OpenDS logo background.
   */
  protected void paintComponent(Graphics g)
  {
      // paint background
      g.setColor(UIFactory.DEFAULT_BACKGROUND);
      int width = getWidth();
      int height = getHeight();
      int buttonsTotalHeight = buttonsPanel.getHeight()
      + buttonsPanelVerticalInsets;
      int stepsPanelTotalWidth = stepsPanel.getWidth()
      + stepsPanelHorizontalInsets;

      g.fillRect(0, 0, stepsPanelTotalWidth, height);
      g.fillRect(stepsPanelTotalWidth, height - buttonsTotalHeight, width,
              height);
      g.setColor(UIFactory.CURRENT_STEP_PANEL_BACKGROUND);
      g.fillRect(stepsPanelTotalWidth, 0, width, height - buttonsTotalHeight);

      if (backgroundIcon != null)
      {
          // Draw the icon over and over, right aligned.
          // Copy the Graphics object, which is actually
          // a Graphics2D object. Cast it so we can
          // set alpha composite.
          Graphics2D g2d = (Graphics2D) g.create();

          g2d.setComposite(AlphaComposite.getInstance(
                  AlphaComposite.SRC_OVER, 0.1f));

          backgroundIcon.paintIcon(this, g2d,
                  UIFactory.LEFT_INSET_BACKGROUND,
                  UIFactory.TOP_INSET_BACKGROUND);

          g2d.dispose(); //clean up
      }
  }
}
