/* * File : AuthorSettings.java * Created : 18-sep-2002 09:10 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2005 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). */ package edu.xtec.jclic; import edu.xtec.jclic.bags.MediaBagEditor; import edu.xtec.jclic.fileSystem.FileSystem; import edu.xtec.util.BrowserLauncher; import edu.xtec.util.JDomUtility; import edu.xtec.util.LFUtil; import edu.xtec.util.Messages; import edu.xtec.util.Options; import edu.xtec.util.ResourceBridge; import java.awt.Color; import java.awt.Component; import java.io.File; import java.io.FileOutputStream; import java.util.HashMap; import java.util.Iterator; import java.util.Map; /** * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.17 */ public class AuthorSettings implements edu.xtec.jclic.Constants { public ResourceBridge rb; public String language, country, variant; public String lookAndFeel; public String preferredBrowser; public String rootPath; public String rootExportPath; public String rootScormPath; public String mediaSystem; public FileSystem fileSystem; public String appletCodeBase; public String appletWidth, appletHeight; public String jsCodeBase; public Color appletBgColor; public int imgMaxWidth; public int imgMaxHeight; public Map<String, Object> misc; public static final int MAX_RECENT=8; public String[] recentFiles; public String cfgFile; public boolean readOnly; protected static String defaultCfgFile=null; public static final String PROJECTS_PATH="projects", EXPORT_PATH="export", SCORM_PATH = "scorm", CFG_FILE="jclic_author.cfg"; public static final String DEFAULT_APPLET_CODEBASE="http://clic.xtec.cat/dist/jclic"; public static final String DEFAULT_APPLET_WIDTH="700"; public static final String DEFAULT_APPLET_HEIGHT="450"; public static final Color DEFAULT_APPLET_BGCOLOR=Color.white; /** Revert codebase to clic.xtec.cat */ // public static final String DEFAULT_JS_CODEBASE="https://cdn.jsdelivr.net/jclic.js/latest/jclic.min.js"; public static final String DEFAULT_JS_CODEBASE="https://clic.xtec.cat/dist/jclic.js/jclic.min.js"; /** Creates new AuthorSettings */ public AuthorSettings(ResourceBridge rb, String fromPath){ this.rb=rb; misc=new HashMap<String, Object>(); lookAndFeel=edu.xtec.util.LFUtil.SYSTEM; preferredBrowser=""; recentFiles=new String[MAX_RECENT]; mediaSystem=DEFAULT; readOnly=false; rootExportPath=rootScormPath=rootPath=System.getProperty("user.home"); cfgFile=(fromPath==null ? getDefaultCfgFile(rb.getOptions()) : fromPath); fileSystem=new FileSystem(rb); if(FileSystem.isStrUrl(cfgFile)){ readOnly=true; } else{ File f=new File(cfgFile); readOnly=!f.canWrite(); } appletCodeBase=DEFAULT_APPLET_CODEBASE; appletWidth=DEFAULT_APPLET_WIDTH; appletHeight=DEFAULT_APPLET_HEIGHT; appletBgColor=DEFAULT_APPLET_BGCOLOR; jsCodeBase = DEFAULT_JS_CODEBASE; imgMaxWidth=MediaBagEditor.DEFAULT_IMG_MAX_WIDTH; imgMaxHeight=MediaBagEditor.DEFAULT_IMG_MAX_HEIGHT; } public static final String ELEMENT_NAME="JClicAuthorSettings", APPLET="applet", CODEBASE="codebase", JSCODEBASE = "JScodebase", BGCOLOR="bgcolor", IMGMAXSIZE="imgMaxSize", WIDTH="width", HEIGHT="height", SOUND="sound", SYSTEM="system", MISC="misc", PATHS="paths", PATH="path", ROOT="root", EXPORT="export", SCORM="scorm", RECENT_FILES="recentFiles", FILE="file"; public static String getDefaultCfgFile(Options options){ if(defaultCfgFile==null) defaultCfgFile=edu.xtec.util.PersistentSettings.getFilePath(PROGRAM, CFG_FILE, options, true); return defaultCfgFile; } public static AuthorSettings loadAuthorSettings(ResourceBridge rb){ AuthorSettings result=null; String cfgFile=rb.getOptions().getString(ELEMENT_NAME); if(cfgFile!=null){ try{ result=new AuthorSettings(rb, cfgFile); result.loadSettings(result.fileSystem.getXMLDocument(cfgFile).getRootElement()); } catch(Exception ex){ result=null; System.err.println("Unable to read settings from "+cfgFile+"\n"+ex); } } if(result==null){ cfgFile=getDefaultCfgFile(rb.getOptions()); result=new AuthorSettings(rb, cfgFile); try{ result.loadSettings(result.fileSystem.getXMLDocument(cfgFile).getRootElement()); } catch(Exception ex){ result.initNewSettings(); } } Options options=rb.getOptions(); options.syncProperties(result.getProperties(), true); if(!options.getBoolean(Options.LANGUAGE_BY_PARAM) && result.language!=null){ options.put(Messages.LANGUAGE, result.language); if(result.country!=null) options.put(Messages.COUNTRY, result.country); if(result.variant!=null) options.put(Messages.VARIANT, result.variant); } return result; } private void initNewSettings(){ try{ Messages msg=rb.getOptions().getMessages(); if(language==null){ language=msg.getLocale().getLanguage(); country=msg.getLocale().getCountry(); variant=msg.getLocale().getVariant(); } readOnly=false; File f=new File(new File(cfgFile).getParentFile(), PROJECTS_PATH); f.mkdirs(); rootPath=f.getAbsolutePath(); f=new File(new File(cfgFile).getParentFile(), EXPORT_PATH); rootExportPath=f.getAbsolutePath(); f=new File(new File(cfgFile).getParentFile(), SCORM_PATH); rootScormPath=f.getAbsolutePath(); fileSystem=new FileSystem(rootPath, rb); imgMaxWidth=MediaBagEditor.getImgMaxWidth(); imgMaxHeight=MediaBagEditor.getImgMaxHeight(); } catch(Exception ex){ System.err.println("Unable to create new settings!\n"+ex); } } public void save(){ if(!readOnly){ try{ FileOutputStream fos=fileSystem.createSecureFileOutputStream(cfgFile); JDomUtility.saveDocument(fos, getJDomElement()); fos.close(); } catch(Exception ex){ System.err.println("unable to save settings in "+cfgFile + ": " + ex.getMessage()); //getMessages().showCompoundWarning(alertParent, "error_propertiesFile_beg", " "+cfgFile+" ", "error_propertiesFile_end", null); } } } public org.jdom.Element getJDomElement(){ org.jdom.Element e=new org.jdom.Element(ELEMENT_NAME); org.jdom.Element child, child2; if(language!=null){ child=new org.jdom.Element(Messages.LANGUAGE); child.setAttribute(ID, language); if(country!=null) child.setAttribute(Messages.COUNTRY, country); if(variant!=null) child.setAttribute(Messages.VARIANT, variant); e.addContent(child); } child=new org.jdom.Element(PATHS); child2=new org.jdom.Element(PATH); child2.setAttribute(ID, ROOT); child2.setAttribute(PATH, rootPath); child.addContent(child2); child2=new org.jdom.Element(PATH); child2.setAttribute(ID, EXPORT); child2.setAttribute(PATH, rootExportPath); child.addContent(child2); child2=new org.jdom.Element(PATH); child2.setAttribute(ID, SCORM); child2.setAttribute(PATH, rootScormPath); child.addContent(child2); e.addContent(child); child=new org.jdom.Element(APPLET); child.setAttribute(CODEBASE, appletCodeBase); child.setAttribute(WIDTH, appletWidth); child.setAttribute(HEIGHT, appletHeight); child.setAttribute(BGCOLOR, JDomUtility.colorToString(appletBgColor)); child.setAttribute(JSCODEBASE, jsCodeBase); e.addContent(child); child=new org.jdom.Element(SOUND); child.setAttribute(MEDIA_SYSTEM, mediaSystem); e.addContent(child); child=new org.jdom.Element(LFUtil.LOOK_AND_FEEL); child.setAttribute(ID, lookAndFeel); e.addContent(child); child=new org.jdom.Element(BrowserLauncher.BROWSER); child.setAttribute(ID, preferredBrowser); e.addContent(child); child=new org.jdom.Element(IMGMAXSIZE); child.setAttribute(WIDTH, Integer.toString(imgMaxWidth)); child.setAttribute(HEIGHT, Integer.toString(imgMaxHeight)); e.addContent(child); if(!misc.isEmpty()){ child=new org.jdom.Element(MISC); for (java.util.Map.Entry me : misc.entrySet()) { String k=(String)me.getKey(); Object v=me.getValue(); if(k!=null && v!=null && v instanceof String) child.setAttribute(k, (String)v); } e.addContent(child); } child=new org.jdom.Element(RECENT_FILES); for(int i=0; i<MAX_RECENT; i++){ if(recentFiles[i]!=null){ child2=new org.jdom.Element(FILE); child2.setAttribute(PATH, recentFiles[i]); child.addContent(child2); } } e.addContent(child); return e; } protected void loadSettings(org.jdom.Element e) throws Exception{ JDomUtility.checkName(e, ELEMENT_NAME); org.jdom.Element child, child2; if((child=e.getChild(PATHS))!=null){ String rp=null, rpx=null, rps=null; Iterator it=child.getChildren(PATH).iterator(); while(it.hasNext()){ child2=(org.jdom.Element)it.next(); if(ROOT.equals(child2.getAttributeValue(ID))){ rp=JDomUtility.getStringAttr(child2, PATH, rootPath, false); } else if(EXPORT.equals(child2.getAttributeValue(ID))){ rpx=JDomUtility.getStringAttr(child2, PATH, rootExportPath, false); } else if(SCORM.equals(child2.getAttributeValue(ID))){ rps=JDomUtility.getStringAttr(child2, PATH, rootScormPath, false); } } if(rp!=null){ rootPath=rp; if(!FileSystem.isStrUrl(rootPath)) fileSystem=new FileSystem(rootPath, rb); } if(rpx!=null){ rootExportPath=rpx; } else { if(!FileSystem.isStrUrl(rootPath)){ File f=new File(rootPath); if(f.getName().compareToIgnoreCase(PROJECTS_PATH)==0 && f.getParent()!=null){ rootExportPath = (new File(f.getParentFile(), EXPORT_PATH)).getPath(); } else{ rootExportPath = (new File(f, EXPORT_PATH)).getPath(); } } } if(rps!=null){ rootScormPath=rps; } else { if(!FileSystem.isStrUrl(rootPath)){ File f=new File(rootPath); if(f.getName().compareToIgnoreCase(PROJECTS_PATH)==0 && f.getParent()!=null){ rootScormPath = (new File(f.getParentFile(), SCORM_PATH)).getPath(); } else{ rootScormPath = (new File(f, SCORM_PATH)).getPath(); } } } } if((child=e.getChild(APPLET))!=null){ appletCodeBase=JDomUtility.getStringAttr(child, CODEBASE, DEFAULT_APPLET_CODEBASE, false); appletWidth=JDomUtility.getStringAttr(child, WIDTH, DEFAULT_APPLET_WIDTH, false); appletHeight=JDomUtility.getStringAttr(child, HEIGHT, DEFAULT_APPLET_HEIGHT, false); appletBgColor=JDomUtility.getColorAttr(child, BGCOLOR, DEFAULT_APPLET_BGCOLOR); jsCodeBase=JDomUtility.getStringAttr(child, JSCODEBASE, DEFAULT_JS_CODEBASE, false); } if((child=e.getChild(Messages.LANGUAGE))!=null){ language=JDomUtility.getStringAttr(child, ID, language, false); country=JDomUtility.getStringAttr(child, Messages.COUNTRY, country, false); variant=JDomUtility.getStringAttr(child, Messages.VARIANT, variant, false); } if((child=e.getChild(SOUND))!=null){ mediaSystem=JDomUtility.getStringAttr(child, MEDIA_SYSTEM, mediaSystem, false); } if((child=e.getChild(LFUtil.LOOK_AND_FEEL))!=null){ lookAndFeel=JDomUtility.getStringAttr(child, ID, lookAndFeel, false); } if((child=e.getChild(BrowserLauncher.BROWSER))!=null){ preferredBrowser=JDomUtility.getStringAttr(child, ID, preferredBrowser, false); BrowserLauncher.setPreferredBrowser(preferredBrowser); } if((child=e.getChild(IMGMAXSIZE))!=null){ imgMaxWidth=JDomUtility.getIntAttr(child, WIDTH, MediaBagEditor.DEFAULT_IMG_MAX_WIDTH); imgMaxHeight=JDomUtility.getIntAttr(child, HEIGHT, MediaBagEditor.DEFAULT_IMG_MAX_HEIGHT); MediaBagEditor.setImgMaxWidth(imgMaxWidth); MediaBagEditor.setImgMaxHeight(imgMaxHeight); } if((child=e.getChild(MISC))!=null){ java.util.Iterator it=child.getAttributes().iterator(); while(it.hasNext()){ org.jdom.Attribute a=(org.jdom.Attribute)it.next(); misc.put(a.getName(), a.getValue()); } } if((child=e.getChild(RECENT_FILES))!=null){ java.util.Iterator it=child.getChildren(FILE).iterator(); for(int i=0; i<MAX_RECENT; i++){ if(it.hasNext()) recentFiles[i]=JDomUtility.getStringAttr(((org.jdom.Element)it.next()), PATH, null, false); else recentFiles[i]=null; } } } public Map<String, Object> getProperties(){ Map<String, Object> prop=new HashMap<String, Object>(); String t=TRUE; String f=FALSE; if(language!=null){ prop.put(Messages.LANGUAGE, language); prop.put(Messages.COUNTRY, country); prop.put(Messages.VARIANT, variant); } prop.put(LFUtil.LOOK_AND_FEEL, lookAndFeel); prop.put(MEDIA_SYSTEM, mediaSystem); prop.putAll(misc); return prop; } public boolean edit(Component parent){ AuthorSettingsDlg dlg=new AuthorSettingsDlg(this, parent); dlg.setVisible(true); if(dlg.result){ BrowserLauncher.setPreferredBrowser(preferredBrowser); MediaBagEditor.setImgMaxWidth(imgMaxWidth); MediaBagEditor.setImgMaxHeight(imgMaxHeight); } return dlg.result; } public void addRecentFile(String fName){ String[] recentBak=recentFiles; recentFiles=new String[MAX_RECENT]; recentFiles[0]=fName; for(int i=0, j=1; i<MAX_RECENT && j<MAX_RECENT; i++){ if(recentBak[i]!=null && !recentBak[i].equals(fName)){ recentFiles[j++]=recentBak[i]; } } } }