1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222
/* * @(#)AbstractColorChooserPanel.java 1.21 05/11/17 * * Copyright 2006 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 <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}. * * @version 1.21 11/17/05 * @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 <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; buildChooser(); updateChooser(); colorListener = new ModelListener(); getColorSelectionModel().addChangeListener(colorListener); } /** * Invoked when the panel is removed from the chooser. * If override this, be sure to call <code>super</code>. */ public void uninstallChooserPanel(JColorChooser enclosingChooser) { getColorSelectionModel().removeChangeListener(colorListener); 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 chooser.getSelectionModel(); } /** * Returns the color that is currently selected. * @return the <code>Color</code> that is selected */ protected Color getColorFromModel() { return getColorSelectionModel().getSelectedColor(); } /** * Draws the panel. * @param g the <code>Graphics</code> object */ public void paint(Graphics g) { if (dirty) { updateChooser(); dirty = false; } 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 */ 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; } } } }