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