blob: 43d28fed0a9370628fd67cee43b06559468553f9 [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 1997-2004 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Sun designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Sun in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22 * CA 95054 USA or visit www.sun.com if you need additional information or
23 * have any questions.
24 */
25
26package javax.swing.plaf.basic;
27
28import javax.swing.*;
29import javax.swing.colorchooser.*;
30import javax.swing.event.*;
31import javax.swing.border.*;
32import javax.swing.plaf.*;
33import java.util.*;
34import java.awt.*;
35import java.awt.image.*;
36import java.awt.event.*;
37import java.beans.PropertyChangeEvent;
38import java.beans.PropertyChangeListener;
39import java.io.Serializable;
40
41import sun.swing.DefaultLookup;
42import sun.swing.UIAction;
43
44/**
45 * Provides the basic look and feel for a JColorChooser.
46 * <p>
47 * @author Tom Santos
48 * @author Steve Wilson
49 */
50
51public class BasicColorChooserUI extends ColorChooserUI
52{
53 /**
54 * JColorChooser this BasicColorChooserUI is installed on.
55 *
56 * @since 1.5
57 */
58 protected JColorChooser chooser;
59
60 JTabbedPane tabbedPane;
61 JPanel singlePanel;
62
63 JPanel previewPanelHolder;
64 JComponent previewPanel;
65 boolean isMultiPanel = false;
66 private static TransferHandler defaultTransferHandler = new ColorTransferHandler();
67
68 protected AbstractColorChooserPanel[] defaultChoosers;
69
70 protected ChangeListener previewListener;
71 protected PropertyChangeListener propertyChangeListener;
72 private Handler handler;
73
74 public static ComponentUI createUI(JComponent c) {
75 return new BasicColorChooserUI();
76 }
77
78 protected AbstractColorChooserPanel[] createDefaultChoosers() {
79 AbstractColorChooserPanel[] panels = ColorChooserComponentFactory.getDefaultChooserPanels();
80 return panels;
81 }
82
83 protected void uninstallDefaultChoosers() {
84 AbstractColorChooserPanel[] choosers = chooser.getChooserPanels();
85 for( int i = 0 ; i < choosers.length; i++) {
86 chooser.removeChooserPanel( choosers[i] );
87 }
88 }
89
90 public void installUI( JComponent c ) {
91 chooser = (JColorChooser)c;
92
93 super.installUI( c );
94
95 installDefaults();
96 installListeners();
97
98 tabbedPane = new JTabbedPane();
99 tabbedPane.setName("ColorChooser.tabPane");
100 tabbedPane.setInheritsPopupMenu(true);
101 singlePanel = new JPanel(new CenterLayout());
102 singlePanel.setName("ColorChooser.panel");
103 singlePanel.setInheritsPopupMenu(true);
104
105 chooser.setLayout( new BorderLayout() );
106
107 defaultChoosers = createDefaultChoosers();
108 chooser.setChooserPanels(defaultChoosers);
109
110 previewPanelHolder = new JPanel(new CenterLayout());
111 previewPanelHolder.setName("ColorChooser.previewPanelHolder");
112
113 if (DefaultLookup.getBoolean(chooser, this,
114 "ColorChooser.showPreviewPanelText", true)) {
115 String previewString = UIManager.getString(
116 "ColorChooser.previewText", chooser.getLocale());
117 previewPanelHolder.setBorder(new TitledBorder(previewString));
118 }
119 previewPanelHolder.setInheritsPopupMenu(true);
120 chooser.add(previewPanelHolder, BorderLayout.SOUTH);
121
122 installPreviewPanel();
123 chooser.applyComponentOrientation(c.getComponentOrientation());
124 }
125
126 public void uninstallUI( JComponent c ) {
127 chooser.remove(tabbedPane);
128 chooser.remove(singlePanel);
129 chooser.remove(previewPanelHolder);
130
131 uninstallDefaultChoosers();
132 uninstallListeners();
133 uninstallDefaults();
134
135 previewPanelHolder.remove(previewPanel);
136 if (previewPanel instanceof UIResource) {
137 chooser.setPreviewPanel(null);
138 }
139
140 previewPanelHolder = null;
141 previewPanel = null;
142 defaultChoosers = null;
143 chooser = null;
144 tabbedPane = null;
145
146 handler = null;
147 }
148
149 protected void installPreviewPanel() {
150 if (previewPanel != null) {
151 previewPanelHolder.remove(previewPanel);
152 previewPanel.removeMouseListener(getHandler());
153 }
154
155 previewPanel = chooser.getPreviewPanel();
156 Dimension layoutSize = new Dimension(); // fix for bug 4759306
157 if (previewPanel != null) {
158 layoutSize = new BorderLayout().minimumLayoutSize(previewPanel);
159 if ((previewPanelHolder != null) && (chooser != null) &&
160 (layoutSize.getWidth() + layoutSize.getHeight() == 0)) {
161 chooser.remove(previewPanelHolder);
162 return;
163 }
164 }
165 if (previewPanel == null || previewPanel instanceof UIResource) {
166 previewPanel = ColorChooserComponentFactory.getPreviewPanel(); // get from table?
167 chooser.setPreviewPanel(previewPanel);
168 }
169 previewPanel.setForeground(chooser.getColor());
170 previewPanelHolder.add(previewPanel);
171 previewPanel.addMouseListener(getHandler());
172 previewPanel.setInheritsPopupMenu(true);
173 }
174
175 protected void installDefaults() {
176 LookAndFeel.installColorsAndFont(chooser, "ColorChooser.background",
177 "ColorChooser.foreground",
178 "ColorChooser.font");
179 LookAndFeel.installProperty(chooser, "opaque", Boolean.TRUE);
180 TransferHandler th = chooser.getTransferHandler();
181 if (th == null || th instanceof UIResource) {
182 chooser.setTransferHandler(defaultTransferHandler);
183 }
184 }
185
186 protected void uninstallDefaults() {
187 if (chooser.getTransferHandler() instanceof UIResource) {
188 chooser.setTransferHandler(null);
189 }
190 }
191
192
193 protected void installListeners() {
194 propertyChangeListener = createPropertyChangeListener();
195 chooser.addPropertyChangeListener( propertyChangeListener );
196
197 previewListener = getHandler();
198 chooser.getSelectionModel().addChangeListener(previewListener);
199 }
200
201 private Handler getHandler() {
202 if (handler == null) {
203 handler = new Handler();
204 }
205 return handler;
206 }
207
208 protected PropertyChangeListener createPropertyChangeListener() {
209 return getHandler();
210 }
211
212 protected void uninstallListeners() {
213 chooser.removePropertyChangeListener( propertyChangeListener );
214 chooser.getSelectionModel().removeChangeListener(previewListener);
215 previewPanel.removeMouseListener(getHandler());
216 }
217
218
219 private class Handler implements ChangeListener, MouseListener,
220 PropertyChangeListener {
221 //
222 // ChangeListener
223 //
224 public void stateChanged(ChangeEvent evt) {
225 ColorSelectionModel model = (ColorSelectionModel)evt.getSource();
226 if (previewPanel != null) {
227 previewPanel.setForeground(model.getSelectedColor());
228 previewPanel.repaint();
229 }
230 }
231
232 //
233 // MouseListener
234 public void mousePressed(MouseEvent evt) {
235 if (chooser.getDragEnabled()) {
236 TransferHandler th = chooser.getTransferHandler();
237 th.exportAsDrag(chooser, evt, TransferHandler.COPY);
238 }
239 }
240 public void mouseReleased(MouseEvent evt) {}
241 public void mouseClicked(MouseEvent evt) {}
242 public void mouseEntered(MouseEvent evt) {}
243 public void mouseExited(MouseEvent evt) {}
244
245 //
246 // PropertyChangeListener
247 //
248 public void propertyChange(PropertyChangeEvent evt) {
249 String prop = evt.getPropertyName();
250
251 if (prop == JColorChooser.CHOOSER_PANELS_PROPERTY) {
252 AbstractColorChooserPanel[] oldPanels =
253 (AbstractColorChooserPanel[])evt.getOldValue();
254 AbstractColorChooserPanel[] newPanels =
255 (AbstractColorChooserPanel[])evt.getNewValue();
256
257 for (int i = 0; i < oldPanels.length; i++) { // remove old panels
258 Container wrapper = oldPanels[i].getParent();
259 if (wrapper != null) {
260 Container parent = wrapper.getParent();
261 if (parent != null)
262 parent.remove(wrapper); // remove from hierarchy
263 oldPanels[i].uninstallChooserPanel(chooser); // uninstall
264 }
265 }
266
267 int numNewPanels = newPanels.length;
268 if (numNewPanels == 0) { // removed all panels and added none
269 chooser.remove(tabbedPane);
270 return;
271 }
272 else if (numNewPanels == 1) { // one panel case
273 chooser.remove(tabbedPane);
274 JPanel centerWrapper = new JPanel( new CenterLayout() );
275 centerWrapper.setInheritsPopupMenu(true);
276 centerWrapper.add(newPanels[0]);
277 singlePanel.add(centerWrapper, BorderLayout.CENTER);
278 chooser.add(singlePanel);
279 }
280 else { // multi-panel case
281 if ( oldPanels.length < 2 ) {// moving from single to multiple
282 chooser.remove(singlePanel);
283 chooser.add(tabbedPane, BorderLayout.CENTER);
284 }
285
286 for (int i = 0; i < newPanels.length; i++) {
287 JPanel centerWrapper = new JPanel( new CenterLayout() );
288 centerWrapper.setInheritsPopupMenu(true);
289 String name = newPanels[i].getDisplayName();
290 int mnemonic = newPanels[i].getMnemonic();
291 centerWrapper.add(newPanels[i]);
292 tabbedPane.addTab(name, centerWrapper);
293 if (mnemonic > 0) {
294 tabbedPane.setMnemonicAt(i, mnemonic);
295 tabbedPane.setDisplayedMnemonicIndexAt(
296 i, newPanels[i].getDisplayedMnemonicIndex());
297 }
298 }
299 }
300 chooser.applyComponentOrientation(chooser.getComponentOrientation());
301 for (int i = 0; i < newPanels.length; i++) {
302 newPanels[i].installChooserPanel(chooser);
303 }
304 }
305
306 if (prop == JColorChooser.PREVIEW_PANEL_PROPERTY) {
307 if (evt.getNewValue() != previewPanel) {
308 installPreviewPanel();
309 }
310 }
311 if (prop == "componentOrientation") {
312 ComponentOrientation o =
313 (ComponentOrientation)evt.getNewValue();
314 JColorChooser cc = (JColorChooser)evt.getSource();
315 if (o != (ComponentOrientation)evt.getOldValue()) {
316 cc.applyComponentOrientation(o);
317 cc.updateUI();
318 }
319 }
320 }
321 }
322
323 /**
324 * This inner class is marked &quot;public&quot; due to a compiler bug.
325 * This class should be treated as a &quot;protected&quot; inner class.
326 * Instantiate it only within subclasses of <Foo>.
327 */
328 public class PropertyHandler implements PropertyChangeListener {
329 public void propertyChange(PropertyChangeEvent e) {
330 getHandler().propertyChange(e);
331 }
332 }
333
334 static class ColorTransferHandler extends TransferHandler implements UIResource {
335
336 ColorTransferHandler() {
337 super("color");
338 }
339 }
340
341}