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/main/standalone/Pavlov.java,v 1.8 2004/07/01 05:50:20 tj_willis Exp $
019     */
020    package net.sourceforge.pavlov.main.standalone;
021    
022    import java.awt.*;
023    import java.awt.event.*;
024    
025    import javax.swing.*;
026    
027    import net.sourceforge.pavlov.main.*;
028    import net.sourceforge.pavlov.pluglets.*;
029    import net.sourceforge.pavlov.pluglets.feedback.velocity.*;
030    import net.sourceforge.pavlov.pluglets.strategy.*;
031    
032    import org.apache.log4j.*;
033    /**
034     *  Description of the Class
035     *
036     *@author     Haus
037     *@created    June 26, 2004
038     */
039    public class Pavlov
040                     extends AbstractPavlovApplication
041    {
042            private JFrame frame;
043            private SwingUIFactory uiFactory;
044            private static Category cat = Category.getInstance(Pavlov.class.getName());
045    
046    
047            /**
048             *  Constructor for the Pavlov object
049             *
050             *@param  args  Description of the Parameter
051             */
052            public Pavlov(String args[])
053            {
054                    //FIXED: finally single-document-interface
055                    super(args);
056                    makeFrame();
057                    makeUIFactory();
058                    // this must be done before pluglet loading starts
059                    frame.setJMenuBar(uiFactory.createMenuBar(frame.getRootPane()));
060    
061                    setup();
062                    cat.info("Build date: " + rb.getString("BuildDate", "Unknown"));
063    
064                    ImageIcon logo = uiFactory.makeImageIcon("WindowIconFile",
065                                    "file:resources/P.png",
066                                    50);
067    
068    
069                    if (logo != null) {
070                            java.awt.Image imm = logo.getImage();
071                            frame.setIconImage(imm);
072                    }
073                    
074                    //JLabel lab = new JLabel("Foo");
075                    //frame.add(lab);
076    
077                    //Quit this app when the big window closes.
078                    frame.addWindowListener(
079                            new WindowAdapter()
080                            {
081                                    public void windowClosing(WindowEvent event)
082                                    {
083                                            niceQuit(false);
084                                    }
085                            });
086                    javax.swing.ToolTipManager.sharedInstance().setEnabled(true);
087                    
088                    frame.add(uiFactory.getMain());
089                    sizeFrame();
090                    //frame.pack();
091            }
092    
093    
094            /**
095             *  Description of the Method
096             */
097            private void makeFrame()
098            {
099                    if (frame != null) {
100                            return;
101                    }
102                    frame = new JFrame(rb.getString(rb.TITLE,"Pavlov"));
103                    //frame.pack();
104                    //frame.setVisible(true);
105            }
106    
107    
108            /*
109             *  Gets the frame attribute of the Pavlov object
110             *
111             *@return    The frame value
112             *@deprecated to be removed soon
113             *
114            public JFrame getFrame()
115            {
116                    return frame;
117            }*/
118    
119    
120            /**
121             *  Description of the Method
122             */
123            private void makeUIFactory()
124            {
125                    if (uiFactory != null) {
126                            return;
127                    }
128                    uiFactory = new SwingUIFactory(this, frame);
129            }
130    
131            /**
132             *  Description of the Method
133             *
134             *@param  abs  Description of the Parameter
135             */
136            protected void showLoginController(AbstractPavlovApplication abs)
137            {
138                    //System.out.println("In showLoginController");
139                    uiFactory.showLoginController(abs);
140            }
141    
142    
143            /**
144             *  Shows the user startup status, delegates to getUIBuilder()'s setStatus.
145             *
146             *@param  pos  an <code>int</code> value
147             *@param  msg  a <code>String</code> value
148             */
149            public final void setStatus(final int pos, final String msg)
150            {
151                    uiFactory.setStatus(pos, msg);
152            }
153    
154    
155            /**
156             *  Sets status using a key to query the resource broker.
157             *
158             *@param  pos  Description of the Parameter
159             *@param  key  Description of the Parameter
160             */
161            public final void newSetStatus(final int pos, final String key)
162            {
163                    String msg = rb.getString(key);
164                    setStatus(pos, msg);
165            }
166    
167    
168            /**
169             *  Description of the Method
170             */
171            protected final void showSplashScreen()
172            {
173                    uiFactory.showSplashScreen(frame);
174            }
175    
176    
177            /**
178             *  Description of the Method
179             */
180            protected final void closeSplashScreen()
181            {
182                    uiFactory.closeSplashScreen();
183            }
184    
185    
186            /**
187             *  Description of the Method
188             *
189             *@return    Description of the Return Value
190             */
191            protected boolean confirmQuit()
192            {
193                    return uiFactory.confirmQuit();
194            }
195    
196    
197            /**
198             *  Description of the Method
199             *
200             *@param  msg  Description of the Parameter
201             */
202            public final void showIncorrectDialog(String msg)
203            {
204                    uiFactory.showIncorrectDialog(msg);
205            }
206    
207    
208            /**
209             *  Description of the Method
210             */
211            public void loadPluglets()
212            {
213            //Load java feedback pluglets
214            String superClass 
215            = "net.sourceforge.pavlov.pluglets.feedback.AbstractFeedbackPluglet";
216            new fbLoader().start();
217            /*
218            feedbackPlugins = new PlugletLoader(superClass,"pluglets/feedback/");
219            //feedbackPlugins.addToContainer(desktopPane);
220            uiFactory.setFeedbackPluglets(feedbackPlugins);
221            */
222            
223            //Load velocity feedback pluglets
224            new vpLoader().start();
225            /*
226            velocityPlugins = new VelocityPlugletLoader("pluglets/velocity");
227            uiFactory.setVelocityPluglets(velocityPlugins);
228            */
229            
230            //Load strategy pluglets
231            new stLoader().start();
232            /*
233            String sc1 = "net.sourceforge.pavlov.user.AbstractStrategy";
234            strategyPlugins = new StrategyLoader(sc1,"pluglets/strategy/");
235            uiFactory.setStrategyPluglets(strategyPlugins);
236            */
237            
238            
239            //Load tool pluglets
240            new tLoader().start();
241            /*
242            toolPluglets = new PlugletLoader(superClass,"pluglets/tools/");
243            //toolPluglets.addToContainer(desktopPane);
244            uiFactory.setToolPluglets(toolPluglets);
245            */
246            }
247    
248            private final class fbLoader extends Thread{
249                    public fbLoader(){
250                            super();
251                    }
252                    
253                    public void run(){
254                            String superClass 
255                            = "net.sourceforge.pavlov.pluglets.feedback.AbstractFeedbackPluglet";
256                String dir = Pavlov.this.rb.getString(rb.FEEDBACK_PLUGLET_DIRECTORY);
257                            Pavlov.this.feedbackPlugins = new PlugletLoader(superClass,dir);//"pluglets/feedback/");
258                            //feedbackPlugins.addToContainer(desktopPane);
259                            Pavlov.this.uiFactory.setFeedbackPluglets(feedbackPlugins);                     
260                    }
261            }
262            private final class vpLoader extends Thread{
263                    public vpLoader(){
264                            super();
265                    }
266                    
267                    public void run(){
268                String dir = Pavlov.this.rb.getString(rb.VELOCITY_PLUGLET_DIRECTORY);
269                            Pavlov.this.velocityPlugins = new VelocityPlugletLoader(dir);//"pluglets/velocity");
270                            Pavlov.this.uiFactory.setVelocityPluglets(velocityPlugins);             
271                    }
272            }       
273            
274            
275            private final class stLoader extends Thread{
276                    public stLoader(){
277                            super();
278                    }
279                    
280                    public void run(){
281                            String sc1 = "net.sourceforge.pavlov.user.AbstractStrategy";
282                String dir = Pavlov.this.rb.getString(rb.STRATEGY_PLUGLET_DIRECTORY);
283                            Pavlov.this.strategyPlugins = new StrategyLoader(sc1,dir);//"pluglets/strategy/");
284                            Pavlov.this.uiFactory.setStrategyPluglets(strategyPlugins);             
285                    }
286            }       
287            
288            private final class tLoader extends Thread{
289                    public tLoader(){
290                            super();
291                    }
292                    
293                    public void run(){
294                            String superClass 
295                            = "net.sourceforge.pavlov.pluglets.feedback.AbstractFeedbackPluglet";
296                String dir = Pavlov.this.rb.getString(rb.TOOL_PLUGLET_DIRECTORY);
297                            Pavlov.this.toolPluglets = new PlugletLoader(superClass,dir);//"pluglets/tools/");
298                            //toolPluglets.addToContainer(desktopPane);
299                            Pavlov.this.uiFactory.setToolPluglets(toolPluglets);    
300                    }
301            }               
302            
303            /**
304             *  Description of the Method
305             */
306            public void createQuizSelector()
307            {
308                    uiFactory.createQuizSelector(user, library);
309            }
310    
311    
312            /**
313             *  Gets the uIBuilder attribute of the Pavlov object
314             *
315             *@return    The uIBuilder value
316             */
317            public AbstractUIFactory getUIBuilder()
318            {
319                    // these 2 methods do nothing if frame, uiFactory already exist
320                    makeFrame();
321                    makeUIFactory();
322                    return uiFactory;
323            }
324    
325    
326            /**
327             *  Description of the Method
328             */
329            public void loginFinished()
330            {
331                    //FIXED: 800 X 600 was ghetto
332                    sizeFrame();
333            }
334    
335            private void sizeFrame(){
336                    Dimension size = Toolkit.getDefaultToolkit().getScreenSize();
337                    frame.setSize(new java.awt.Dimension( (int)(size.width*.8), (int)(size.height*.8)));
338                    frame.setVisible(true);         
339            }
340    
341            /**
342             *  Description of the Method
343             *
344             *@param  args  Description of the Parameter
345             */
346            public static void main(String args[])
347            {
348                    try {
349                            new Pavlov(args);
350                    } catch (Throwable t) {
351                            cat.error("Uncaught Throwable",t);      
352                    }
353            }
354    }
355