|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
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; |
|
|
|
import sun.awt.AWTAccessor; |
|
import sun.awt.AWTAccessor.MouseEventAccessor; |
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
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 |
|
|
|
private MotifInternalFrameTitlePane sysMenuTitlePane; |
|
|
|
JPopupMenu systemMenu; |
|
EventListener mml; |
|
|
|
final static int LABEL_HEIGHT = 18; |
|
final static int LABEL_DIVIDER = 4; |
|
|
|
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); |
|
|
|
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); |
|
} |
|
|
|
|
|
|
|
*/ |
|
public Icon getDefaultIcon() { |
|
return defaultIcon; |
|
} |
|
|
|
|
|
|
|
*/ |
|
public void setDefaultIcon(Icon newIcon) { |
|
defaultIcon = newIcon; |
|
} |
|
|
|
protected class IconLabel extends JPanel { |
|
JInternalFrame frame; |
|
|
|
IconLabel(JInternalFrame f) { |
|
super(); |
|
this.frame = f; |
|
setFont(defaultTitleFont); |
|
|
|
|
|
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 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); |
|
|
|
|
|
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); |
|
|
|
|
|
g.setColor(UIManager.getColor("inactiveCaption")); |
|
g.fillRect(2, 1, maxX - 3, LABEL_HEIGHT + 1); |
|
|
|
|
|
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; |
|
|
|
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) { |
|
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 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 { |
|
|
|
public void mousePressed(MouseEvent e){ |
|
if (e.getClickCount() > 1) { |
|
try { |
|
getFrame().setIcon(false); |
|
} catch (PropertyVetoException e2){ } |
|
systemMenu.setVisible(false); |
|
|
|
|
|
|
|
to do the required cleanup here. */ |
|
getFrame().getDesktopPane().getDesktopManager().endDraggingFrame((JComponent)e.getSource()); |
|
} |
|
} |
|
} |
|
} |