/* * GloballyContextSensitiveAction.java * * Created on December 4, 2007, 4:09 PM * * To change this template, choose Tools | Template Manager * and open the template in the editor. */ package org.owasp.webscarab.util.swing; import java.awt.KeyboardFocusManager; import java.awt.event.ActionEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import javax.swing.Action; import javax.swing.JComponent; /** * * @author rdawes */ // @author Santhosh Kumar T - santhosh@in.fiorano.com public class GloballyContextSensitiveAction implements Action { String actionName, shortDescription, longDescription; Action delegate; JComponent source; private PropertyChangeListener focusOwnerListener = new PropertyChangeListener(){ public void propertyChange(PropertyChangeEvent evt){ if("focusOwner".equals(evt.getPropertyName())){ if(evt.getNewValue() instanceof JComponent){ JComponent comp = (JComponent)evt.getNewValue(); Action action = comp.getActionMap().get(actionName); if(action != null) changeDelegate(comp, action); } } } }; public GloballyContextSensitiveAction(String actionName, String shortDescription, String longDescription){ this.actionName = actionName; this.shortDescription = shortDescription; this.longDescription = longDescription; KeyboardFocusManager.getCurrentKeyboardFocusManager().addPropertyChangeListener(focusOwnerListener); } /*-------------------------------------------------[ Delegate Listener ]---------------------------------------------------*/ PropertyChangeSupport support = new PropertyChangeSupport(this); private PropertyChangeListener delegateListener = new PropertyChangeListener(){ public void propertyChange(PropertyChangeEvent evt){ support.firePropertyChange(evt.getPropertyName(), evt.getOldValue(), evt.getNewValue()); } }; public void addPropertyChangeListener(PropertyChangeListener listener){ support.addPropertyChangeListener(listener); } public void removePropertyChangeListener(PropertyChangeListener listener){ support.removePropertyChangeListener(listener); } private void changeDelegate(JComponent comp, Action action){ if(delegate!=null) delegate.removePropertyChangeListener(delegateListener); source = comp; delegate = action; delegate.addPropertyChangeListener(delegateListener); boolean enabled = delegate.isEnabled(); support.firePropertyChange("enabled", !enabled, enabled); } public boolean isEnabled(){ return delegate!=null && delegate.isEnabled(); } public void setEnabled(boolean enabled){ if(delegate!=null) delegate.setEnabled(enabled); } public Object getValue(String key){ if(key.equals(Action.NAME)) return actionName; else if(key.equals(Action.SHORT_DESCRIPTION)) return shortDescription; else if(key.equals(Action.LONG_DESCRIPTION)) return longDescription; else if(delegate!=null) return delegate.getValue(key); else return null; } public void putValue(String key, Object value){ if(key.equals(Action.NAME)) actionName = (String)value; else if(key.equals(Action.SHORT_DESCRIPTION)) shortDescription = (String)value; else if(key.equals(Action.LONG_DESCRIPTION)) longDescription = (String)value; else if(delegate!=null) delegate.putValue(key, value); } public void actionPerformed(ActionEvent ae){ if(delegate!=null) delegate.actionPerformed(new ActionEvent(source, ae.getID(), ae.getActionCommand(), ae.getWhen(), ae.getModifiers())); } }