1. /*
  2. * @(#)BasicButtonListener.java 1.40 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.basic;
  8. import java.awt.*;
  9. import java.awt.event.*;
  10. import java.beans.*;
  11. import javax.swing.*;
  12. import javax.swing.event.*;
  13. /**
  14. * Button Listener
  15. *
  16. * @version 1.40 11/29/01
  17. * @author Jeff Dinkins
  18. * @author Arnaud Weber (keyboard UI support)
  19. */
  20. public class BasicButtonListener implements MouseListener, MouseMotionListener,
  21. FocusListener, ChangeListener, PropertyChangeListener
  22. {
  23. // used in mouseDragged
  24. private Rectangle tmpRect = new Rectangle();
  25. // Keyboard Actions used by the mnemonic accelerator and
  26. // the "spacebar" accelerator triggers
  27. private KeyStroke altPressedKeyStroke = null;
  28. private KeyStroke altReleasedKeyStroke = null;
  29. private KeyStroke nonAltReleasedKeyStroke = null;
  30. // These two keystrokes can be shared accross all buttons.
  31. private static KeyStroke spacePressedKeyStroke = null;
  32. private static KeyStroke spaceReleasedKeyStroke = null;
  33. public BasicButtonListener(AbstractButton b) {
  34. if(spacePressedKeyStroke == null) {
  35. spacePressedKeyStroke = KeyStroke.getKeyStroke(' ', 0, false);
  36. spaceReleasedKeyStroke = KeyStroke.getKeyStroke(' ', 0,true);
  37. }
  38. }
  39. public void propertyChange(PropertyChangeEvent e) {
  40. String prop = e.getPropertyName();
  41. if(prop.equals(AbstractButton.MNEMONIC_CHANGED_PROPERTY)) {
  42. uninstallKeyboardActions((AbstractButton) e.getSource());
  43. installKeyboardActions((AbstractButton) e.getSource());
  44. }
  45. if(prop.equals(AbstractButton.CONTENT_AREA_FILLED_CHANGED_PROPERTY)) {
  46. checkOpacity((AbstractButton) e.getSource() );
  47. }
  48. if(prop.equals(AbstractButton.TEXT_CHANGED_PROPERTY)) {
  49. AbstractButton b = (AbstractButton) e.getSource();
  50. BasicHTML.updateRenderer(b, b.getText());
  51. }
  52. }
  53. protected void checkOpacity(AbstractButton b) {
  54. b.setOpaque( b.isContentAreaFilled() );
  55. }
  56. /**
  57. * Register default key actions: pressing space to "click" a
  58. * button and registring the keyboard mnemonic (if any).
  59. */
  60. public void installKeyboardActions(JComponent c) {
  61. AbstractButton b = (AbstractButton) c;
  62. PressedAction pressedAction = new PressedAction(b);
  63. ReleasedAction releasedAction = new ReleasedAction(b);
  64. b.registerKeyboardAction(pressedAction, spacePressedKeyStroke, JComponent.WHEN_FOCUSED);
  65. b.registerKeyboardAction(releasedAction, spaceReleasedKeyStroke, JComponent.WHEN_FOCUSED);
  66. int m = b.getMnemonic();
  67. if(m != 0) {
  68. altPressedKeyStroke = KeyStroke.getKeyStroke(m, ActionEvent.ALT_MASK, false);
  69. altReleasedKeyStroke = KeyStroke.getKeyStroke(m, ActionEvent.ALT_MASK, true);
  70. nonAltReleasedKeyStroke = KeyStroke.getKeyStroke(m, 0, true);
  71. b.registerKeyboardAction(pressedAction, altPressedKeyStroke, JComponent.WHEN_IN_FOCUSED_WINDOW);
  72. b.registerKeyboardAction(releasedAction, altReleasedKeyStroke, JComponent.WHEN_IN_FOCUSED_WINDOW);
  73. b.registerKeyboardAction(releasedAction, nonAltReleasedKeyStroke, JComponent.WHEN_IN_FOCUSED_WINDOW);
  74. }
  75. }
  76. /**
  77. * Unregister's default key actions
  78. * @see #registerKeyboardActions
  79. */
  80. public void uninstallKeyboardActions(JComponent c) {
  81. AbstractButton b = (AbstractButton) c;
  82. // Don't null out the spacePressed/spaceReleased KeyStrokes,
  83. // they are shared accross all buttons
  84. if(spacePressedKeyStroke != null) {
  85. b.unregisterKeyboardAction(spacePressedKeyStroke);
  86. }
  87. if(spaceReleasedKeyStroke != null) {
  88. b.unregisterKeyboardAction(spaceReleasedKeyStroke);
  89. }
  90. if(altPressedKeyStroke != null) {
  91. b.unregisterKeyboardAction(altPressedKeyStroke);
  92. altPressedKeyStroke = null;
  93. }
  94. if(altReleasedKeyStroke != null) {
  95. b.unregisterKeyboardAction(altReleasedKeyStroke);
  96. altReleasedKeyStroke = null;
  97. }
  98. if(nonAltReleasedKeyStroke != null) {
  99. b.unregisterKeyboardAction(nonAltReleasedKeyStroke);
  100. nonAltReleasedKeyStroke = null;
  101. }
  102. }
  103. public void stateChanged(ChangeEvent e) {
  104. AbstractButton b = (AbstractButton) e.getSource();
  105. b.repaint();
  106. }
  107. public void focusGained(FocusEvent e) {
  108. AbstractButton b = (AbstractButton) e.getSource();
  109. if (b instanceof JButton && ((JButton)b).isDefaultCapable()) {
  110. JRootPane root = b.getRootPane();
  111. if (root != null) {
  112. root.setDefaultButton((JButton)b);
  113. }
  114. }
  115. b.repaint();
  116. }
  117. public void focusLost(FocusEvent e) {
  118. AbstractButton b = (AbstractButton) e.getSource();
  119. b.repaint();
  120. }
  121. public void mouseMoved(MouseEvent e) {
  122. };
  123. public void mouseDragged(MouseEvent e) {
  124. AbstractButton b = (AbstractButton) e.getSource();
  125. // HACK! We're forced to do this since mouseEnter and mouseExit aren't
  126. // reported while the mouse is down.
  127. ButtonModel model = b.getModel();
  128. if(model.isPressed()) {
  129. tmpRect.width = b.getWidth();
  130. tmpRect.height = b.getHeight();
  131. if(tmpRect.contains(e.getPoint())) {
  132. model.setArmed(true);
  133. } else {
  134. model.setArmed(false);
  135. }
  136. }
  137. };
  138. public void mouseClicked(MouseEvent e) {
  139. };
  140. public void mousePressed(MouseEvent e) {
  141. if ( SwingUtilities.isLeftMouseButton(e) ) {
  142. AbstractButton b = (AbstractButton) e.getSource();
  143. ButtonModel model = b.getModel();
  144. if (!model.isEnabled()) {
  145. // Disabled buttons ignore all input...
  146. return;
  147. }
  148. // But because of the mouseDragged hack above, we can't do setArmed
  149. // in mouseEnter. As a workaround, set it here just before setting
  150. // focus.
  151. model.setArmed(true);
  152. model.setPressed(true);
  153. if(!b.hasFocus()) {
  154. b.requestFocus();
  155. }
  156. }
  157. };
  158. public void mouseReleased(MouseEvent e) {
  159. AbstractButton b = (AbstractButton) e.getSource();
  160. ButtonModel model = b.getModel();
  161. model.setPressed(false);
  162. model.setArmed(false);
  163. };
  164. public void mouseEntered(MouseEvent e) {
  165. AbstractButton b = (AbstractButton) e.getSource();
  166. if(b.isRolloverEnabled()) {
  167. b.getModel().setRollover(true);
  168. }
  169. };
  170. public void mouseExited(MouseEvent e) {
  171. AbstractButton b = (AbstractButton) e.getSource();
  172. if(b.isRolloverEnabled()) {
  173. b.getModel().setRollover(false);
  174. }
  175. };
  176. static class PressedAction implements ActionListener {
  177. AbstractButton b = null;
  178. PressedAction(AbstractButton b) {
  179. this.b = b;
  180. }
  181. public void actionPerformed(ActionEvent e) {
  182. ButtonModel model = b.getModel();
  183. model.setArmed(true);
  184. model.setPressed(true);
  185. if(!b.hasFocus()) {
  186. b.requestFocus();
  187. }
  188. }
  189. public boolean isEnabled() {
  190. if(!b.getModel().isEnabled()) {
  191. return false;
  192. } else {
  193. return true;
  194. }
  195. }
  196. }
  197. static class ReleasedAction implements ActionListener {
  198. AbstractButton b = null;
  199. ReleasedAction(AbstractButton b) {
  200. this.b = b;
  201. }
  202. public void actionPerformed(ActionEvent e) {
  203. b.getModel().setPressed(false);
  204. }
  205. public boolean isEnabled() {
  206. if(!b.getModel().isEnabled()) {
  207. return false;
  208. } else {
  209. return true;
  210. }
  211. }
  212. }
  213. }