001: /*
002: * @(#)QuaquaColorChooserUI.java 1.2.1 2006-05-10
003: *
004: * Copyright (c) 2005-2006 Werner Randelshofer
005: * Staldenmattweg 2, Immensee, CH-6405, Switzerland.
006: * All rights reserved.
007: *
008: * This software is the confidential and proprietary information of
009: * Werner Randelshofer. ("Confidential Information"). You shall not
010: * disclose such Confidential Information and shall use it only in
011: * accordance with the terms of the license agreement you entered into
012: * with Werner Randelshofer.
013: */
014:
015: package contrib.ch.randelshofer.quaqua;
016:
017: import java.awt.*;
018: import java.awt.event.*;
019: import java.beans.*;
020: import javax.swing.*;
021: import javax.swing.colorchooser.*;
022: import javax.swing.event.*;
023: import javax.swing.plaf.*;
024: import javax.swing.plaf.basic.*;
025:
026: import contrib.ch.randelshofer.quaqua.colorchooser.*;
027:
028: import java.security.*;
029: import java.util.*;
030:
031: /**
032: * QuaquaColorChooserUI.
033: *
034: * @author Werner Randelshofer
035: * @version 1.2.1 2006-05-10 Method createDefaultChoosers mustn't return an
036: * an array with null entries in it.
037: * <br>1.2 2005-09-18 Read class names of default choosers from UIManager.
038: * <br>1.1 2005-08-28 ColorWheelChooser and CrayonsChooser added.
039: * <br>1.0 29 March 2005 Created.
040: */
041: public class Quaqua13ColorChooserUI extends ColorChooserUI {
042: protected ColorChooserMainPanel mainPanel;
043: protected JColorChooser chooser;
044: protected ChangeListener previewListener;
045: protected PropertyChangeListener propertyChangeListener;
046: protected AbstractColorChooserPanel[] defaultChoosers;
047: protected JComponent previewPanel;
048:
049: public static ComponentUI createUI(JComponent c) {
050: return new Quaqua13ColorChooserUI();
051: }
052:
053: public void installUI(JComponent c) {
054: chooser = (JColorChooser) c;
055:
056: installDefaults();
057: installListeners();
058:
059: chooser.setLayout(new BorderLayout());
060: mainPanel = new ColorChooserMainPanel();
061: chooser.add(mainPanel);
062: defaultChoosers = createDefaultChoosers();
063: chooser.setChooserPanels(defaultChoosers);
064:
065: installPreviewPanel();
066: }
067:
068: protected AbstractColorChooserPanel[] createDefaultChoosers() {
069: String[] defaultChoosers = (String[]) UIManager
070: .get("ColorChooser.defaultChoosers");
071: ArrayList panels = new ArrayList(defaultChoosers.length);
072: for (int i = 0; i < defaultChoosers.length; i++) {
073: try {
074:
075: panels.add(Class.forName(defaultChoosers[i])
076: .newInstance());
077: } catch (AccessControlException e) {
078: // suppress
079: System.err
080: .println("Quaqua13ColorChooserUI warning: unable to instantiate "
081: + defaultChoosers[i]);
082: } catch (Exception e) {
083: throw new InternalError("Unable to instantiate "
084: + defaultChoosers[i]);
085: } catch (UnsupportedClassVersionError e) {
086: // suppress
087: System.err
088: .println("Quaqua13ColorChooserUI warning: unable to instantiate "
089: + defaultChoosers[i]);
090: }
091: }
092: //AbstractColorChooserPanel[] panels = new AbstractColorChooserPanel[defaultChoosers.length];
093: return (AbstractColorChooserPanel[]) panels
094: .toArray(new AbstractColorChooserPanel[panels.size()]);
095: }
096:
097: public void uninstallUI(JComponent c) {
098: chooser.remove(mainPanel);
099:
100: uninstallListeners();
101: uninstallDefaultChoosers();
102: uninstallDefaults();
103:
104: mainPanel.setPreviewPanel(null);
105: if (previewPanel instanceof UIResource) {
106: chooser.setPreviewPanel(null);
107: }
108:
109: mainPanel = null;
110: previewPanel = null;
111: defaultChoosers = null;
112: chooser = null;
113: }
114:
115: protected void installDefaults() {
116: LookAndFeel.installColorsAndFont(chooser,
117: "ColorChooser.background", "ColorChooser.foreground",
118: "ColorChooser.font");
119: }
120:
121: protected void uninstallDefaults() {
122: }
123:
124: protected void installListeners() {
125: propertyChangeListener = createPropertyChangeListener();
126: chooser.addPropertyChangeListener(propertyChangeListener);
127:
128: previewListener = new PreviewListener();
129: chooser.getSelectionModel().addChangeListener(previewListener);
130: }
131:
132: protected void uninstallListeners() {
133: chooser.removePropertyChangeListener(propertyChangeListener);
134: chooser.getSelectionModel().removeChangeListener(
135: previewListener);
136: }
137:
138: protected PropertyChangeListener createPropertyChangeListener() {
139: return new PropertyHandler();
140: }
141:
142: protected void installPreviewPanel() {
143: if (previewPanel != null) {
144: mainPanel.setPreviewPanel(null);
145: }
146:
147: previewPanel = chooser.getPreviewPanel();
148: if ((previewPanel != null)
149: && (mainPanel != null)
150: && (chooser != null)
151: && (previewPanel.getSize().getHeight()
152: + previewPanel.getSize().getWidth() == 0)) {
153: mainPanel.setPreviewPanel(null);
154: return;
155: }
156: if (previewPanel == null || previewPanel instanceof UIResource) {
157: //previewPanel = ColorChooserComponentFactory.getPreviewPanel(); // get from table?
158: previewPanel = new QuaquaColorPreviewPanel();
159: chooser.setPreviewPanel(previewPanel);
160: }
161: previewPanel.setForeground(chooser.getColor());
162: mainPanel.setPreviewPanel(previewPanel);
163: }
164:
165: class PreviewListener implements ChangeListener {
166: public void stateChanged(ChangeEvent e) {
167: ColorSelectionModel model = (ColorSelectionModel) e
168: .getSource();
169: if (previewPanel != null) {
170: previewPanel.setForeground(model.getSelectedColor());
171: previewPanel.repaint();
172: }
173: }
174: }
175:
176: protected void uninstallDefaultChoosers() {
177: for (int i = 0; i < defaultChoosers.length; i++) {
178: chooser.removeChooserPanel(defaultChoosers[i]);
179: }
180: }
181:
182: /**
183: * This inner class is marked "public" due to a compiler bug.
184: * This class should be treated as a "protected" inner class.
185: * Instantiate it only within subclasses of <Foo>.
186: */
187: public class PropertyHandler implements PropertyChangeListener {
188:
189: public void propertyChange(PropertyChangeEvent e) {
190:
191: if (e.getPropertyName().equals(
192: JColorChooser.CHOOSER_PANELS_PROPERTY)) {
193: AbstractColorChooserPanel[] oldPanels = (AbstractColorChooserPanel[]) e
194: .getOldValue();
195: AbstractColorChooserPanel[] newPanels = (AbstractColorChooserPanel[]) e
196: .getNewValue();
197:
198: for (int i = 0; i < oldPanels.length; i++) { // remove old panels
199: Container wrapper = oldPanels[i].getParent();
200: if (wrapper != null) {
201: Container parent = wrapper.getParent();
202: if (parent != null)
203: parent.remove(wrapper); // remove from hierarchy
204: oldPanels[i].uninstallChooserPanel(chooser); // uninstall
205: }
206: }
207:
208: mainPanel.removeAllColorChooserPanels();
209: for (int i = 0; i < newPanels.length; i++) {
210: if (newPanels[i] != null) {
211: mainPanel.addColorChooserPanel(newPanels[i]);
212: }
213: }
214:
215: for (int i = 0; i < newPanels.length; i++) {
216: if (newPanels[i] != null) {
217: newPanels[i].installChooserPanel(chooser);
218: }
219: }
220: }
221:
222: if (e.getPropertyName().equals(
223: JColorChooser.PREVIEW_PANEL_PROPERTY)) {
224: if (e.getNewValue() != previewPanel) {
225: installPreviewPanel();
226: }
227: }
228: }
229: }
230: }
|