| /* |
| * Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. Oracle designates this |
| * particular file as subject to the "Classpath" exception as provided |
| * by Oracle in the LICENSE file that accompanied this code. |
| * |
| * This code 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 |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| * or visit www.oracle.com if you need additional information or have any |
| * questions. |
| */ |
| |
| package com.sun.java.swing.plaf.motif; |
| |
| import sun.swing.SwingUtilities2; |
| import java.awt.*; |
| import java.awt.event.*; |
| import javax.swing.*; |
| import javax.swing.border.*; |
| import javax.swing.plaf.*; |
| import javax.swing.plaf.basic.*; |
| import java.beans.*; |
| import java.util.EventListener; |
| import java.io.Serializable; |
| |
| |
| /** |
| * Motif rendition of the component. |
| * |
| * @author Thomas Ball |
| * @author Rich Schiavi |
| */ |
| public class MotifDesktopIconUI extends BasicDesktopIconUI |
| { |
| protected DesktopIconActionListener desktopIconActionListener; |
| protected DesktopIconMouseListener desktopIconMouseListener; |
| |
| protected Icon defaultIcon; |
| protected IconButton iconButton; |
| protected IconLabel iconLabel; |
| |
| // This is only used for its system menu, but we need a reference to it so |
| // we can remove its listeners. |
| private MotifInternalFrameTitlePane sysMenuTitlePane; |
| |
| JPopupMenu systemMenu; |
| EventListener mml; |
| |
| final static int LABEL_HEIGHT = 18; |
| final static int LABEL_DIVIDER = 4; // padding between icon and label |
| |
| final static Font defaultTitleFont = |
| new Font(Font.SANS_SERIF, Font.PLAIN, 12); |
| |
| public static ComponentUI createUI(JComponent c) { |
| return new MotifDesktopIconUI(); |
| } |
| |
| public MotifDesktopIconUI() { |
| } |
| |
| protected void installDefaults(){ |
| super.installDefaults(); |
| setDefaultIcon(UIManager.getIcon("DesktopIcon.icon")); |
| iconButton = createIconButton(defaultIcon); |
| // An underhanded way of creating a system popup menu. |
| sysMenuTitlePane = new MotifInternalFrameTitlePane(frame); |
| systemMenu = sysMenuTitlePane.getSystemMenu(); |
| |
| MotifBorders.FrameBorder border = new MotifBorders.FrameBorder(desktopIcon); |
| desktopIcon.setLayout(new BorderLayout()); |
| iconButton.setBorder(border); |
| desktopIcon.add(iconButton, BorderLayout.CENTER); |
| iconLabel = createIconLabel(frame); |
| iconLabel.setBorder(border); |
| desktopIcon.add(iconLabel, BorderLayout.SOUTH); |
| desktopIcon.setSize(desktopIcon.getPreferredSize()); |
| desktopIcon.validate(); |
| JLayeredPane.putLayer(desktopIcon, JLayeredPane.getLayer(frame)); |
| } |
| |
| protected void installComponents(){ |
| } |
| |
| protected void uninstallComponents(){ |
| } |
| |
| protected void installListeners(){ |
| super.installListeners(); |
| desktopIconActionListener = createDesktopIconActionListener(); |
| desktopIconMouseListener = createDesktopIconMouseListener(); |
| iconButton.addActionListener(desktopIconActionListener); |
| iconButton.addMouseListener(desktopIconMouseListener); |
| iconLabel.addMouseListener(desktopIconMouseListener); |
| } |
| |
| JInternalFrame.JDesktopIcon getDesktopIcon(){ |
| return desktopIcon; |
| } |
| |
| void setDesktopIcon(JInternalFrame.JDesktopIcon d){ |
| desktopIcon = d; |
| } |
| |
| JInternalFrame getFrame(){ |
| return frame; |
| } |
| |
| void setFrame(JInternalFrame f){ |
| frame = f ; |
| } |
| |
| protected void showSystemMenu(){ |
| systemMenu.show(iconButton, 0, getDesktopIcon().getHeight()); |
| } |
| |
| protected void hideSystemMenu(){ |
| systemMenu.setVisible(false); |
| } |
| |
| protected IconLabel createIconLabel(JInternalFrame frame){ |
| return new IconLabel(frame); |
| } |
| |
| protected IconButton createIconButton(Icon i){ |
| return new IconButton(i); |
| } |
| |
| protected DesktopIconActionListener createDesktopIconActionListener(){ |
| return new DesktopIconActionListener(); |
| } |
| |
| protected DesktopIconMouseListener createDesktopIconMouseListener(){ |
| return new DesktopIconMouseListener(); |
| } |
| |
| protected void uninstallDefaults(){ |
| super.uninstallDefaults(); |
| desktopIcon.setLayout(null); |
| desktopIcon.remove(iconButton); |
| desktopIcon.remove(iconLabel); |
| } |
| |
| protected void uninstallListeners(){ |
| super.uninstallListeners(); |
| iconButton.removeActionListener(desktopIconActionListener); |
| iconButton.removeMouseListener(desktopIconMouseListener); |
| sysMenuTitlePane.uninstallListeners(); |
| } |
| |
| public Dimension getMinimumSize(JComponent c) { |
| JInternalFrame iframe = desktopIcon.getInternalFrame(); |
| |
| int w = defaultIcon.getIconWidth(); |
| int h = defaultIcon.getIconHeight() + LABEL_HEIGHT + LABEL_DIVIDER; |
| |
| Border border = iframe.getBorder(); |
| if(border != null) { |
| w += border.getBorderInsets(iframe).left + |
| border.getBorderInsets(iframe).right; |
| h += border.getBorderInsets(iframe).bottom + |
| border.getBorderInsets(iframe).top; |
| } |
| |
| return new Dimension(w, h); |
| } |
| |
| public Dimension getPreferredSize(JComponent c) { |
| return getMinimumSize(c); |
| } |
| |
| public Dimension getMaximumSize(JComponent c){ |
| return getMinimumSize(c); |
| } |
| |
| /** |
| * Returns the default desktop icon. |
| */ |
| public Icon getDefaultIcon() { |
| return defaultIcon; |
| } |
| |
| /** |
| * Sets the icon used as the default desktop icon. |
| */ |
| public void setDefaultIcon(Icon newIcon) { |
| defaultIcon = newIcon; |
| } |
| |
| protected class IconLabel extends JPanel { |
| JInternalFrame frame; |
| |
| IconLabel(JInternalFrame f) { |
| super(); |
| this.frame = f; |
| setFont(defaultTitleFont); |
| |
| // 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.getXOnScreen(), |
| e.getYOnScreen(), e.getClickCount(), |
| e.isPopupTrigger(), MouseEvent.NOBUTTON)); |
| } |
| |
| public boolean isFocusTraversable() { |
| return false; |
| } |
| |
| public Dimension getMinimumSize() { |
| return new Dimension(defaultIcon.getIconWidth() + 1, |
| LABEL_HEIGHT + LABEL_DIVIDER); |
| } |
| |
| public Dimension getPreferredSize() { |
| String title = frame.getTitle(); |
| FontMetrics fm = frame.getFontMetrics(defaultTitleFont); |
| int w = 4; |
| if (title != null) { |
| w += SwingUtilities2.stringWidth(frame, fm, title); |
| } |
| return new Dimension(w, LABEL_HEIGHT + LABEL_DIVIDER); |
| } |
| |
| public void paint(Graphics g) { |
| super.paint(g); |
| |
| // touch-up frame |
| int maxX = getWidth() - 1; |
| Color shadow = |
| UIManager.getColor("inactiveCaptionBorder").darker().darker(); |
| g.setColor(shadow); |
| g.setClip(0, 0, getWidth(), getHeight()); |
| g.drawLine(maxX - 1, 1, maxX - 1, 1); |
| g.drawLine(maxX, 0, maxX, 0); |
| |
| // fill background |
| g.setColor(UIManager.getColor("inactiveCaption")); |
| g.fillRect(2, 1, maxX - 3, LABEL_HEIGHT + 1); |
| |
| // draw text -- clipping to truncate text like CDE/Motif |
| g.setClip(2, 1, maxX - 4, LABEL_HEIGHT); |
| int y = LABEL_HEIGHT - SwingUtilities2.getFontMetrics(frame, g). |
| getDescent(); |
| g.setColor(UIManager.getColor("inactiveCaptionText")); |
| String title = frame.getTitle(); |
| if (title != null) { |
| SwingUtilities2.drawString(frame, g, title, 4, y); |
| } |
| } |
| } |
| |
| protected class IconButton extends JButton { |
| Icon icon; |
| |
| IconButton(Icon icon) { |
| super(icon); |
| this.icon = icon; |
| // 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) { |
| if (!systemMenu.isShowing()) { |
| 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.getXOnScreen(), e.getYOnScreen(), |
| e.getClickCount(), e.isPopupTrigger(), MouseEvent.NOBUTTON )); |
| } |
| |
| public boolean isFocusTraversable() { |
| return false; |
| } |
| } |
| |
| |
| protected class DesktopIconActionListener implements ActionListener { |
| public void actionPerformed(ActionEvent e){ |
| systemMenu.show(iconButton, 0, getDesktopIcon().getHeight()); |
| } |
| } |
| |
| protected class DesktopIconMouseListener extends MouseAdapter { |
| // if we drag or move we should deengage the popup |
| public void mousePressed(MouseEvent e){ |
| if (e.getClickCount() > 1) { |
| try { |
| getFrame().setIcon(false); |
| } catch (PropertyVetoException e2){ } |
| systemMenu.setVisible(false); |
| /* the mouse release will not get reported correctly, |
| because the icon will no longer be in the hierarchy; |
| maybe that should be fixed, but until it is, we need |
| to do the required cleanup here. */ |
| getFrame().getDesktopPane().getDesktopManager().endDraggingFrame((JComponent)e.getSource()); |
| } |
| } |
| } |
| } |