/* JRootPane.java --
   Copyright (C) 2002, 2004  Free Software Foundation, Inc.

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */


package javax.swing;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.IllegalComponentStateException;
import java.awt.Insets;
import java.awt.LayoutManager;
import java.awt.LayoutManager2;
import java.awt.Rectangle;
import java.io.Serializable;

import javax.accessibility.Accessible;
import javax.accessibility.AccessibleContext;
import javax.accessibility.AccessibleRole;
import javax.swing.plaf.RootPaneUI;

/**
 * This class is where JComponents are added to. Unlike awt where you could
 * just say frame.add(), with swing you need to say frame.getRootPane()
 * (which delivers an instance of this class) and add your components to
 * that. It is implemented by several 'layers' (pane() should be read as
 * plane()) each on top of the others where you can add components to.
 * (getContentPane(), getGlassPane(), getLayeredPane())
 *
 * @author Ronald Veldema (rveldema@cs.vu.nl)
 */
public class JRootPane extends JComponent implements Accessible
{
  //  The class used to obtain the accessible role for this object.
  protected class AccessibleJRootPane extends AccessibleJComponent
  {
    /**
     * For compatability with Sun's JDK
     */
    private static final long serialVersionUID = 1082432482784468088L;

    /**
     * Creates a new <code>AccessibleJRootPane</code> object.
     */
    protected AccessibleJRootPane()
    {
      // Nothing to do here.
    }

    /**
     * DOCUMENT ME!
     *
     * @return DOCUMENT ME!
     */
    public AccessibleRole getAccessibleRole()
    {
      return AccessibleRole.ROOT_PANE;
    }
  }

  // Custom Layout Manager for JRootPane. It positions contentPane and
  // menuBar withing its layeredPane.
  protected class RootLayout implements LayoutManager2, Serializable
  {
    /** DOCUMENT ME! */
    private static final long serialVersionUID = -4100116998559815027L;

    /**
     * The cached layout info for the glass pane.
     */
    private Rectangle glassPaneBounds;

    /**
     * The cached layout info for the layered pane.
     */
    private Rectangle layeredPaneBounds;

    /**
     * The cached layout info for the content pane.
     */
    private Rectangle contentPaneBounds;

    /**
     * The cached layout info for the menu bar.
     */
    private Rectangle menuBarBounds;

    /**
     * Creates a new <code>RootLayout</code> object.
     */
    protected RootLayout()
    {
      // Nothing to do here.
    }

    /**
     * DOCUMENT ME!
     *
     * @param comp DOCUMENT ME!
     * @param constraints DOCUMENT ME!
     */
    public void addLayoutComponent(Component comp, Object constraints)
    {
      // Nothing to do here.
    }

    /**
     * DOCUMENT ME!
     *
     * @param name DOCUMENT ME!
     * @param comp DOCUMENT ME!
     */
    public void addLayoutComponent(String name, Component comp)
    {
      // Nothing to do here.
    }

    /**
     * DOCUMENT ME!
     *
     * @param target DOCUMENT ME!
     *
     * @return DOCUMENT ME!
     */
    public float getLayoutAlignmentX(Container target)
    {
      return 0.0F;
    }

    /**
     * DOCUMENT ME!
     *
     * @param target DOCUMENT ME!
     *
     * @return DOCUMENT ME!
     */
    public float getLayoutAlignmentY(Container target)
    {
      return 0.0F;
    }

    /**
     * DOCUMENT ME!
     *
     * @param target DOCUMENT ME!
     */
    public void invalidateLayout(Container target)
    {
      synchronized (this)
        {
          glassPaneBounds = null;
          layeredPaneBounds = null;
          contentPaneBounds = null;
          menuBarBounds = null;
        }
    }

    /**
     * DOCUMENT ME!
     *
     * @param c DOCUMENT ME!
     */
    public void layoutContainer(Container c)
    {
      if (glassPaneBounds == null || layeredPaneBounds == null
          || contentPaneBounds == null || menuBarBounds == null)
        {
          Insets i = getInsets();
          int containerWidth = c.getBounds().width - i.left - i.right;
          int containerHeight = c.getBounds().height - i.top - i.bottom;

          // 1. the glassPane fills entire viewable region (bounds - insets).
          // 2. the layeredPane filles entire viewable region.
          // 3. the menuBar is positioned at the upper edge of layeredPane.
          // 4. the contentPane fills viewable region minus menuBar, if present.


          // +-------------------------------+
          // |  JLayeredPane                 |
          // |  +--------------------------+ |
          // |  | menuBar                  | |
          // |  +--------------------------+ |
          // |  +--------------------------+ |
          // |  |contentPane               | |
          // |  |                          | |
          // |  |                          | |
          // |  |                          | |
          // |  +--------------------------+ |
          // +-------------------------------+

          if (menuBar != null)
            {
              Dimension menuBarSize = menuBar.getPreferredSize();
              if (menuBarSize.height > containerHeight)
                menuBarSize.height = containerHeight;
              menuBarBounds = new Rectangle(0, 0, containerWidth,
                                            menuBarSize.height);
              contentPaneBounds = new Rectangle(0, menuBarSize.height,
                                                containerWidth,
                                         containerHeight - menuBarSize.height);
            }
          else
            contentPaneBounds = new Rectangle(0, 0, containerWidth,
                                              containerHeight);

          glassPaneBounds = new Rectangle(i.left, i.top, containerWidth, containerHeight);
          layeredPaneBounds = new Rectangle(i.left, i.top, containerWidth, containerHeight);
        }

      glassPane.setBounds(glassPaneBounds);
      layeredPane.setBounds(layeredPaneBounds);
      if (menuBar != null)
        menuBar.setBounds(menuBarBounds);
      getContentPane().setBounds(contentPaneBounds);
    }

    /**
     * DOCUMENT ME!
     *
     * @param target DOCUMENT ME!
     *
     * @return DOCUMENT ME!
     */
    public Dimension maximumLayoutSize(Container target)
    {
      return preferredLayoutSize(target);
    }

    /**
     * DOCUMENT ME!
     *
     * @param target DOCUMENT ME!
     *
     * @return DOCUMENT ME!
     */
    public Dimension minimumLayoutSize(Container target)
    {
      return preferredLayoutSize(target);
    }

    /**
     * DOCUMENT ME!
     *
     * @param c DOCUMENT ME!
     *
     * @return DOCUMENT ME!
     */
    public Dimension preferredLayoutSize(Container c)
    {
      Dimension prefSize = new Dimension();
      Insets i = getInsets();
      prefSize = new Dimension(i.left + i.right, i.top + i.bottom);
      Dimension contentPrefSize = getContentPane().getPreferredSize();
      prefSize.width += contentPrefSize.width;
      prefSize.height += contentPrefSize.height;
      if (menuBar != null)
        {
          Dimension menuBarSize = menuBar.getPreferredSize();
          if (menuBarSize.width > contentPrefSize.width)
            prefSize.width += menuBarSize.width - contentPrefSize.width;
          prefSize.height += menuBarSize.height;
        }
      return prefSize;
    }

    /**
     * DOCUMENT ME!
     *
     * @param comp DOCUMENT ME!
     */
    public void removeLayoutComponent(Component comp)
    {
      // Nothing to do here.
    }
  }

  /** DOCUMENT ME! */
  private static final long serialVersionUID = 8690748000348575668L;

  public static final int NONE = 0;
  public static final int FRAME = 1;
  public static final int PLAIN_DIALOG = 2;
  public static final int INFORMATION_DIALOG = 3;
  public static final int ERROR_DIALOG = 4;
  public static final int COLOR_CHOOSER_DIALOG = 5;
  public static final int FILE_CHOOSER_DIALOG = 6;
  public static final int QUESTION_DIALOG = 7;
  public static final int WARNING_DIALOG = 8;

  /** DOCUMENT ME! */
  protected Component glassPane;

  /** DOCUMENT ME! */
  protected JLayeredPane layeredPane;

  /** DOCUMENT ME! */
  protected JMenuBar menuBar;

  /** DOCUMENT ME! */
  protected Container contentPane;

  protected JButton defaultButton;

  /**
   * This field is unused since JDK1.3. To override the default action you
   * should modify the JRootPane's ActionMap.
   *
   * @deprecated since JDK1.3
   *
   * @specnote the specs indicate that the type of this field is
   *           a package private inner class
   *           javax.swing.JRootPane.DefaultAction. I assume that the closest
   *           public superclass is javax.swing.Action.
   */
  protected Action defaultPressAction;

  /**
   * This field is unused since JDK1.3. To override the default action you
   * should modify the JRootPane's ActionMap.
   *
   * @deprecated since JDK1.3
   *
   * @specnote the specs indicate that the type of this field is
   *           a package private inner class
   *           javax.swing.JRootPane.DefaultAction. I assume that the closest
   *           public superclass is javax.swing.Action.
   */
  protected Action defaultReleaseAction;

  /**
   * @since 1.4
   */
  private int windowDecorationStyle = NONE;

  /**
   * DOCUMENT ME!
   *
   * @param m DOCUMENT ME!
   */
  public void setJMenuBar(JMenuBar m)
  {
    JLayeredPane jlPane = getLayeredPane();
    if (menuBar != null)
      jlPane.remove(menuBar);
    menuBar = m;
    if (menuBar != null)
      jlPane.add(menuBar, JLayeredPane.FRAME_CONTENT_LAYER);
  }

  /**
   * @deprecated Replaced by <code>setJMenuBar()</code>
   */
  public void setMenuBar(JMenuBar m)
  {
    setJMenuBar(m);
  }

  /**
   * DOCUMENT ME!
   *
   * @return DOCUMENT ME!
   */
  public JMenuBar getJMenuBar()
  {
    return menuBar;
  }

  /**
   * @deprecated Replaced by <code>getJMenuBar()</code>
   */
  public JMenuBar getMenuBar()
  {
    return getJMenuBar();
  }

  /**
   * DOCUMENT ME!
   *
   * @return DOCUMENT ME!
   */
  public boolean isValidateRoot()
  {
    return true;
  }

  /**
   * DOCUMENT ME!
   *
   * @return DOCUMENT ME!
   */
  public Container getContentPane()
  {
    if (contentPane == null)
      setContentPane(createContentPane());
    return contentPane;
  }

  /**
   * Sets the JRootPane's content pane.  The content pane should typically be
   * opaque for painting to work properly.  This method also
   * removes the old content pane from the layered pane.
   *
   * @param p the Container that will be the content pane
   * @throws IllegalComponentStateException if p is null
   */
  public void setContentPane(Container p)
  {
    if (p == null)
      throw new IllegalComponentStateException ("cannot " +
            "have a null content pane");
    else
      {
        if (contentPane != null && contentPane.getParent() == layeredPane)
          layeredPane.remove(contentPane);
        contentPane = p;
        getLayeredPane().add(contentPane, JLayeredPane.FRAME_CONTENT_LAYER);
      }
  }

  /**
   * DOCUMENT ME!
   *
   * @param comp DOCUMENT ME!
   * @param constraints DOCUMENT ME!
   * @param index DOCUMENT ME!
   */
  protected void addImpl(Component comp, Object constraints, int index)
  {
    super.addImpl(comp, constraints, index);
  }

  /**
   * DOCUMENT ME!
   *
   * @return DOCUMENT ME!
   */
  public Component getGlassPane()
  {
    if (glassPane == null)
      setGlassPane(createGlassPane());
    return glassPane;
  }

  /**
   * DOCUMENT ME!
   *
   * @param f DOCUMENT ME!
   */
  public void setGlassPane(Component f)
  {
    if (glassPane != null)
      remove(glassPane);

    glassPane = f;

    glassPane.setVisible(false);
    add(glassPane, 0);
  }

  /**
   * DOCUMENT ME!
   *
   * @return DOCUMENT ME!
   */
  public JLayeredPane getLayeredPane()
  {
    if (layeredPane == null)
      setLayeredPane(createLayeredPane());
    return layeredPane;
  }

  /**
   * Set the layered pane for the root pane.
   *
   * @param f The JLayeredPane to be used.
   *
   * @throws IllegalComponentStateException if JLayeredPane
   * parameter is null.
   */
  public void setLayeredPane(JLayeredPane f)
  {
    if (f == null)
      throw new IllegalComponentStateException();

    if (layeredPane != null)
      remove(layeredPane);

    layeredPane = f;
    add(f, -1);
  }

  /**
   * Creates a new <code>JRootPane</code> object.
   */
  public JRootPane()
  {
    setLayout(createRootLayout());
    getGlassPane();
    getLayeredPane();
    getContentPane();
    setOpaque(true);
    updateUI();
  }

  /**
   * DOCUMENT ME!
   *
   * @return DOCUMENT ME!
   */
  protected LayoutManager createRootLayout()
  {
    return new RootLayout();
  }

  /**
   * DOCUMENT ME!
   *
   * @return DOCUMENT ME!
   */
  protected Container createContentPane()
  {
    JPanel p = new JPanel();
    p.setName(this.getName() + ".contentPane");
    p.setLayout(new BorderLayout());
    return p;
  }

  /**
   * DOCUMENT ME!
   *
   * @return DOCUMENT ME!
   */
  protected Component createGlassPane()
  {
    JPanel p = new JPanel();
    p.setName(this.getName() + ".glassPane");
    p.setVisible(false);
    p.setOpaque(false);
    return p;
  }

  /**
   * DOCUMENT ME!
   *
   * @return DOCUMENT ME!
   */
  protected JLayeredPane createLayeredPane()
  {
    JLayeredPane l = new JLayeredPane();
    l.setLayout(null);
    return l;
  }

  /**
   * DOCUMENT ME!
   *
   * @return DOCUMENT ME!
   */
  public RootPaneUI getUI()
  {
    return (RootPaneUI) ui;
  }

  /**
   * DOCUMENT ME!
   *
   * @param ui DOCUMENT ME!
   */
  public void setUI(RootPaneUI ui)
  {
    super.setUI(ui);
  }

  /**
   * DOCUMENT ME!
   */
  public void updateUI()
  {
    setUI((RootPaneUI) UIManager.getUI(this));
  }

  /**
   * DOCUMENT ME!
   *
   * @return DOCUMENT ME!
   */
  public String getUIClassID()
  {
    return "RootPaneUI";
  }

  public JButton getDefaultButton()
  {
    return defaultButton;
  }

  public void setDefaultButton(JButton newButton)
  {
    // We only change the default button if the new button is defaultCapable
    // or null and the old and new button are different objects.
    if (defaultButton != newButton
        && (newButton == null || newButton.isDefaultCapable()))
      {
        JButton oldButton = defaultButton;
        defaultButton = newButton;
        firePropertyChange("defaultButton", oldButton, newButton);
      }
  }

  /**
   * @since 1.4
   */
  public int getWindowDecorationStyle()
  {
    return windowDecorationStyle;
  }

  /**
   * @since 1.4
   */
  public void setWindowDecorationStyle(int style)
  {
    if (style != NONE
        && style != FRAME
        && style != INFORMATION_DIALOG
        && style != ERROR_DIALOG
        && style != COLOR_CHOOSER_DIALOG
        && style != FILE_CHOOSER_DIALOG
        && style != QUESTION_DIALOG
        && style != WARNING_DIALOG
        && style != PLAIN_DIALOG)
      throw new IllegalArgumentException("invalid style");

    int oldStyle = windowDecorationStyle;
    windowDecorationStyle = style;
    firePropertyChange("windowDecorationStyle", oldStyle, style);
  }

  /**
   * This returns <code>true</code> if the <code>glassPane</code> is not
   * visible because then the root pane can guarantee to tile its children
   * (the only other direct child is a JLayeredPane which must figure its
   * <code>optimizeDrawingEnabled</code> state on its own).
   *
   * @return <code>true</code> if the <code>glassPane</code> is not
   *         visible
   */
  public boolean isOptimizedDrawingEnable()
  {
    return ! glassPane.isVisible();
  }

  /**
   * Returns the accessible context for this JRootPane. This will be
   * an instance of {@link AccessibleJRootPane}.
   *
   * @return the accessible context for this JRootPane
   */
  public AccessibleContext getAccessibleContext()
  {
    if (accessibleContext == null)
      accessibleContext = new AccessibleJRootPane();
    return accessibleContext;
  }
}
