- /*
- * @(#)SynthInternalFrameTitlePane.java 1.21 04/04/16
- *
- * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
- * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
- */
-
- package javax.swing.plaf.synth;
-
- import java.awt.*;
- import java.awt.event.*;
- import javax.swing.*;
- import javax.swing.plaf.*;
- import javax.swing.plaf.basic.BasicInternalFrameTitlePane;
- import javax.swing.border.*;
- import javax.swing.event.InternalFrameEvent;
- import java.util.EventListener;
- import java.beans.PropertyChangeListener;
- import java.beans.PropertyChangeEvent;
- import java.beans.VetoableChangeListener;
- import java.beans.PropertyVetoException;
- import sun.swing.plaf.synth.SynthUI;
-
- /**
- * The class that manages a synth title bar
- *
- * @version 1.21 04/16/04
- * @author David Kloba
- * @author Joshua Outwater
- * @author Steve Wilson
- */
- class SynthInternalFrameTitlePane extends BasicInternalFrameTitlePane
- implements SynthUI, PropertyChangeListener {
-
- protected JPopupMenu systemPopupMenu;
- protected JButton menuButton;
-
- private SynthStyle style;
-
- public SynthInternalFrameTitlePane(JInternalFrame f) {
- super(f);
- }
-
- public String getUIClassID() {
- return "InternalFrameTitlePaneUI";
- }
-
- public SynthContext getContext(JComponent c) {
- return getContext(c, getComponentState(c));
- }
-
- public SynthContext getContext(JComponent c, int state) {
- return SynthContext.getContext(SynthContext.class, c,
- SynthLookAndFeel.getRegion(c), style, state);
- }
-
- private Region getRegion(JComponent c) {
- return SynthLookAndFeel.getRegion(c);
- }
-
- private int getComponentState(JComponent c) {
- if (frame != null) {
- if (frame.isSelected()) {
- return SELECTED;
- }
- }
- return SynthLookAndFeel.getComponentState(c);
- }
-
- protected void addSubComponents() {
- menuButton.setName("InternalFrameTitlePane.menuButton");
- iconButton.setName("InternalFrameTitlePane.iconifyButton");
- maxButton.setName("InternalFrameTitlePane.maximizeButton");
- closeButton.setName("InternalFrameTitlePane.closeButton");
-
- add(menuButton);
- add(iconButton);
- add(maxButton);
- add(closeButton);
- }
-
- protected void installListeners() {
- super.installListeners();
- frame.addPropertyChangeListener(this);
- }
-
- protected void uninstallListeners() {
- frame.removePropertyChangeListener(this);
- super.uninstallListeners();
- }
-
- private void updateStyle(JComponent c) {
- SynthContext context = getContext(this, ENABLED);
- SynthStyle oldStyle = style;
- style = SynthLookAndFeel.updateStyle(context, this);
- if (style != oldStyle) {
- maxIcon =
- style.getIcon(context,"InternalFrameTitlePane.maximizeIcon");
- minIcon =
- style.getIcon(context,"InternalFrameTitlePane.minimizeIcon");
- iconIcon =
- style.getIcon(context,"InternalFrameTitlePane.iconifyIcon");
- closeIcon =
- style.getIcon(context,"InternalFrameTitlePane.closeIcon");
- }
- context.dispose();
- }
-
- protected void installDefaults() {
- super.installDefaults();
- updateStyle(this);
- }
-
- protected void uninstallDefaults() {
- SynthContext context = getContext(this, ENABLED);
- style.uninstallDefaults(context);
- context.dispose();
- style = null;
- JInternalFrame.JDesktopIcon di = frame.getDesktopIcon();
- if(di != null && di.getComponentPopupMenu() == systemPopupMenu) {
- // Release link to systemMenu from the JInternalFrame
- di.setComponentPopupMenu(null);
- }
- super.uninstallDefaults();
- }
-
- private static class JPopupMenuUIResource extends JPopupMenu implements UIResource { }
-
- protected void assembleSystemMenu() {
- systemPopupMenu = new JPopupMenuUIResource();
- addSystemMenuItems(systemPopupMenu);
- enableActions();
- menuButton = createNoFocusButton();
- menuButton.setIcon(frame.getFrameIcon());
- menuButton.addMouseListener(new MouseAdapter() {
- public void mousePressed(MouseEvent e) {
- Dimension dim = new Dimension();
- Border border = frame.getBorder();
- if (border != null) {
- dim.width += border.getBorderInsets(frame).left +
- border.getBorderInsets(frame).right;
- dim.height += border.getBorderInsets(frame).bottom +
- border.getBorderInsets(frame).top;
- }
- if (!frame.isIcon()) {
- systemPopupMenu.show(e.getComponent(),
- getX() - dim.width,
- getY() + getHeight() - dim.height);
- } else {
- systemPopupMenu.show(e.getComponent(),
- getX() - dim.width,
- getY() - systemPopupMenu.getPreferredSize().height -
- dim.height);
- }
- }
- });
- JPopupMenu p = frame.getComponentPopupMenu();
- if (p == null || p instanceof UIResource) {
- frame.setComponentPopupMenu(systemPopupMenu);
- }
- if (frame.getDesktopIcon() != null) {
- p = frame.getDesktopIcon().getComponentPopupMenu();
- if (p == null || p instanceof UIResource) {
- frame.getDesktopIcon().setComponentPopupMenu(systemPopupMenu);
- }
- }
- setInheritsPopupMenu(true);
- }
-
- protected void addSystemMenuItems(JPopupMenu menu) {
- // PENDING: this should all be localizable!
- JMenuItem mi = (JMenuItem)menu.add(restoreAction);
- mi.setMnemonic('R');
- mi = (JMenuItem)menu.add(moveAction);
- mi.setMnemonic('M');
- mi = (JMenuItem)menu.add(sizeAction);
- mi.setMnemonic('S');
- mi = (JMenuItem)menu.add(iconifyAction);
- mi.setMnemonic('n');
- mi = (JMenuItem)menu.add(maximizeAction);
- mi.setMnemonic('x');
- menu.add(new JSeparator());
- mi = (JMenuItem)menu.add(closeAction);
- mi.setMnemonic('C');
- }
-
- // SynthInternalFrameTitlePane has no UI, we'll invoke paint on it.
- public void paintComponent(Graphics g) {
- SynthContext context = getContext(this);
- SynthLookAndFeel.update(context, g);
- context.getPainter().paintInternalFrameTitlePaneBackground(context,
- g, 0, 0, getWidth(), getHeight());
- paint(context, g);
- context.dispose();
- }
-
- public void paint(Graphics g, JComponent c) {
- SynthContext context = getContext(c);
-
- paint(context, g);
- context.dispose();
- }
-
- protected void paint(SynthContext context, Graphics g) {
- }
-
- public void paintBorder(SynthContext context, Graphics g, int x,
- int y, int w, int h) {
- context.getPainter().paintInternalFrameTitlePaneBorder(context,
- g, x, y, w, h);
- }
-
- protected LayoutManager createLayout() {
- SynthContext context = getContext(this);
- LayoutManager lm =
- (LayoutManager)style.get(context, "InternalFrameTitlePane.titlePaneLayout");
- context.dispose();
- return (lm != null) ? lm : new SynthTitlePaneLayout();
- }
-
- public void propertyChange(PropertyChangeEvent evt) {
- if (SynthLookAndFeel.shouldUpdateStyle(evt)) {
- updateStyle(SynthInternalFrameTitlePane.this);
- }
- }
-
- class SynthTitlePaneLayout implements LayoutManager {
- public void addLayoutComponent(String name, Component c) {}
- public void removeLayoutComponent(Component c) {}
- public Dimension preferredLayoutSize(Container c) {
- return minimumLayoutSize(c);
- }
-
- public Dimension minimumLayoutSize(Container c) {
- // Calculate width.
- int width = 22;
-
- if (frame.isClosable()) {
- width += 19;
- }
- if (frame.isMaximizable()) {
- width += 19;
- }
- if (frame.isIconifiable()) {
- width += 19;
- }
-
- FontMetrics fm = frame.getFontMetrics(getFont());
- SynthContext context = getContext(frame);
- SynthGraphicsUtils graphicsUtils = context.getStyle().
- getGraphicsUtils(context);
- String frameTitle = frame.getTitle();
- int title_w = frameTitle != null ? graphicsUtils.
- computeStringWidth(context, fm.getFont(),
- fm, frameTitle) : 0;
- int title_length = frameTitle != null ? frameTitle.length() : 0;
-
- // Leave room for three characters in the title.
- if (title_length > 3) {
- int subtitle_w = graphicsUtils.computeStringWidth(context,
- fm.getFont(), fm, frameTitle.substring(0, 3) + "...");
- width += (title_w < subtitle_w) ? title_w : subtitle_w;
- } else {
- width += title_w;
- }
-
- // Calculate height.
- Icon icon = frame.getFrameIcon();
- int fontHeight = fm.getHeight();
- fontHeight += 2;
- int iconHeight = 0;
- if (icon != null) {
- // SystemMenuBar forces the icon to be 16x16 or less.
- iconHeight = Math.min(icon.getIconHeight(), 16);
- }
- iconHeight += 2;
-
- int height = Math.max( fontHeight, iconHeight );
-
- Dimension dim = new Dimension(width, height);
-
- // Take into account the border insets if any.
- if (getBorder() != null) {
- Insets insets = getBorder().getBorderInsets(c);
- dim.height += insets.top + insets.bottom;
- dim.width += insets.left + insets.right;
- }
- context.dispose();
- return dim;
- }
-
- public void layoutContainer(Container c) {
- boolean leftToRight = SynthLookAndFeel.isLeftToRight(frame);
-
- int w = getWidth();
- int h = getHeight();
- int x;
-
- Icon closeIcon = closeButton.getIcon();
- int buttonHeight = (closeIcon != null) ? closeIcon.getIconHeight(): 12;
- if (buttonHeight == 0) {
- buttonHeight = 12;
- }
- //int buttonWidth = closeButton.getIcon().getIconWidth();
-
- Icon icon = frame.getFrameIcon();
- int iconHeight = (icon != null) ? icon.getIconHeight() : buttonHeight;
-
- Insets insets = frame.getInsets();
-
- x = (leftToRight) ? insets.left : w - 16 - insets.right;
- menuButton.setBounds(x, (h - iconHeight) / 2, 16, 14);
-
- x = (leftToRight) ? w - 16 - insets.right : insets.left;
-
- if (frame.isClosable()) {
- closeButton.setBounds(x, (h - buttonHeight) / 2, 16, 14);
- x += (leftToRight) ? -(16 + 2) : 16 + 2;
- }
-
- if (frame.isMaximizable()) {
- maxButton.setBounds(x, (h - buttonHeight) / 2, 16, 14);
- x += (leftToRight) ? -(16 + 2) : 16 + 2;
- }
-
- if (frame.isIconifiable()) {
- iconButton.setBounds(x, (h - buttonHeight) / 2, 16, 14);
- }
- }
- }
-
- private JButton createNoFocusButton() {
- JButton button = new JButton();
- button.setFocusable(false);
- button.setMargin(new Insets(0,0,0,0));
- return button;
- }
- }