| 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 */  | 
 | 
 | 
 | 
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 javax.swing.plaf.basic.*;  | 
 | 
import java.util.EventListener;  | 
 | 
import java.beans.PropertyChangeListener;  | 
 | 
import java.beans.PropertyChangeEvent;  | 
 | 
import java.beans.VetoableChangeListener;  | 
 | 
import java.beans.PropertyVetoException;  | 
 | 
 | 
 | 
import sun.awt.AWTAccessor;  | 
 | 
import sun.awt.AWTAccessor.MouseEventAccessor;  | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 */  | 
 | 
public class MotifInternalFrameTitlePane  | 
 | 
    extends BasicInternalFrameTitlePane implements LayoutManager, ActionListener, PropertyChangeListener  | 
 | 
{ | 
 | 
    SystemButton systemButton;  | 
 | 
    MinimizeButton minimizeButton;  | 
 | 
    MaximizeButton maximizeButton;  | 
 | 
    JPopupMenu systemMenu;  | 
 | 
    Title title;  | 
 | 
    Color color;  | 
 | 
    Color highlight;  | 
 | 
    Color shadow;  | 
 | 
 | 
 | 
    // The width and height of a title pane button  | 
 | 
    public final static int BUTTON_SIZE = 19;    | 
 | 
 | 
 | 
 | 
 | 
    public MotifInternalFrameTitlePane(JInternalFrame frame) { | 
 | 
        super(frame);  | 
 | 
    }  | 
 | 
 | 
 | 
    protected void installDefaults() { | 
 | 
        setFont(UIManager.getFont("InternalFrame.titleFont")); | 
 | 
        setPreferredSize(new Dimension(100, BUTTON_SIZE));  | 
 | 
    }  | 
 | 
 | 
 | 
    protected void uninstallListeners() { | 
 | 
          | 
 | 
        super.uninstallListeners();  | 
 | 
    }  | 
 | 
 | 
 | 
    protected PropertyChangeListener createPropertyChangeListener() { | 
 | 
        return this;  | 
 | 
    }  | 
 | 
 | 
 | 
    protected LayoutManager createLayout() { | 
 | 
        return this;  | 
 | 
    }  | 
 | 
 | 
 | 
    JPopupMenu getSystemMenu() { | 
 | 
        return systemMenu;  | 
 | 
    }  | 
 | 
 | 
 | 
    protected void assembleSystemMenu() { | 
 | 
        systemMenu = new JPopupMenu();  | 
 | 
        JMenuItem mi = systemMenu.add(restoreAction);  | 
 | 
        mi.setMnemonic(getButtonMnemonic("restore")); | 
 | 
        mi = systemMenu.add(moveAction);  | 
 | 
        mi.setMnemonic(getButtonMnemonic("move")); | 
 | 
        mi = systemMenu.add(sizeAction);  | 
 | 
        mi.setMnemonic(getButtonMnemonic("size")); | 
 | 
        mi = systemMenu.add(iconifyAction);  | 
 | 
        mi.setMnemonic(getButtonMnemonic("minimize")); | 
 | 
        mi = systemMenu.add(maximizeAction);  | 
 | 
        mi.setMnemonic(getButtonMnemonic("maximize")); | 
 | 
        systemMenu.add(new JSeparator());  | 
 | 
        mi = systemMenu.add(closeAction);  | 
 | 
        mi.setMnemonic(getButtonMnemonic("close")); | 
 | 
 | 
 | 
        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 evt) { | 
 | 
                try { | 
 | 
                    frame.setSelected(true);  | 
 | 
                } catch (PropertyVetoException pve) { | 
 | 
                }  | 
 | 
                if ((evt.getClickCount() == 2)) { | 
 | 
                    closeAction.actionPerformed(new  | 
 | 
                        ActionEvent(evt.getSource(),  | 
 | 
                            ActionEvent.ACTION_PERFORMED,  | 
 | 
                            null, evt.getWhen(), 0));  | 
 | 
                    systemMenu.setVisible(false);  | 
 | 
                }  | 
 | 
            }  | 
 | 
        });  | 
 | 
    }  | 
 | 
 | 
 | 
    private static int getButtonMnemonic(String button) { | 
 | 
        try { | 
 | 
            return Integer.parseInt(UIManager.getString(  | 
 | 
                    "InternalFrameTitlePane." + button + "Button.mnemonic"));  | 
 | 
        } catch (NumberFormatException e) { | 
 | 
            return -1;  | 
 | 
        }  | 
 | 
    }  | 
 | 
 | 
 | 
    protected void createButtons() { | 
 | 
        minimizeButton = new MinimizeButton();  | 
 | 
        minimizeButton.addActionListener(iconifyAction);  | 
 | 
 | 
 | 
        maximizeButton = new MaximizeButton();  | 
 | 
        maximizeButton.addActionListener(maximizeAction);  | 
 | 
    }  | 
 | 
 | 
 | 
 | 
 | 
    protected void addSubComponents() { | 
 | 
        title = new Title(frame.getTitle());  | 
 | 
        title.setFont(getFont());  | 
 | 
 | 
 | 
        add(systemButton);  | 
 | 
        add(title);  | 
 | 
        add(minimizeButton);  | 
 | 
        add(maximizeButton);  | 
 | 
    }  | 
 | 
 | 
 | 
    public void paintComponent(Graphics g) { | 
 | 
    }  | 
 | 
 | 
 | 
    void setColors(Color c, Color h, Color s) { | 
 | 
        color = c;  | 
 | 
        highlight = h;  | 
 | 
        shadow = s;  | 
 | 
    }  | 
 | 
 | 
 | 
    public void actionPerformed(ActionEvent e) { | 
 | 
    }  | 
 | 
 | 
 | 
    public void propertyChange(PropertyChangeEvent evt) { | 
 | 
        String prop = evt.getPropertyName();  | 
 | 
        JInternalFrame f = (JInternalFrame)evt.getSource();  | 
 | 
        boolean value = false;  | 
 | 
        if (JInternalFrame.IS_SELECTED_PROPERTY.equals(prop)) { | 
 | 
            repaint();  | 
 | 
        } 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();  | 
 | 
        }  | 
 | 
        enableActions();  | 
 | 
    }  | 
 | 
 | 
 | 
    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) { | 
 | 
        return new Dimension(100, BUTTON_SIZE);  | 
 | 
    }  | 
 | 
 | 
 | 
    public void layoutContainer(Container c) { | 
 | 
        int w = getWidth();  | 
 | 
        systemButton.setBounds(0, 0, BUTTON_SIZE, BUTTON_SIZE);  | 
 | 
        int x = w - BUTTON_SIZE;  | 
 | 
 | 
 | 
        if(frame.isMaximizable()) { | 
 | 
            maximizeButton.setBounds(x, 0, BUTTON_SIZE, BUTTON_SIZE);  | 
 | 
            x -= BUTTON_SIZE;  | 
 | 
        } else if(maximizeButton.getParent() != null) { | 
 | 
            maximizeButton.getParent().remove(maximizeButton);  | 
 | 
        }  | 
 | 
 | 
 | 
        if(frame.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 paintComponent(Graphics g) { | 
 | 
            Dimension d = getSize();  | 
 | 
            int maxX = d.width - 1;  | 
 | 
            int maxY = d.height - 1;  | 
 | 
 | 
 | 
              | 
 | 
            g.setColor(color);  | 
 | 
            g.fillRect(1, 1, d.width, d.height);  | 
 | 
 | 
 | 
              | 
 | 
            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 paintComponent(Graphics g) { | 
 | 
            super.paintComponent(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 paintComponent(Graphics g) { | 
 | 
            super.paintComponent(g);  | 
 | 
            int max = BUTTON_SIZE - 5;  | 
 | 
            boolean isMaxed = frame.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 paintComponent(Graphics g) { | 
 | 
            super.paintComponent(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"))); | 
 | 
 | 
 | 
              | 
 | 
            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) { | 
 | 
            MouseEvent newEvent = new MouseEvent(  | 
 | 
                getParent(), e.getID(), e.getWhen(), e.getModifiers(),  | 
 | 
                e.getX(), e.getY(),  e.getXOnScreen(),  | 
 | 
                e.getYOnScreen(), e.getClickCount(),  | 
 | 
                e.isPopupTrigger(),  MouseEvent.NOBUTTON);  | 
 | 
            MouseEventAccessor meAccessor = AWTAccessor.getMouseEventAccessor();  | 
 | 
            meAccessor.setCausedByTouchEvent(newEvent,  | 
 | 
                meAccessor.isCausedByTouchEvent(e));  | 
 | 
            getParent().dispatchEvent(newEvent);  | 
 | 
        }  | 
 | 
 | 
 | 
        public void paintComponent(Graphics g) { | 
 | 
            super.paintComponent(g);  | 
 | 
            if (frame.isSelected()) { | 
 | 
                g.setColor(UIManager.getColor("activeCaptionText")); | 
 | 
            } else { | 
 | 
                g.setColor(UIManager.getColor("inactiveCaptionText")); | 
 | 
            }  | 
 | 
            Dimension d = getSize();  | 
 | 
            String frameTitle = frame.getTitle();  | 
 | 
            if (frameTitle != null) { | 
 | 
                MotifGraphicsUtils.drawStringInRect(frame, g, frameTitle,  | 
 | 
                                                    0, 0, d.width, d.height,  | 
 | 
                                                    SwingConstants.CENTER);  | 
 | 
            }  | 
 | 
        }  | 
 | 
    }  | 
 | 
}  |