1. /*
  2. * @(#)MetalToolBarUI.java 1.33 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.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.GraphicsEnvironment;
  16. import java.awt.Insets;
  17. import java.awt.Point;
  18. import java.awt.Rectangle;
  19. import java.awt.event.*;
  20. import java.beans.PropertyChangeListener;
  21. import javax.swing.event.*;
  22. import javax.swing.border.*;
  23. import javax.swing.plaf.*;
  24. import javax.swing.plaf.basic.*;
  25. /**
  26. * A Metal Look and Feel implementation of ToolBarUI. This implementation
  27. * is a "combined" view/controller.
  28. * <p>
  29. *
  30. * @version 1.33 01/23/03
  31. * @author Jeff Shapiro
  32. */
  33. public class MetalToolBarUI extends BasicToolBarUI
  34. {
  35. /**
  36. * This protected field is implemenation specific. Do not access directly
  37. * or override. Use the create method instead.
  38. *
  39. * @see #createContainerListener
  40. */
  41. protected ContainerListener contListener;
  42. /**
  43. * This protected field is implemenation specific. Do not access directly
  44. * or override. Use the create method instead.
  45. *
  46. * @see #createRolloverListener
  47. */
  48. protected PropertyChangeListener rolloverListener;
  49. private static Border nonRolloverBorder;
  50. public static ComponentUI createUI( JComponent c )
  51. {
  52. return new MetalToolBarUI();
  53. }
  54. public void installUI( JComponent c )
  55. {
  56. super.installUI( c );
  57. }
  58. public void uninstallUI( JComponent c )
  59. {
  60. super.uninstallUI( c );
  61. nonRolloverBorder = null;
  62. }
  63. protected void installListeners() {
  64. super.installListeners();
  65. contListener = createContainerListener();
  66. if (contListener != null) {
  67. toolBar.addContainerListener(contListener);
  68. }
  69. rolloverListener = createRolloverListener();
  70. if (rolloverListener != null) {
  71. toolBar.addPropertyChangeListener(rolloverListener);
  72. }
  73. }
  74. protected void uninstallListeners() {
  75. super.uninstallListeners();
  76. if (contListener != null) {
  77. toolBar.removeContainerListener(contListener);
  78. }
  79. rolloverListener = createRolloverListener();
  80. if (rolloverListener != null) {
  81. toolBar.removePropertyChangeListener(rolloverListener);
  82. }
  83. }
  84. protected Border createRolloverBorder() {
  85. return new BorderUIResource.CompoundBorderUIResource(new MetalBorders.RolloverButtonBorder(),
  86. new MetalBorders.RolloverMarginBorder());
  87. }
  88. protected Border createNonRolloverBorder() {
  89. return new BorderUIResource.CompoundBorderUIResource(new MetalBorders.ButtonBorder(),
  90. new MetalBorders.RolloverMarginBorder());
  91. }
  92. /**
  93. * Creates a non rollover border for Toggle buttons in the toolbar.
  94. */
  95. private Border createNonRolloverToggleBorder() {
  96. return createNonRolloverBorder();
  97. }
  98. protected void setBorderToNonRollover(Component c) {
  99. super.setBorderToNonRollover(c);
  100. if (c instanceof AbstractButton) {
  101. AbstractButton b = (AbstractButton)c;
  102. if (b.getBorder() instanceof UIResource) {
  103. if (b instanceof JToggleButton && !(b instanceof JCheckBox)) {
  104. // only install this border for the ToggleButton
  105. if (nonRolloverBorder == null) {
  106. nonRolloverBorder = createNonRolloverToggleBorder();
  107. }
  108. b.setBorder(nonRolloverBorder);
  109. }
  110. }
  111. }
  112. }
  113. /**
  114. * Creates a container listener that will be added to the JToolBar.
  115. * If this method returns null then it will not be added to the
  116. * toolbar.
  117. *
  118. * @return an instance of a <code>ContainerListener</code> or null
  119. */
  120. protected ContainerListener createContainerListener() {
  121. return null;
  122. }
  123. /**
  124. * Creates a property change listener that will be added to the JToolBar.
  125. * If this method returns null then it will not be added to the
  126. * toolbar.
  127. *
  128. * @return an instance of a <code>PropertyChangeListener</code> or null
  129. */
  130. protected PropertyChangeListener createRolloverListener() {
  131. return null;
  132. }
  133. protected MouseInputListener createDockingListener( )
  134. {
  135. return new MetalDockingListener( toolBar );
  136. }
  137. protected void setDragOffset(Point p) {
  138. if (!GraphicsEnvironment.isHeadless()) {
  139. if (dragWindow == null) {
  140. dragWindow = createDragWindow(toolBar);
  141. }
  142. dragWindow.setOffset(p);
  143. }
  144. }
  145. // No longer used. Cannot remove for compatibility reasons
  146. protected class MetalContainerListener
  147. extends BasicToolBarUI.ToolBarContListener {}
  148. // No longer used. Cannot remove for compatibility reasons
  149. protected class MetalRolloverListener
  150. extends BasicToolBarUI.PropertyListener {}
  151. protected class MetalDockingListener extends DockingListener {
  152. private boolean pressedInBumps = false;
  153. public MetalDockingListener(JToolBar t) {
  154. super(t);
  155. }
  156. public void mousePressed(MouseEvent e) {
  157. super.mousePressed(e);
  158. if (!toolBar.isEnabled()) {
  159. return;
  160. }
  161. pressedInBumps = false;
  162. Rectangle bumpRect = new Rectangle();
  163. if (toolBar.getOrientation() == JToolBar.HORIZONTAL) {
  164. int x = MetalUtils.isLeftToRight(toolBar) ? 0 : toolBar.getSize().width-14;
  165. bumpRect.setBounds(x, 0, 14, toolBar.getSize().height);
  166. } else { // vertical
  167. bumpRect.setBounds(0, 0, toolBar.getSize().width, 14);
  168. }
  169. if (bumpRect.contains(e.getPoint())) {
  170. pressedInBumps = true;
  171. Point dragOffset = e.getPoint();
  172. if (!MetalUtils.isLeftToRight(toolBar)) {
  173. dragOffset.x -= (toolBar.getSize().width
  174. - toolBar.getPreferredSize().width);
  175. }
  176. setDragOffset(dragOffset);
  177. }
  178. }
  179. public void mouseDragged(MouseEvent e) {
  180. if (pressedInBumps) {
  181. super.mouseDragged(e);
  182. }
  183. }
  184. } // end class MetalDockingListener
  185. }