1. /*
  2. * @(#)SynthDesktopPaneUI.java 1.18 03/12/19
  3. *
  4. * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
  5. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
  6. */
  7. package javax.swing.plaf.synth;
  8. import javax.swing.*;
  9. import javax.swing.border.*;
  10. import javax.swing.plaf.*;
  11. import javax.swing.plaf.basic.BasicDesktopPaneUI;
  12. import java.beans.*;
  13. import java.awt.event.*;
  14. import java.awt.Dimension;
  15. import java.awt.Insets;
  16. import java.awt.Graphics;
  17. import java.awt.KeyboardFocusManager;
  18. import java.awt.*;
  19. import java.util.Vector;
  20. import sun.swing.plaf.synth.SynthUI;
  21. /**
  22. * Synth L&F for a desktop.
  23. *
  24. * @version 1.18, 12/19/03
  25. * @author Joshua Outwater
  26. * @author Steve Wilson
  27. */
  28. class SynthDesktopPaneUI extends BasicDesktopPaneUI implements
  29. PropertyChangeListener, SynthUI {
  30. private SynthStyle style;
  31. private TaskBar taskBar;
  32. private DesktopManager oldDesktopManager;
  33. public static ComponentUI createUI(JComponent c) {
  34. return new SynthDesktopPaneUI();
  35. }
  36. protected void installListeners() {
  37. super.installListeners();
  38. desktop.addPropertyChangeListener(this);
  39. if (taskBar != null) {
  40. // Listen for desktop being resized
  41. desktop.addComponentListener(taskBar);
  42. // Listen for frames being added to desktop
  43. desktop.addContainerListener(taskBar);
  44. }
  45. }
  46. protected void installDefaults() {
  47. updateStyle(desktop);
  48. if (UIManager.getBoolean("InternalFrame.useTaskBar")) {
  49. taskBar = new TaskBar();
  50. for (Component comp : desktop.getComponents()) {
  51. JInternalFrame.JDesktopIcon desktopIcon;
  52. if (comp instanceof JInternalFrame.JDesktopIcon) {
  53. desktopIcon = (JInternalFrame.JDesktopIcon)comp;
  54. } else if (comp instanceof JInternalFrame) {
  55. desktopIcon = ((JInternalFrame)comp).getDesktopIcon();
  56. } else {
  57. continue;
  58. }
  59. // Move desktopIcon from desktop to taskBar
  60. if (desktopIcon.getParent() == desktop) {
  61. desktop.remove(desktopIcon);
  62. }
  63. if (desktopIcon.getParent() != taskBar) {
  64. taskBar.add(desktopIcon);
  65. desktopIcon.getInternalFrame().addComponentListener(
  66. taskBar);
  67. }
  68. }
  69. taskBar.setBackground(desktop.getBackground());
  70. desktop.add(taskBar,
  71. new Integer(JLayeredPane.PALETTE_LAYER.intValue() + 1));
  72. if (desktop.isShowing()) {
  73. taskBar.adjustSize();
  74. }
  75. }
  76. }
  77. private void updateStyle(JDesktopPane c) {
  78. SynthStyle oldStyle = style;
  79. SynthContext context = getContext(c, ENABLED);
  80. style = SynthLookAndFeel.updateStyle(context, this);
  81. if (oldStyle != null) {
  82. uninstallKeyboardActions();
  83. installKeyboardActions();
  84. }
  85. context.dispose();
  86. }
  87. protected void uninstallListeners() {
  88. if (taskBar != null) {
  89. desktop.removeComponentListener(taskBar);
  90. desktop.removeContainerListener(taskBar);
  91. }
  92. desktop.removePropertyChangeListener(this);
  93. super.uninstallListeners();
  94. }
  95. protected void uninstallDefaults() {
  96. SynthContext context = getContext(desktop, ENABLED);
  97. style.uninstallDefaults(context);
  98. context.dispose();
  99. style = null;
  100. if (taskBar != null) {
  101. for (Component comp : taskBar.getComponents()) {
  102. JInternalFrame.JDesktopIcon desktopIcon =
  103. (JInternalFrame.JDesktopIcon)comp;
  104. taskBar.remove(desktopIcon);
  105. desktopIcon.setPreferredSize(null);
  106. JInternalFrame f = desktopIcon.getInternalFrame();
  107. if (f.isIcon()) {
  108. desktop.add(desktopIcon);
  109. }
  110. f.removeComponentListener(taskBar);
  111. }
  112. desktop.remove(taskBar);
  113. taskBar = null;
  114. }
  115. }
  116. protected void installDesktopManager() {
  117. if (UIManager.getBoolean("InternalFrame.useTaskBar")) {
  118. desktopManager = oldDesktopManager = desktop.getDesktopManager();
  119. if (!(desktopManager instanceof SynthDesktopManager)) {
  120. desktopManager = new SynthDesktopManager();
  121. desktop.setDesktopManager(desktopManager);
  122. }
  123. } else {
  124. super.installDesktopManager();
  125. }
  126. }
  127. protected void uninstallDesktopManager() {
  128. if (oldDesktopManager != null && !(oldDesktopManager instanceof UIResource)) {
  129. desktopManager = desktop.getDesktopManager();
  130. if (desktopManager == null || desktopManager instanceof UIResource) {
  131. desktop.setDesktopManager(oldDesktopManager);
  132. }
  133. }
  134. oldDesktopManager = null;
  135. super.uninstallDesktopManager();
  136. }
  137. static class TaskBar extends JPanel implements ComponentListener, ContainerListener {
  138. TaskBar() {
  139. setOpaque(true);
  140. setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0) {
  141. public void layoutContainer(Container target) {
  142. // First shrink buttons to fit
  143. Component[] comps = target.getComponents();
  144. int n = comps.length;
  145. if (n > 0) {
  146. // Start with the largest preferred width
  147. int prefWidth = 0;
  148. for (Component c : comps) {
  149. c.setPreferredSize(null);
  150. Dimension prefSize = c.getPreferredSize();
  151. if (prefSize.width > prefWidth) {
  152. prefWidth = prefSize.width;
  153. }
  154. }
  155. // Shrink equally to fit if needed
  156. Insets insets = target.getInsets();
  157. int tw = target.getWidth() - insets.left - insets.right;
  158. int w = Math.min(prefWidth, Math.max(10, twn));
  159. for (Component c : comps) {
  160. Dimension prefSize = c.getPreferredSize();
  161. c.setPreferredSize(new Dimension(w, prefSize.height));
  162. }
  163. }
  164. super.layoutContainer(target);
  165. }
  166. });
  167. // PENDING: This should be handled by the painter
  168. setBorder(new BevelBorder(BevelBorder.RAISED) {
  169. protected void paintRaisedBevel(Component c, Graphics g,
  170. int x, int y, int w, int h) {
  171. Color oldColor = g.getColor();
  172. g.translate(x, y);
  173. g.setColor(getHighlightOuterColor(c));
  174. g.drawLine(0, 0, 0, h-2);
  175. g.drawLine(1, 0, w-2, 0);
  176. g.setColor(getShadowOuterColor(c));
  177. g.drawLine(0, h-1, w-1, h-1);
  178. g.drawLine(w-1, 0, w-1, h-2);
  179. g.translate(-x, -y);
  180. g.setColor(oldColor);
  181. }
  182. });
  183. }
  184. void adjustSize() {
  185. JDesktopPane desktop = (JDesktopPane)getParent();
  186. if (desktop != null) {
  187. int height = getPreferredSize().height;
  188. Insets insets = getInsets();
  189. if (height == insets.top + insets.bottom) {
  190. if (getHeight() <= height) {
  191. // Initial size, because we have no buttons yet
  192. height += 21;
  193. } else {
  194. // We already have a good height
  195. height = getHeight();
  196. }
  197. }
  198. setBounds(0, desktop.getHeight() - height, desktop.getWidth(), height);
  199. revalidate();
  200. repaint();
  201. }
  202. }
  203. // ComponentListener interface
  204. public void componentResized(ComponentEvent e) {
  205. if (e.getSource() instanceof JDesktopPane) {
  206. adjustSize();
  207. }
  208. }
  209. public void componentMoved(ComponentEvent e){}
  210. public void componentShown(ComponentEvent e) {
  211. if (e.getSource() instanceof JInternalFrame) {
  212. adjustSize();
  213. }
  214. }
  215. public void componentHidden(ComponentEvent e) {
  216. if (e.getSource() instanceof JInternalFrame) {
  217. ((JInternalFrame)e.getSource()).getDesktopIcon().setVisible(false);
  218. revalidate();
  219. }
  220. }
  221. // ContainerListener interface
  222. public void componentAdded(ContainerEvent e) {
  223. if (e.getChild() instanceof JInternalFrame) {
  224. JDesktopPane desktop = (JDesktopPane)e.getSource();
  225. JInternalFrame f = (JInternalFrame)e.getChild();
  226. JInternalFrame.JDesktopIcon desktopIcon = f.getDesktopIcon();
  227. for (Component comp : getComponents()) {
  228. if (comp == desktopIcon) {
  229. // We have it already
  230. return;
  231. }
  232. }
  233. add(desktopIcon);
  234. f.addComponentListener(this);
  235. if (getComponentCount() == 1) {
  236. adjustSize();
  237. }
  238. }
  239. }
  240. public void componentRemoved(ContainerEvent e) {
  241. if (e.getChild() instanceof JInternalFrame) {
  242. JInternalFrame f = (JInternalFrame)e.getChild();
  243. if (!f.isIcon()) {
  244. // Frame was removed without using setClosed(true)
  245. remove(f.getDesktopIcon());
  246. f.removeComponentListener(this);
  247. revalidate();
  248. repaint();
  249. }
  250. }
  251. }
  252. }
  253. class SynthDesktopManager extends DefaultDesktopManager implements UIResource {
  254. public void maximizeFrame(JInternalFrame f) {
  255. if (f.isIcon()) {
  256. try {
  257. f.setIcon(false);
  258. } catch (PropertyVetoException e2) {
  259. }
  260. } else {
  261. f.setNormalBounds(f.getBounds());
  262. Component desktop = f.getParent();
  263. setBoundsForFrame(f, 0, 0,
  264. desktop.getWidth(),
  265. desktop.getHeight() - taskBar.getHeight());
  266. }
  267. try {
  268. f.setSelected(true);
  269. } catch (PropertyVetoException e2) {
  270. }
  271. }
  272. public void iconifyFrame(JInternalFrame f) {
  273. JInternalFrame.JDesktopIcon desktopIcon;
  274. Container c = f.getParent();
  275. JDesktopPane d = f.getDesktopPane();
  276. boolean findNext = f.isSelected();
  277. if (c == null) {
  278. return;
  279. }
  280. desktopIcon = f.getDesktopIcon();
  281. if (!f.isMaximum()) {
  282. f.setNormalBounds(f.getBounds());
  283. }
  284. c.remove(f);
  285. c.repaint(f.getX(), f.getY(), f.getWidth(), f.getHeight());
  286. try {
  287. f.setSelected(false);
  288. } catch (PropertyVetoException e2) {
  289. }
  290. // Get topmost of the remaining frames
  291. if (findNext) {
  292. for (Component comp : c.getComponents()) {
  293. if (comp instanceof JInternalFrame) {
  294. try {
  295. ((JInternalFrame)comp).setSelected(true);
  296. } catch (PropertyVetoException e2) {
  297. }
  298. ((JInternalFrame)comp).moveToFront();
  299. return;
  300. }
  301. }
  302. }
  303. }
  304. public void deiconifyFrame(JInternalFrame f) {
  305. JInternalFrame.JDesktopIcon desktopIcon = f.getDesktopIcon();
  306. Container c = desktopIcon.getParent();
  307. if (c != null) {
  308. c = c.getParent();
  309. if (c != null) {
  310. c.add(f);
  311. if (f.isMaximum()) {
  312. int w = c.getWidth();
  313. int h = c.getHeight() - taskBar.getHeight();
  314. if (f.getWidth() != w || f.getHeight() != h) {
  315. setBoundsForFrame(f, 0, 0, w, h);
  316. }
  317. }
  318. if (f.isSelected()) {
  319. f.moveToFront();
  320. } else {
  321. try {
  322. f.setSelected(true);
  323. } catch (PropertyVetoException e2) {
  324. }
  325. }
  326. }
  327. }
  328. }
  329. protected void removeIconFor(JInternalFrame f) {
  330. super.removeIconFor(f);
  331. taskBar.validate();
  332. }
  333. public void setBoundsForFrame(JComponent f, int newX, int newY, int newWidth, int newHeight) {
  334. super.setBoundsForFrame(f, newX, newY, newWidth, newHeight);
  335. if (taskBar != null && newY >= taskBar.getY()) {
  336. f.setLocation(f.getX(), taskBar.getY()-f.getInsets().top);
  337. }
  338. }
  339. }
  340. public SynthContext getContext(JComponent c) {
  341. return getContext(c, getComponentState(c));
  342. }
  343. private SynthContext getContext(JComponent c, int state) {
  344. return SynthContext.getContext(SynthContext.class, c,
  345. SynthLookAndFeel.getRegion(c), style, state);
  346. }
  347. private Region getRegion(JComponent c) {
  348. return SynthLookAndFeel.getRegion(c);
  349. }
  350. private int getComponentState(JComponent c) {
  351. return SynthLookAndFeel.getComponentState(c);
  352. }
  353. public void update(Graphics g, JComponent c) {
  354. SynthContext context = getContext(c);
  355. SynthLookAndFeel.update(context, g);
  356. context.getPainter().paintDesktopPaneBackground(context, g, 0, 0,
  357. c.getWidth(), c.getHeight());
  358. paint(context, g);
  359. context.dispose();
  360. }
  361. public void paint(Graphics g, JComponent c) {
  362. SynthContext context = getContext(c);
  363. paint(context, g);
  364. context.dispose();
  365. }
  366. protected void paint(SynthContext context, Graphics g) {
  367. }
  368. public void paintBorder(SynthContext context, Graphics g, int x,
  369. int y, int w, int h) {
  370. context.getPainter().paintDesktopPaneBorder(context, g, x, y, w, h);
  371. }
  372. public void propertyChange(PropertyChangeEvent evt) {
  373. if (SynthLookAndFeel.shouldUpdateStyle(evt)) {
  374. updateStyle((JDesktopPane)evt.getSource());
  375. }
  376. if (evt.getPropertyName() == "ancestor" && taskBar != null) {
  377. taskBar.adjustSize();
  378. }
  379. }
  380. }