/*
* @(#)AbstractColorChooserPanel.java 1.20 03/12/19
*
* Copyright 2004 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package javax.swing.colorchooser;
import java.awt.*;
import java.io.Serializable;
import javax.swing.*;
import javax.swing.event.*;
/**
* This is the abstract superclass for color choosers. If you want to add
* a new color chooser panel into a JColorChooser
, subclass
* this class.
*
* Warning:
* 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 JavaBeansTM
* has been added to the java.beans
package.
* Please see {@link java.beans.XMLEncoder}.
*
* @version 1.20 12/19/03
* @author Tom Santos
* @author Steve Wilson
*/
public abstract class AbstractColorChooserPanel extends JPanel {
/**
*
*/
private JColorChooser chooser;
/**
*
*/
private ChangeListener colorListener;
/**
*
*/
private boolean dirty = true;
/**
* Invoked automatically when the model's state changes.
* It is also called by installChooserPanel
to allow
* you to set up the initial state of your chooser.
* Override this method to update your ChooserPanel
.
*/
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
* KeyEvent.VK
constant that can be used as a mnemonic to
* access the panel. A return value <= 0 indicates there is no mnemonic.
*
* 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. *
* This implementation returns 0, indicating the
* AbstractColorChooserPanel
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
* getDisplayName
that should be visually identified as the
* mnemonic. The look and feel should only use this if
* getMnemonic
returns a value > 0.
*
* 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
* AbstractColorChooserPanel
in a JTabbedPane
,
* and further use this return value to underline a character in
* the getDisplayName
.
*
* This implementation returns -1, indicating the
* AbstractColorChooserPanel
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 super
.
* @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;
buildChooser();
updateChooser();
colorListener = new ModelListener();
getColorSelectionModel().addChangeListener(colorListener);
}
/**
* Invoked when the panel is removed from the chooser.
* If override this, be sure to call super
.
*/
public void uninstallChooserPanel(JColorChooser enclosingChooser) {
getColorSelectionModel().removeChangeListener(colorListener);
chooser = null;
}
/**
* Returns the model that the chooser panel is editing.
* @return the ColorSelectionModel
model this panel
* is editing
*/
public ColorSelectionModel getColorSelectionModel() {
return chooser.getSelectionModel();
}
/**
* Returns the color that is currently selected.
* @return the Color
that is selected
*/
protected Color getColorFromModel() {
return getColorSelectionModel().getSelectedColor();
}
/**
* Draws the panel.
* @param g the Graphics
object
*/
public void paint(Graphics g) {
if (dirty) {
updateChooser();
dirty = false;
}
super.paint(g);
}
/**
* Returns an integer from the defaults table. If key
does
* not map to a valid Integer
, default
is
* returned.
*
* @param key an Object
specifying the int
* @param defaultValue Returned value if key
is not available,
* or is not an Integer
* @return the int
*/
static int getInt(Object key, int defaultValue) {
Object value = UIManager.get(key);
if (value instanceof Integer) {
return ((Integer)value).intValue();
}
if (value instanceof String) {
try {
return Integer.parseInt((String)value);
} catch (NumberFormatException nfe) {}
}
return defaultValue;
}
/**
*
*/
class ModelListener implements ChangeListener, Serializable {
public void stateChanged(ChangeEvent e) {
if (isShowing()) { // isVisible
updateChooser();
dirty = false;
} else {
dirty = true;
}
}
}
}