J. Duke | 319a3b9 | 2007-12-01 00:00:00 +0000 | [diff] [blame^] | 1 | /* |
| 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 | |
| 26 | package javax.swing.plaf.basic; |
| 27 | |
| 28 | import javax.swing.*; |
| 29 | import javax.swing.colorchooser.*; |
| 30 | import javax.swing.event.*; |
| 31 | import javax.swing.border.*; |
| 32 | import javax.swing.plaf.*; |
| 33 | import java.util.*; |
| 34 | import java.awt.*; |
| 35 | import java.awt.image.*; |
| 36 | import java.awt.event.*; |
| 37 | import java.beans.PropertyChangeEvent; |
| 38 | import java.beans.PropertyChangeListener; |
| 39 | import java.io.Serializable; |
| 40 | |
| 41 | import sun.swing.DefaultLookup; |
| 42 | import 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 | |
| 51 | public 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 "public" due to a compiler bug. |
| 325 | * This class should be treated as a "protected" 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 | } |