/*
* $Id$
*
* Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
* Santa Clara, California 95054, U.S.A. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
package org.jdesktop.swingx.plaf;
import java.awt.event.ActionEvent;
import java.util.HashMap;
import java.util.Map;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ActionMap;
import javax.swing.JComponent;
import javax.swing.UIManager;
/**
* @author Jeanette Winzenburg
*/
public abstract class ContextMenuSource {
private Map<String, String> names;
public abstract String[] getKeys();
public String getName(String actionKey) {
return getNames().get(actionKey);
}
public abstract void updateActionEnabled(JComponent component, ActionMap map);
/**
* returns an ActionMap for usage in default context menus.
* @param component
* @return an <code>ActionMap</code> for usage in default context menus
*/
public ActionMap createActionMap(JComponent component) {
ActionMap map = new ActionMap();
String[] keys = getKeys();
for (int i = 0; i < keys.length; i++) {
if (keys[i] != null) {
Action action = createDelegateAction(component, keys[i]);
if (action != null) {
map.put(keys[i], action);
}
}
}
return map;
}
protected Map<String, String> getNames() {
if (names == null) {
names = new HashMap<String, String>();
initNames(names);
}
return names;
}
protected String getValue(String key, String defaultValue) {
String value = UIManager.getString(getResourcePrefix() + key);
return value != null ? value : defaultValue;
}
protected abstract void initNames(Map<String, String> names);
protected abstract String getResourcePrefix();
protected Action createDelegateAction(JComponent component,
String actionKey) {
Action action = component.getActionMap().get(actionKey);
if (action != null) {
return new DelegateAction(getName(actionKey),
action, component);
}
return null;
}
public static class DelegateAction extends AbstractAction {
private Action delegatee;
private JComponent target;
public DelegateAction(String name, Action delegatee, JComponent target) {
super(name);
this.delegatee = delegatee;
this.target = target;
}
public void actionPerformed(ActionEvent e) {
delegatee.actionPerformed(createActionEvent(e));
}
private ActionEvent createActionEvent(ActionEvent e) {
if (target != null) {
return new ActionEvent(target, e.getID(), e.getActionCommand(), e.getWhen(), e.getModifiers());
}
return e;
}
}
}