/* * File : MediaContent.java * Created : 25-apr-2001 15:33 * 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.media; import edu.xtec.jclic.*; import edu.xtec.jclic.bags.MediaBag; import edu.xtec.jclic.fileSystem.FileSystem; import edu.xtec.util.*; import java.awt.Point; import java.util.Map; /** * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.09 */ public class MediaContent extends Object implements Cloneable, Domable { public static final int UNKNOWN=0, PLAY_AUDIO=1, PLAY_VIDEO=2, PLAY_MIDI=3, PLAY_CDAUDIO=4, RECORD_AUDIO=5, PLAY_RECORDED_AUDIO=6, RUN_CLIC_ACTIVITY=7, RUN_CLIC_PACKAGE=8, RUN_EXTERNAL=9, URL=10, EXIT=11, RETURN=12, NUM_MEDIA_TYPES=13; public static final String[] mediaName={ "UNKNOWN", "PLAY_AUDIO", "PLAY_VIDEO", "PLAY_MIDI", "PLAY_CDAUDIO", "RECORD_AUDIO", "PLAY_RECORDED_AUDIO", "RUN_CLIC_ACTIVITY", "RUN_CLIC_PACKAGE", "RUN_EXTERNAL", "URL", "EXIT", "RETURN" }; public static final int FROM_BOX=0, FROM_WINDOW=1, FROM_FRAME=2; public static final String[] fromName={"BOX", "WINDOW", "FRAME"}; public int mediaType=UNKNOWN; public int level=1; public String mediaFileName=null; public String externalParam=null; public int from=-1; public int to=-1; public int length=3; public String cdFrom=null; public String cdTo=null; public int recBuffer=0; //public boolean fixedAspectRatio=true; public boolean stretch=false; public boolean free=false; public Point absLocation=null; public int absLocationFrom=FROM_BOX; public boolean loop=false; public boolean catchMouseEvents=false; public boolean autoStart=false; /** Creates new MediaContent */ public MediaContent() { } public static final String ELEMENT_NAME="media"; protected static final String TYPE="type", LEVEL="level", FILE="file", PARAMS="params", FROM="from", TO="to", CDFROM="cdFrom", CDTO="cdTo", BUFFER="buffer", LENGTH="length", STRETCH="stretch", //RETAIN_ASPECT="retainAspect", FREE="free", PX="px", PY="py", PFROM="pFrom", LOOP="loop", CATCH_MOUSE="catchMouseEvents", AUTOSTART="autoStart"; public org.jdom.Element getJDomElement(){ org.jdom.Element e=new org.jdom.Element(ELEMENT_NAME); e.setAttribute(TYPE, mediaName[mediaType]); e.setAttribute(LEVEL, Integer.toString(level)); if(mediaFileName!=null) e.setAttribute(FILE, mediaFileName); if(externalParam!=null) e.setAttribute(PARAMS, externalParam); if(from!=-1) e.setAttribute(FROM, Integer.toString(from)); if(to!=-1) e.setAttribute(TO, Integer.toString(to)); if(cdFrom!=null) e.setAttribute(CDFROM, cdFrom); if(cdTo!=null) e.setAttribute(CDTO, cdTo); if(mediaType==RECORD_AUDIO || mediaType==PLAY_RECORDED_AUDIO){ e.setAttribute(BUFFER, Integer.toString(recBuffer)); if(mediaType==RECORD_AUDIO) e.setAttribute(LENGTH, Integer.toString(length)); } if(mediaType==PLAY_VIDEO){ //e.setAttribute(RETAIN_ASPECT, JDomUtility.boolString(fixedAspectRatio)); e.setAttribute(STRETCH, JDomUtility.boolString(stretch)); e.setAttribute(FREE, JDomUtility.boolString(free)); if(catchMouseEvents) e.setAttribute(CATCH_MOUSE, JDomUtility.boolString(catchMouseEvents)); if(absLocation!=null){ e.setAttribute(PX, Integer.toString(absLocation.x)); e.setAttribute(PY, Integer.toString(absLocation.y)); e.setAttribute(PFROM, fromName[absLocationFrom]); } } if(loop) e.setAttribute(LOOP, JDomUtility.boolString(loop)); if(autoStart) e.setAttribute(AUTOSTART, JDomUtility.boolString(autoStart)); return e; } public static MediaContent getMediaContent(org.jdom.Element e) throws Exception{ MediaContent mc=new MediaContent(); mc.setProperties(e, null); return mc; } public void setProperties(org.jdom.Element e, Object aux) throws Exception{ JDomUtility.checkName(e, ELEMENT_NAME); mediaType=JDomUtility.getStrIndexAttr(e, TYPE, mediaName, -1); if(mediaType==-1) throw new IllegalArgumentException("Unknown media type: "+mediaName); level=JDomUtility.getIntAttr(e, LEVEL, level); mediaFileName=FileSystem.stdFn(e.getAttributeValue(FILE)); externalParam=e.getAttributeValue(PARAMS); from=JDomUtility.getIntAttr(e, FROM, from); to=JDomUtility.getIntAttr(e, TO, to); cdFrom=e.getAttributeValue(CDFROM); cdTo=e.getAttributeValue(CDTO); recBuffer=JDomUtility.getIntAttr(e, BUFFER, recBuffer); length=JDomUtility.getIntAttr(e, LENGTH, length); stretch=JDomUtility.getBoolAttr(e, STRETCH, stretch); // bad identifier in beta 0 //mc.fixedAspectRatio=JDomUtility.getBoolAttr(e, RETAIN_ASPECT, mc.fixedAspectRatio); stretch=JDomUtility.getBoolAttr(e, "retainAspect", stretch); // -------- free=JDomUtility.getBoolAttr(e, FREE, free); absLocationFrom=JDomUtility.getStrIndexAttr(e, PFROM, fromName, absLocationFrom); absLocation=JDomUtility.getPointAttr(e, PX, PY, absLocation); loop=JDomUtility.getBoolAttr(e, LOOP, loop); catchMouseEvents=JDomUtility.getBoolAttr(e, CATCH_MOUSE, catchMouseEvents); autoStart=JDomUtility.getBoolAttr(e, AUTOSTART, autoStart); } public static void listReferences(org.jdom.Element e, Map<String,String> map){ if(e!=null){ String s=e.getAttributeValue(FILE); String p=e.getAttributeValue(PARAMS); int k=0; if(s!=null && s.length()>0){ int type; try{ type=JDomUtility.getStrIndexAttr(e, TYPE, mediaName, -1); } catch(Exception ex){ System.err.println("error:\n"+ex); return; } switch(type){ case PLAY_AUDIO: case PLAY_VIDEO: case PLAY_MIDI: map.put(s, Constants.MEDIA_OBJECT); break; case RUN_CLIC_ACTIVITY: k=1; case RUN_CLIC_PACKAGE: map.put(s, p!=null ? Constants.EXTERNAL_OBJECT : k>0 ? Constants.ACTIVITY_OBJECT : Constants.SEQUENCE_OBJECT); if(p!=null) map.put(p, Constants.EXTERNAL_OBJECT); break; case RUN_EXTERNAL: map.put((p==null ? s : s+" "+p), Constants.EXTERNAL_OBJECT); break; case URL: map.put(s, Constants.URL_OBJECT); break; } } } } public String getIconName(){ String s="unknown.gif"; switch(mediaType){ case PLAY_AUDIO: s="icowave.png"; break; case PLAY_MIDI: s="icomidi.png"; break; case PLAY_VIDEO: s="icomci.png"; break; case RETURN: case RUN_CLIC_ACTIVITY: case RUN_CLIC_PACKAGE: s="ico00.png"; break; case RECORD_AUDIO: s="icorec.png"; break; case PLAY_RECORDED_AUDIO: s="icorplay.png"; break; case EXIT: s="icoexit.png"; break; case URL: case RUN_EXTERNAL: s="icoexe.png"; break; default: break; } return s; } public void registerContentTo(MediaBag mb) throws Exception{ if(mediaFileName!=null){ switch(mediaType){ case PLAY_AUDIO: case PLAY_MIDI: case PLAY_VIDEO: mb.registerElement(mediaFileName, null); break; default: break; } } } public boolean isEquivalent(MediaContent mc){ return mc!=null && mediaType==mc.mediaType && StrUtils.compareStringsIgnoreCase(mediaFileName, mc.mediaFileName) && StrUtils.compareStringsIgnoreCase(externalParam, mc.externalParam) && from==mc.from && to==mc.to && StrUtils.compareStringsIgnoreCase(cdFrom, mc.cdFrom) && StrUtils.compareStringsIgnoreCase(cdTo, mc.cdTo) && recBuffer==mc.recBuffer && stretch==mc.stretch && free==mc.free && StrUtils.compareObjects(absLocation, mc.absLocation) && absLocationFrom==mc.absLocationFrom && loop==mc.loop && level==mc.level; } public String getDescription(){ StringBuilder result=new StringBuilder(); result.append(mediaName[mediaType]); if(mediaFileName!=null){ result.append(" ").append(mediaFileName); if(from>=0) result.append(" ").append("from:").append(from); if(to>=0) result.append(" ").append("to:").append(to); } else if(externalParam!=null){ result.append(" ").append(externalParam); } return result.substring(0); } @Override public Object clone(){ MediaContent mc=null; try{ mc=(MediaContent)super.clone(); if(absLocation!=null) mc.absLocation=(Point)absLocation.clone(); } catch(Exception ex){ System.err.println("Unexpected error cloning MediaContent!"); } return mc; } }