/* * File : ActivitySequenceJump.java * Created : 19-dec-2000 16:27 * 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.bags; import edu.xtec.util.JDomUtility; import java.util.Map; /** * This is a special case of {@link edu.xtec.jclic.bags.JumpInfo}, used only in * {@link edu.xtec.jclic.bags.ActivitySequenceElement} objects. Sequence elements contain * two ActivitySequenceJump objects: one to be processed when the user clicks on the * "next" button (or when the activity finishes, if in automatic mode), and the * other one related to the "prev" button. ActivitySequenceJump objects define a default * jump or action, but can have up to two {@link edu.xtec.jclic.bags.ConditionalJumpInfo} objects, * used to define alternative jumps when the obtained score or the time used to solve the * activities are below or over specific values. * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public class ActivitySequenceJump extends JumpInfo implements Cloneable { public ConditionalJumpInfo upperJump; public ConditionalJumpInfo lowerJump; /** Creates new ActivitySequenceJump */ public ActivitySequenceJump(int action) { this(action, null); } public ActivitySequenceJump(int action, String sequence) { super(action, sequence); upperJump=null; lowerJump=null; } public static final String ID="id", NAME="name", UPPER="upper", LOWER="lower"; public org.jdom.Element getJDomElement(String id){ org.jdom.Element e, child; e=super.getJDomElement(); e.setAttribute(ID, id); if(upperJump!=null){ child=upperJump.getJDomElement(); child.setAttribute(ID, UPPER); e.addContent(child); } if(lowerJump!=null){ child=lowerJump.getJDomElement(); child.setAttribute(ID, LOWER); e.addContent(child); } return e; } public static ActivitySequenceJump getActivitySequenceJump(org.jdom.Element e) throws Exception{ ActivitySequenceJump asj=new ActivitySequenceJump(STOP); asj.setProperties(e, null); return asj; } @Override public void setProperties(org.jdom.Element e, Object aux) throws Exception{ JDomUtility.checkName(e, ELEMENT_NAME); org.jdom.Element child; // check for old version data (Jclic beta 0.4 or lower) String s=e.getAttributeValue(NAME); if(s==null){ super.setProperties(e, aux); if((child=JDomUtility.getChildWithId(e, ELEMENT_NAME, UPPER))!=null) upperJump=ConditionalJumpInfo.getConditionalJumpInfo(child); if((child=JDomUtility.getChildWithId(e, ELEMENT_NAME, LOWER))!=null) lowerJump=ConditionalJumpInfo.getConditionalJumpInfo(child); } else{ // OLD VERSION DATA if(!s.equals(actions[STOP])){ if(s.equals(actions[EXIT])) action=EXIT; else{ action=JUMP; sequence=s; } } if((child=e.getChild(UPPER))!=null){ int v=JDomUtility.getIntAttr(child, ConditionalJumpInfo.THRESHOLD, 0); int t=JDomUtility.getIntAttr(child, ConditionalJumpInfo.TIME, -1); String sq=child.getText(); upperJump=new ConditionalJumpInfo(JUMP, sq, v, t); } if((child=e.getChild(LOWER))!=null){ int v=JDomUtility.getIntAttr(child, ConditionalJumpInfo.THRESHOLD, 0); int t=JDomUtility.getIntAttr(child, ConditionalJumpInfo.TIME, -1); String sq=child.getText(); lowerJump=new ConditionalJumpInfo(JUMP, sq, v, t); } } } public void setConditionalJump(ConditionalJumpInfo jump, boolean upper){ if(upper) upperJump=jump; else lowerJump=jump; } public JumpInfo resolveJump(int rating, int time){ if(rating<0 || time<0) return this; if(upperJump!=null && rating>upperJump.threshold && (upperJump.time<=0 || time<upperJump.time)) return upperJump; if(lowerJump!=null && (rating<lowerJump.threshold || (lowerJump.time>0 && time>lowerJump.time))) return lowerJump; return this; } @Override public void listReferences(String type, Map<String, String> map) { super.listReferences(type, map); if(upperJump!=null) upperJump.listReferences(type, map); if(lowerJump!=null) lowerJump.listReferences(type, map); } @Override public Object clone() throws CloneNotSupportedException { ActivitySequenceJump result=(ActivitySequenceJump)super.clone(); if(upperJump!=null) result.upperJump=(ConditionalJumpInfo)upperJump.clone(); if(lowerJump!=null) result.lowerJump=(ConditionalJumpInfo)lowerJump.clone(); return result; } }