1. /*
  2. * @(#)SynthColorChooserUI.java 1.7 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 com.sun.java.swing.plaf.gtk;
  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.7, 01/23/03 (based on BasicColorChooserUI v 1.38)
  24. * @author Tom Santos
  25. * @author Steve Wilson
  26. */
  27. class SynthColorChooserUI extends ColorChooserUI implements SynthUI {
  28. private static final LayoutManager PANEL_LAYOUT = new CenterLayout();
  29. private SynthStyle style;
  30. JColorChooser chooser;
  31. JTabbedPane tabbedPane;
  32. JPanel singlePanel;
  33. JPanel previewPanelHolder;
  34. JComponent previewPanel;
  35. MouseListener previewMouseListener;
  36. boolean isMultiPanel = false;
  37. private static TransferHandler defaultTransferHandler = new ColorTransferHandler();
  38. protected AbstractColorChooserPanel[] defaultChoosers;
  39. protected ChangeListener previewListener;
  40. protected PropertyChangeListener propertyChangeListener;
  41. public static ComponentUI createUI(JComponent c) {
  42. return new SynthColorChooserUI();
  43. }
  44. protected AbstractColorChooserPanel[] createDefaultChoosers(
  45. SynthContext context) {
  46. AbstractColorChooserPanel[] panels = (AbstractColorChooserPanel[])
  47. context.getStyle().get(context, "ColorChooser.panels");
  48. if (panels == null) {
  49. panels = ColorChooserComponentFactory.getDefaultChooserPanels();
  50. }
  51. return panels;
  52. }
  53. protected void uninstallDefaultChoosers() {
  54. for( int i = 0 ; i < defaultChoosers.length; i++) {
  55. chooser.removeChooserPanel( defaultChoosers[i] );
  56. }
  57. }
  58. public void installUI( JComponent c ) {
  59. chooser = (JColorChooser)c;
  60. super.installUI( c );
  61. installDefaults();
  62. installListeners();
  63. tabbedPane = new JTabbedPane();
  64. tabbedPane.setName("ColorChooser.tabPane");
  65. singlePanel = new JPanel(new CenterLayout());
  66. singlePanel.setName("ColorChooser.panel");
  67. chooser.setLayout(PANEL_LAYOUT);
  68. SynthContext context = getContext(c, ENABLED);
  69. defaultChoosers = createDefaultChoosers(context);
  70. context.dispose();
  71. chooser.setChooserPanels(defaultChoosers);
  72. previewPanelHolder = new JPanel(PANEL_LAYOUT);
  73. previewPanelHolder.setName("ColorChooser.previewPanelHolder");
  74. chooser.add(previewPanelHolder, BorderLayout.SOUTH);
  75. previewMouseListener = new MouseAdapter() {
  76. public void mousePressed(MouseEvent e) {
  77. if (chooser.getDragEnabled()) {
  78. TransferHandler th = chooser.getTransferHandler();
  79. th.exportAsDrag(chooser, e, TransferHandler.COPY);
  80. }
  81. }
  82. };
  83. installPreviewPanel();
  84. chooser.applyComponentOrientation(c.getComponentOrientation());
  85. }
  86. public void uninstallUI( JComponent c ) {
  87. chooser.remove(tabbedPane);
  88. chooser.remove(singlePanel);
  89. chooser.remove(previewPanelHolder);
  90. uninstallListeners();
  91. uninstallDefaultChoosers();
  92. uninstallDefaults();
  93. previewPanelHolder.remove(previewPanel);
  94. if (previewPanel instanceof UIResource) {
  95. chooser.setPreviewPanel(null);
  96. }
  97. previewPanelHolder = null;
  98. previewPanel = null;
  99. defaultChoosers = null;
  100. chooser = null;
  101. tabbedPane = null;
  102. }
  103. protected void installPreviewPanel() {
  104. if (previewPanel != null) {
  105. previewPanelHolder.remove(previewPanel);
  106. previewPanel.removeMouseListener(previewMouseListener);
  107. }
  108. previewPanel = chooser.getPreviewPanel();
  109. if ((previewPanel != null) && (previewPanelHolder != null) && (chooser != null) && (previewPanel.getSize().getHeight()+previewPanel.getSize().getWidth() == 0)) {
  110. chooser.remove(previewPanelHolder);
  111. return;
  112. }
  113. if (previewPanel == null || previewPanel instanceof UIResource) {
  114. previewPanel = ColorChooserComponentFactory.getPreviewPanel(); // get from table?
  115. chooser.setPreviewPanel(previewPanel);
  116. }
  117. previewPanel.setForeground(chooser.getColor());
  118. previewPanelHolder.add(previewPanel);
  119. previewPanel.addMouseListener(previewMouseListener);
  120. }
  121. protected void installDefaults() {
  122. fetchStyle(chooser);
  123. TransferHandler th = chooser.getTransferHandler();
  124. if (th == null || th instanceof UIResource) {
  125. chooser.setTransferHandler(defaultTransferHandler);
  126. }
  127. }
  128. private void fetchStyle(JComponent c) {
  129. SynthContext context = getContext(c, ENABLED);
  130. style = SynthLookAndFeel.updateStyle(context, this);
  131. context.dispose();
  132. }
  133. protected void uninstallDefaults() {
  134. SynthContext context = getContext(chooser, ENABLED);
  135. style.uninstallDefaults(context);
  136. context.dispose();
  137. if (chooser.getTransferHandler() instanceof UIResource) {
  138. chooser.setTransferHandler(null);
  139. }
  140. style = null;
  141. }
  142. protected void installListeners() {
  143. propertyChangeListener = createPropertyChangeListener();
  144. chooser.addPropertyChangeListener( propertyChangeListener );
  145. previewListener = new PreviewListener();
  146. chooser.getSelectionModel().addChangeListener(previewListener);
  147. }
  148. protected PropertyChangeListener createPropertyChangeListener() {
  149. return new PropertyHandler();
  150. }
  151. protected void uninstallListeners() {
  152. chooser.removePropertyChangeListener( propertyChangeListener );
  153. chooser.getSelectionModel().removeChangeListener(previewListener);
  154. previewPanel.removeMouseListener(previewMouseListener);
  155. }
  156. public SynthContext getContext(JComponent c) {
  157. return getContext(c, getComponentState(c));
  158. }
  159. private SynthContext getContext(JComponent c, int state) {
  160. return SynthContext.getContext(SynthContext.class, c,
  161. SynthLookAndFeel.getRegion(c), style, state);
  162. }
  163. private Region getRegion(JComponent c) {
  164. return SynthLookAndFeel.getRegion(c);
  165. }
  166. private int getComponentState(JComponent c) {
  167. return SynthLookAndFeel.getComponentState(c);
  168. }
  169. public void update(Graphics g, JComponent c) {
  170. SynthContext context = getContext(c);
  171. SynthLookAndFeel.update(context, g);
  172. paint(context, g);
  173. context.dispose();
  174. }
  175. public void paint(Graphics g, JComponent c) {
  176. SynthContext context = getContext(c);
  177. paint(context, g);
  178. context.dispose();
  179. }
  180. protected void paint(SynthContext context, Graphics g) {
  181. }
  182. class PreviewListener implements ChangeListener {
  183. public void stateChanged( ChangeEvent e ) {
  184. ColorSelectionModel model = (ColorSelectionModel)e.getSource();
  185. if (previewPanel != null) {
  186. previewPanel.setForeground(model.getSelectedColor());
  187. previewPanel.repaint();
  188. }
  189. }
  190. }
  191. /**
  192. * This inner class is marked "public" due to a compiler bug.
  193. * This class should be treated as a "protected" inner class.
  194. * Instantiate it only within subclasses of <Foo>.
  195. */
  196. class PropertyHandler implements PropertyChangeListener {
  197. public void propertyChange(PropertyChangeEvent e) {
  198. if (SynthLookAndFeel.shouldUpdateStyle(e)) {
  199. fetchStyle((JColorChooser)e.getSource());
  200. }
  201. if ( e.getPropertyName().equals( JColorChooser.CHOOSER_PANELS_PROPERTY ) ) {
  202. AbstractColorChooserPanel[] oldPanels = (AbstractColorChooserPanel[]) e.getOldValue();
  203. AbstractColorChooserPanel[] newPanels = (AbstractColorChooserPanel[]) e.getNewValue();
  204. for (int i = 0; i < oldPanels.length; i++) { // remove old panels
  205. Container wrapper = oldPanels[i].getParent();
  206. if (wrapper != null) {
  207. Container parent = wrapper.getParent();
  208. if (parent != null)
  209. parent.remove(wrapper); // remove from hierarchy
  210. oldPanels[i].uninstallChooserPanel(chooser); // uninstall
  211. }
  212. }
  213. int numNewPanels = newPanels.length;
  214. if (numNewPanels == 0) { // removed all panels and added none
  215. chooser.remove(tabbedPane);
  216. return;
  217. }
  218. else if (numNewPanels == 1) { // one panel case
  219. chooser.remove(tabbedPane);
  220. JPanel centerWrapper = new JPanel( new CenterLayout() );
  221. centerWrapper.add(newPanels[0]);
  222. singlePanel.add(centerWrapper, BorderLayout.CENTER);
  223. chooser.add(singlePanel);
  224. }
  225. else { // multi-panel case
  226. if ( oldPanels.length < 2 ) {// moving from single to multiple
  227. chooser.remove(singlePanel);
  228. chooser.add(tabbedPane, BorderLayout.CENTER);
  229. }
  230. for (int i = 0; i < newPanels.length; i++) {
  231. JPanel centerWrapper = new JPanel( new CenterLayout() );
  232. String name = newPanels[i].getDisplayName();
  233. int mnemonic = newPanels[i].getMnemonic();
  234. centerWrapper.add(newPanels[i]);
  235. tabbedPane.addTab(name, centerWrapper);
  236. if (mnemonic > 0) {
  237. tabbedPane.setMnemonicAt(i, mnemonic);
  238. tabbedPane.setDisplayedMnemonicIndexAt(
  239. i, newPanels[i].getDisplayedMnemonicIndex());
  240. }
  241. }
  242. }
  243. chooser.applyComponentOrientation(chooser.getComponentOrientation());
  244. for (int i = 0; i < newPanels.length; i++) {
  245. newPanels[i].installChooserPanel(chooser);
  246. }
  247. }
  248. if ( e.getPropertyName().equals( JColorChooser.PREVIEW_PANEL_PROPERTY ) ) {
  249. if (e.getNewValue() != previewPanel) {
  250. installPreviewPanel();
  251. }
  252. }
  253. if (e.getPropertyName().equals("componentOrientation")) {
  254. ComponentOrientation o = (ComponentOrientation)e.getNewValue();
  255. JColorChooser cc = (JColorChooser)e.getSource();
  256. if (o != (ComponentOrientation)e.getOldValue()) {
  257. cc.applyComponentOrientation(o);
  258. cc.updateUI();
  259. }
  260. }
  261. }
  262. }
  263. static class ColorTransferHandler extends TransferHandler implements UIResource {
  264. ColorTransferHandler() {
  265. super("color");
  266. }
  267. }
  268. static class CenterLayout implements LayoutManager, Serializable {
  269. public void addLayoutComponent(String name, Component comp) { }
  270. public void removeLayoutComponent(Component comp) { }
  271. public Dimension preferredLayoutSize( Container container ) {
  272. Component c = container.getComponent(0);
  273. if ( c != null ) {
  274. Dimension size = c.getPreferredSize();
  275. Insets insets = container.getInsets();
  276. return new Dimension(size.width + insets.left + insets.right,
  277. size.height + insets.top + insets.bottom);
  278. }
  279. else {
  280. return new Dimension(0, 0);
  281. }
  282. }
  283. public Dimension minimumLayoutSize(Container cont) {
  284. return preferredLayoutSize(cont);
  285. }
  286. public void layoutContainer(Container container) {
  287. if (container.getComponentCount() > 0) {
  288. Component c = container.getComponent(0);
  289. Dimension pref = c.getPreferredSize();
  290. int containerWidth = container.getWidth();
  291. int containerHeight = container.getHeight();
  292. Insets containerInsets = container.getInsets();
  293. containerWidth -= containerInsets.left +
  294. containerInsets.right;
  295. containerHeight -= containerInsets.top +
  296. containerInsets.bottom;
  297. int left = (containerWidth - pref.width) / 2 +
  298. containerInsets.left;
  299. int right = (containerHeight - pref.height) / 2 +
  300. containerInsets.top;
  301. c.setBounds(left, right, pref.width, pref.height);
  302. }
  303. }
  304. }
  305. }