blob: 99a20e38ffde51cdd340a37eafb5966a515f3773 [file] [log] [blame]
/*
* Copyright (c) 1998, 2008, 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<sup><font size="-2">TM</font></sup>
* 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;
}
}