/* * @(#)SynthInternalFrameTitlePane.java 1.22 04/09/10 * * 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.22 09/10/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) { showSystemMenu(); } }); 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'); } protected void showSystemMenu() { Dimension dim = new Dimension(); Insets insets = frame.getInsets(); dim.width += insets.left + insets.right; dim.height += insets.bottom + insets.top; if (!frame.isIcon()) { systemPopupMenu.show(menuButton, getX() - dim.width, getY() + getHeight() - dim.height); } else { systemPopupMenu.show(menuButton, getX() - dim.width, getY() - systemPopupMenu.getPreferredSize().height - dim.height); } } // 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; } }