001    /* PAVLOV -- Multiple Choice Study System
002     * Copyright (C) 2000 - 2004 T.J. Willis
003     * 
004     * This program is free software; you can redistribute it and/or
005     * modify it under the terms of the GNU General Public License
006     * as published by the Free Software Foundation; either version 2
007     * of the License, or (at your option) any later version.
008     *      
009     * This program is distributed in the hope that it will be useful,
010     * but WITHOUT ANY WARRANTY; without even the implied warranty of
011     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
012     * GNU General Public License for more details.
013     *          
014     * You should have received a copy of the GNU General Public License
015     * along with this program; if not, write to the Free Software
016     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
017     *  
018     * $Header: /cvsroot/pavlov/net/sourceforge/pavlov/swing/HashtableJRadioButtonMenu.java,v 1.3 2004/05/10 15:02:41 tj_willis Exp $
019     */ 
020    package net.sourceforge.pavlov.swing;
021    import javax.swing.*;
022    import java.util.Hashtable;
023    import java.awt.event.*;
024    
025    // note.. hashtable will only be populated
026    // by calls to methods overriden in this class.
027    // a complete implementation of this class
028    // would override all such methods
029    
030    // also, class is schizo as to whether it deals with JMenuItem or JRadio...MenuItem
031    /**
032     * This is a _partial_ implementation of a JMenu that creates 
033     * JRadioButtonMenuItems for all the keys in a given hashtable.
034     * This class needs some serious polishing.
035     * @author <a href="mailto:tj_willis@users.sourceforge.net"></a>
036     * @version 1.0
037     */
038    public class HashtableJRadioButtonMenu extends JMenu {
039        // FIXED: reduce access
040        private Hashtable<String,JMenuItem> _items;
041    
042        /**
043         * Creates a new <code>HashtableJRadioButtonMenu</code> instance.
044         *
045         */
046        public HashtableJRadioButtonMenu() {
047            super();
048            _items = new Hashtable<String,JMenuItem>();
049        }
050        
051        /**
052         * Creates a new <code>HashtableJRadioButtonMenu</code> instance.
053         *
054         * @param a an <code>Action</code> value
055         */
056        public HashtableJRadioButtonMenu(Action a) {
057            super(a);
058            _items = new Hashtable<String,JMenuItem>();   
059        }
060        
061        /**
062         * Creates a new <code>HashtableJRadioButtonMenu</code> instance.
063         *
064         * @param s a <code>String</code> value
065         */
066        public HashtableJRadioButtonMenu(String s) {
067            super(s);
068            _items = new Hashtable<String,JMenuItem>();
069        }
070        
071        /**
072         * Creates a new <code>HashtableJRadioButtonMenu</code> instance.
073         *
074         * @param s a <code>String</code> value
075         * @param b a <code>boolean</code> value
076         */
077        public HashtableJRadioButtonMenu(String s, boolean b) {
078            super(s, b);
079            _items = new Hashtable<String,JMenuItem>();
080        }
081    
082        /**
083         * Adds the given menuitem, placing a reference in the hashtable.
084         *
085         * @param menuItem a <code>JMenuItem</code> value
086         * @return a <code>JMenuItem</code> value
087         */
088        public JMenuItem add(JMenuItem menuItem) {
089            _items.put(menuItem.getText(), menuItem);
090            JMenuItem x = super.add(menuItem);
091    
092            return  x;
093        }
094    
095        /**
096         * Adds a JMenuItem with the given string.  Adds the string as its 
097         * hashtable key.
098         *
099         * @param s a <code>String</code> value
100         * @return a <code>JMenuItem</code> value
101         */
102        public JMenuItem add(String s) {
103            JMenuItem x = super.add(s);
104    
105            _items.put(s, x);
106            return x;
107        }
108    
109        // get-by-name is the whole motivation for this class
110        /**
111         * Returns the JMenuItem corresponding to the given key string.
112         *
113         * @param s a <code>String</code> value
114         * @return a <code>JMenuItem</code> value
115         */
116        public JMenuItem get(String s) {
117            return _items.get(s);
118        }
119    
120        // add a bunch of names with a single actionlistener
121        /**
122         * Describe <code>addAllAsJRadioButtonMenuItems</code> method here.
123         *
124         * @param names a <code>String[]</code> value
125         * @param lis a <code>ActionListener</code> value
126         */
127        public void addAllAsJRadioButtonMenuItems(String[] names, ActionListener lis) {
128            int sz = java.lang.reflect.Array.getLength(names);
129    
130            for (int i = 0; i < sz; i++) {
131                JRadioButtonMenuItem dir1 = new JRadioButtonMenuItem(names[i]);
132    
133                dir1.addActionListener(lis);
134                add(dir1);
135            }
136        }
137    
138        //set a particular item to selected by name
139        /**
140         * Sets the named JRadioButtonMenuItem to selected.
141         *
142         * @param _name a <code>String</code> value
143         * @param tog a <code>boolean</code> value
144         */
145        public void setSelected(String _name, boolean tog) {
146            // FIXME: check for classcast exception
147            JRadioButtonMenuItem dir1 = (JRadioButtonMenuItem) get(_name);
148    
149            if (dir1 == null) return;
150            dir1.setSelected(tog);
151        }
152    
153    }