001    /*
002     * $Id: ContextMenuSource.java,v 1.5 2006/05/14 08:19:45 dmouse Exp $
003     *
004     * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
005     * Santa Clara, California 95054, U.S.A. All rights reserved.
006     *
007     * This library is free software; you can redistribute it and/or
008     * modify it under the terms of the GNU Lesser General Public
009     * License as published by the Free Software Foundation; either
010     * version 2.1 of the License, or (at your option) any later version.
011     * 
012     * This library is distributed in the hope that it will be useful,
013     * but WITHOUT ANY WARRANTY; without even the implied warranty of
014     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
015     * Lesser General Public License for more details.
016     * 
017     * You should have received a copy of the GNU Lesser General Public
018     * License along with this library; if not, write to the Free Software
019     * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
020     */
021    package org.jdesktop.swingx.plaf;
022    
023    import java.awt.event.ActionEvent;
024    import java.util.HashMap;
025    import java.util.Map;
026    
027    import javax.swing.AbstractAction;
028    import javax.swing.Action;
029    import javax.swing.ActionMap;
030    import javax.swing.JComponent;
031    import javax.swing.UIManager;
032    
033    
034    /**
035     * @author Jeanette Winzenburg
036     */
037    public abstract class ContextMenuSource {
038    
039        private Map<String, String> names;
040    
041        public abstract String[] getKeys();
042    
043        public String getName(String actionKey) {
044            return getNames().get(actionKey);
045        }
046    
047        public abstract void updateActionEnabled(JComponent component, ActionMap map);
048    
049        /**
050         * returns an ActionMap for usage in default context menus.
051         * @param component
052         * @return an <code>ActionMap</code> for usage in default context menus
053         */
054        public ActionMap createActionMap(JComponent component) {
055            ActionMap map = new ActionMap();
056            String[] keys = getKeys();
057            for (int i = 0; i < keys.length; i++) {
058                if (keys[i] != null) {
059                    Action action = createDelegateAction(component, keys[i]);
060                    if (action != null) {
061                        map.put(keys[i], action);
062                    }
063                }
064            }
065            return map;
066        }
067    
068        protected Map<String, String> getNames() {
069            if (names == null) {
070                names = new HashMap<String, String>();
071                initNames(names);
072            }
073            return names;
074        }
075    
076        protected String getValue(String key, String defaultValue) {
077            String value = UIManager.getString(getResourcePrefix() + key);
078            return value != null ? value : defaultValue;
079        }
080    
081        protected abstract void initNames(Map<String, String> names);
082        
083        protected abstract String getResourcePrefix();
084    
085     
086        protected Action createDelegateAction(JComponent component,
087                String actionKey) {
088            Action action = component.getActionMap().get(actionKey);
089            if (action != null) {
090             return new DelegateAction(getName(actionKey),
091                    action, component);
092            }
093            return null;
094        }
095    
096        public static class DelegateAction extends AbstractAction {
097    
098            private Action delegatee;
099            private JComponent target;
100    
101            public DelegateAction(String name, Action delegatee, JComponent target) {
102                super(name);
103                this.delegatee = delegatee;
104                this.target = target;
105            }
106    
107            public void actionPerformed(ActionEvent e) {
108                delegatee.actionPerformed(createActionEvent(e));
109            }
110    
111            private ActionEvent createActionEvent(ActionEvent e) {
112                if (target != null) {
113                    return new ActionEvent(target, e.getID(), e.getActionCommand(), e.getWhen(), e.getModifiers());
114                }
115                return e;
116            }
117        }
118    
119    }