1. /*
  2. * @(#)BasicColorChooserUI.java 1.24 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 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.24 11/29/01
  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. boolean isMultiPanel = false;
  35. protected AbstractColorChooserPanel[] defaultChoosers;
  36. protected ChangeListener previewListener;
  37. protected PropertyChangeListener propertyChangeListener;
  38. public static ComponentUI createUI(JComponent c) {
  39. return new BasicColorChooserUI();
  40. }
  41. protected AbstractColorChooserPanel[] createDefaultChoosers() {
  42. AbstractColorChooserPanel[] panels = ColorChooserComponentFactory.getDefaultChooserPanels();
  43. return panels;
  44. }
  45. protected void uninstallDefaultChoosers() {
  46. for( int i = 0 ; i < defaultChoosers.length; i++) {
  47. chooser.removeChooserPanel( defaultChoosers[i] );
  48. }
  49. }
  50. public void installUI( JComponent c ) {
  51. chooser = (JColorChooser)c;
  52. super.installUI( c );
  53. installDefaults();
  54. installListeners();
  55. tabbedPane = new JTabbedPane();
  56. singlePanel = new JPanel(new CenterLayout());
  57. chooser.setLayout( new BorderLayout() );
  58. defaultChoosers = createDefaultChoosers();
  59. chooser.setChooserPanels(defaultChoosers);
  60. installPreviewPanel();
  61. }
  62. public void uninstallUI( JComponent c ) {
  63. uninstallListeners();
  64. uninstallDefaultChoosers();
  65. uninstallDefaults();
  66. defaultChoosers = null;
  67. chooser = null;
  68. tabbedPane = null;
  69. }
  70. protected void installPreviewPanel() {
  71. previewPanelHolder = new JPanel(new CenterLayout());
  72. String previewString = UIManager.getString("ColorChooser.previewText");
  73. previewPanelHolder.setBorder(new TitledBorder(previewString));
  74. previewPanel = chooser.getPreviewPanel();
  75. if (previewPanel == null || previewPanel instanceof UIResource) {
  76. previewPanel = ColorChooserComponentFactory.getPreviewPanel(); // get from table?
  77. }
  78. previewPanel.setForeground(chooser.getColor());
  79. previewPanelHolder.add(previewPanel);
  80. chooser.add(previewPanelHolder, BorderLayout.SOUTH);
  81. }
  82. protected void installDefaults() {
  83. LookAndFeel.installColorsAndFont(chooser, "ColorChooser.background",
  84. "ColorChooser.foreground",
  85. "ColorChooser.font");
  86. }
  87. protected void uninstallDefaults() {
  88. }
  89. protected void installListeners() {
  90. propertyChangeListener = createPropertyChangeListener();
  91. chooser.addPropertyChangeListener( propertyChangeListener );
  92. previewListener = new PreviewListener();
  93. chooser.getSelectionModel().addChangeListener(previewListener);
  94. }
  95. protected PropertyChangeListener createPropertyChangeListener() {
  96. return new PropertyHandler();
  97. }
  98. protected void uninstallListeners() {
  99. chooser.removePropertyChangeListener( propertyChangeListener );
  100. chooser.getSelectionModel().removeChangeListener(previewListener);
  101. }
  102. class PreviewListener implements ChangeListener {
  103. public void stateChanged( ChangeEvent e ) {
  104. ColorSelectionModel model = (ColorSelectionModel)e.getSource();
  105. if (previewPanel != null) {
  106. previewPanel.setForeground(model.getSelectedColor());
  107. previewPanel.repaint();
  108. }
  109. }
  110. }
  111. /**
  112. * This inner class is marked "public" due to a compiler bug.
  113. * This class should be treated as a "protected" inner class.
  114. * Instantiate it only within subclasses of <Foo>.
  115. */
  116. public class PropertyHandler implements PropertyChangeListener {
  117. public void propertyChange(PropertyChangeEvent e) {
  118. if ( e.getPropertyName().equals( JColorChooser.CHOOSER_PANELS_PROPERTY ) ) {
  119. AbstractColorChooserPanel[] oldPanels = (AbstractColorChooserPanel[]) e.getOldValue();
  120. AbstractColorChooserPanel[] newPanels = (AbstractColorChooserPanel[]) e.getNewValue();
  121. for (int i = 0; i < oldPanels.length; i++) { // remove old panels
  122. Container wrapper = oldPanels[i].getParent();
  123. if (wrapper != null) {
  124. Container parent = wrapper.getParent();
  125. if (parent != null)
  126. parent.remove(wrapper); // remove from hierarchy
  127. oldPanels[i].uninstallChooserPanel(chooser); // uninstall
  128. }
  129. }
  130. int numNewPanels = newPanels.length;
  131. if (numNewPanels == 0) { // removed all panels and added none
  132. chooser.remove(tabbedPane);
  133. return;
  134. }
  135. else if (numNewPanels == 1) { // one panel case
  136. chooser.remove(tabbedPane);
  137. JPanel centerWrapper = new JPanel( new CenterLayout() );
  138. centerWrapper.add(newPanels[0]);
  139. singlePanel.add(centerWrapper, BorderLayout.CENTER);
  140. chooser.add(singlePanel);
  141. }
  142. else { // multi-panel case
  143. if ( oldPanels.length < 2 ) {// moving from single to multiple
  144. chooser.remove(singlePanel);
  145. tabbedPane = new JTabbedPane();
  146. chooser.add(tabbedPane, BorderLayout.CENTER);
  147. }
  148. for (int i = 0; i < newPanels.length; i++) {
  149. JPanel centerWrapper = new JPanel( new CenterLayout() );
  150. centerWrapper.add(newPanels[i]);
  151. tabbedPane.addTab(newPanels[i].getDisplayName(), centerWrapper);
  152. }
  153. }
  154. for (int i = 0; i < newPanels.length; i++) {
  155. newPanels[i].installChooserPanel(chooser);
  156. }
  157. }
  158. if ( e.getPropertyName().equals( JColorChooser.PREVIEW_PANEL_PROPERTY ) ) {
  159. JComponent oldPanel = (JComponent) e.getOldValue();
  160. JComponent newPanel = (JComponent) e.getNewValue();
  161. if (oldPanel != null) { // fix for 4166059
  162. chooser.remove(oldPanel);
  163. }
  164. chooser.add(newPanel, BorderLayout.SOUTH);
  165. }
  166. }
  167. }
  168. }