/* * File : JClicAuthotApplet.java * Created : 27-Apr-2008 21:00 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2008 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details (see the LICENSE file). */ import edu.xtec.jclic.RunnableComponent; import edu.xtec.jclic.media.CheckMediaSystem; import edu.xtec.util.Check; import edu.xtec.util.LFUtil; import edu.xtec.util.Messages; import edu.xtec.util.Options; import edu.xtec.util.ResourceManager; import java.net.URL; import javax.swing.RootPaneContainer; /** JClic Author applet. Shows a splash screen at startup and loads * a {@link AuthorSingleFrame} in a separate process. * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.09 */ public class JClicAuthorApplet extends javax.swing.JApplet implements edu.xtec.jclic.Constants { private Options options; private RunnableComponent rc; private String activityPack, sequence; private boolean initiated; private boolean trace; private javax.swing.JLabel splashLabel; private boolean isInstaller; // useful constants private static final String HTTP="http:", FILE="file:"; private static final String STRING="string", BOOL="boolean", URL="url"; // parameters private static final String ACTIVITY_PACK="activityPack"; private static final String SEQUENCE="sequence"; private static final int NUM_PRIVATE_PARAMS=2; private static final String[][] pInfo={ {ACTIVITY_PACK, STRING, "absolute or relative URL of the JClic project to load"}, {SEQUENCE, STRING, "optional project's starting sequence name"}, {Messages.LANGUAGE, STRING, "two-char language code"}, {Messages.COUNTRY, STRING, "two-char country code"}, {Messages.VARIANT, STRING, "locale variant code"}, {SKIN, STRING, "skin to be used"}, {COOKIE, STRING, "optional session cookie value. currently not used"}, {REPORTER_CLASS, STRING, "reporter class name"}, {REPORTER_PARAMS, STRING, "reporter parameters"}, {EXIT_URL, URL, "URL where to redirect navigation at end"}, {INFO_URL_FRAME, STRING, "optional frame where to display info documents. If unespecified, _BLANK will be used"}, {SYSTEM_SOUNDS, BOOL, "to play or not system sounds"}, {COMPRESS_IMAGES, BOOL, "to compress or not images in cells"}, {LFUtil.LOOK_AND_FEEL, STRING, "look & feel to use"}, {AUDIO_ENABLED, BOOL, "to have audio enabled or not"}, {MEDIA_SYSTEM, STRING, "preferred multimedia system: 'JMF' for Java Media Framework or 'QT' for QuickTime"}, {TRACE, BOOL, "show debug messages in console"} }; /** Creates new JClicAuthorApplet */ public JClicAuthorApplet() { super(); trace=false; rc=null; initiated=false; activityPack=null; sequence=null; options=new Options(this); splashLabel = new javax.swing.JLabel(" ", ResourceManager.getImageIcon("icons/logo_author.png"), javax.swing.SwingConstants.CENTER); splashLabel.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); splashLabel.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); splashLabel.setBackground(BG_COLOR); splashLabel.setOpaque(true); getContentPane().add(splashLabel, java.awt.BorderLayout.CENTER); } @Override public void init() { // init only once by applet instance if(initiated) return; initiated=true; // get "trace" flag trace=TRUE.equals(getParameter(TRACE)); final StringBuilder sb=new StringBuilder(); final RootPaneContainer rpc=this; edu.xtec.util.SwingWorker sw=new edu.xtec.util.SwingWorker(){ @Override public Object construct(){ // get parameters for(int i=NUM_PRIVATE_PARAMS; i<pInfo.length; i++){ options.put(pInfo[i][0], getParameter(pInfo[i][0])); if(trace) System.out.println(">>> param "+pInfo[i][0]+" is "+getParameter(pInfo[i][0])); } Messages messages; try{ messages=edu.xtec.util.PersistentSettings.getMessages(options, DEFAULT_BUNDLE); } catch(Exception ex){ System.err.println("Unable to get default user messages language!\n"+ex); messages=Messages.getMessages(options, DEFAULT_BUNDLE); } messages.addBundle(COMMON_SETTINGS); if(splashLabel!=null) splashLabel.setText(messages.get("LOADING")); if(!Check.checkSignature(options, true)) return null; CheckMediaSystem.check(options, false); // build player try{ rc=new edu.xtec.jclic.AuthorSingleFrame(options); } catch(Exception ex){ sb.append("ERROR: ").append(ex); } return rc; } @Override public void finished(){ if(getValue()==null){ if(isInstaller && options.getString(EXIT_URL)!=null){ try{ String url=options.getString(EXIT_URL); if(url.indexOf(':')<0) // no protocol, assume "file://" url="file://"+url; getAppletContext().showDocument(new URL(url)); } catch(Exception ex){ sb.append("ERROR: ").append(ex); } } // no player build! if(splashLabel!=null){ String s=sb.substring(0); splashLabel.setText(s); System.err.println(s); } } else{ // remove label and place player getContentPane().removeAll(); splashLabel=null; //rc.addTo(getContentPane(), java.awt.BorderLayout.CENTER); rc.addTo(rpc, java.awt.BorderLayout.CENTER); getRootPane().revalidate(); // load project javax.swing.SwingUtilities.invokeLater(new Runnable(){ public void run(){ rc.start(activityPack, sequence); } }); } } }; if(trace) System.out.println(">>> initializing..."); // launch swingWorker sw.start(); } @Override public void start(){ if(trace) System.out.println(">>> applet started"); } @Override public void stop(){ if(rc!=null) rc.stop(); if(trace) System.out.println(">>> applet stopped"); } @Override public void destroy(){ if(rc!=null){ if(trace) System.out.println(">>> destroying applet..."); getContentPane().removeAll(); rc.end(); rc=null; initiated=false; } if(trace) System.out.println(">>> applet destroyed"); } @Override public String getAppletInfo(){ return "JClic Author applet"; } @Override public String[][] getParameterInfo(){ return pInfo; } }