1. /*
  2. * @(#)BasicColorChooserUI.java 1.40 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.basic;
  8. import javax.swing.*;
  9. import javax.swing.colorchooser.*;
  10. import javax.swing.event.*;
  11. import javax.swing.border.*;
  12. import javax.swing.plaf.*;
  13. import java.util.*;
  14. import java.awt.*;
  15. import java.awt.image.*;
  16. import java.awt.event.*;
  17. import java.beans.PropertyChangeEvent;
  18. import java.beans.PropertyChangeListener;
  19. import java.io.Serializable;
  20. /**
  21. * Provides the basic look and feel for a JColorChooser.
  22. * <p>
  23. * @version 1.40 01/23/03
  24. * @author Tom Santos
  25. * @author Steve Wilson
  26. */
  27. public class BasicColorChooserUI extends ColorChooserUI
  28. {
  29. JColorChooser chooser;
  30. JTabbedPane tabbedPane;
  31. JPanel singlePanel;
  32. JPanel previewPanelHolder;
  33. JComponent previewPanel;
  34. MouseListener previewMouseListener;
  35. boolean isMultiPanel = false;
  36. private static TransferHandler defaultTransferHandler = new ColorTransferHandler();
  37. protected AbstractColorChooserPanel[] defaultChoosers;
  38. protected ChangeListener previewListener;
  39. protected PropertyChangeListener propertyChangeListener;
  40. public static ComponentUI createUI(JComponent c) {
  41. return new BasicColorChooserUI();
  42. }
  43. protected AbstractColorChooserPanel[] createDefaultChoosers() {
  44. AbstractColorChooserPanel[] panels = ColorChooserComponentFactory.getDefaultChooserPanels();
  45. return panels;
  46. }
  47. protected void uninstallDefaultChoosers() {
  48. for( int i = 0 ; i < defaultChoosers.length; i++) {
  49. chooser.removeChooserPanel( defaultChoosers[i] );
  50. }
  51. }
  52. public void installUI( JComponent c ) {
  53. chooser = (JColorChooser)c;
  54. super.installUI( c );
  55. installDefaults();
  56. installListeners();
  57. tabbedPane = new JTabbedPane();
  58. singlePanel = new JPanel(new CenterLayout());
  59. chooser.setLayout( new BorderLayout() );
  60. defaultChoosers = createDefaultChoosers();
  61. chooser.setChooserPanels(defaultChoosers);
  62. previewPanelHolder = new JPanel(new CenterLayout());
  63. String previewString = UIManager.getString("ColorChooser.previewText",
  64. chooser.getLocale());
  65. previewPanelHolder.setBorder(new TitledBorder(previewString));
  66. chooser.add(previewPanelHolder, BorderLayout.SOUTH);
  67. previewMouseListener = new MouseAdapter() {
  68. public void mousePressed(MouseEvent e) {
  69. if (chooser.getDragEnabled()) {
  70. TransferHandler th = chooser.getTransferHandler();
  71. th.exportAsDrag(chooser, e, TransferHandler.COPY);
  72. }
  73. }
  74. };
  75. installPreviewPanel();
  76. chooser.applyComponentOrientation(c.getComponentOrientation());
  77. }
  78. public void uninstallUI( JComponent c ) {
  79. chooser.remove(tabbedPane);
  80. chooser.remove(singlePanel);
  81. chooser.remove(previewPanelHolder);
  82. uninstallListeners();
  83. uninstallDefaultChoosers();
  84. uninstallDefaults();
  85. previewPanelHolder.remove(previewPanel);
  86. if (previewPanel instanceof UIResource) {
  87. chooser.setPreviewPanel(null);
  88. }
  89. previewPanelHolder = null;
  90. previewPanel = null;
  91. defaultChoosers = null;
  92. chooser = null;
  93. tabbedPane = null;
  94. }
  95. protected void installPreviewPanel() {
  96. if (previewPanel != null) {
  97. previewPanelHolder.remove(previewPanel);
  98. previewPanel.removeMouseListener(previewMouseListener);
  99. }
  100. previewPanel = chooser.getPreviewPanel();
  101. if ((previewPanel != null) && (previewPanelHolder != null) && (chooser != null) && (previewPanel.getSize().getHeight()+previewPanel.getSize().getWidth() == 0)) {
  102. chooser.remove(previewPanelHolder);
  103. return;
  104. }
  105. if (previewPanel == null || previewPanel instanceof UIResource) {
  106. previewPanel = ColorChooserComponentFactory.getPreviewPanel(); // get from table?
  107. chooser.setPreviewPanel(previewPanel);
  108. }
  109. previewPanel.setForeground(chooser.getColor());
  110. previewPanelHolder.add(previewPanel);
  111. previewPanel.addMouseListener(previewMouseListener);
  112. }
  113. protected void installDefaults() {
  114. LookAndFeel.installColorsAndFont(chooser, "ColorChooser.background",
  115. "ColorChooser.foreground",
  116. "ColorChooser.font");
  117. TransferHandler th = chooser.getTransferHandler();
  118. if (th == null || th instanceof UIResource) {
  119. chooser.setTransferHandler(defaultTransferHandler);
  120. }
  121. }
  122. protected void uninstallDefaults() {
  123. if (chooser.getTransferHandler() instanceof UIResource) {
  124. chooser.setTransferHandler(null);
  125. }
  126. }
  127. protected void installListeners() {
  128. propertyChangeListener = createPropertyChangeListener();
  129. chooser.addPropertyChangeListener( propertyChangeListener );
  130. previewListener = new PreviewListener();
  131. chooser.getSelectionModel().addChangeListener(previewListener);
  132. }
  133. protected PropertyChangeListener createPropertyChangeListener() {
  134. return new PropertyHandler();
  135. }
  136. protected void uninstallListeners() {
  137. chooser.removePropertyChangeListener( propertyChangeListener );
  138. chooser.getSelectionModel().removeChangeListener(previewListener);
  139. previewPanel.removeMouseListener(previewMouseListener);
  140. }
  141. class PreviewListener implements ChangeListener {
  142. public void stateChanged( ChangeEvent e ) {
  143. ColorSelectionModel model = (ColorSelectionModel)e.getSource();
  144. if (previewPanel != null) {
  145. previewPanel.setForeground(model.getSelectedColor());
  146. previewPanel.repaint();
  147. }
  148. }
  149. }
  150. /**
  151. * This inner class is marked "public" due to a compiler bug.
  152. * This class should be treated as a "protected" inner class.
  153. * Instantiate it only within subclasses of <Foo>.
  154. */
  155. public class PropertyHandler implements PropertyChangeListener {
  156. public void propertyChange(PropertyChangeEvent e) {
  157. if ( e.getPropertyName().equals( JColorChooser.CHOOSER_PANELS_PROPERTY ) ) {
  158. AbstractColorChooserPanel[] oldPanels = (AbstractColorChooserPanel[]) e.getOldValue();
  159. AbstractColorChooserPanel[] newPanels = (AbstractColorChooserPanel[]) e.getNewValue();
  160. for (int i = 0; i < oldPanels.length; i++) { // remove old panels
  161. Container wrapper = oldPanels[i].getParent();
  162. if (wrapper != null) {
  163. Container parent = wrapper.getParent();
  164. if (parent != null)
  165. parent.remove(wrapper); // remove from hierarchy
  166. oldPanels[i].uninstallChooserPanel(chooser); // uninstall
  167. }
  168. }
  169. int numNewPanels = newPanels.length;
  170. if (numNewPanels == 0) { // removed all panels and added none
  171. chooser.remove(tabbedPane);
  172. return;
  173. }
  174. else if (numNewPanels == 1) { // one panel case
  175. chooser.remove(tabbedPane);
  176. JPanel centerWrapper = new JPanel( new CenterLayout() );
  177. centerWrapper.add(newPanels[0]);
  178. singlePanel.add(centerWrapper, BorderLayout.CENTER);
  179. chooser.add(singlePanel);
  180. }
  181. else { // multi-panel case
  182. if ( oldPanels.length < 2 ) {// moving from single to multiple
  183. chooser.remove(singlePanel);
  184. chooser.add(tabbedPane, BorderLayout.CENTER);
  185. }
  186. for (int i = 0; i < newPanels.length; i++) {
  187. JPanel centerWrapper = new JPanel( new CenterLayout() );
  188. String name = newPanels[i].getDisplayName();
  189. int mnemonic = newPanels[i].getMnemonic();
  190. centerWrapper.add(newPanels[i]);
  191. tabbedPane.addTab(name, centerWrapper);
  192. if (mnemonic > 0) {
  193. tabbedPane.setMnemonicAt(i, mnemonic);
  194. tabbedPane.setDisplayedMnemonicIndexAt(
  195. i, newPanels[i].getDisplayedMnemonicIndex());
  196. }
  197. }
  198. }
  199. chooser.applyComponentOrientation(chooser.getComponentOrientation());
  200. for (int i = 0; i < newPanels.length; i++) {
  201. newPanels[i].installChooserPanel(chooser);
  202. }
  203. }
  204. if ( e.getPropertyName().equals( JColorChooser.PREVIEW_PANEL_PROPERTY ) ) {
  205. if (e.getNewValue() != previewPanel) {
  206. installPreviewPanel();
  207. }
  208. }
  209. if (e.getPropertyName().equals("componentOrientation")) {
  210. ComponentOrientation o = (ComponentOrientation)e.getNewValue();
  211. JColorChooser cc = (JColorChooser)e.getSource();
  212. if (o != (ComponentOrientation)e.getOldValue()) {
  213. cc.applyComponentOrientation(o);
  214. cc.updateUI();
  215. }
  216. }
  217. }
  218. }
  219. static class ColorTransferHandler extends TransferHandler implements UIResource {
  220. ColorTransferHandler() {
  221. super("color");
  222. }
  223. }
  224. }