1. /*
  2. * @(#)MetalToolBarUI.java 1.19 01/11/29
  3. *
  4. * Copyright 2002 Sun Microsystems, Inc. All rights reserved.
  5. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
  6. */
  7. package javax.swing.plaf.metal;
  8. import javax.swing.*;
  9. import java.awt.Color;
  10. import java.awt.Component;
  11. import java.awt.Container;
  12. import java.awt.Dimension;
  13. import java.awt.Frame;
  14. import java.awt.Graphics;
  15. import java.awt.Insets;
  16. import java.awt.Point;
  17. import java.awt.Rectangle;
  18. import java.awt.event.*;
  19. import java.util.*;
  20. import java.beans.PropertyChangeListener;
  21. import java.beans.PropertyChangeEvent;
  22. import java.beans.PropertyVetoException;
  23. import javax.swing.event.*;
  24. import javax.swing.border.*;
  25. import javax.swing.plaf.*;
  26. import javax.swing.plaf.basic.*;
  27. /**
  28. * A Metal Look and Feel implementation of ToolBarUI. This implementation
  29. * is a "combined" view/controller.
  30. * <p>
  31. *
  32. * @version 1.19 11/29/01
  33. * @author Jeff Shapiro
  34. */
  35. public class MetalToolBarUI extends BasicToolBarUI
  36. {
  37. private static Border rolloverBorder = new CompoundBorder(
  38. new MetalBorders.RolloverButtonBorder(), new BasicBorders.MarginBorder() );
  39. private static Border nonRolloverBorder = new CompoundBorder(
  40. new MetalBorders.ButtonBorder(), new BasicBorders.MarginBorder() );
  41. protected ContainerListener contListener;
  42. protected PropertyChangeListener rolloverListener;
  43. private Hashtable borderTable = new Hashtable();
  44. private Hashtable marginTable = new Hashtable();
  45. private boolean rolloverBorders = false;
  46. private static String IS_ROLLOVER = "JToolBar.isRollover";
  47. private final static Insets insets0 = new Insets( 0, 0, 0, 0 );
  48. public static ComponentUI createUI( JComponent c )
  49. {
  50. return new MetalToolBarUI();
  51. }
  52. public void installUI( JComponent c )
  53. {
  54. super.installUI( c );
  55. Object rolloverProp = c.getClientProperty( IS_ROLLOVER );
  56. if ( rolloverProp != null )
  57. {
  58. rolloverBorders = ((Boolean)rolloverProp).booleanValue();
  59. }
  60. else
  61. {
  62. rolloverBorders = false;
  63. }
  64. SwingUtilities.invokeLater( new Runnable()
  65. {
  66. public void run()
  67. {
  68. setRolloverBorders( isRolloverBorders() );
  69. }
  70. });
  71. }
  72. public void uninstallUI( JComponent c )
  73. {
  74. super.uninstallUI( c );
  75. installNormalBorders( c );
  76. }
  77. protected void installListeners( )
  78. {
  79. super.installListeners( );
  80. contListener = createContainerListener( );
  81. if ( contListener != null ) toolBar.addContainerListener( contListener );
  82. rolloverListener = createRolloverListener( );
  83. if ( rolloverListener != null ) toolBar.addPropertyChangeListener( rolloverListener );
  84. }
  85. protected void uninstallListeners( )
  86. {
  87. super.uninstallListeners( );
  88. if ( contListener != null ) toolBar.removeContainerListener( contListener );
  89. contListener = null;
  90. if ( rolloverListener != null ) toolBar.removePropertyChangeListener( rolloverListener );
  91. rolloverListener = null;
  92. }
  93. protected ContainerListener createContainerListener( )
  94. {
  95. return new MetalContainerListener( );
  96. }
  97. protected PropertyChangeListener createRolloverListener( )
  98. {
  99. return new MetalRolloverListener( );
  100. }
  101. protected MouseInputListener createDockingListener( )
  102. {
  103. return new MetalDockingListener( toolBar );
  104. }
  105. protected void setDragOffset( Point p )
  106. {
  107. if (dragWindow == null)
  108. dragWindow = createDragWindow(toolBar);
  109. dragWindow.setOffset( p );
  110. }
  111. public boolean isRolloverBorders()
  112. {
  113. return rolloverBorders;
  114. }
  115. public void setRolloverBorders( boolean rollover )
  116. {
  117. rolloverBorders = rollover;
  118. if ( rolloverBorders )
  119. {
  120. installRolloverBorders( toolBar );
  121. }
  122. else
  123. {
  124. installNonRolloverBorders( toolBar );
  125. }
  126. }
  127. protected void installRolloverBorders ( JComponent c )
  128. {
  129. // Put rollover borders on buttons
  130. Component[] components = c.getComponents();
  131. for ( int i = 0; i < components.length; ++i )
  132. {
  133. if ( components[ i ] instanceof JComponent )
  134. {
  135. ( (JComponent)components[ i ] ).updateUI();
  136. setBorderToRollover( components[ i ] );
  137. }
  138. }
  139. }
  140. protected void installNonRolloverBorders ( JComponent c )
  141. {
  142. // Put nonrollover borders on buttons
  143. Component[] components = c.getComponents();
  144. for ( int i = 0; i < components.length; ++i )
  145. {
  146. if ( components[ i ] instanceof JComponent )
  147. {
  148. ( (JComponent)components[ i ] ).updateUI();
  149. setBorderToNonRollover( components[ i ] );
  150. }
  151. }
  152. }
  153. protected void installNormalBorders ( JComponent c )
  154. {
  155. // Put back the normal borders on buttons
  156. Component[] components = c.getComponents();
  157. for ( int i = 0; i < components.length; ++i )
  158. {
  159. setBorderToNormal( components[ i ] );
  160. }
  161. }
  162. protected void setBorderToRollover( Component c )
  163. {
  164. if ( c instanceof JButton )
  165. {
  166. JButton b = (JButton)c;
  167. if ( b.getUI() instanceof MetalButtonUI )
  168. {
  169. if ( b.getBorder() instanceof UIResource )
  170. {
  171. borderTable.put( b, b.getBorder() );
  172. }
  173. if ( b.getBorder() instanceof UIResource || b.getBorder() == nonRolloverBorder )
  174. {
  175. b.setBorder( rolloverBorder );
  176. }
  177. if ( b.getMargin() == null || b.getMargin() instanceof UIResource )
  178. {
  179. marginTable.put( b, b.getMargin() );
  180. b.setMargin( insets0 );
  181. }
  182. b.setRolloverEnabled( true );
  183. }
  184. }
  185. }
  186. protected void setBorderToNonRollover( Component c )
  187. {
  188. if ( c instanceof JButton )
  189. {
  190. JButton b = (JButton)c;
  191. if ( b.getUI() instanceof MetalButtonUI )
  192. {
  193. if ( b.getBorder() instanceof UIResource )
  194. {
  195. borderTable.put( b, b.getBorder() );
  196. }
  197. if ( b.getBorder() instanceof UIResource || b.getBorder() == rolloverBorder )
  198. {
  199. b.setBorder( nonRolloverBorder );
  200. }
  201. if ( b.getMargin() == null || b.getMargin() instanceof UIResource )
  202. {
  203. marginTable.put( b, b.getMargin() );
  204. b.setMargin( insets0 );
  205. }
  206. b.setRolloverEnabled( false );
  207. }
  208. }
  209. }
  210. protected void setBorderToNormal( Component c )
  211. {
  212. if ( c instanceof JButton )
  213. {
  214. JButton b = (JButton)c;
  215. if ( b.getUI() instanceof MetalButtonUI )
  216. {
  217. if ( b.getBorder() == rolloverBorder || b.getBorder() == nonRolloverBorder )
  218. {
  219. b.setBorder( (Border)borderTable.remove( b ) );
  220. }
  221. if ( b.getMargin() == insets0 )
  222. {
  223. b.setMargin( (Insets)marginTable.remove( b ) );
  224. }
  225. b.setRolloverEnabled( false );
  226. }
  227. }
  228. }
  229. protected class MetalContainerListener implements ContainerListener
  230. {
  231. public void componentAdded( ContainerEvent e )
  232. {
  233. Component c = e.getChild();
  234. if ( rolloverBorders )
  235. {
  236. setBorderToRollover( c );
  237. }
  238. else
  239. {
  240. setBorderToNonRollover( c );
  241. }
  242. }
  243. public void componentRemoved( ContainerEvent e )
  244. {
  245. Component c = e.getChild();
  246. setBorderToNormal( c );
  247. }
  248. } // end class MetalContainerListener
  249. protected class MetalRolloverListener implements PropertyChangeListener
  250. {
  251. public void propertyChange( PropertyChangeEvent e )
  252. {
  253. String name = e.getPropertyName();
  254. if ( name.equals( IS_ROLLOVER ) )
  255. {
  256. if ( e.getNewValue() != null )
  257. {
  258. setRolloverBorders( ((Boolean)e.getNewValue()).booleanValue() );
  259. }
  260. else
  261. {
  262. setRolloverBorders( false );
  263. }
  264. }
  265. }
  266. } // end class MetalRolloverListener
  267. protected class MetalDockingListener extends DockingListener
  268. {
  269. private boolean pressedInBumps = false;
  270. public MetalDockingListener( JToolBar t )
  271. {
  272. super( t );
  273. }
  274. public void mousePressed( MouseEvent e )
  275. {
  276. super.mousePressed( e );
  277. if (!toolBar.isEnabled()) {
  278. return;
  279. }
  280. pressedInBumps = false;
  281. Rectangle bumpRect = new Rectangle();
  282. if ( toolBar.getSize().height <= toolBar.getSize().width ) // horizontal
  283. {
  284. if( MetalUtils.isLeftToRight(toolBar) ) {
  285. bumpRect.setBounds( 0, 0, 14, toolBar.getSize().height );
  286. } else {
  287. bumpRect.setBounds( toolBar.getSize().width-14, 0,
  288. 14, toolBar.getSize().height );
  289. }
  290. }
  291. else // vertical
  292. {
  293. bumpRect.setBounds( 0, 0, toolBar.getSize().width, 14 );
  294. }
  295. if ( bumpRect.contains( e.getPoint() ) )
  296. {
  297. pressedInBumps = true;
  298. Point dragOffset = e.getPoint();
  299. if( !MetalUtils.isLeftToRight(toolBar) ) {
  300. dragOffset.x -= toolBar.getSize().width
  301. - toolBar.getPreferredSize().width;
  302. }
  303. setDragOffset( dragOffset );
  304. }
  305. }
  306. public void mouseDragged( MouseEvent e )
  307. {
  308. if ( pressedInBumps )
  309. {
  310. super.mouseDragged( e );
  311. }
  312. }
  313. } // end class MetalDockingListener
  314. }