/*
* This file is modified by Ivan Maidanski <ivmai@ivmaisoft.com>
* Project name: JCGO-SUNAWT (http://www.ivmaisoft.com/jcgo/)
*/
/*
* @(#)MotifInternalFrameTitlePane.java 1.26 03/07/24
*
* Copyright 2003 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.sun.java.swing.plaf.motif;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
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;
/**
* Class that manages a Motif title bar
* @version 1.26 07/24/03
*
* @since 1.3
*/
public class MotifInternalFrameTitlePane
extends JComponent implements LayoutManager, ActionListener, PropertyChangeListener
{
SystemButton systemButton;
MinimizeButton minimizeButton;
MaximizeButton maximizeButton;
JPopupMenu systemMenu;
Title title;
JInternalFrame iFrame;
Color color;
Color highlight;
Color shadow;
static final Font defaultTitleFont = new Font("SansSerif", Font.PLAIN, 12);
// The width and height of a title pane button
public final static int BUTTON_SIZE = 19; // 17 + 1 pixel border
private static String CLOSE_CMD;
private static String ICONIFY_CMD;
private static String RESTORE_CMD;
private static String MAXIMIZE_CMD;
private static String MOVE_CMD;
private static String SIZE_CMD;
private static synchronized void initializeCmds() {
if (CLOSE_CMD == null) {
ICONIFY_CMD =
UIManager.getString("InternalFrameTitlePane.minimizeButtonText");
RESTORE_CMD =
UIManager.getString("InternalFrameTitlePane.restoreButtonText");
MAXIMIZE_CMD =
UIManager.getString("InternalFrameTitlePane.maximizeButtonText");
MOVE_CMD =
UIManager.getString("InternalFrameTitlePane.moveButtonText");
SIZE_CMD =
UIManager.getString("InternalFrameTitlePane.sizeButtonText");
CLOSE_CMD =
UIManager.getString("InternalFrameTitlePane.closeButtonText");
}
}
private static final int RESTORE_MENU_ITEM = 0;
private static final int MOVE_MENU_ITEM = 1;
private static final int SIZE_MENU_ITEM = 2;
private static final int MINIMIZE_MENU_ITEM = 3;
private static final int MAXIMIZE_MENU_ITEM = 4;
private static final int SEPARATOR_MENU_ITEM = 5;
private static final int CLOSE_MENU_ITEM = 6;
public MotifInternalFrameTitlePane(JInternalFrame f) {
initializeCmds();
iFrame = f;
setPreferredSize(new Dimension(100, BUTTON_SIZE));
systemMenu = new JPopupMenu() {
public void show(Component invoker, int x, int y) {
if(!iFrame.isIconifiable())
systemMenu.getComponentAtIndex(MINIMIZE_MENU_ITEM).setEnabled(false);
if(!iFrame.isMaximizable())
systemMenu.getComponentAtIndex(MAXIMIZE_MENU_ITEM).setEnabled(false);
if(!iFrame.isMaximizable() && !iFrame.isIconifiable())
systemMenu.getComponentAtIndex(RESTORE_MENU_ITEM).setEnabled(false);
if(!iFrame.isClosable())
systemMenu.getComponentAtIndex(CLOSE_MENU_ITEM).setEnabled(false);
super.show(invoker, x, y);
}
};
JMenuItem mi = (JMenuItem) systemMenu.add(new JMenuItem(RESTORE_CMD));
mi.setEnabled(iFrame.isIcon());
mi.addActionListener(this);
/// PENDING(klobad) Move/Size actions on InternalFrame need to be determined
mi = (JMenuItem) systemMenu.add(new JMenuItem(MOVE_CMD));
mi.setEnabled(false);
mi.addActionListener(this);
mi = (JMenuItem) systemMenu.add(new JMenuItem(SIZE_CMD));
mi.setEnabled(false);
mi.addActionListener(this);
mi = (JMenuItem) systemMenu.add(new JMenuItem(ICONIFY_CMD));
mi.setEnabled(!iFrame.isIcon());
mi.addActionListener(this);
mi = (JMenuItem) systemMenu.add(new JMenuItem(MAXIMIZE_CMD));
mi.addActionListener(this);
systemMenu.add(new JSeparator());
mi = (JMenuItem) systemMenu.add(new JMenuItem(CLOSE_CMD));
mi.addActionListener(this);
systemButton = new SystemButton();
systemButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
systemMenu.show(systemButton, 0, BUTTON_SIZE);
}
});
systemButton.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
if ((e.getClickCount() == 2)){
if (iFrame.isClosable()) {
iFrame.doDefaultCloseAction();
}
systemMenu.setVisible(false);
}
}
});
minimizeButton = new MinimizeButton();
minimizeButton.addActionListener(this);
minimizeButton.setActionCommand(ICONIFY_CMD);
maximizeButton = new MaximizeButton();
maximizeButton.addActionListener(this);
maximizeButton.setActionCommand(MAXIMIZE_CMD);
title = new Title(iFrame.getTitle());
title.setFont(defaultTitleFont);
setLayout(this);
add(systemButton);
add(title);
add(minimizeButton);
add(maximizeButton);
// Make sure these are ok to leave on?
iFrame.addPropertyChangeListener(this);
}
void setColors(Color c, Color h, Color s) {
color = c;
highlight = h;
shadow = s;
}
JPopupMenu getSystemMenu() {
return systemMenu;
}
public void actionPerformed(ActionEvent e) {
try {
if (CLOSE_CMD.equals(e.getActionCommand()) && iFrame.isClosable()) {
iFrame.doDefaultCloseAction();
} else if (ICONIFY_CMD.equals(e.getActionCommand()) &&
iFrame.isIconifiable()) { //4118140
if (!iFrame.isIcon()) {
iFrame.setIcon(true);
} else {
iFrame.setIcon(false);
}
} else if (MAXIMIZE_CMD.equals(e.getActionCommand()) &&
iFrame.isMaximizable()) {
if (!iFrame.isMaximum()) {
iFrame.setMaximum(true);
} else {
iFrame.setMaximum(false);
}
} else if (RESTORE_CMD.equals(e.getActionCommand()) &&
iFrame.isMaximizable() && iFrame.isMaximum()) {
iFrame.setMaximum(false);
} else if (RESTORE_CMD.equals(e.getActionCommand()) &&
iFrame.isIconifiable() && iFrame.isIcon()) {
iFrame.setIcon(false);
}
} catch (PropertyVetoException e0) { }
// Dismiss popup menu if it's displayed
if (systemMenu.isVisible()) {
systemMenu.setVisible(false);
}
}
public void propertyChange(PropertyChangeEvent evt) {
String prop = (String)evt.getPropertyName();
JInternalFrame f = (JInternalFrame)evt.getSource();
boolean value = false;
if(JInternalFrame.IS_SELECTED_PROPERTY.equals(prop)) {
repaint();
} else if(JInternalFrame.IS_MAXIMUM_PROPERTY.equals(prop)) {
value = ((Boolean)evt.getNewValue()).booleanValue();
systemMenu.getComponentAtIndex(RESTORE_MENU_ITEM).setEnabled(value);
systemMenu.getComponentAtIndex(MAXIMIZE_MENU_ITEM).setEnabled(!value);
} else if(JInternalFrame.IS_ICON_PROPERTY.equals(prop)) {
value = ((Boolean)evt.getNewValue()).booleanValue();
systemMenu.getComponentAtIndex(RESTORE_MENU_ITEM).setEnabled(value);
if (f.isMaximizable())
systemMenu.getComponentAtIndex(MAXIMIZE_MENU_ITEM).setEnabled(true);
else
systemMenu.getComponentAtIndex(MAXIMIZE_MENU_ITEM).setEnabled(false);
systemMenu.getComponentAtIndex(MINIMIZE_MENU_ITEM).setEnabled(!value);
} else if( prop.equals("maximizable") ) {
if( (Boolean)evt.getNewValue() == Boolean.TRUE )
add(maximizeButton);
else
remove(maximizeButton);
revalidate();
repaint();
} else if( prop.equals("iconable") ) {
if( (Boolean)evt.getNewValue() == Boolean.TRUE )
add(minimizeButton);
else
remove(minimizeButton);
revalidate();
repaint();
} else if (prop.equals(JInternalFrame.TITLE_PROPERTY)) {
repaint();
}
}
public void addLayoutComponent(String name, Component c) {}
public void removeLayoutComponent(Component c) {}
public Dimension preferredLayoutSize(Container c) {
return new Dimension(c.getSize().width, BUTTON_SIZE);
}
public Dimension minimumLayoutSize(Container c) {
return new Dimension(c.getSize().width, BUTTON_SIZE);
}
public void layoutContainer(Container c) {
int w = getWidth();
systemButton.setBounds(0, 0, BUTTON_SIZE, BUTTON_SIZE);
int x = w - BUTTON_SIZE;
if(iFrame.isMaximizable()) {
maximizeButton.setBounds(x, 0, BUTTON_SIZE, BUTTON_SIZE);
x -= BUTTON_SIZE;
} else if(maximizeButton.getParent() != null) {
maximizeButton.getParent().remove(maximizeButton);
}
if(iFrame.isIconifiable()) {
minimizeButton.setBounds(x, 0, BUTTON_SIZE, BUTTON_SIZE);
x -= BUTTON_SIZE;
} else if(minimizeButton.getParent() != null) {
minimizeButton.getParent().remove(minimizeButton);
}
title.setBounds(BUTTON_SIZE, 0, x, BUTTON_SIZE);
}
protected void showSystemMenu(){
systemMenu.show(systemButton, 0, BUTTON_SIZE);
}
protected void hideSystemMenu(){
systemMenu.setVisible(false);
}
static Dimension buttonDimension = new Dimension(BUTTON_SIZE, BUTTON_SIZE);
private abstract class FrameButton extends JButton {
FrameButton() {
super();
setFocusPainted(false);
setBorderPainted(false);
}
public boolean isFocusTraversable() {
return false;
}
public void requestFocus() {
// ignore request.
}
public Dimension getMinimumSize() {
return buttonDimension;
}
public Dimension getPreferredSize() {
return buttonDimension;
}
public void paint(Graphics g) {
Dimension d = getSize();
int maxX = d.width - 1;
int maxY = d.height - 1;
// draw background
g.setColor(color);
g.fillRect(1, 1, d.width, d.height);
// draw border
boolean pressed = getModel().isPressed();
g.setColor(pressed ? shadow : highlight);
g.drawLine(0, 0, maxX, 0);
g.drawLine(0, 0, 0, maxY);
g.setColor(pressed ? highlight : shadow);
g.drawLine(1, maxY, maxX, maxY);
g.drawLine(maxX, 1, maxX, maxY);
}
}
private class MinimizeButton extends FrameButton {
public void paint(Graphics g) {
super.paint(g);
g.setColor(highlight);
g.drawLine(7, 8, 7, 11);
g.drawLine(7, 8, 10, 8);
g.setColor(shadow);
g.drawLine(8, 11, 10, 11);
g.drawLine(11, 9, 11, 11);
}
}
private class MaximizeButton extends FrameButton {
public void paint(Graphics g) {
super.paint(g);
int max = BUTTON_SIZE - 5;
boolean isMaxed = iFrame.isMaximum();
g.setColor(isMaxed ? shadow : highlight);
g.drawLine(4, 4, 4, max);
g.drawLine(4, 4, max, 4);
g.setColor(isMaxed ? highlight : shadow);
g.drawLine(5, max, max, max);
g.drawLine(max, 5, max, max);
}
}
private class SystemButton extends FrameButton {
public boolean isFocusTraversable() { return false; }
public void requestFocus() {}
public void paint(Graphics g) {
super.paint(g);
g.setColor(highlight);
g.drawLine(4, 8, 4, 11);
g.drawLine(4, 8, BUTTON_SIZE - 5, 8);
g.setColor(shadow);
g.drawLine(5, 11, BUTTON_SIZE - 5, 11);
g.drawLine(BUTTON_SIZE - 5, 9, BUTTON_SIZE - 5, 11);
}
}
private class Title extends FrameButton {
Title(String title) {
super();
setText(title);
setHorizontalAlignment(SwingConstants.CENTER);
setBorder(BorderFactory.createBevelBorder(
BevelBorder.RAISED,
UIManager.getColor("activeCaptionBorder"),
UIManager.getColor("inactiveCaptionBorder")));
// Forward mouse events to titlebar for moves.
addMouseMotionListener(new MouseMotionListener() {
public void mouseDragged(MouseEvent e) {
forwardEventToParent(e);
}
public void mouseMoved(MouseEvent e) {
forwardEventToParent(e);
}
});
addMouseListener(new MouseListener() {
public void mouseClicked(MouseEvent e) {
forwardEventToParent(e);
}
public void mousePressed(MouseEvent e) {
forwardEventToParent(e);
}
public void mouseReleased(MouseEvent e) {
forwardEventToParent(e);
}
public void mouseEntered(MouseEvent e) {
forwardEventToParent(e);
}
public void mouseExited(MouseEvent e) {
forwardEventToParent(e);
}
});
}
void forwardEventToParent(MouseEvent e) {
getParent().dispatchEvent(new MouseEvent(
getParent(), e.getID(), e.getWhen(), e.getModifiers(),
e.getX(), e.getY(), e.getClickCount(), e.isPopupTrigger()));
}
public void paint(Graphics g) {
super.paint(g);
if (iFrame.isSelected()) {
g.setColor(UIManager.getColor("activeCaptionText"));
} else {
g.setColor(UIManager.getColor("inactiveCaptionText"));
}
Dimension d = getSize();
String frameTitle = iFrame.getTitle();
if (frameTitle != null) {
MotifGraphicsUtils.drawStringInRect(g, frameTitle,
0, 0, d.width, d.height,
SwingConstants.CENTER);
}
}
}
} /// End Title Pane Class