1. /*
  2. * @(#)BasicDesktopIconUI.java 1.31 03/01/23
  3. *
  4. * Copyright 2003 Sun Microsystems, Inc. All rights reserved.
  5. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
  6. */
  7. package javax.swing.plaf.basic;
  8. import java.awt.*;
  9. import java.awt.event.*;
  10. import javax.swing.*;
  11. import javax.swing.event.*;
  12. import javax.swing.border.*;
  13. import javax.swing.plaf.*;
  14. import java.beans.*;
  15. import java.util.EventListener;
  16. import java.io.Serializable;
  17. /**
  18. * Basic L&F for a minimized window on a desktop.
  19. *
  20. * @version 1.31 01/23/03
  21. * @author David Kloba
  22. * @author Steve Wilson
  23. * @author Rich Schiavi
  24. */
  25. public class BasicDesktopIconUI extends DesktopIconUI {
  26. protected JInternalFrame.JDesktopIcon desktopIcon;
  27. protected JInternalFrame frame;
  28. // This component is only used for windows look and feel, but it's package
  29. // private. This should be protected. (joutwate 2/22/2001)
  30. JComponent iconPane;
  31. MouseInputListener mouseInputListener;
  32. public static ComponentUI createUI(JComponent c) {
  33. return new BasicDesktopIconUI();
  34. }
  35. public BasicDesktopIconUI() {
  36. }
  37. public void installUI(JComponent c) {
  38. desktopIcon = (JInternalFrame.JDesktopIcon)c;
  39. frame = desktopIcon.getInternalFrame();
  40. installDefaults();
  41. installComponents();
  42. installListeners();
  43. JLayeredPane.putLayer(desktopIcon, JLayeredPane.getLayer(frame));
  44. }
  45. public void uninstallUI(JComponent c) {
  46. uninstallDefaults();
  47. uninstallComponents();
  48. uninstallListeners();
  49. frame = null;
  50. desktopIcon = null;
  51. }
  52. protected void installComponents() {
  53. iconPane = new BasicInternalFrameTitlePane(frame);
  54. desktopIcon.setLayout(new BorderLayout());
  55. desktopIcon.add(iconPane, BorderLayout.CENTER);
  56. }
  57. protected void uninstallComponents() {
  58. desktopIcon.setLayout(null);
  59. desktopIcon.remove(iconPane);
  60. iconPane = null;
  61. }
  62. protected void installListeners() {
  63. mouseInputListener = createMouseInputListener();
  64. desktopIcon.addMouseMotionListener(mouseInputListener);
  65. desktopIcon.addMouseListener(mouseInputListener);
  66. }
  67. protected void uninstallListeners() {
  68. desktopIcon.removeMouseMotionListener(mouseInputListener);
  69. desktopIcon.removeMouseListener(mouseInputListener);
  70. mouseInputListener = null;
  71. }
  72. protected void installDefaults() {
  73. LookAndFeel.installBorder(desktopIcon, "DesktopIcon.border");
  74. }
  75. protected void uninstallDefaults() {
  76. LookAndFeel.uninstallBorder(desktopIcon);
  77. }
  78. protected MouseInputListener createMouseInputListener() {
  79. return new MouseInputHandler();
  80. }
  81. public Dimension getPreferredSize(JComponent c) {
  82. return desktopIcon.getLayout().preferredLayoutSize(desktopIcon);
  83. }
  84. public Dimension getMinimumSize(JComponent c) {
  85. Dimension dim = new Dimension(iconPane.getMinimumSize());
  86. Border border = frame.getBorder();
  87. if (border != null) {
  88. dim.height += border.getBorderInsets(frame).bottom +
  89. border.getBorderInsets(frame).top;
  90. }
  91. return dim;
  92. }
  93. public Dimension getMaximumSize(JComponent c){
  94. return iconPane.getMaximumSize();
  95. }
  96. public Insets getInsets(JComponent c) {
  97. JInternalFrame iframe = desktopIcon.getInternalFrame();
  98. Border border = iframe.getBorder();
  99. if(border != null)
  100. return border.getBorderInsets(iframe);
  101. return new Insets(0,0,0,0);
  102. }
  103. public void deiconize() {
  104. try { frame.setIcon(false); } catch (PropertyVetoException e2) { }
  105. }
  106. /**
  107. * Listens for mouse movements and acts on them.
  108. *
  109. * This inner class is marked "public" due to a compiler bug.
  110. * This class should be treated as a "protected" inner class.
  111. * Instantiate it only within subclasses of <Foo>.
  112. */
  113. public class MouseInputHandler extends MouseInputAdapter
  114. {
  115. // _x & _y are the mousePressed location in absolute coordinate system
  116. int _x, _y;
  117. // __x & __y are the mousePressed location in source view's coordinate system
  118. int __x, __y;
  119. Rectangle startingBounds;
  120. public void mouseReleased(MouseEvent e) {
  121. _x = 0;
  122. _y = 0;
  123. __x = 0;
  124. __y = 0;
  125. startingBounds = null;
  126. JDesktopPane d;
  127. if((d = desktopIcon.getDesktopPane()) != null) {
  128. DesktopManager dm = d.getDesktopManager();
  129. dm.endDraggingFrame(desktopIcon);
  130. }
  131. }
  132. public void mousePressed(MouseEvent e) {
  133. Point p = SwingUtilities.convertPoint((Component)e.getSource(),
  134. e.getX(), e.getY(), null);
  135. __x = e.getX();
  136. __y = e.getY();
  137. _x = p.x;
  138. _y = p.y;
  139. startingBounds = desktopIcon.getBounds();
  140. JDesktopPane d;
  141. if((d = desktopIcon.getDesktopPane()) != null) {
  142. DesktopManager dm = d.getDesktopManager();
  143. dm.beginDraggingFrame(desktopIcon);
  144. }
  145. try { frame.setSelected(true); } catch (PropertyVetoException e1) { }
  146. if(desktopIcon.getParent() instanceof JLayeredPane) {
  147. ((JLayeredPane)desktopIcon.getParent()).moveToFront(desktopIcon);
  148. }
  149. if(e.getClickCount() > 1) {
  150. if(frame.isIconifiable() && frame.isIcon()) {
  151. deiconize();
  152. }
  153. }
  154. }
  155. public void mouseMoved(MouseEvent e) {}
  156. public void mouseDragged(MouseEvent e) {
  157. Point p;
  158. int newX, newY, newW, newH;
  159. int deltaX;
  160. int deltaY;
  161. Dimension min;
  162. Dimension max;
  163. p = SwingUtilities.convertPoint((Component)e.getSource(),
  164. e.getX(), e.getY(), null);
  165. Insets i = desktopIcon.getInsets();
  166. int pWidth, pHeight;
  167. pWidth = ((JComponent)desktopIcon.getParent()).getWidth();
  168. pHeight = ((JComponent)desktopIcon.getParent()).getHeight();
  169. if (startingBounds == null) {
  170. // (STEVE) Yucky work around for bug ID 4106552
  171. return;
  172. }
  173. newX = startingBounds.x - (_x - p.x);
  174. newY = startingBounds.y - (_y - p.y);
  175. // Make sure we stay in-bounds
  176. if(newX + i.left <= -__x)
  177. newX = -__x - i.left;
  178. if(newY + i.top <= -__y)
  179. newY = -__y - i.top;
  180. if(newX + __x + i.right > pWidth)
  181. newX = pWidth - __x - i.right;
  182. if(newY + __y + i.bottom > pHeight)
  183. newY = pHeight - __y - i.bottom;
  184. JDesktopPane d;
  185. if((d = desktopIcon.getDesktopPane()) != null) {
  186. DesktopManager dm = d.getDesktopManager();
  187. dm.dragFrame(desktopIcon, newX, newY);
  188. } else {
  189. moveAndRepaint(desktopIcon, newX, newY,
  190. desktopIcon.getWidth(), desktopIcon.getHeight());
  191. }
  192. return;
  193. }
  194. public void moveAndRepaint(JComponent f, int newX, int newY,
  195. int newWidth, int newHeight) {
  196. Rectangle r = f.getBounds();
  197. f.setBounds(newX, newY, newWidth, newHeight);
  198. SwingUtilities.computeUnion(newX, newY, newWidth, newHeight, r);
  199. f.getParent().repaint(r.x, r.y, r.width, r.height);
  200. }
  201. }; /// End MotionListener
  202. }