/* * File : TextGridContent.java * Created : 04-oct-2001 12:30 * 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.boxes; import edu.xtec.util.Domable; import edu.xtec.util.JDomUtility; import java.awt.Color; import java.util.Iterator; /** * This class encapsulates the content of {@link edu.xtec.jclic.boxes.TextGrid} objects. * It implements methods to set and retrieve individual characters on the grid, and to * serialize and de-serialize the content from/to XML objects. It also contains information * about the desired size and graphic properties (font, colors, etc.) of the grid. * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.08 */ public class TextGridContent extends Object implements Domable{ public static final char DEFAULT_WILD='*'; public static final String DEFAULT_RANDOM_CHARS="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; public int ncw=1, nch=1; public double w=TextGrid.DEFAULT_CELL_SIZE; public double h=TextGrid.DEFAULT_CELL_SIZE; public boolean border=false; public BoxBase bb=null; public String[] text=new String[1]; public char wild=DEFAULT_WILD; public String randomChars=DEFAULT_RANDOM_CHARS; /** Creates new TextGridContent */ public TextGridContent() { } public static TextGridContent initNew(int ncw, int nch, char firstChar){ TextGridContent result=new TextGridContent(); result.ncw=ncw; result.nch=nch; result.text=new String[nch]; StringBuilder sb=new StringBuilder(); for(int i=0; i<nch; i++){ sb.setLength(0); for(int j=0; j<ncw; j++) sb.append(firstChar++); result.text[i]=sb.toString(); } result.bb=new BoxBase(); result.bb.backColor=Color.white; result.border=true; return result; } public static final String ELEMENT_NAME="textGrid"; public static final String ROWS="rows", COLUMNS="columns", CELL_WIDTH="cellWidth", CELL_HEIGHT="cellHeight", BORDER="border", ROW="row", TEXT="text", WILD="wild", RANDOM_CHARS="randomChars"; public org.jdom.Element getJDomElement(){ org.jdom.Element e=new org.jdom.Element(ELEMENT_NAME); org.jdom.Element child; // --------------------------------------------------------------------- // May 2015 // WARNING: The number of rows (nch) is stored as "columns", and the number // of columns (ncw) as "rows". By now, this bug will not be corrected to avoid // problems with already existing JClic packages. e.setAttribute(ROWS, Integer.toString(ncw)); e.setAttribute(COLUMNS, Integer.toString(nch)); // --------------------------------------------------------------------- e.setAttribute(CELL_WIDTH, Double.toString(w)); e.setAttribute(CELL_HEIGHT, Double.toString(h)); e.setAttribute(BORDER, JDomUtility.boolString(border)); if(wild!=DEFAULT_WILD) e.setAttribute(WILD, String.copyValueOf(new char[]{wild})); if(!DEFAULT_RANDOM_CHARS.equals(randomChars)) e.setAttribute(RANDOM_CHARS, randomChars); if(bb!=null) e.addContent(bb.getJDomElement()); child=new org.jdom.Element(TEXT); for(int i=0; i<nch; i++){ if(i<text.length) child.addContent(new org.jdom.Element(ROW).setText(text[i])); } e.addContent(child); return e; } public static TextGridContent getTextGridContent(org.jdom.Element e) throws Exception{ TextGridContent tgc=new TextGridContent(); tgc.setProperties(e, null); return tgc; } public void setProperties(org.jdom.Element e, Object aux) throws Exception{ org.jdom.Element child, child2; JDomUtility.checkName(e, ELEMENT_NAME); ncw=JDomUtility.getIntAttr(e, ROWS, ncw); nch=JDomUtility.getIntAttr(e, COLUMNS, nch); w=JDomUtility.getDoubleAttr(e, CELL_WIDTH, w); h=JDomUtility.getDoubleAttr(e, CELL_HEIGHT, h); if(ncw<1 || nch<1 || w<1 || h<1) throw new IllegalArgumentException("Invalid TextGridContent attributes!"); String s=e.getAttributeValue(WILD); if(s!=null && s.length()>0) wild=s.charAt(0); randomChars=JDomUtility.getStringAttr(e, RANDOM_CHARS, randomChars, false); border=JDomUtility.getBoolAttr(e, BORDER, border); if((child=e.getChild(BoxBase.ELEMENT_NAME))!=null) bb=BoxBase.getBoxBase(child); if((child=e.getChild(TEXT))!=null){ text=new String[nch]; Iterator itr=child.getChildren(ROW).iterator(); int i=0; while(itr.hasNext()){ child2=((org.jdom.Element)itr.next()); text[i++]=child2.getText(); } for(; i<nch; i++) text[i]=""; } } public void completeText(){ char[] emptyLineChars=new char[ncw]; for(int i=0; i<ncw; i++) emptyLineChars[i]=wild; String[] result=new String[nch]; for(int i=0; i<nch; i++){ StringBuilder sb=new StringBuilder(); if(i<text.length){ char[] txch=text[i].toCharArray(); sb.append(txch, 0, Math.min(txch.length, ncw)); int l=sb.length(); if(l<ncw) sb.append(emptyLineChars, 0, ncw-l); result[i]=sb.substring(0); } else result[i]=String.copyValueOf(emptyLineChars); } text=result; } public int countWildChars(){ int result=0; completeText(); if(text!=null) for(int y=0; y<nch; y++) for(int x=0; x<ncw; x++) if(text[y].charAt(x)==wild) result++; return result; } public int getNumChars(){ return ncw*nch; } public void setCharAt(int x, int y, char ch){ if(x>=0 && x<ncw && y>=0 && y<nch){ StringBuilder sb=new StringBuilder(text[y]); sb.setCharAt(x, ch); text[y]=sb.substring(0); } } public void copyStyleTo(TextGridContent tgc){ if(tgc!=null){ tgc.w=w; tgc.h=h; tgc.border=border; tgc.bb=bb; } } }