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/pluglets/strategy/StrategyLoader.java,v 1.5 2004/06/11 06:17:34 tj_willis Exp $
019 */
020 package net.sourceforge.pavlov.pluglets.strategy;
021
022 import net.sourceforge.pavlov.user.AbstractStrategy;
023 import java.util.*;
024 import javax.swing.*;
025 import java.awt.event.*;
026 import net.sourceforge.pavlov.event.*;
027 import net.sourceforge.pavlov.pluglets.*;
028
029
030 //FIXME: having more than 1 menu using this will be a disaster
031 //FIXME: having less than 1 menu using this will be a disaster
032 /**
033 * A plugin loader for question selection strategies.
034 *
035 * @author <a href="mailto:"></a>
036 * @version 1.0
037 */
038 public class StrategyLoader
039 extends PlugletLoader
040 implements ActionListener
041 {
042 // FIXME: minimize access
043 ButtonGroup radioButtons;
044
045 /**
046 * Objects that want to be notified when user selects a new strategy.
047 *
048 */
049 protected Vector<StrategyListener> strategyListeners;
050
051
052 /**
053 * Creates a new <code>StrategyLoader</code> instance.
054 *
055 * @param baseClassName a <code>String</code> value
056 * @param directory a <code>String</code> value
057 */
058 public StrategyLoader(String baseClassName, String directory)
059 {
060 super(baseClassName,directory);
061 strategyListeners = new Vector<StrategyListener>();
062 }
063
064 /**
065 * Adds a listener.
066 *
067 * @param l a <code>StrategyListener</code> value
068 */
069 public void addStrategyListener(StrategyListener l)
070 {
071 strategyListeners.add(l);
072 }
073
074 /**
075 * Notify all my listeners that the strategy has changed.
076 *
077 * @param newStrategy an <code>AbstractStrategy</code> value
078 */
079 public void notify(AbstractStrategy newStrategy)
080 {
081 for (StrategyListener sl : strategyListeners) {
082 sl.strategyChanged(newStrategy);
083 }
084 }
085
086
087 /**
088 * Lets a non-listener know what current strategy is.
089 *
090 * @return an <code>AbstractStrategy</code> value
091 */
092 public AbstractStrategy getCurrentStrategy()
093 {
094 Object foo = radioButtons.getSelection();
095 //System.out.println("CLASS IS: " + foo.getClass());
096 JToggleButton.ToggleButtonModel b =(JToggleButton.ToggleButtonModel) radioButtons.getSelection();
097 if(b==null) return null;
098 //System.out.println("in loader name is " + b.getActionCommand());
099 return (AbstractStrategy)getPluginByName(b.getActionCommand());
100 }
101
102 // FIXME: offhand, this looks exactly the same as superclass definition
103 /**
104 * Describe <code>addToJMenuAsRadioButtons</code> method here.
105 *
106 * @param menu a <code>JMenu</code> value
107 * @return a <code>ButtonGroup</code> value
108 */
109 public ButtonGroup addToJMenuAsRadioButtons(JMenu menu)
110 {
111 if(pluglets==null) return null;
112 if(menu==null) return null;
113 radioButtons = new ButtonGroup();
114 boolean first = true;
115 for (Pluglet ap : pluglets) {
116 JRadioButtonMenuItem mi = new JRadioButtonMenuItem(ap.getName());
117 mi.setToolTipText(ap.getDescription());
118 mi.setActionCommand(ap.getName());
119 radioButtons.add(mi);
120 if(first){
121 mi.setSelected(true);
122 first = false;
123 }
124 menu.add(mi);
125 mi.addActionListener(this);
126 }
127 return radioButtons;
128 }
129
130
131 /**
132 * User has clicked a JRadioButtonMenuItem on my menu. Set the current
133 * strategy as requested and notify listeners.
134 *
135 * @param evt an <code>ActionEvent</code> value
136 */
137 public void actionPerformed(ActionEvent evt)
138 {
139 AbstractButton b = (AbstractButton)evt.getSource();
140 String stratName = b.getText();
141 AbstractStrategy strat = (AbstractStrategy)getPluginByName(stratName);
142 if(strat==null) return;
143 notify(strat);
144 }
145
146 }
147
148
149
150
151
152