/* * File : Clic3Activity.java * Created : 30-oct-2000 20:45 * 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.clic3; import edu.xtec.jclic.boxes.ActiveBagContent; import edu.xtec.jclic.boxes.ActiveBoxContent; import edu.xtec.jclic.boxes.BoxBase; import edu.xtec.jclic.fileSystem.FileSystem; import edu.xtec.jclic.media.MediaContent; import edu.xtec.jclic.project.JClicProject; import edu.xtec.jclic.shapers.HolesMaker; import edu.xtec.jclic.shapers.Rectangular; import edu.xtec.jclic.shapers.Shaper; import edu.xtec.util.FontCheck; import edu.xtec.util.JDomUtility; import edu.xtec.util.StrUtils; import java.awt.Color; import java.awt.Font; import java.awt.Point; import java.util.StringTokenizer; /** * This class encapsulates the main properties of a Clic 3.0 activity, and provides * methods to load it from a data stream and to convert it to a JClic * {@link edu.xtec.jclic.Activity}. * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.08 */ public class Clic3Activity extends Clic3 { public JClicProject project; public static final int TOO_MUCH_CELLS=14; private static final Boolean BF=false; public String rPath=null; public String className=null; public String fileName; public String[] fileNameCont=new String[3]; public int actMode, puzMode, graPos; public int ncw, nch; public int nctxw, nctxh; public int txtCW, txtCH, txtCW2, txtCH2; public int[] ntags = new int[2]; public int[] cont = new int[3]; public boolean[] bar = new boolean[2]; public boolean[] delim = new boolean[2]; public boolean stretch; public String initMess; public String endMess; public String fileDesc; public String custHelpFile; public String hlpTopic; public String[][] tags=new String[2][]; public String[] graTxt; public int[] nLines = new int[3]; public int[] ass = new int[MAXCW * MAXCH]; //public boolean loaded, modified; public boolean mAss, invAss, shHelp, shPuz, sol; public boolean okToNext, btCorregir; public boolean avCont, avMaj, avAcc, avDblSpc, avPunt, avLletra, brPar, avNoSalta; public boolean noBV, shDisk, shPrint, shPorta, barraAmunt, noAv; //public boolean reported, solved; public boolean custHlp, tileBmp, pwTransp, pwrp; public int pwrx, pwry; public int avPrevHelp, avTimePH, tabSpc; public int avScope, avMaxScope; //public int movToSolv, iniSolved; public Font[] logF = new Font[4]; public TripleColor[] colors = new TripleColor[4]; public Color[] colorFons = new Color[2]; public Color[] colorUsuari = new Color[2]; public Color[] colorError = new Color[2]; //public int[] tramaFons = new int[2]; public boolean useDLL; public String rgDLL; public byte[] dllOptions; public boolean[] comptadors = new boolean[3]; public boolean marcs; public int btTipus; public String txBase; public String txBtCorregir; public String txPrev; public String bmpFons; public String initMessPrev; public String actd; /** Creates new Clic3Activity */ public Clic3Activity(JClicProject project) { this.project=project; clear(); rPath=BLANK; } public void clear(){ int i; actMode=NONE; puzMode=INTERC; graPos=AB; ncw=nch=nctxw=nctxh=0; txtCW=txtCW2=DEF_TXTCASW; txtCH=txtCH2=DEF_TXTCASH; stretch=false; btCorregir=true; avCont=true; avAcc=true; avMaj=true; brPar=false; avDblSpc=false; avPunt=true; avLletra=true; avNoSalta=true; avScope=3; avMaxScope=6; fileName=initMess=endMess=fileDesc=custHelpFile=hlpTopic=BLANK; for(i=0; i<(MAXCW * MAXCH); i++) ass[i]=-2; mAss=false; invAss=false; shHelp=true; shPuz=true; shDisk=true; shPrint=false; shPorta=true; custHlp=false; noBV=false; barraAmunt=false; okToNext=false; noAv=false; tabSpc=16; for(i=0; i<3; i++){ fileNameCont[i]=BLANK; cont[i]=EXT_TXT; nLines[i]=0; comptadors[i]=true; } for(i=0; i<2; i++){ ntags[i]=0; tags[i]=null; bar[i]=true; delim[i]=true; colorFons[i]=DEFAULT_BACK_COLOR; //tramaFons[i]=-1; } colorUsuari[0]=DEFAULT_COLOR_USUARI_0; colorUsuari[1]=DEFAULT_COLOR_USUARI_1; colorError[0]=DEFAULT_COLOR_ERROR_0; colorError[1]=DEFAULT_COLOR_ERROR_1; graTxt=null; for(i=0; i<4; i++){ logF[i]=BoxBase.getDefaultFont(); //logF[i]=logFont0; //colors[i]=new TripleColor(new Color(0xFF, 0xFF, 0xFF), // new Color(0, 0, 0), // new Color(0x80, 0x80, 0x80), false); //colors[i]=new TripleColor(DEFAULT_TRIPLE_COLOR.backColor, // DEFAULT_TRIPLE_COLOR.textColor, // DEFAULT_TRIPLE_COLOR.shadowColor, // DEFAULT_TRIPLE_COLOR.shadow); colors[i]=(TripleColor)DEFAULT_TRIPLE_COLOR.clone(); } //colors[2].backColor=new Color(0xC0, 0xC0, 0xC0); colors[2].backColor=DEFAULT_BACK_COLOR; //loaded=modified=sol=false; //reported=true; //solved=false; //movToSolv=0; //iniSolved=0; marcs=true; useDLL=false; dllOptions=null; rgDLL=BLANK; txBase=txBtCorregir=txPrev=bmpFons=initMessPrev=BLANK; avPrevHelp=0; avTimePH=30; btTipus=1; tileBmp=true; pwTransp=false; pwrp=false; pwrx=pwry=0; } Font stringToFont(String s) { //Hashtable lf = new Hashtable(); int lfHeight, lfWeight, lfItalic; //int lfHeight, lfWidth, lfEscapement, lfOrientation, lfWeight, lfItalic, lfUnderline; //int lfStrikeOut, lfCharSet, lfOutPrecision, lfClipPrecision, lfQuality, lfPitchAndFamily; String lfFaceName; float size; int style; StringTokenizer st; st = new StringTokenizer(s, COMMA); lfHeight=parseIntX(st.nextToken()); for(int i=0; i<3; i++) st.nextToken(); //lfWidth=parseIntX(st.nextToken()); //lfEscapement=parseIntX(st.nextToken()); //lfOrientation=parseIntX(st.nextToken()); lfWeight=parseIntX(st.nextToken()); lfItalic=parseIntX(st.nextToken()); for(int i=0; i<7; i++) st.nextToken(); //lfUnderline=parseIntX(st.nextToken()); //lfStrikeOut=parseIntX(st.nextToken()); //lfCharSet=parseIntX(st.nextToken()); //lfOutPrecision=parseIntX(st.nextToken()); //lfClipPrecision=parseIntX(st.nextToken()); //lfQuality=parseIntX(st.nextToken()); //lfPitchAndFamily=parseIntX(st.nextToken()); lfFaceName=st.nextToken().trim(); //size = lfHeight; //size /= 0.62; size = (lfHeight*10)/12; if(size<BoxBase.MIN_FONT_SIZE) size=BoxBase.MIN_FONT_SIZE; style=0; if(lfWeight>=700) style |= Font.BOLD; if(lfItalic!=0) style |= Font.ITALIC; if("system".equalsIgnoreCase(lfFaceName)){ lfFaceName="Arial"; size=13; style|=Font.BOLD; } //f = new Font(lfFaceName, style, new Float(size).intValue()); return FontCheck.getValidFont(lfFaceName, style, (int)size); } TripleColor stringToTripleColor(String str) { TripleColor c = new TripleColor(); StringTokenizer st; String tx; st=new StringTokenizer(str, COMMA); // test alpha //c.backColor=new Color(correctColor(parseIntX(st.nextToken(), 16)) | 150<<24, true); c.backColor=strToColor(st.nextToken()); c.textColor=strToColor(st.nextToken()); c.shadowColor=strToColor(st.nextToken()); c.shadow=(st.nextToken().compareTo("1")==0); return c; } public boolean load(String name, byte[] data) { String[] txt; StringBuilder tmptx=new StringBuilder(); String fn=BLANK; int i, l, tipus, nLin, fLine, ver, ncas, k; boolean result=false; int boolParms=0; //clear(); fileName = FileSystem.getCanonicalNameOf(validFileName(name), false); rPath=FileSystem.getPathPartOf(fileName); fLine=0; nLin=0; ver=0; tipus=getExt(fileName); if(isClic3Extension(tipus) && (txt=dataToArray(data))!=null && (nLin=txt.length)>0){ if(nLin>2 && (ver=(ver=parseIntX(txt[fLine++]))>1000 ? ver-1000 : ver)>=100 && ver<=CLICVER){ if(ver>107){ StringBuilder sb=new StringBuilder(); while(fLine<nLin){ if(txt[fLine].length()>0 && txt[fLine].charAt(0)==ENDDESC){ fLine++; break; } if(sb.length()>0) sb.append("\r\n"); sb.append(txt[fLine++]); } fileDesc=sb.substring(0); } if(ver>100){ for(i=0; i<(ver<118 ? 1:3); i++){ logF[i] = stringToFont(txt[fLine++]); if(ver>=118) colors[i] = stringToTripleColor(txt[fLine++]); } if(ver<118) for(i=1; i<4; i++) logF[i]=logF[0]; } if(ver>118){ StringTokenizer st=new StringTokenizer(txt[fLine++], COMMA); comptadors[1]=(parseIntX(st.nextToken())!=0); comptadors[2]=(parseIntX(st.nextToken())!=0); comptadors[0]=(parseIntX(st.nextToken())!=0); marcs=(parseIntX(st.nextToken())!=0); colorFons[0]=strToColor(st.nextToken()); colorFons[1]=strToColor(st.nextToken()); //tramaFons[0]=parseIntX(st.nextToken()); //tramaFons[1]=parseIntX(st.nextToken()); st.nextToken(); st.nextToken(); btTipus=parseIntX(st.nextToken()); pwrx=parseIntX(st.nextToken()); pwry=parseIntX(st.nextToken()); } else if(ver==118){ StringTokenizer st=new StringTokenizer(txt[fLine++], COMMA); comptadors[0]=(parseIntX(st.nextToken())!=0); comptadors[1]=(parseIntX(st.nextToken())!=0); comptadors[2]=(parseIntX(st.nextToken())!=0); marcs=(parseIntX(st.nextToken())!=0); colorFons[0]=strToColor(st.nextToken()); colorFons[1]=strToColor(st.nextToken()); //tramaFons[0]=parseIntX(st.nextToken()); st.nextToken(); //tramaFons[1]=parseIntX(st.nextToken()); st.nextToken(); } //else tramaFons[0]=0; if(ver<119) btTipus=0; if(ver>=119) if(txt[fLine++].length()>0) //bmpFons=rPath+validFileName(txt[fLine-1]); bmpFons=FileSystem.getCanonicalNameOf(rPath+validFileName(txt[fLine-1]), BF); initMess=txt[fLine++]; endMess=txt[fLine++]; if(ver>102){ boolParms=parseIntX(txt[fLine++]); delim[0]=(boolParms & 0x0001)!=0; delim[1]=(boolParms & 0x0002)!=0; } if(ver>105){ StringTokenizer st=new StringTokenizer(txt[fLine++], ";"); txtCW=parseIntX(st.nextToken()); if(st.hasMoreTokens()) txtCW2=parseIntX(st.nextToken()); else txtCW2=txtCW; st=new StringTokenizer(txt[fLine++], ";"); txtCH=parseIntX(st.nextToken()); if(st.hasMoreTokens()) txtCH2=parseIntX(st.nextToken()); else txtCH2=txtCH; } else{ txtCW=txtCW2=DEF_TXTCASW; txtCH=txtCH2=DEF_TXTCASH; } if(ver<118 && (tipus==EXT_SOP || tipus==EXT_CRW)){ txtCW=20; txtCH=20; } shHelp=(boolParms & 0x0004)==0; graPos=(boolParms&(0x0018))>>3; shPuz=(boolParms & 0x0020)==0; noBV=(boolParms & 0x0040)!=0; if(ver>=118){ shDisk=(boolParms & 0x0080)!=0; shPorta=(boolParms & 0x0100)!=0; barraAmunt=(boolParms & 0x0200)!=0; } if(ver>=119){ invAss=(boolParms & 0x400)!=0; tileBmp=(boolParms & 0x800)!=0; pwTransp=(boolParms & 0x1000)!=0; pwrp=(boolParms & 0x2000)!=0; noAv=(boolParms & 0x4000)!=0; shPrint=(boolParms & 0x8000)!=0; } if(ver>108){ custHlp=(parseIntX(txt[fLine++])!=0); // AFEGIR RPATH? hlpTopic=validFileName(txt[fLine++]); custHelpFile=validFileName(txt[fLine++]); } if(ver>114){ useDLL=(parseIntX(txt[fLine++])!=0); rgDLL=validFileName(txt[fLine++]); dllOptions=StrUtils.extractByteSeq(data, fLine++, (byte)0, ENDDESC_BYTE); } switch(tipus){ case EXT_PUZ: actMode=PUZZLE; if(nLin<fLine+4) break; //fileNameCont[0]=rPath+validFileName(txt[fLine++]); fileNameCont[0]=FileSystem.getCanonicalNameOf(rPath+validFileName(txt[fLine++]), BF); if((cont[0]=getExt(fileNameCont[0]))>EXT_TXT || (ncw=parseIntX(txt[fLine++]))<1 || (nch=parseIntX(txt[fLine++]))<1 || ncw>MAXCW || nch>MAXCH || (ncw==1 && nch==1) || (puzMode=parseIntX(txt[fLine++]))<INTERC || puzMode>MEMORY) break; stretch=(nLin>fLine && parseIntX(txt[fLine++])==1); bar[0]=bar[1]=true; if(ver<120 && puzMode==MEMORY) graPos=AUB; result=true; break; case EXT_ASS: actMode=ASSOCIA; if(nLin<fLine+7) break; if(ver>109) puzMode=parseIntX(txt[fLine++]); if((ncw=parseIntX(txt[fLine++]))<1 || (nch=parseIntX(txt[fLine++]))<1 || ncw>MAXCW || nch>MAXCH) break; //fileNameCont[0]=rPath+validFileName(txt[fLine++]); fileNameCont[0]=FileSystem.getCanonicalNameOf(rPath+validFileName(txt[fLine++]), BF); if((cont[0]=getExt(fileNameCont[0]))>EXT_TXT) break; //fileNameCont[1]=rPath+validFileName(txt[fLine++]); fileNameCont[1]=FileSystem.getCanonicalNameOf(rPath+validFileName(txt[fLine++]), BF); if(puzMode!=INFO && puzMode!=IDENTIFICA && (cont[1]=getExt(fileNameCont[1]))>EXT_TXT) break; bar[0]=(parseIntX(txt[fLine++])==1); bar[1]=(parseIntX(txt[fLine++])==1); if(puzMode==IDENTIFICA || puzMode==ESCRIU) bar[1]=false; else if(puzMode==EXPLORA || puzMode==INFO) bar[0]=bar[1]=false; stretch=true; if(ver>106){ if(sol=(parseIntX(txt[fLine++])!=0)){ //fileNameCont[2]=rPath+validFileName(txt[fLine++]); fileNameCont[2]=FileSystem.getCanonicalNameOf(rPath+validFileName(txt[fLine++]), BF); if((cont[2]=getExt(fileNameCont[2]))>EXT_TXT) break; } } if(ver>101){ if(nLin<fLine+1) break; mAss=(parseIntX(txt[fLine++])==1); if(mAss){ if(puzMode==NORMAL) puzMode=ESPECIAL; ncas=ncw*nch; if(nLin<fLine+ncas+2) break; if((nctxw=parseIntX(txt[fLine++]))<1 || (nctxh=parseIntX(txt[fLine++]))<1 || nctxw>MAXCW || nctxh>MAXCH) break; for(i=0; i<ncas; i++) ass[i]=parseIntX(txt[fLine++]); } } if(puzMode==INFO || puzMode==EXPLORA) noAv=true; result=true; break; case EXT_SOP: actMode=SOPA; if(nLin<fLine+7) break; fileNameCont[0]=txt[fLine++]; if(fileNameCont[0].length()>0 && fileNameCont[0].charAt(0)=='*'){ bar[0]=false; fileNameCont[0]=BLANK; cont[0]=EXT_BMP; } else{ //fileNameCont[0]=rPath+validFileName(fileNameCont[0]); fileNameCont[0]=FileSystem.getCanonicalNameOf(rPath+validFileName(fileNameCont[0]), BF); bar[0]=true; } if((bar[0] && (cont[0]=getExt(fileNameCont[0]))>EXT_TXT) || (ncw=parseIntX(txt[fLine++]))<1 || (nch=parseIntX(txt[fLine++]))<1 || ncw>MAXCW || nch>MAXCH || (ncw==1 && nch==1) || (nctxw=parseIntX(txt[fLine++]))<1 || (nctxh=parseIntX(txt[fLine++]))<1 || nctxw>MAXGW || nctxh>MAXGH || (nctxw==1 && nctxh==1) || (ntags[0]=parseIntX(txt[fLine++]))<1 || nLin<(nctxh+ntags[0]+fLine) || (tags[0]=new String[ntags[0]])==null || (graTxt=new String[nctxh])==null || copyArray(graTxt, 0, txt, fLine, nctxh, true)==false || copyArray(tags[0], 0, txt, fLine+nctxh, ntags[0], true)==false) break; result=true; stretch=true; break; case EXT_CRW: actMode=CREUATS; if(nLin<fLine+6) break; if((nctxw=parseIntX(txt[fLine++]))<1 || (nctxh=parseIntX(txt[fLine++]))<1 || nctxw>MAXGW || nctxh>MAXGH || (nctxw==1 && nctxh==1) || nLin<(fLine+nctxh+(ntags[0]=nctxh)+(ntags[1]=nctxw)) || (graTxt=new String[nctxh])==null || (tags[0]=new String[ntags[0]])==null || (tags[1]=new String[ntags[1]])==null || copyArray(graTxt, 0, txt, fLine, nctxh, true)==false || copyArray(tags[0], 0, txt, fLine+nctxh, ntags[0], false)==false || copyArray(tags[1], 0, txt, fLine+nctxh+ntags[0], ntags[1], false)==false) break; bar[0]=bar[1]=false; ncw=1; nch=4; stretch=false; result=true; break; case EXT_TXA: actMode=TEXTACT; logF[3]=stringToFont(txt[fLine++]); colors[3]=stringToTripleColor(txt[fLine++]); StringTokenizer st = new StringTokenizer(txt[fLine++], COMMA); colorUsuari[0]=strToColor(st.nextToken()); colorUsuari[1]=strToColor(st.nextToken()); colorError[0]=strToColor(st.nextToken()); colorError[1]=strToColor(st.nextToken()); st = new StringTokenizer(txt[fLine++], COMMA); puzMode=parseIntX(st.nextToken()); boolParms=parseIntX(st.nextToken()); avScope=parseIntX(st.nextToken()); avMaxScope=parseIntX(st.nextToken()); avPrevHelp=parseIntX(st.nextToken()); avTimePH=parseIntX(st.nextToken()); tabSpc=parseIntX(st.nextToken()); okToNext=(boolParms & 0x0001)!=0; btCorregir=(boolParms & 0x0002)!=0; avCont=(boolParms & 0x0004)!=0; avMaj=(boolParms & 0x0008)!=0; avAcc=(boolParms & 0x0010)!=0; brPar=(boolParms & 0x0020)!=0; avDblSpc=(boolParms & 0x0040)!=0; avPunt=(boolParms & 0x0080)!=0; avLletra=(boolParms & 0x0100)!=0; avNoSalta=(boolParms & 0x0200)!=0; txBtCorregir=txt[fLine++]; for(k=0; k<3; k++){ tmptx.setLength(0); while(fLine < nLin){ if(txt[fLine].length()>0 && txt[fLine].charAt(0)==ENDDESC) { fLine++; break; } if(tmptx.length()>0) tmptx.append("\n"); tmptx.append(txt[fLine++]); } switch(k){ case 0: txBase=tmptx.substring(0); break; case 1: txPrev=tmptx.substring(0); break; case 2: initMessPrev=tmptx.substring(0); break; } } if(btCorregir==false &&(puzMode!=FORATS || avCont==false)) noAv=true; result=(txBase!=null); default: break; } } if(!result){ //BMsgBox(0, IDS_LECT, ver>CLICVER ? IDS_ERRNEWV:IDS_ERRFMT, fn); clear(); } //else loaded=true; } else clear(); return result; } public BoxBase getBoxBase(int i){ // we have only 4 box bases if(i>3) return null; BoxBase bb=new BoxBase(); if(!colors[i].backColor.equals(BoxBase.DEFAULT_BACK_COLOR)) bb.backColor=colors[i].backColor; if(!colors[i].textColor.equals(BoxBase.DEFAULT_TEXT_COLOR)) bb.textColor=colors[i].textColor; if(!colors[i].shadowColor.equals(Color.gray)){ if(colors[i].shadow) bb.shadowColor=colors[i].shadowColor; bb.inactiveColor=colors[i].shadowColor; bb.alternativeColor=colors[i].shadowColor; } bb.shadow=colors[i].shadow; if(!logF[i].equals(BoxBase.getDefaultFont())) bb.setFont(logF[i]); return bb; } protected ActiveBagContent[] abcCopy=new ActiveBagContent[3]; public ActiveBagContent createActiveBagContent(int num) throws Exception{ int cw, ch; double w, h; ActiveBagContent abc=null; boolean specialShape=false; boolean noAutoZones=false; boolean singleCells=false; boolean border; if(num<0 || num>=3 || fileNameCont[num]==null) return abc; if(num==0 || num==2){ cw=ncw; ch=nch; w=txtCW; h=txtCH; border=delim[0]; } else{ cw=nctxw; ch=nctxh; w=txtCW2; h=txtCH2; border=delim[1]; } abc=new ActiveBagContent(cw, ch); abc.border=border; Shaper sh=null; if(fileDesc!=null){ if(fileDesc.indexOf("noAutoZones")>=0) noAutoZones=true; if(fileDesc.indexOf("singleCells")>=0) singleCells=true; int i=fileDesc.indexOf("SHAPER:"); if(i>=0){ StringTokenizer st=new StringTokenizer(fileDesc.substring(i+7), "|"); if(st.hasMoreTokens()){ org.jdom.Element e=new org.jdom.Element(Shaper.ELEMENT_NAME); e.setAttribute(JDomUtility.CLASS, "@"+st.nextToken()); e.setAttribute(Shaper.COLS, Integer.toString(cw)); e.setAttribute(Shaper.ROWS, Integer.toString(ch)); while(st.hasMoreTokens()){ String attribute, value; attribute=st.nextToken(); if(st.hasMoreTokens()){ value=st.nextToken(); e.setAttribute(attribute, value); } } try{ sh=Shaper.getShaper(e); } catch(Exception ex){ sh=null; } } } } if(sh==null) sh=new Rectangular(cw, ch); else specialShape=true; abc.setShaper(sh); if(fileNameCont[num].endsWith(".txt")){ //abc.setTextContent(ac.getTxtFile(fileNameCont[num]), ac, cw, ch, w, h); //setActiveBagTextContent(abc, ac.getTxtFile(fileNameCont[num]), ac, cw, ch, w, h); String[] content=dataToArray(project.getFileSystem().getBytes(fileNameCont[num])); if(content==null){ content=new String[cw*ch]; for(int z=0; z<cw*ch; z++) content[z]=new String(); } setActiveBagTextContent(abc, content, /*rb,*/ cw, ch, w, h); } else{ if(!noAutoZones && mAss && !specialShape && cw*ch>TOO_MUCH_CELLS && bar[num&1]==false){ if(num==2){ if(abcCopy[0]!=null){ abc.setShaper(abcCopy[0].getShaper()); abc.ncw=abcCopy[0].ncw; abc.nch=abcCopy[0].nch; } } else{ int[] ids=new int[cw*ch]; if(num==0) //ATENCIÓ!!!!!! //for(int i=0; i<cw*ch; i++) // ids[i]=ass[i]; System.arraycopy(ass, 0, ids, 0, cw*ch); else{ for(int i=0; i<cw*ch; i++) ids[i]=-1; int k=0; int m=Math.min(ncw*nch, ass.length); for(int i=0; i<m; i++){ int j=ass[i]; if(j>=0){ if(ids[j]==-1){ ids[j]=k; ass[i]=k; k++; } else ass[i]=ids[j]; } } } boolean skipOnes=(actMode==ASSOCIA && puzMode==IDENTIFICA); HolesMaker hsm=new HolesMaker(cw, ch, ids, num!=1, skipOnes, singleCells); abc.setShaper(hsm.getShaper()); if(num==0) ass=hsm.getIds(); } } abc.setImgContent(project.mediaBag.getImageElement(fileNameCont[num]), true); } abcCopy[num]=abc; return abc; } public void setActiveBoxTextContent(ActiveBoxContent abc, String tx) throws Exception{ int i, j; String sub, subc; String txPrev2; abc.mediaContent=null; abc.img=null; abc.imgName=null; //abc.rawText=new String(tx); abc.rawText=tx; txPrev2=tx; while((i=txPrev2.indexOf('{'))>=0){ j=txPrev2.indexOf('}', i); if(j<0) break; sub=txPrev2.substring(i+1, j); txPrev2=txPrev2.substring(0, i)+txPrev2.substring(j+1); sub=sub.trim(); subc=sub.toLowerCase(); if(subc.endsWith(".gif") || subc.endsWith(".jpg") || subc.endsWith(".bmp") || subc.endsWith(".png")){ abc.imgName=FileSystem.getCanonicalNameOf(rPath+validFileName(sub), BF); } else{ if(abc.mediaContent==null) abc.mediaContent=new MediaContent(); try{ StringTokenizer st=new StringTokenizer(subc, " "); while(st.hasMoreTokens()){ String token=st.nextToken(); if(token.equals("stretch")) //abc.mediaContent.fixedAspectRatio=false; abc.mediaContent.stretch=true; else if(token.equals("free")) abc.mediaContent.free=true; else if(token.equals("pos")){ abc.mediaContent.absLocation=new Point(); abc.mediaContent.absLocation.x=Integer.parseInt(st.nextToken()); abc.mediaContent.absLocation.y=Integer.parseInt(st.nextToken()); int k=Integer.parseInt(st.nextToken()); abc.mediaContent.absLocationFrom=(k==0 ? MediaContent.FROM_BOX : (k==1 ? MediaContent.FROM_WINDOW : MediaContent.FROM_FRAME)); } else if(token.equals("to")){ if(abc.mediaContent.mediaType==MediaContent.PLAY_CDAUDIO) abc.mediaContent.cdTo=st.nextToken(); else abc.mediaContent.to=Integer.parseInt(st.nextToken()); } else if(token.equals("from")) abc.mediaContent.from=Integer.parseInt(st.nextToken()); else if(token.equals("exit")) abc.mediaContent.mediaType=MediaContent.EXIT; else if(token.length()==4 && token.startsWith("rec")){ abc.mediaContent.recBuffer=Integer.parseInt(token.substring(3)); abc.mediaContent.mediaType=MediaContent.RECORD_AUDIO; if(st.hasMoreTokens()){ token=st.nextToken(); if(token.equals("play")) abc.mediaContent.mediaType=MediaContent.PLAY_RECORDED_AUDIO; else abc.mediaContent.length=Integer.parseInt(token); } } else if(token.endsWith(".wav") || token.endsWith(".mp3") || token.endsWith(".ogg") || token.endsWith(".au") || token.endsWith(".ra")){ abc.mediaContent.mediaType=MediaContent.PLAY_AUDIO; abc.mediaContent.mediaFileName=FileSystem.getCanonicalNameOf(rPath+validFileName(token), BF); } else if(token.endsWith(".mid")){ abc.mediaContent.mediaType=MediaContent.PLAY_MIDI; //abc.mediaContent.mediaFileName=rPath+validFileName(token); abc.mediaContent.mediaFileName=FileSystem.getCanonicalNameOf(rPath+validFileName(token), BF); // Compute MIDI pos!!! } else if(token.endsWith(".avi") || token.endsWith(".mpg") || token.endsWith(".swf")){ abc.mediaContent.mediaType=MediaContent.PLAY_VIDEO; //abc.mediaContent.mediaFileName=rPath+validFileName(token); abc.mediaContent.mediaFileName=FileSystem.getCanonicalNameOf(rPath+validFileName(token), BF); } else if(token.endsWith(".ass") || token.endsWith(".puz") || token.endsWith(".sop") || token.endsWith(".crw") || token.endsWith(".txa")){ abc.mediaContent.mediaType=MediaContent.RUN_CLIC_ACTIVITY; //abc.mediaContent.mediaFileName=rPath+validFileName(token); abc.mediaContent.mediaFileName=FileSystem.getCanonicalNameOf(rPath+validFileName(token), BF); } else if(token.endsWith(".pac") || token.endsWith(".pcc")){ abc.mediaContent.mediaType=MediaContent.RUN_CLIC_PACKAGE; //abc.mediaContent.mediaFileName=rPath+validFileName(token); abc.mediaContent.mediaFileName=FileSystem.getCanonicalNameOf(rPath+validFileName(token), BF); } else if(token.endsWith(".exe") || token.endsWith(".com") || token.endsWith(".bat")){ abc.mediaContent.mediaType=MediaContent.RUN_EXTERNAL; // AVOID ABSOLUTE PATH //abc.mediaContent.mediaFileName=rPath+validFileName(token); abc.mediaContent.mediaFileName=FileSystem.getCanonicalNameOf(rPath+validFileName(token), BF); abc.mediaContent.externalParam=BLANK; while(st.hasMoreTokens()){ // CHECK RPATH abc.mediaContent.externalParam=abc.mediaContent.externalParam + " " + st.nextToken(); } abc.mediaContent.externalParam=abc.mediaContent.externalParam.trim(); } else if(token.endsWith(".htm") || token.endsWith(".html") || token.startsWith("http:")){ abc.mediaContent.mediaType=MediaContent.URL; if(FileSystem.isStrUrl(token)) abc.mediaContent.mediaFileName=token; else //abc.mediaContent.mediaFileName=rPath+validFileName(token); abc.mediaContent.mediaFileName=FileSystem.getCanonicalNameOf(rPath+validFileName(token), BF); } else if(token.indexOf(".")>=0){ abc.mediaContent.mediaType=MediaContent.UNKNOWN; //abc.mediaContent.mediaFileName=rPath+validFileName(token); abc.mediaContent.mediaFileName=FileSystem.getCanonicalNameOf(rPath+validFileName(token), BF); } else if(token.indexOf(":")>=0){ abc.mediaContent.mediaType=MediaContent.PLAY_CDAUDIO; abc.mediaContent.cdFrom=token; } else System.err.println("Unknown media command: " + token); } } catch(Exception e){ System.err.println("Error parsing media string \""+ sub+"\"\n"+e); } } } abc.text=txPrev2; abc.realizeContent(project.mediaBag); } public void setActiveBagTextContent(ActiveBagContent abc, String[] setText, int setNcw, int setNch, double setW, double setH) throws Exception{ setActiveBagTextContent(abc, setText, setNcw, setNch); abc.w=setW; abc.h=setH; } public void setActiveBagTextContent(ActiveBagContent abc, String[] txt, int setNcw, int setNch) throws Exception{ abc.img=null; abc.imgName=null; abc.ncw=Math.max(1, setNcw); abc.nch=Math.max(1, setNch); int n=abc.ncw*abc.nch; for(int i=0; i<n; i++) setActiveBoxTextContent(abc.getActiveBoxContent(i), ((i>=txt.length || txt[i]==null) ? BLANK : txt[i])); } }