1. /*
  2. * @(#)DefaultRGBChooserPanel.java 1.31 03/01/23
  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.colorchooser;
  8. import javax.swing.*;
  9. import javax.swing.event.*;
  10. import java.awt.*;
  11. /**
  12. * The standard RGB chooser.
  13. * <p>
  14. * <strong>Warning:</strong>
  15. * Serialized objects of this class will not be compatible with
  16. * future Swing releases. The current serialization support is
  17. * appropriate for short term storage or RMI between applications running
  18. * the same version of Swing. As of 1.4, support for long term storage
  19. * of all JavaBeans<sup><font size="-2">TM</font></sup>
  20. * has been added to the <code>java.beans</code> package.
  21. * Please see {@link java.beans.XMLEncoder}.
  22. *
  23. * @version 1.31 01/23/03
  24. * @author Steve Wilson
  25. * @author Mark Davidson
  26. * @see JColorChooser
  27. * @see AbstractColorChooserPanel
  28. */
  29. class DefaultRGBChooserPanel extends AbstractColorChooserPanel implements ChangeListener {
  30. protected JSlider redSlider;
  31. protected JSlider greenSlider;
  32. protected JSlider blueSlider;
  33. protected JSpinner redField;
  34. protected JSpinner blueField;
  35. protected JSpinner greenField;
  36. private final int minValue = 0;
  37. private final int maxValue = 255;
  38. private boolean isAdjusting = false; // indicates the fields are being set internally
  39. public DefaultRGBChooserPanel() {
  40. super();
  41. }
  42. /**
  43. * Sets the values of the controls to reflect the color
  44. */
  45. private void setColor( Color newColor ) {
  46. int red = newColor.getRed();
  47. int blue = newColor.getBlue();
  48. int green = newColor.getGreen();
  49. if (redSlider.getValue() != red) {
  50. redSlider.setValue(red);
  51. }
  52. if (greenSlider.getValue() != green) {
  53. greenSlider.setValue(green);
  54. }
  55. if (blueSlider.getValue() != blue) {
  56. blueSlider.setValue(blue);
  57. }
  58. if (((Integer)redField.getValue()).intValue() != red)
  59. redField.setValue(new Integer(red));
  60. if (((Integer)greenField.getValue()).intValue() != green)
  61. greenField.setValue(new Integer(green));
  62. if (((Integer)blueField.getValue()).intValue() != blue )
  63. blueField.setValue(new Integer(blue));
  64. }
  65. public String getDisplayName() {
  66. return UIManager.getString("ColorChooser.rgbNameText");
  67. }
  68. /**
  69. * Provides a hint to the look and feel as to the
  70. * <code>KeyEvent.VK</code> constant that can be used as a mnemonic to
  71. * access the panel. A return value <= 0 indicates there is no mnemonic.
  72. * <p>
  73. * The return value here is a hint, it is ultimately up to the look
  74. * and feel to honor the return value in some meaningful way.
  75. * <p>
  76. * This implementation looks up the value from the default
  77. * <code>ColorChooser.rgbMnemonic</code>, or if it
  78. * isn't available (or not an <code>Integer</code>) returns -1.
  79. * The lookup for the default is done through the <code>UIManager</code>:
  80. * <code>UIManager.get("ColorChooser.rgbMnemonic");</code>.
  81. *
  82. * @return KeyEvent.VK constant identifying the mnemonic; <= 0 for no
  83. * mnemonic
  84. * @see #getDisplayedMnemonicIndex
  85. * @since 1.4
  86. */
  87. public int getMnemonic() {
  88. return getInt("ColorChooser.rgbMnemonic", -1);
  89. }
  90. /**
  91. * Provides a hint to the look and feel as to the index of the character in
  92. * <code>getDisplayName</code> that should be visually identified as the
  93. * mnemonic. The look and feel should only use this if
  94. * <code>getMnemonic</code> returns a value > 0.
  95. * <p>
  96. * The return value here is a hint, it is ultimately up to the look
  97. * and feel to honor the return value in some meaningful way. For example,
  98. * a look and feel may wish to render each
  99. * <code>AbstractColorChooserPanel</code> in a <code>JTabbedPane</code>,
  100. * and further use this return value to underline a character in
  101. * the <code>getDisplayName</code>.
  102. * <p>
  103. * This implementation looks up the value from the default
  104. * <code>ColorChooser.rgbDisplayedMnemonicIndex</code>, or if it
  105. * isn't available (or not an <code>Integer</code>) returns -1.
  106. * The lookup for the default is done through the <code>UIManager</code>:
  107. * <code>UIManager.get("ColorChooser.rgbDisplayedMnemonicIndex");</code>.
  108. *
  109. * @return Character index to render mnemonic for; -1 to provide no
  110. * visual identifier for this panel.
  111. * @see #getMnemonic
  112. * @since 1.4
  113. */
  114. public int getDisplayedMnemonicIndex() {
  115. return getInt("ColorChooser.rgbDisplayedMnemonicIndex", -1);
  116. }
  117. public Icon getSmallDisplayIcon() {
  118. return null;
  119. }
  120. public Icon getLargeDisplayIcon() {
  121. return null;
  122. }
  123. /**
  124. * The background color, foreground color, and font are already set to the
  125. * defaults from the defaults table before this method is called.
  126. */
  127. public void installChooserPanel(JColorChooser enclosingChooser) {
  128. super.installChooserPanel(enclosingChooser);
  129. }
  130. protected void buildChooser() {
  131. String redString = UIManager.getString("ColorChooser.rgbRedText");
  132. String greenString = UIManager.getString("ColorChooser.rgbGreenText");
  133. String blueString = UIManager.getString("ColorChooser.rgbBlueText");
  134. setLayout( new BorderLayout() );
  135. Color color = getColorFromModel();
  136. JPanel enclosure = new JPanel();
  137. enclosure.setLayout( new SmartGridLayout( 3, 3 ) );
  138. // The panel that holds the sliders
  139. add( enclosure, BorderLayout.CENTER );
  140. // sliderPanel.setBorder(new LineBorder(Color.black));
  141. // The row for the red value
  142. JLabel l = new JLabel(redString);
  143. l.setDisplayedMnemonic(AbstractColorChooserPanel.getInt("ColorChooser.rgbRedMnemonic", -1));
  144. enclosure.add(l);
  145. redSlider = new JSlider(JSlider.HORIZONTAL, 0, 255, color.getRed());
  146. redSlider.setMajorTickSpacing( 85 );
  147. redSlider.setMinorTickSpacing( 17 );
  148. redSlider.setPaintTicks( true );
  149. redSlider.setPaintLabels( true );
  150. enclosure.add( redSlider );
  151. redField = new JSpinner(
  152. new SpinnerNumberModel(color.getRed(), minValue, maxValue, 1));
  153. l.setLabelFor(redSlider);
  154. JPanel redFieldHolder = new JPanel(new CenterLayout());
  155. redField.addChangeListener(this);
  156. redFieldHolder.add(redField);
  157. enclosure.add(redFieldHolder);
  158. // The row for the green value
  159. l = new JLabel(greenString);
  160. l.setDisplayedMnemonic(AbstractColorChooserPanel.getInt("ColorChooser.rgbGreenMnemonic", -1));
  161. enclosure.add(l);
  162. greenSlider = new JSlider(JSlider.HORIZONTAL, 0, 255, color.getGreen());
  163. greenSlider.setMajorTickSpacing( 85 );
  164. greenSlider.setMinorTickSpacing( 17 );
  165. greenSlider.setPaintTicks( true );
  166. greenSlider.setPaintLabels( true );
  167. enclosure.add(greenSlider);
  168. greenField = new JSpinner(
  169. new SpinnerNumberModel(color.getGreen(), minValue, maxValue, 1));
  170. l.setLabelFor(greenSlider);
  171. JPanel greenFieldHolder = new JPanel(new CenterLayout());
  172. greenFieldHolder.add(greenField);
  173. greenField.addChangeListener(this);
  174. enclosure.add(greenFieldHolder);
  175. // The slider for the blue value
  176. l = new JLabel(blueString);
  177. l.setDisplayedMnemonic(AbstractColorChooserPanel.getInt("ColorChooser.rgbBlueMnemonic", -1));
  178. enclosure.add(l);
  179. blueSlider = new JSlider(JSlider.HORIZONTAL, 0, 255, color.getBlue());
  180. blueSlider.setMajorTickSpacing( 85 );
  181. blueSlider.setMinorTickSpacing( 17 );
  182. blueSlider.setPaintTicks( true );
  183. blueSlider.setPaintLabels( true );
  184. enclosure.add(blueSlider);
  185. blueField = new JSpinner(
  186. new SpinnerNumberModel(color.getBlue(), minValue, maxValue, 1));
  187. l.setLabelFor(blueSlider);
  188. JPanel blueFieldHolder = new JPanel(new CenterLayout());
  189. blueFieldHolder.add(blueField);
  190. blueField.addChangeListener(this);
  191. enclosure.add(blueFieldHolder);
  192. redSlider.addChangeListener( this );
  193. greenSlider.addChangeListener( this );
  194. blueSlider.addChangeListener( this );
  195. redSlider.putClientProperty("JSlider.isFilled", Boolean.TRUE);
  196. greenSlider.putClientProperty("JSlider.isFilled", Boolean.TRUE);
  197. blueSlider.putClientProperty("JSlider.isFilled", Boolean.TRUE);
  198. }
  199. public void uninstallChooserPanel(JColorChooser enclosingChooser) {
  200. super.uninstallChooserPanel(enclosingChooser);
  201. removeAll();
  202. }
  203. public void updateChooser() {
  204. if (!isAdjusting) {
  205. isAdjusting = true;
  206. setColor(getColorFromModel());
  207. isAdjusting = false;
  208. }
  209. }
  210. public void stateChanged( ChangeEvent e ) {
  211. if ( e.getSource() instanceof JSlider && !isAdjusting) {
  212. int red = redSlider.getValue();
  213. int green = greenSlider.getValue();
  214. int blue = blueSlider.getValue() ;
  215. Color color = new Color (red, green, blue);
  216. getColorSelectionModel().setSelectedColor(color);
  217. } else if (e.getSource() instanceof JSpinner && !isAdjusting) {
  218. int red = ((Integer)redField.getValue()).intValue();
  219. int green = ((Integer)greenField.getValue()).intValue();
  220. int blue = ((Integer)blueField.getValue()).intValue();
  221. Color color = new Color (red, green, blue);
  222. getColorSelectionModel().setSelectedColor(color);
  223. }
  224. }
  225. }