/* * @(#)QuaquaColorChooserUI.java * * Copyright (c) 2005-2010 Werner Randelshofer, Immensee, Switzerland. * All rights reserved. * * You may not use, copy or modify this file, except in compliance with the * license agreement you entered into with Werner Randelshofer. * For details see accompanying license terms. */ package ch.randelshofer.quaqua; import ch.randelshofer.quaqua.colorchooser.*; import ch.randelshofer.quaqua.util.Methods; import java.awt.*; import java.awt.event.*; import java.beans.*; import javax.swing.*; import javax.swing.colorchooser.*; import javax.swing.event.*; import javax.swing.plaf.*; import java.security.*; import java.util.*; /** * QuaquaColorChooserUI. * * @author Werner Randelshofer * @version $Id: QuaquaColorChooserUI.java 361 2010-11-21 11:19:20Z wrandelshofer $ */ public class QuaquaColorChooserUI extends ColorChooserUI { protected ColorChooserMainPanel mainPanel; protected JColorChooser chooser; protected ChangeListener previewListener; protected PropertyChangeListener propertyChangeListener; protected AbstractColorChooserPanel[] defaultChoosers; protected JComponent previewPanel; private static TransferHandler defaultTransferHandler = new ColorTransferHandler(); private MouseListener previewMouseListener; public static ComponentUI createUI(JComponent c) { return new QuaquaColorChooserUI(); } @Override public void installUI(JComponent c) { chooser = (JColorChooser) c; AbstractColorChooserPanel[] oldPanels = chooser.getChooserPanels(); installDefaults(); chooser.setLayout(new BorderLayout()); mainPanel = new ColorChooserMainPanel(); chooser.add(mainPanel); defaultChoosers = createDefaultChoosers(); chooser.setChooserPanels(defaultChoosers); installPreviewPanel(); AbstractColorChooserPanel[] newPanels = (AbstractColorChooserPanel[]) chooser.getChooserPanels(); updateColorChooserPanels(oldPanels, newPanels); // Note: install listeners only after we have fully installed // all chooser panels. If we do it earlier, we send property // events too early. installListeners(); chooser.applyComponentOrientation(c.getComponentOrientation()); } protected AbstractColorChooserPanel[] createDefaultChoosers() { String[] defaultChooserNames = (String[]) UIManager.get("ColorChooser.defaultChoosers"); ArrayList panels = new ArrayList(defaultChooserNames.length); for (int i = 0; i < defaultChooserNames.length; i++) { try { //panels.add(Class.forName(defaultChoosers[i]).newInstance()); panels.add(Methods.newInstance(defaultChooserNames[i])); } catch (AccessControlException e) { // suppress System.err.println("QuaquaColorChooserUI warning: unable to instantiate " + defaultChooserNames[i]); e.printStackTrace(); } catch (Exception e) { // throw new InternalError("Unable to instantiate "+defaultChoosers[i]); // suppress System.err.println("QuaquaColorChooserUI warning: unable to instantiate " + defaultChooserNames[i]); e.printStackTrace(); } catch (UnsupportedClassVersionError e) { // suppress System.err.println("QuaquaColorChooserUI warning: unable to instantiate " + defaultChooserNames[i]); //e.printStackTrace(); } catch (Throwable t) { System.err.println("QuaquaColorChooserUI warning: unable to instantiate " + defaultChooserNames[i]); } } //AbstractColorChooserPanel[] panels = new AbstractColorChooserPanel[defaultChoosers.length]; return (AbstractColorChooserPanel[]) panels.toArray(new AbstractColorChooserPanel[panels.size()]); } @Override public void uninstallUI(JComponent c) { chooser.remove(mainPanel); uninstallListeners(); uninstallDefaultChoosers(); uninstallDefaults(); mainPanel.setPreviewPanel(null); if (previewPanel instanceof UIResource) { chooser.setPreviewPanel(null); } mainPanel = null; previewPanel = null; defaultChoosers = null; chooser = null; } protected void installDefaults() { LookAndFeel.installColorsAndFont(chooser, "ColorChooser.background", "ColorChooser.foreground", "ColorChooser.font"); TransferHandler th = chooser.getTransferHandler(); if (th == null || th instanceof UIResource) { chooser.setTransferHandler(defaultTransferHandler); } } protected void uninstallDefaults() { if (chooser.getTransferHandler() instanceof UIResource) { chooser.setTransferHandler(null); } } protected void installListeners() { propertyChangeListener = createPropertyChangeListener(); chooser.addPropertyChangeListener(propertyChangeListener); previewListener = new PreviewListener(); chooser.getSelectionModel().addChangeListener(previewListener); previewMouseListener = new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { if (chooser.getDragEnabled()) { TransferHandler th = chooser.getTransferHandler(); th.exportAsDrag(chooser, e, TransferHandler.COPY); } } }; } protected void uninstallListeners() { chooser.removePropertyChangeListener(propertyChangeListener); chooser.getSelectionModel().removeChangeListener(previewListener); previewPanel.removeMouseListener(previewMouseListener); } protected PropertyChangeListener createPropertyChangeListener() { return new PropertyHandler(); } protected void installPreviewPanel() { if (previewPanel != null) { previewPanel.removeMouseListener(previewMouseListener); mainPanel.setPreviewPanel(null); } previewPanel = chooser.getPreviewPanel(); // If the previewPanel has zero size, the user wants to not display // a preview at all. // See http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5029286 Dimension layoutSize; // fix for bug 4759306 if (previewPanel != null) { layoutSize = new BorderLayout().minimumLayoutSize(previewPanel); if (layoutSize.getWidth() + layoutSize.getHeight() == 0) { return; } } // If the previewPanel is null or an UIResource, the user wants to // display the previewPanel from the look and fell. if (previewPanel == null || previewPanel instanceof UIResource) { //previewPanel = ColorChooserComponentFactory.getPreviewPanel(); // get from table? previewPanel = new QuaquaColorPreviewPanel(); chooser.setPreviewPanel(previewPanel); } // previewPanel.setForeground(chooser.getColor()); mainPanel.setPreviewPanel(previewPanel); previewPanel.addMouseListener(previewMouseListener); } class PreviewListener implements ChangeListener { public void stateChanged(ChangeEvent e) { ColorSelectionModel model = (ColorSelectionModel) e.getSource(); if (previewPanel != null) { previewPanel.setForeground(model.getSelectedColor()); previewPanel.repaint(); } } } protected void uninstallDefaultChoosers() { for (int i = 0; i < defaultChoosers.length; i++) { chooser.removeChooserPanel(defaultChoosers[i]); } } private void updateColorChooserPanels( AbstractColorChooserPanel[] oldPanels, AbstractColorChooserPanel[] newPanels) { for (int i = 0; i < oldPanels.length; i++) { // remove old panels Container wrapper = oldPanels[i].getParent(); if (wrapper != null) { Container parent = wrapper.getParent(); if (parent != null) { parent.remove(wrapper); // remove from hierarchy } oldPanels[i].uninstallChooserPanel(chooser); // uninstall } } mainPanel.removeAllColorChooserPanels(); for (int i = 0; i < newPanels.length; i++) { if (newPanels[i] != null) { mainPanel.addColorChooserPanel(newPanels[i]); } } for (int i = 0; i < newPanels.length; i++) { if (newPanels[i] != null) { newPanels[i].installChooserPanel(chooser); } } } public class PropertyHandler implements PropertyChangeListener { public void propertyChange(PropertyChangeEvent e) { String name = e.getPropertyName(); if (name.equals(JColorChooser.CHOOSER_PANELS_PROPERTY)) { AbstractColorChooserPanel[] oldPanels = (AbstractColorChooserPanel[]) e.getOldValue(); AbstractColorChooserPanel[] newPanels = (AbstractColorChooserPanel[]) e.getNewValue(); for (int i = 0; i < oldPanels.length; i++) { // remove old panels if (oldPanels[i] != null) { Container wrapper = oldPanels[i].getParent(); if (wrapper != null) { Container parent = wrapper.getParent(); if (parent != null) { parent.remove(wrapper); // remove from hierarchy } oldPanels[i].uninstallChooserPanel(chooser); // uninstall } } } mainPanel.removeAllColorChooserPanels(); for (int i = 0; i < newPanels.length; i++) { if (newPanels[i] != null) { mainPanel.addColorChooserPanel(newPanels[i]); } } chooser.applyComponentOrientation(chooser.getComponentOrientation()); for (int i = 0; i < newPanels.length; i++) { if (newPanels[i] != null) { newPanels[i].installChooserPanel(chooser); } } } if (name.equals(JColorChooser.PREVIEW_PANEL_PROPERTY)) { if (e.getNewValue() != previewPanel) { installPreviewPanel(); } } if (name.equals("componentOrientation")) { ComponentOrientation o = (ComponentOrientation) e.getNewValue(); JColorChooser cc = (JColorChooser) e.getSource(); if (o != (ComponentOrientation) e.getOldValue()) { cc.applyComponentOrientation(o); cc.updateUI(); } } } } static class ColorTransferHandler extends TransferHandler implements UIResource { ColorTransferHandler() { super("color"); } } }