001/* ======================================================================== 002 * JCommon : a free general purpose class library for the Java(tm) platform 003 * ======================================================================== 004 * 005 * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors. 006 * 007 * Project Info: http://www.jfree.org/jcommon/index.html 008 * 009 * This library is free software; you can redistribute it and/or modify it 010 * under the terms of the GNU Lesser General Public License as published by 011 * the Free Software Foundation; either version 2.1 of the License, or 012 * (at your option) any later version. 013 * 014 * This library is distributed in the hope that it will be useful, but 015 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 016 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 017 * License for more details. 018 * 019 * You should have received a copy of the GNU Lesser General Public 020 * License along with this library; if not, write to the Free Software 021 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 022 * USA. 023 * 024 * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 025 * in the United States and other countries.] 026 * 027 * ----------------- 028 * ActionButton.java 029 * ----------------- 030 * (C)opyright 2002-2004, by Thomas Morgner and Contributors. 031 * 032 * Original Author: Thomas Morgner; 033 * Contributor(s): David Gilbert (for Object Refinery Limited); 034 * 035 * $Id: ActionButton.java,v 1.6 2006/11/02 13:10:35 taqua Exp $ 036 * 037 * ChangeLog 038 * --------- 039 * 30-Aug-2002 : Initial version 040 * 01-Sep-2002 : Documentation 041 * 10-Dec-2002 : Minor Javadoc updates (DG); 042 * 07-Jun-2004 : Corrected source headers (DG); 043 * 044 */ 045 046package org.jfree.ui.action; 047 048import java.beans.PropertyChangeEvent; 049import java.beans.PropertyChangeListener; 050 051import javax.swing.Action; 052import javax.swing.Icon; 053import javax.swing.JButton; 054import javax.swing.KeyStroke; 055 056import org.jfree.util.Log; 057 058/** 059 * The ActionButton is used to connect an Action and its properties to a Button. This functionality 060 * is already implemented in JDK 1.3 but needed for JDK 1.2.2 compatibility. 061 * 062 * @author Thomas Morgner 063 */ 064public class ActionButton extends JButton { 065 066 /** 067 * The action. 068 */ 069 private Action action; 070 071 /** 072 * The property change handler. 073 */ 074 private ActionEnablePropertyChangeHandler propertyChangeHandler; 075 076 /** 077 * Helperclass to handle the property change event raised by the action. Changed properties in 078 * the action will affect the button. 079 */ 080 private class ActionEnablePropertyChangeHandler implements PropertyChangeListener { 081 082 /** 083 * Default constructor. 084 */ 085 public ActionEnablePropertyChangeHandler() { 086 } 087 088 /** 089 * Receives notification of a property change event. 090 * 091 * @param event the property change event. 092 */ 093 public void propertyChange(final PropertyChangeEvent event) { 094 try { 095 if (event.getPropertyName().equals("enabled")) { 096 setEnabled(getAction().isEnabled()); 097 } 098 else if (event.getPropertyName().equals(Action.SMALL_ICON)) { 099 setIcon((Icon) getAction().getValue(Action.SMALL_ICON)); 100 } 101 else if (event.getPropertyName().equals(Action.NAME)) { 102 setText((String) getAction().getValue 103 (Action.NAME)); 104 } 105 else if (event.getPropertyName().equals(Action.SHORT_DESCRIPTION)) { 106 ActionButton.this.setToolTipText((String) 107 getAction().getValue(Action.SHORT_DESCRIPTION)); 108 } 109 110 final Action ac = getAction(); 111 if (event.getPropertyName().equals(ActionDowngrade.ACCELERATOR_KEY)) { 112 final KeyStroke oldVal = (KeyStroke) event.getOldValue(); 113 if (oldVal != null) { 114 unregisterKeyboardAction(oldVal); 115 } 116 final Object o = ac.getValue(ActionDowngrade.ACCELERATOR_KEY); 117 if (o instanceof KeyStroke) { 118 final KeyStroke k = (KeyStroke) o; 119 registerKeyboardAction(ac, k, WHEN_IN_FOCUSED_WINDOW); 120 } 121 } 122 else if (event.getPropertyName().equals(ActionDowngrade.MNEMONIC_KEY)) { 123 final Object o = ac.getValue(ActionDowngrade.MNEMONIC_KEY); 124 if (o != null) { 125 if (o instanceof Character) { 126 final Character c = (Character) o; 127 setMnemonic(c.charValue()); 128 } 129 else if (o instanceof Integer) { 130 final Integer c = (Integer) o; 131 setMnemonic(c.intValue()); 132 } 133 } 134 } 135 } 136 catch (Exception e) { 137 Log.warn("Error on PropertyChange in ActionButton: ", e); 138 } 139 } 140 } 141 142 /** 143 * Creates a Button without any text and without an assigned Action. 144 */ 145 public ActionButton() { 146 super(); 147 } 148 149 /** 150 * Creates a Button and set the given text as label. 151 * 152 * @param text the label for the new button. 153 */ 154 public ActionButton(final String text) { 155 super(text); 156 } 157 158 /** 159 * Creates an ActionButton and sets the given text and icon on the button. 160 * 161 * @param text the label for the new button. 162 * @param icon the icon for the button. 163 */ 164 public ActionButton(final String text, final Icon icon) { 165 super(text, icon); 166 } 167 168 169 /** 170 * Creates an ActionButton and sets the given icon on the button. 171 * 172 * @param icon the icon for the button. 173 */ 174 public ActionButton(final Icon icon) { 175 super(icon); 176 } 177 178 /** 179 * Nreates an ActionButton and assigns the given action with the button. 180 * 181 * @param action the action. 182 */ 183 public ActionButton(final Action action) { 184 setAction(action); 185 } 186 187 /** 188 * Returns the assigned action or null if no action has been assigned. 189 * 190 * @return the action (possibly null). 191 */ 192 public Action getAction() { 193 return this.action; 194 } 195 196 197 /** 198 * Returns and initializes the PropertyChangehandler for this ActionButton. 199 * The PropertyChangeHandler monitors the action and updates the button if necessary. 200 * 201 * @return the property change handler. 202 */ 203 private ActionEnablePropertyChangeHandler getPropertyChangeHandler() { 204 if (this.propertyChangeHandler == null) { 205 this.propertyChangeHandler = new ActionEnablePropertyChangeHandler(); 206 } 207 return this.propertyChangeHandler; 208 } 209 210 /** 211 * Enables and disables this button and if an action is assigned to this button the 212 * propertychange is forwarded to the assigned action. 213 * 214 * @param b the new enable-state of this button 215 */ 216 public void setEnabled(final boolean b) { 217 super.setEnabled(b); 218 if (getAction() != null) { 219 getAction().setEnabled(b); 220 } 221 } 222 223 /** 224 * Assigns the given action to this button. The properties of the action will be assigned to 225 * the button. If an previous action was set, the old action is unregistered. 226 * <p/> 227 * <ul> 228 * <li>NAME - specifies the button text 229 * <li>SMALL_ICON - specifies the buttons icon 230 * <li>MNEMONIC_KEY - specifies the buttons mnemonic key 231 * <li>ACCELERATOR_KEY - specifies the buttons accelerator 232 * </ul> 233 * 234 * @param newAction the new action 235 */ 236 public void setAction(final Action newAction) { 237 final Action oldAction = getAction(); 238 if (oldAction != null) { 239 removeActionListener(oldAction); 240 oldAction.removePropertyChangeListener(getPropertyChangeHandler()); 241 242 final Object o = oldAction.getValue(ActionDowngrade.ACCELERATOR_KEY); 243 if (o instanceof KeyStroke) { 244 final KeyStroke k = (KeyStroke) o; 245 unregisterKeyboardAction(k); 246 } 247 } 248 this.action = newAction; 249 if (this.action != null) { 250 addActionListener(newAction); 251 newAction.addPropertyChangeListener(getPropertyChangeHandler()); 252 253 setText((String) (newAction.getValue(Action.NAME))); 254 setToolTipText((String) (newAction.getValue(Action.SHORT_DESCRIPTION))); 255 setIcon((Icon) newAction.getValue(Action.SMALL_ICON)); 256 setEnabled(this.action.isEnabled()); 257 258 Object o = newAction.getValue(ActionDowngrade.MNEMONIC_KEY); 259 if (o != null) { 260 if (o instanceof Character) { 261 final Character c = (Character) o; 262 setMnemonic(c.charValue()); 263 } 264 else if (o instanceof Integer) { 265 final Integer c = (Integer) o; 266 setMnemonic(c.intValue()); 267 } 268 } 269 o = newAction.getValue(ActionDowngrade.ACCELERATOR_KEY); 270 if (o instanceof KeyStroke) { 271 final KeyStroke k = (KeyStroke) o; 272 registerKeyboardAction(newAction, k, WHEN_IN_FOCUSED_WINDOW); 273 } 274 } 275 } 276} 277