/* | 
|
 * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. | 
|
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 
|
 * | 
|
 * This code is free software; you can redistribute it and/or modify it | 
|
 * under the terms of the GNU General Public License version 2 only, as | 
|
 * published by the Free Software Foundation.  Oracle designates this | 
|
 * particular file as subject to the "Classpath" exception as provided | 
|
 * by Oracle in the LICENSE file that accompanied this code. | 
|
 * | 
|
 * This code is distributed in the hope that it will be useful, but WITHOUT | 
|
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | 
|
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License | 
|
 * version 2 for more details (a copy is included in the LICENSE file that | 
|
 * accompanied this code). | 
|
 * | 
|
 * You should have received a copy of the GNU General Public License version | 
|
 * 2 along with this work; if not, write to the Free Software Foundation, | 
|
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | 
|
 * | 
|
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | 
|
 * or visit www.oracle.com if you need additional information or have any | 
|
 * questions. | 
|
*/  | 
|
package javax.swing.colorchooser;  | 
|
import java.awt.*;  | 
|
import java.beans.PropertyChangeEvent;  | 
|
import java.beans.PropertyChangeListener;  | 
|
import javax.swing.*;  | 
|
/** | 
|
 * This is the abstract superclass for color choosers.  If you want to add | 
|
 * a new color chooser panel into a <code>JColorChooser</code>, subclass | 
|
 * this class. | 
|
 * <p> | 
|
 * <strong>Warning:</strong> | 
|
 * Serialized objects of this class will not be compatible with | 
|
 * future Swing releases. The current serialization support is | 
|
 * appropriate for short term storage or RMI between applications running | 
|
 * the same version of Swing.  As of 1.4, support for long term storage | 
|
 * of all JavaBeans™ | 
|
 * has been added to the <code>java.beans</code> package. | 
|
 * Please see {@link java.beans.XMLEncoder}. | 
|
 * | 
|
 * @author Tom Santos | 
|
 * @author Steve Wilson | 
|
*/  | 
|
public abstract class AbstractColorChooserPanel extends JPanel {  | 
|
private final PropertyChangeListener enabledListener = new PropertyChangeListener() {  | 
|
public void propertyChange(PropertyChangeEvent event) {  | 
|
Object value = event.getNewValue();  | 
|
if (value instanceof Boolean) {  | 
|
setEnabled((Boolean) value);  | 
|
}  | 
|
}  | 
|
};  | 
|
    /** | 
|
     * | 
|
*/  | 
|
private JColorChooser chooser;  | 
|
    /** | 
|
      * Invoked automatically when the model's state changes. | 
|
      * It is also called by <code>installChooserPanel</code> to allow | 
|
      * you to set up the initial state of your chooser. | 
|
      * Override this method to update your <code>ChooserPanel</code>. | 
|
*/  | 
|
public abstract void updateChooser();  | 
|
    /** | 
|
     * Builds a new chooser panel. | 
|
*/  | 
|
protected abstract void buildChooser();  | 
|
    /** | 
|
     * Returns a string containing the display name of the panel. | 
|
     * @return the name of the display panel | 
|
*/  | 
|
public abstract String getDisplayName();  | 
|
    /** | 
|
     * Provides a hint to the look and feel as to the | 
|
     * <code>KeyEvent.VK</code> constant that can be used as a mnemonic to | 
|
     * access the panel. A return value <= 0 indicates there is no mnemonic. | 
|
     * <p> | 
|
     * The return value here is a hint, it is ultimately up to the look | 
|
     * and feel to honor the return value in some meaningful way. | 
|
     * <p> | 
|
     * This implementation returns 0, indicating the | 
|
     * <code>AbstractColorChooserPanel</code> does not support a mnemonic, | 
|
     * subclasses wishing a mnemonic will need to override this. | 
|
     * | 
|
     * @return KeyEvent.VK constant identifying the mnemonic; <= 0 for no | 
|
     *         mnemonic | 
|
     * @see #getDisplayedMnemonicIndex | 
|
     * @since 1.4 | 
|
*/  | 
|
    public int getMnemonic() { | 
|
return 0;  | 
|
}  | 
|
    /** | 
|
     * Provides a hint to the look and feel as to the index of the character in | 
|
     * <code>getDisplayName</code> that should be visually identified as the | 
|
     * mnemonic. The look and feel should only use this if | 
|
     * <code>getMnemonic</code> returns a value > 0. | 
|
     * <p> | 
|
     * The return value here is a hint, it is ultimately up to the look | 
|
     * and feel to honor the return value in some meaningful way. For example, | 
|
     * a look and feel may wish to render each | 
|
     * <code>AbstractColorChooserPanel</code> in a <code>JTabbedPane</code>, | 
|
     * and further use this return value to underline a character in | 
|
     * the <code>getDisplayName</code>. | 
|
     * <p> | 
|
     * This implementation returns -1, indicating the | 
|
     * <code>AbstractColorChooserPanel</code> does not support a mnemonic, | 
|
     * subclasses wishing a mnemonic will need to override this. | 
|
     * | 
|
     * @return Character index to render mnemonic for; -1 to provide no | 
|
     *                   visual identifier for this panel. | 
|
     * @see #getMnemonic | 
|
     * @since 1.4 | 
|
*/  | 
|
    public int getDisplayedMnemonicIndex() { | 
|
return -1;  | 
|
}  | 
|
    /** | 
|
     * Returns the small display icon for the panel. | 
|
     * @return the small display icon | 
|
*/  | 
|
public abstract Icon getSmallDisplayIcon();  | 
|
    /** | 
|
     * Returns the large display icon for the panel. | 
|
     * @return the large display icon | 
|
*/  | 
|
public abstract Icon getLargeDisplayIcon();  | 
|
    /** | 
|
     * Invoked when the panel is added to the chooser. | 
|
     * If you override this, be sure to call <code>super</code>. | 
|
     * @param enclosingChooser  the panel to be added | 
|
     * @exception RuntimeException  if the chooser panel has already been | 
|
     *                          installed | 
|
*/  | 
|
public void installChooserPanel(JColorChooser enclosingChooser) {  | 
|
if (chooser != null) {  | 
|
throw new RuntimeException ("This chooser panel is already installed");  | 
|
}  | 
|
chooser = enclosingChooser;  | 
|
chooser.addPropertyChangeListener("enabled", enabledListener);  | 
|
setEnabled(chooser.isEnabled());  | 
|
buildChooser();  | 
|
updateChooser();  | 
|
}  | 
|
    /** | 
|
     * Invoked when the panel is removed from the chooser. | 
|
     * If override this, be sure to call <code>super</code>. | 
|
*/  | 
|
public void uninstallChooserPanel(JColorChooser enclosingChooser) {  | 
|
chooser.removePropertyChangeListener("enabled", enabledListener);  | 
|
chooser = null;  | 
|
}  | 
|
    /** | 
|
      * Returns the model that the chooser panel is editing. | 
|
      * @return the <code>ColorSelectionModel</code> model this panel | 
|
      *         is editing | 
|
*/  | 
|
public ColorSelectionModel getColorSelectionModel() {  | 
|
return (this.chooser != null)  | 
|
? this.chooser.getSelectionModel()  | 
|
: null;  | 
|
}  | 
|
    /** | 
|
     * Returns the color that is currently selected. | 
|
     * @return the <code>Color</code> that is selected | 
|
*/  | 
|
protected Color getColorFromModel() {  | 
|
ColorSelectionModel model = getColorSelectionModel();  | 
|
return (model != null)  | 
|
? model.getSelectedColor()  | 
|
: null;  | 
|
}  | 
|
void setSelectedColor(Color color) {  | 
|
ColorSelectionModel model = getColorSelectionModel();  | 
|
if (model != null) {  | 
|
model.setSelectedColor(color);  | 
|
}  | 
|
}  | 
|
    /** | 
|
     * Draws the panel. | 
|
     * @param g  the <code>Graphics</code> object | 
|
*/  | 
|
public void paint(Graphics g) {  | 
|
super.paint(g);  | 
|
}  | 
|
    /** | 
|
     * Returns an integer from the defaults table. If <code>key</code> does | 
|
     * not map to a valid <code>Integer</code>, <code>default</code> is | 
|
     * returned. | 
|
     * | 
|
     * @param key  an <code>Object</code> specifying the int | 
|
     * @param defaultValue Returned value if <code>key</code> is not available, | 
|
     *                     or is not an Integer | 
|
     * @return the int | 
|
*/  | 
|
int getInt(Object key, int defaultValue) {  | 
|
Object value = UIManager.get(key, getLocale());  | 
|
if (value instanceof Integer) {  | 
|
return ((Integer)value).intValue();  | 
|
}  | 
|
if (value instanceof String) {  | 
|
            try { | 
|
return Integer.parseInt((String)value);  | 
|
} catch (NumberFormatException nfe) {}  | 
|
}  | 
|
return defaultValue;  | 
|
}  | 
|
}  |