/* * File : TargetMarker.java * Created : 04-jun-2001 19:47 * 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.activities.text; import javax.swing.text.*; /** * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.08 */ public class TargetMarker extends java.lang.Object { public int begOffset, endOffset; public Position begPos, endPos; public TextTarget target; public TextActivityDocument doc; public boolean hasFocus; @Override public String toString(){ StringBuilder sb=new StringBuilder(); sb.append("h: ").append(hashCode()); sb.append(" [").append(begOffset).append("-").append(endOffset).append("]"); sb.append(" target: ").append(target); return sb.substring(0); } /** Creates new TargetMarker */ public TargetMarker(TextActivityDocument document) { begOffset=0; endOffset=0; begPos=null; endPos=null; target=null; doc=document; hasFocus=false; } public void reset(){ hasFocus=false; if(target!=null) target.reset(); } public void setPositions(){ try{ begPos=doc.createPosition(begOffset); endPos=doc.createPosition(endOffset); } catch(Exception e){ System.err.println("Target marker error:\n"+e); } } public void requestFocus(TextActivityBase.Panel tabp){ hasFocus=true; if(target!=null) target.requestFocus(tabp, this); } public void lostFocus(TextActivityBase.Panel tabp){ hasFocus=false; if(target!=null) target.lostFocus(tabp, this); } public void updateOffsets(){ if(begPos!=null) begOffset=begPos.getOffset(); if(endPos!=null) endOffset=endPos.getOffset(); } public java.awt.Rectangle getBegRect(JTextComponent pane){ if(begPos!=null){ begOffset=begPos.getOffset(); try{ return pane.modelToView(begOffset); } catch(Exception ex){ System.err.println("Error calling modelToView:\n"+ex); } } return null; } public String getCurrentText(){ String result=null; if(target!=null && target.comboList!=null){ result=(String)target.comboList.getSelectedItem(); } else{ try{ result=doc.getText(begPos.getOffset(), endPos.getOffset()-begPos.getOffset()); }catch(Exception e){ // eat exception } } return result==null ? new String() : result; } public String getCurrentText(String boolAttrToExclude){ if(boolAttrToExclude==null || (target!=null && target.comboList!=null)) return getCurrentText(); updateOffsets(); StringBuilder stb=new StringBuilder(); for(int i=begOffset; i<endOffset; i++){ if(!doc.checkBooleanAttribute(i, boolAttrToExclude)){ try{ stb.append(doc.getText(i, 1)); } catch(Exception e){ System.err.println("Error getting text answer:\n"+e); break; } } } return stb.substring(0); } public boolean checkText(Evaluator ev){ if(target==null) return false; return target.checkText(getCurrentText(), ev); } public boolean contains(int offset, boolean includeEndPos){ updateOffsets(); return offset>=begOffset && (includeEndPos ? (offset<=endOffset) : (offset<endOffset)); } public int getLength(){ return endOffset-begOffset; } public int getParagraphBegOffset(){ updateOffsets(); return doc.getParagraphElement(begOffset).getStartOffset(); } }