mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			1016 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			1016 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			Java
		
	
	
	
/* BasicInternalFrameTitlePane.java --
 | 
						|
   Copyright (C) 2004, 2005 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.plaf.basic;
 | 
						|
 | 
						|
import java.awt.Color;
 | 
						|
import java.awt.Component;
 | 
						|
import java.awt.Container;
 | 
						|
import java.awt.Dimension;
 | 
						|
import java.awt.Font;
 | 
						|
import java.awt.FontMetrics;
 | 
						|
import java.awt.Graphics;
 | 
						|
import java.awt.Insets;
 | 
						|
import java.awt.LayoutManager;
 | 
						|
import java.awt.Rectangle;
 | 
						|
import java.awt.event.ActionEvent;
 | 
						|
import java.awt.event.KeyEvent;
 | 
						|
import java.beans.PropertyChangeEvent;
 | 
						|
import java.beans.PropertyChangeListener;
 | 
						|
import java.beans.PropertyVetoException;
 | 
						|
 | 
						|
import javax.swing.AbstractAction;
 | 
						|
import javax.swing.Action;
 | 
						|
import javax.swing.Icon;
 | 
						|
import javax.swing.JButton;
 | 
						|
import javax.swing.JComponent;
 | 
						|
import javax.swing.JInternalFrame;
 | 
						|
import javax.swing.JLabel;
 | 
						|
import javax.swing.JMenu;
 | 
						|
import javax.swing.JMenuBar;
 | 
						|
import javax.swing.JMenuItem;
 | 
						|
import javax.swing.SwingConstants;
 | 
						|
import javax.swing.SwingUtilities;
 | 
						|
import javax.swing.UIManager;
 | 
						|
 | 
						|
/**
 | 
						|
 * This class acts as a titlebar for JInternalFrames.
 | 
						|
 */
 | 
						|
public class BasicInternalFrameTitlePane extends JComponent
 | 
						|
{
 | 
						|
  /**
 | 
						|
   * The Action responsible for closing the JInternalFrame.
 | 
						|
   *
 | 
						|
   * @specnote Apparently this class was intended to be protected,
 | 
						|
   *           but was made public by a compiler bug and is now
 | 
						|
   *           public for compatibility.
 | 
						|
   */
 | 
						|
  public class CloseAction extends AbstractAction
 | 
						|
  {
 | 
						|
    /**
 | 
						|
     * Creates a new action.
 | 
						|
     */
 | 
						|
    public CloseAction()
 | 
						|
    {
 | 
						|
      super("Close");
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * This method is called when something closes the JInternalFrame.
 | 
						|
     *
 | 
						|
     * @param e The ActionEvent.
 | 
						|
     */
 | 
						|
    public void actionPerformed(ActionEvent e)
 | 
						|
    {
 | 
						|
      if (frame.isClosable())
 | 
						|
        {
 | 
						|
          try
 | 
						|
            {
 | 
						|
              frame.setClosed(true);
 | 
						|
            }
 | 
						|
          catch (PropertyVetoException pve)
 | 
						|
            {
 | 
						|
              // We do nothing if the attempt has been vetoed.
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * This Action is responsible for iconifying the JInternalFrame.
 | 
						|
   *
 | 
						|
   * @specnote Apparently this class was intended to be protected,
 | 
						|
   *           but was made public by a compiler bug and is now
 | 
						|
   *           public for compatibility.
 | 
						|
   */
 | 
						|
  public class IconifyAction extends AbstractAction
 | 
						|
  {
 | 
						|
    /**
 | 
						|
     * Creates a new action.
 | 
						|
     */
 | 
						|
    public IconifyAction()
 | 
						|
    {
 | 
						|
      super("Minimize");
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * This method is called when the user wants to iconify the
 | 
						|
     * JInternalFrame.
 | 
						|
     *
 | 
						|
     * @param e The ActionEvent.
 | 
						|
     */
 | 
						|
    public void actionPerformed(ActionEvent e)
 | 
						|
    {
 | 
						|
      if (frame.isIconifiable() && ! frame.isIcon())
 | 
						|
        {
 | 
						|
          try
 | 
						|
            {
 | 
						|
              frame.setIcon(true);
 | 
						|
            }
 | 
						|
          catch (PropertyVetoException pve)
 | 
						|
            {
 | 
						|
              // We do nothing if the attempt has been vetoed.
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * This Action is responsible for maximizing the JInternalFrame.
 | 
						|
   *
 | 
						|
   * @specnote Apparently this class was intended to be protected,
 | 
						|
   *           but was made public by a compiler bug and is now
 | 
						|
   *           public for compatibility.
 | 
						|
   */
 | 
						|
  public class MaximizeAction extends AbstractAction
 | 
						|
  {
 | 
						|
    /**
 | 
						|
     * Creates a new action.
 | 
						|
     */
 | 
						|
    public MaximizeAction()
 | 
						|
    {
 | 
						|
      super("Maximize");
 | 
						|
    }
 | 
						|
    /**
 | 
						|
     * This method is called when the user wants to maximize the
 | 
						|
     * JInternalFrame.
 | 
						|
     *
 | 
						|
     * @param e The ActionEvent.
 | 
						|
     */
 | 
						|
    public void actionPerformed(ActionEvent e)
 | 
						|
    {
 | 
						|
      try
 | 
						|
        {
 | 
						|
          if (frame.isMaximizable() && ! frame.isMaximum())
 | 
						|
            {
 | 
						|
              frame.setMaximum(true);
 | 
						|
              maxButton.setIcon(minIcon);
 | 
						|
            }
 | 
						|
          else if (frame.isMaximum())
 | 
						|
            {
 | 
						|
              frame.setMaximum(false);
 | 
						|
              maxButton.setIcon(maxIcon);
 | 
						|
            }
 | 
						|
        }
 | 
						|
      catch (PropertyVetoException pve)
 | 
						|
        {
 | 
						|
          // We do nothing if the attempt has been vetoed.
 | 
						|
        }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * This Action is responsible for dragging the JInternalFrame.
 | 
						|
   *
 | 
						|
   * @specnote Apparently this class was intended to be protected,
 | 
						|
   *           but was made public by a compiler bug and is now
 | 
						|
   *           public for compatibility.
 | 
						|
   */
 | 
						|
  public class MoveAction extends AbstractAction
 | 
						|
  {
 | 
						|
    /**
 | 
						|
     * Creates a new action.
 | 
						|
     */
 | 
						|
    public MoveAction()
 | 
						|
    {
 | 
						|
      super("Move");
 | 
						|
    }
 | 
						|
    /**
 | 
						|
     * This method is called when the user wants to drag the JInternalFrame.
 | 
						|
     *
 | 
						|
     * @param e The ActionEvent.
 | 
						|
     */
 | 
						|
    public void actionPerformed(ActionEvent e)
 | 
						|
    {
 | 
						|
      // FIXME: Implement keyboard driven? move actions.
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * This Action is responsible for restoring the JInternalFrame. Restoring
 | 
						|
   * the JInternalFrame is the same as setting the maximum property to false.
 | 
						|
   *
 | 
						|
   * @specnote Apparently this class was intended to be protected,
 | 
						|
   *           but was made public by a compiler bug and is now
 | 
						|
   *           public for compatibility.
 | 
						|
   */
 | 
						|
  public class RestoreAction extends AbstractAction
 | 
						|
  {
 | 
						|
    /**
 | 
						|
     * Creates a new action.
 | 
						|
     */
 | 
						|
    public RestoreAction()
 | 
						|
    {
 | 
						|
      super("Restore");
 | 
						|
    }
 | 
						|
    /**
 | 
						|
     * This method is called when the user wants to restore the
 | 
						|
     * JInternalFrame.
 | 
						|
     *
 | 
						|
     * @param e The ActionEvent.
 | 
						|
     */
 | 
						|
    public void actionPerformed(ActionEvent e)
 | 
						|
    {
 | 
						|
      if (frame.isMaximum())
 | 
						|
        {
 | 
						|
          try
 | 
						|
            {
 | 
						|
              frame.setMaximum(false);
 | 
						|
            }
 | 
						|
          catch (PropertyVetoException pve)
 | 
						|
            {
 | 
						|
              // We do nothing if the attempt has been vetoed.
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * This action is responsible for sizing the JInternalFrame.
 | 
						|
   *
 | 
						|
   * @specnote Apparently this class was intended to be protected,
 | 
						|
   *           but was made public by a compiler bug and is now
 | 
						|
   *           public for compatibility.
 | 
						|
   */
 | 
						|
  public class SizeAction extends AbstractAction
 | 
						|
  {
 | 
						|
    /**
 | 
						|
     * Creates a new action.
 | 
						|
     */
 | 
						|
    public SizeAction()
 | 
						|
    {
 | 
						|
      super("Size");
 | 
						|
    }
 | 
						|
    /**
 | 
						|
     * This method is called when the user wants to resize the JInternalFrame.
 | 
						|
     *
 | 
						|
     * @param e The ActionEvent.
 | 
						|
     */
 | 
						|
    public void actionPerformed(ActionEvent e)
 | 
						|
    {
 | 
						|
      // FIXME: Not sure how size actions should be handled.
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * This class is responsible for handling property change events from the
 | 
						|
   * JInternalFrame and adjusting the Title Pane as necessary.
 | 
						|
   *
 | 
						|
   * @specnote Apparently this class was intended to be protected,
 | 
						|
   *           but was made public by a compiler bug and is now
 | 
						|
   *           public for compatibility.
 | 
						|
   */
 | 
						|
  public class PropertyChangeHandler implements PropertyChangeListener
 | 
						|
  {
 | 
						|
    /**
 | 
						|
     * This method is called when a PropertyChangeEvent is received by the
 | 
						|
     * Title Pane.
 | 
						|
     *
 | 
						|
     * @param evt The PropertyChangeEvent.
 | 
						|
     */
 | 
						|
    public void propertyChange(PropertyChangeEvent evt)
 | 
						|
    {
 | 
						|
      String propName = evt.getPropertyName();
 | 
						|
      if (propName.equals("closable"))
 | 
						|
        {
 | 
						|
          if (evt.getNewValue().equals(Boolean.TRUE))
 | 
						|
            closeButton.setVisible(true);
 | 
						|
          else
 | 
						|
            closeButton.setVisible(false);
 | 
						|
        }
 | 
						|
      else if (propName.equals("iconable"))
 | 
						|
        {
 | 
						|
          if (evt.getNewValue().equals(Boolean.TRUE))
 | 
						|
            iconButton.setVisible(true);
 | 
						|
          else
 | 
						|
            iconButton.setVisible(false);
 | 
						|
        }
 | 
						|
      else if (propName.equals("maximizable"))
 | 
						|
        {
 | 
						|
          if (evt.getNewValue().equals(Boolean.TRUE))
 | 
						|
            maxButton.setVisible(true);
 | 
						|
          else
 | 
						|
            maxButton.setVisible(false);
 | 
						|
        }
 | 
						|
      enableActions();
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * This class acts as the MenuBar for the TitlePane. Clicking on the Frame
 | 
						|
   * Icon in the top left corner will activate it.
 | 
						|
   *
 | 
						|
   * @specnote Apparently this class was intended to be protected,
 | 
						|
   *           but was made public by a compiler bug and is now
 | 
						|
   *           public for compatibility.
 | 
						|
   */
 | 
						|
  public class SystemMenuBar extends JMenuBar
 | 
						|
  {
 | 
						|
    /**
 | 
						|
     * This method returns true if it can receive focus.
 | 
						|
     *
 | 
						|
     * @return True if this Component can receive focus.
 | 
						|
     */
 | 
						|
    public boolean isFocusTraversable()
 | 
						|
    {
 | 
						|
      return true;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * This method returns true if this Component is expected to paint all of
 | 
						|
     * itself.
 | 
						|
     *
 | 
						|
     * @return True if this Component is expect to paint all of itself.
 | 
						|
     */
 | 
						|
    public boolean isOpaque()
 | 
						|
    {
 | 
						|
      return true;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * This method paints this Component.
 | 
						|
     *
 | 
						|
     * @param g The Graphics object to paint with.
 | 
						|
     */
 | 
						|
    public void paint(Graphics g)
 | 
						|
    {
 | 
						|
      Icon frameIcon = frame.getFrameIcon();
 | 
						|
      if (frameIcon == null)
 | 
						|
        frameIcon = BasicDesktopIconUI.defaultIcon;
 | 
						|
      frameIcon.paintIcon(this, g, 0, 0);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * This method requests that focus be given to this Component.
 | 
						|
     */
 | 
						|
    public void requestFocus()
 | 
						|
    {
 | 
						|
      super.requestFocus();
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * This class acts as the Layout Manager for the TitlePane.
 | 
						|
   *
 | 
						|
   * @specnote Apparently this class was intended to be protected,
 | 
						|
   *           but was made public by a compiler bug and is now
 | 
						|
   *           public for compatibility.
 | 
						|
   */
 | 
						|
  public class TitlePaneLayout implements LayoutManager
 | 
						|
  {
 | 
						|
    /**
 | 
						|
     * Creates a new <code>TitlePaneLayout</code> object.
 | 
						|
     */
 | 
						|
    public TitlePaneLayout()
 | 
						|
    {
 | 
						|
      // Do nothing.
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * This method is called when adding a Component to the Container.
 | 
						|
     *
 | 
						|
     * @param name The name to reference the added Component by.
 | 
						|
     * @param c The Component to add.
 | 
						|
     */
 | 
						|
    public void addLayoutComponent(String name, Component c)
 | 
						|
    {
 | 
						|
      // Do nothing.
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * This method is called to lay out the children of the Title Pane.
 | 
						|
     *
 | 
						|
     * @param c The Container to lay out.
 | 
						|
     */
 | 
						|
    public void layoutContainer(Container c)
 | 
						|
    {
 | 
						|
      Dimension size = c.getSize();
 | 
						|
      Insets insets = c.getInsets();
 | 
						|
      int width = size.width - insets.left - insets.right;
 | 
						|
      int height = size.height - insets.top - insets.bottom;
 | 
						|
 | 
						|
      // MenuBar is always present and located at the top left corner.
 | 
						|
      Dimension menupref = menuBar.getPreferredSize();
 | 
						|
      menuBar.setBounds(insets.left, insets.top, menupref.width, height);
 | 
						|
 | 
						|
      int loc = width + insets.left - 1;
 | 
						|
      int top = insets.top + 1;
 | 
						|
      int buttonHeight = height - 4;
 | 
						|
      if (closeButton.isVisible())
 | 
						|
        {
 | 
						|
          int buttonWidth = closeIcon.getIconWidth();
 | 
						|
          loc -= buttonWidth + 2;
 | 
						|
          closeButton.setBounds(loc, top, buttonWidth, buttonHeight);
 | 
						|
        }
 | 
						|
 | 
						|
      if (maxButton.isVisible())
 | 
						|
        {
 | 
						|
          int buttonWidth = maxIcon.getIconWidth();
 | 
						|
          loc -= buttonWidth + 2;
 | 
						|
          maxButton.setBounds(loc, top, buttonWidth, buttonHeight);
 | 
						|
        }
 | 
						|
 | 
						|
      if (iconButton.isVisible())
 | 
						|
        {
 | 
						|
          int buttonWidth = iconIcon.getIconWidth();
 | 
						|
          loc -= buttonWidth + 2;
 | 
						|
          iconButton.setBounds(loc, top, buttonWidth, buttonHeight);
 | 
						|
        }
 | 
						|
 | 
						|
      if (title != null)
 | 
						|
        title.setBounds(insets.left + menupref.width, insets.top,
 | 
						|
                        loc - menupref.width - insets.left, height);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * This method returns the minimum size of the given Container given the
 | 
						|
     * children that it has.
 | 
						|
     *
 | 
						|
     * @param c The Container to get a minimum size for.
 | 
						|
     *
 | 
						|
     * @return The minimum size of the Container.
 | 
						|
     */
 | 
						|
    public Dimension minimumLayoutSize(Container c)
 | 
						|
    {
 | 
						|
      return preferredLayoutSize(c);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * This method returns the preferred size of the given Container taking
 | 
						|
     * into account the children that it has.
 | 
						|
     *
 | 
						|
     * @param c The Container to lay out.
 | 
						|
     *
 | 
						|
     * @return The preferred size of the Container.
 | 
						|
     */
 | 
						|
    public Dimension preferredLayoutSize(Container c)
 | 
						|
    {
 | 
						|
      return new Dimension(22, 18);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * This method is called when removing a Component from the Container.
 | 
						|
     *
 | 
						|
     * @param c The Component to remove.
 | 
						|
     */
 | 
						|
    public void removeLayoutComponent(Component c)
 | 
						|
    {
 | 
						|
      // Nothing to do here.
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * This helper class is used to create the minimize, maximize and close
 | 
						|
   * buttons in the top right corner of the Title Pane. These buttons are
 | 
						|
   * special since they cannot be given focus and have no border.
 | 
						|
   */
 | 
						|
  private class PaneButton extends JButton
 | 
						|
  {
 | 
						|
    /**
 | 
						|
     * Creates a new PaneButton object with the given Action.
 | 
						|
     *
 | 
						|
     * @param a The Action that the button uses.
 | 
						|
     */
 | 
						|
    public PaneButton(Action a)
 | 
						|
    {
 | 
						|
      super(a);
 | 
						|
      setMargin(new Insets(0, 0, 0, 0));
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * This method returns true if the Component can be focused.
 | 
						|
     *
 | 
						|
     * @return false.
 | 
						|
     */
 | 
						|
    public boolean isFocusable()
 | 
						|
    {
 | 
						|
      // These buttons cannot be given focus.
 | 
						|
      return false;
 | 
						|
    }
 | 
						|
 | 
						|
  }
 | 
						|
 | 
						|
  /** The action command for the Close action. */
 | 
						|
  protected static final String CLOSE_CMD;
 | 
						|
 | 
						|
  /** The action command for the Minimize action. */
 | 
						|
  protected static final String ICONIFY_CMD;
 | 
						|
 | 
						|
  /** The action command for the Maximize action. */
 | 
						|
  protected static final String MAXIMIZE_CMD;
 | 
						|
 | 
						|
  /** The action command for the Move action. */
 | 
						|
  protected static final String MOVE_CMD;
 | 
						|
 | 
						|
  /** The action command for the Restore action. */
 | 
						|
  protected static final String RESTORE_CMD;
 | 
						|
 | 
						|
  /** The action command for the Size action. */
 | 
						|
  protected static final String SIZE_CMD;
 | 
						|
 | 
						|
  /** The action associated with closing the JInternalFrame. */
 | 
						|
  protected Action closeAction;
 | 
						|
 | 
						|
  /** The action associated with iconifying the JInternalFrame. */
 | 
						|
  protected Action iconifyAction;
 | 
						|
 | 
						|
  /** The action associated with maximizing the JInternalFrame. */
 | 
						|
  protected Action maximizeAction;
 | 
						|
 | 
						|
  /** The action associated with moving the JInternalFrame. */
 | 
						|
  protected Action moveAction;
 | 
						|
 | 
						|
  /** The action associated with restoring the JInternalFrame. */
 | 
						|
  protected Action restoreAction;
 | 
						|
 | 
						|
  /** The action associated with resizing the JInternalFrame. */
 | 
						|
  protected Action sizeAction;
 | 
						|
 | 
						|
  /** The button that closes the JInternalFrame. */
 | 
						|
  protected JButton closeButton;
 | 
						|
 | 
						|
  /** The button that iconifies the JInternalFrame. */
 | 
						|
  protected JButton iconButton;
 | 
						|
 | 
						|
  /** The button that maximizes the JInternalFrame. */
 | 
						|
  protected JButton maxButton;
 | 
						|
 | 
						|
  /** The icon displayed in the restore button. */
 | 
						|
  protected Icon minIcon = BasicIconFactory.createEmptyFrameIcon();
 | 
						|
 | 
						|
  /** The icon displayed in the maximize button. */
 | 
						|
  protected Icon maxIcon = BasicIconFactory.createEmptyFrameIcon();
 | 
						|
 | 
						|
  /** The icon displayed in the iconify button. */
 | 
						|
  protected Icon iconIcon = BasicIconFactory.createEmptyFrameIcon();
 | 
						|
 | 
						|
  /** The icon displayed in the close button. */
 | 
						|
  protected Icon closeIcon;
 | 
						|
 | 
						|
  /** The JInternalFrame that this TitlePane is used in. */
 | 
						|
  protected JInternalFrame frame;
 | 
						|
 | 
						|
  /** The JMenuBar that is located at the top left of the Title Pane. */
 | 
						|
  protected JMenuBar menuBar;
 | 
						|
 | 
						|
  /** The JMenu inside the menuBar. */
 | 
						|
  protected JMenu windowMenu;
 | 
						|
 | 
						|
  /**
 | 
						|
   * The text color of the TitlePane when the JInternalFrame is not selected.
 | 
						|
   */
 | 
						|
  protected Color notSelectedTextColor;
 | 
						|
 | 
						|
  /**
 | 
						|
   * The background color of the TitlePane when the JInternalFrame is not
 | 
						|
   * selected.
 | 
						|
   */
 | 
						|
  protected Color notSelectedTitleColor;
 | 
						|
 | 
						|
  /** The text color of the titlePane when the JInternalFrame is selected. */
 | 
						|
  protected Color selectedTextColor;
 | 
						|
 | 
						|
  /**
 | 
						|
   * The background color of the TitlePane when the JInternalFrame is
 | 
						|
   * selected.
 | 
						|
   */
 | 
						|
  protected Color selectedTitleColor;
 | 
						|
 | 
						|
  /** The Property Change listener that listens to the JInternalFrame. */
 | 
						|
  protected PropertyChangeListener propertyChangeListener;
 | 
						|
 | 
						|
  /**
 | 
						|
   * The label used to display the title. This label is not added to the
 | 
						|
   * TitlePane.
 | 
						|
   * This is package-private to avoid an accessor method.
 | 
						|
   */
 | 
						|
  transient JLabel title;
 | 
						|
 | 
						|
  static
 | 
						|
    {
 | 
						|
      // not constants in JDK
 | 
						|
      CLOSE_CMD = "Close";
 | 
						|
      ICONIFY_CMD = "Minimize";
 | 
						|
      MAXIMIZE_CMD = "Maximize";
 | 
						|
      MOVE_CMD = "Move";
 | 
						|
      RESTORE_CMD = "Restore";
 | 
						|
      SIZE_CMD = "Size";
 | 
						|
    }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Creates a new BasicInternalFrameTitlePane object that is used in the
 | 
						|
   * given JInternalFrame.
 | 
						|
   *
 | 
						|
   * @param f The JInternalFrame this BasicInternalFrameTitlePane will be used
 | 
						|
   *        in.
 | 
						|
   */
 | 
						|
  public BasicInternalFrameTitlePane(JInternalFrame f)
 | 
						|
  {
 | 
						|
    frame = f;
 | 
						|
    setLayout(createLayout());
 | 
						|
    title = new JLabel();
 | 
						|
    title.setHorizontalAlignment(SwingConstants.LEFT);
 | 
						|
    title.setHorizontalTextPosition(SwingConstants.LEFT);
 | 
						|
    title.setOpaque(false);
 | 
						|
    setOpaque(true);
 | 
						|
 | 
						|
    setBackground(Color.LIGHT_GRAY);
 | 
						|
    setOpaque(true);
 | 
						|
 | 
						|
    installTitlePane();
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * This method installs the TitlePane onto the JInternalFrameTitlePane. It
 | 
						|
   * also creates any children components that need to be created and adds
 | 
						|
   * listeners to the appropriate components.
 | 
						|
   */
 | 
						|
  protected void installTitlePane()
 | 
						|
  {
 | 
						|
    installDefaults();
 | 
						|
    installListeners();
 | 
						|
    createActions();
 | 
						|
 | 
						|
    assembleSystemMenu();
 | 
						|
 | 
						|
    createButtons();
 | 
						|
    setButtonIcons();
 | 
						|
    addSubComponents();
 | 
						|
    enableActions();
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * This method adds the sub components to the TitlePane.
 | 
						|
   */
 | 
						|
  protected void addSubComponents()
 | 
						|
  {
 | 
						|
    add(menuBar);
 | 
						|
 | 
						|
    add(closeButton);
 | 
						|
    add(iconButton);
 | 
						|
    add(maxButton);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * This method creates the actions that are used to manipulate the
 | 
						|
   * JInternalFrame.
 | 
						|
   */
 | 
						|
  protected void createActions()
 | 
						|
  {
 | 
						|
    closeAction = new CloseAction();
 | 
						|
    closeAction.putValue(AbstractAction.ACTION_COMMAND_KEY, CLOSE_CMD);
 | 
						|
 | 
						|
    iconifyAction = new IconifyAction();
 | 
						|
    iconifyAction.putValue(AbstractAction.ACTION_COMMAND_KEY, ICONIFY_CMD);
 | 
						|
 | 
						|
    maximizeAction = new MaximizeAction();
 | 
						|
    maximizeAction.putValue(AbstractAction.ACTION_COMMAND_KEY, MAXIMIZE_CMD);
 | 
						|
 | 
						|
    sizeAction = new SizeAction();
 | 
						|
    sizeAction.putValue(AbstractAction.ACTION_COMMAND_KEY, SIZE_CMD);
 | 
						|
 | 
						|
    restoreAction = new RestoreAction();
 | 
						|
    restoreAction.putValue(AbstractAction.ACTION_COMMAND_KEY, RESTORE_CMD);
 | 
						|
 | 
						|
    moveAction = new MoveAction();
 | 
						|
    moveAction.putValue(AbstractAction.ACTION_COMMAND_KEY, MOVE_CMD);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * This method is used to install the listeners.
 | 
						|
   */
 | 
						|
  protected void installListeners()
 | 
						|
  {
 | 
						|
    propertyChangeListener = createPropertyChangeListener();
 | 
						|
    frame.addPropertyChangeListener(propertyChangeListener);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * This method is used to uninstall the listeners.
 | 
						|
   */
 | 
						|
  protected void uninstallListeners()
 | 
						|
  {
 | 
						|
    frame.removePropertyChangeListener(propertyChangeListener);
 | 
						|
    propertyChangeListener = null;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * This method installs the defaults determined by the look and feel.
 | 
						|
   */
 | 
						|
  protected void installDefaults()
 | 
						|
  {
 | 
						|
    title.setFont(UIManager.getFont("InternalFrame.titleFont"));
 | 
						|
    selectedTextColor = UIManager.getColor("InternalFrame.activeTitleForeground");
 | 
						|
    selectedTitleColor = UIManager.getColor("InternalFrame.activeTitleBackground");
 | 
						|
    notSelectedTextColor = UIManager.getColor("InternalFrame.inactiveTitleForeground");
 | 
						|
    notSelectedTitleColor = UIManager.getColor("InternalFrame.inactiveTitleBackground");
 | 
						|
 | 
						|
    closeIcon = UIManager.getIcon("InternalFrame.closeIcon");
 | 
						|
    iconIcon = UIManager.getIcon("InternalFrame.iconifyIcon");
 | 
						|
    maxIcon = UIManager.getIcon("InternalFrame.maximizeIcon");
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * This method uninstalls the defaults.
 | 
						|
   */
 | 
						|
  protected void uninstallDefaults()
 | 
						|
  {
 | 
						|
    setFont(null);
 | 
						|
    selectedTextColor = null;
 | 
						|
    selectedTitleColor = null;
 | 
						|
    notSelectedTextColor = null;
 | 
						|
    notSelectedTitleColor = null;
 | 
						|
 | 
						|
    closeIcon = null;
 | 
						|
    iconIcon = null;
 | 
						|
    maxIcon = null;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * This method creates the buttons used in the TitlePane.
 | 
						|
   */
 | 
						|
  protected void createButtons()
 | 
						|
  {
 | 
						|
    closeButton = new PaneButton(closeAction);
 | 
						|
    closeButton.setText(null);
 | 
						|
    if (!frame.isClosable())
 | 
						|
      closeButton.setVisible(false);
 | 
						|
    iconButton = new PaneButton(iconifyAction);
 | 
						|
    iconButton.setText(null);
 | 
						|
    if (!frame.isIconifiable())
 | 
						|
      iconButton.setVisible(false);
 | 
						|
    maxButton = new PaneButton(maximizeAction);
 | 
						|
    maxButton.setText(null);
 | 
						|
    if (!frame.isMaximizable())
 | 
						|
      maxButton.setVisible(false);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Set icons for the minimize-, maximize- and close-buttons.
 | 
						|
   */
 | 
						|
  protected void setButtonIcons()
 | 
						|
  {
 | 
						|
    if (closeIcon != null && closeButton != null)
 | 
						|
      closeButton.setIcon(closeIcon);
 | 
						|
    if (iconIcon != null && iconButton != null)
 | 
						|
      iconButton.setIcon(iconIcon);
 | 
						|
    if (maxIcon != null && maxButton != null)
 | 
						|
      maxButton.setIcon(maxIcon);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * This method creates the MenuBar used in the TitlePane.
 | 
						|
   */
 | 
						|
  protected void assembleSystemMenu()
 | 
						|
  {
 | 
						|
    menuBar = createSystemMenuBar();
 | 
						|
    windowMenu = createSystemMenu();
 | 
						|
 | 
						|
    menuBar.add(windowMenu);
 | 
						|
 | 
						|
    addSystemMenuItems(windowMenu);
 | 
						|
    enableActions();
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * This method adds the MenuItems to the given JMenu.
 | 
						|
   *
 | 
						|
   * @param systemMenu The JMenu to add MenuItems to.
 | 
						|
   */
 | 
						|
  protected void addSystemMenuItems(JMenu systemMenu)
 | 
						|
  {
 | 
						|
    JMenuItem tmp;
 | 
						|
 | 
						|
    tmp = new JMenuItem(RESTORE_CMD);
 | 
						|
    tmp.addActionListener(restoreAction);
 | 
						|
    tmp.setMnemonic(KeyEvent.VK_R);
 | 
						|
    systemMenu.add(tmp);
 | 
						|
 | 
						|
    tmp = new JMenuItem(MOVE_CMD);
 | 
						|
    tmp.addActionListener(moveAction);
 | 
						|
    tmp.setMnemonic(KeyEvent.VK_M);
 | 
						|
    systemMenu.add(tmp);
 | 
						|
 | 
						|
    tmp = new JMenuItem(SIZE_CMD);
 | 
						|
    tmp.addActionListener(sizeAction);
 | 
						|
    tmp.setMnemonic(KeyEvent.VK_S);
 | 
						|
    systemMenu.add(tmp);
 | 
						|
 | 
						|
    tmp = new JMenuItem(ICONIFY_CMD);
 | 
						|
    tmp.addActionListener(iconifyAction);
 | 
						|
    tmp.setMnemonic(KeyEvent.VK_N);
 | 
						|
    systemMenu.add(tmp);
 | 
						|
 | 
						|
    tmp = new JMenuItem(MAXIMIZE_CMD);
 | 
						|
    tmp.addActionListener(maximizeAction);
 | 
						|
    tmp.setMnemonic(KeyEvent.VK_X);
 | 
						|
    systemMenu.add(tmp);
 | 
						|
 | 
						|
    systemMenu.addSeparator();
 | 
						|
 | 
						|
    tmp = new JMenuItem(CLOSE_CMD);
 | 
						|
    tmp.addActionListener(closeAction);
 | 
						|
    tmp.setMnemonic(KeyEvent.VK_C);
 | 
						|
    systemMenu.add(tmp);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * This method creates a new JMenubar.
 | 
						|
   *
 | 
						|
   * @return A new JMenuBar.
 | 
						|
   */
 | 
						|
  protected JMenuBar createSystemMenuBar()
 | 
						|
  {
 | 
						|
    if (menuBar == null)
 | 
						|
      menuBar = new SystemMenuBar();
 | 
						|
    menuBar.removeAll();
 | 
						|
    return menuBar;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * This method creates a new JMenu.
 | 
						|
   *
 | 
						|
   * @return A new JMenu.
 | 
						|
   */
 | 
						|
  protected JMenu createSystemMenu()
 | 
						|
  {
 | 
						|
    if (windowMenu == null)
 | 
						|
      windowMenu = new JMenu();
 | 
						|
    windowMenu.removeAll();
 | 
						|
    return windowMenu;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * This method programmatically shows the JMenu.
 | 
						|
   */
 | 
						|
  protected void showSystemMenu()
 | 
						|
  {
 | 
						|
    // FIXME: Untested as KeyEvents are not hooked up.
 | 
						|
    menuBar.getMenu(1).getPopupMenu().show();
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * This method paints the TitlePane.
 | 
						|
   *
 | 
						|
   * @param g The Graphics object to paint with.
 | 
						|
   */
 | 
						|
  public void paintComponent(Graphics g)
 | 
						|
  {
 | 
						|
    paintTitleBackground(g);
 | 
						|
    if (frame.getTitle() != null && title != null)
 | 
						|
      {
 | 
						|
        Color saved = g.getColor();
 | 
						|
        Font f = title.getFont();
 | 
						|
        g.setFont(f);
 | 
						|
        FontMetrics fm = g.getFontMetrics(f);
 | 
						|
        if (frame.isSelected())
 | 
						|
          g.setColor(selectedTextColor);
 | 
						|
        else
 | 
						|
          g.setColor(notSelectedTextColor);
 | 
						|
        title.setText(getTitle(frame.getTitle(), fm, title.getBounds().width));
 | 
						|
        SwingUtilities.paintComponent(g, title, null, title.getBounds());
 | 
						|
        g.setColor(saved);
 | 
						|
      }
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * This method paints the TitlePane's background.
 | 
						|
   *
 | 
						|
   * @param g The Graphics object to paint with.
 | 
						|
   */
 | 
						|
  protected void paintTitleBackground(Graphics g)
 | 
						|
  {
 | 
						|
    if (!isOpaque())
 | 
						|
      return;
 | 
						|
 | 
						|
    Color saved = g.getColor();
 | 
						|
    Dimension dims = getSize();
 | 
						|
 | 
						|
    Color bg = getBackground();
 | 
						|
    if (frame.isSelected())
 | 
						|
      bg = selectedTitleColor;
 | 
						|
    else
 | 
						|
      bg = notSelectedTitleColor;
 | 
						|
    g.setColor(bg);
 | 
						|
    g.fillRect(0, 0, dims.width, dims.height);
 | 
						|
    g.setColor(saved);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * This method returns the title string based on the available width and the
 | 
						|
   * font metrics.
 | 
						|
   *
 | 
						|
   * @param text The desired title.
 | 
						|
   * @param fm The FontMetrics of the font used.
 | 
						|
   * @param availableWidth The available width.
 | 
						|
   *
 | 
						|
   * @return The allowable string.
 | 
						|
   */
 | 
						|
  protected String getTitle(String text, FontMetrics fm, int availableWidth)
 | 
						|
  {
 | 
						|
    Rectangle vr = new Rectangle(0, 0, availableWidth, fm.getHeight());
 | 
						|
    Rectangle ir = new Rectangle();
 | 
						|
    Rectangle tr = new Rectangle();
 | 
						|
    String value = SwingUtilities.layoutCompoundLabel(this, fm, text, null,
 | 
						|
                                                      SwingConstants.CENTER,
 | 
						|
                                                      SwingConstants.LEFT,
 | 
						|
                                                      SwingConstants.CENTER,
 | 
						|
                                                      SwingConstants.LEFT, vr,
 | 
						|
                                                      ir, tr, 0);
 | 
						|
    return value;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * This method fires something similar to a WINDOW_CLOSING event.
 | 
						|
   *
 | 
						|
   * @param frame The JInternalFrame that is being closed.
 | 
						|
   */
 | 
						|
  protected void postClosingEvent(JInternalFrame frame)
 | 
						|
  {
 | 
						|
    // FIXME: Implement postClosingEvent when I figure out what
 | 
						|
    // it's supposed to do.
 | 
						|
    // It says that this fires an WINDOW_CLOSING like event.
 | 
						|
    // So the closest thing is some kind of InternalFrameEvent.
 | 
						|
    // But none is fired.
 | 
						|
    // Can't see it called or anything.
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * This method enables the actions for the TitlePane given the frame's
 | 
						|
   * properties.
 | 
						|
   */
 | 
						|
  protected void enableActions()
 | 
						|
  {
 | 
						|
    closeAction.setEnabled(frame.isClosable());
 | 
						|
 | 
						|
    iconifyAction.setEnabled(frame.isIconifiable());
 | 
						|
    // The maximize action is responsible for restoring it
 | 
						|
    // as well, if clicked from the button
 | 
						|
    maximizeAction.setEnabled(frame.isMaximizable());
 | 
						|
 | 
						|
    // The restoring action is only active when selected
 | 
						|
    // from the menu.
 | 
						|
    restoreAction.setEnabled(frame.isMaximum());
 | 
						|
 | 
						|
    sizeAction.setEnabled(frame.isResizable());
 | 
						|
 | 
						|
    // FIXME: Tie MoveAction enabled status to a variable.
 | 
						|
    moveAction.setEnabled(false);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * This method creates a new PropertyChangeListener.
 | 
						|
   *
 | 
						|
   * @return A new PropertyChangeListener.
 | 
						|
   */
 | 
						|
  protected PropertyChangeListener createPropertyChangeListener()
 | 
						|
  {
 | 
						|
    return new PropertyChangeHandler();
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * This method creates a new LayoutManager for the TitlePane.
 | 
						|
   *
 | 
						|
   * @return A new LayoutManager.
 | 
						|
   */
 | 
						|
  protected LayoutManager createLayout()
 | 
						|
  {
 | 
						|
    return new TitlePaneLayout();
 | 
						|
  }
 | 
						|
}
 |