/*
* File : TargetMarkerBag.java
* Created : 04-jun-2001 19:54
* 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 java.util.Iterator;
/**
*
* @author Francesc Busquets (fbusquets@xtec.cat)
* @version 13.09.10
*/
public class TargetMarkerBag extends java.util.ArrayList<TargetMarker> {
private TargetMarker currentTarget;
/**
* Creates new TargetMarkerBag
*/
public TargetMarkerBag() {
super(10);
currentTarget = null;
}
@Override
public boolean add(TargetMarker tm) {
int i;
/*
if (!(obj instanceof TargetMarker)) {
return false;
}
TargetMarker tm = (TargetMarker) obj;
*/
for (i = 0; i < size(); i++) {
if (getElement(i).begOffset >= tm.begOffset)
break;
}
if (i == size()) {
return super.add(tm);
}
super.add(i, tm);
return true;
}
public TargetMarker getElement(int n) {
try {
return get(n);
} catch (Exception e) {
return null;
}
}
public void setParentPane(TextActivityPane parent) {
for (int i = 0; i < size(); i++) {
TargetMarker tm = getElement(i);
if (tm.target != null)
tm.target.setParentPane(parent);
}
}
public void setPositions() {
for (int i = 0; i < size(); i++)
getElement(i).setPositions();
}
public void updateOffsets() {
for (int i = 0; i < size(); i++)
getElement(i).updateOffsets();
}
public void removeUnattachedElements() {
Iterator it = iterator();
while (it.hasNext()) {
TargetMarker tm = (TargetMarker) it.next();
tm.updateOffsets();
if (tm.begOffset < 0 || tm.endOffset < 0 || tm.begOffset == tm.endOffset)
it.remove();
}
}
public int checkTargets(Evaluator ev) {
int result = 0;
for (int i = 0; i < size(); i++) {
if (getElement(i).checkText(ev))
result++;
}
return result;
}
public int countSolvedTargets() {
int result = 0;
for (int i = 0; i < size(); i++) {
TextTarget tt = getElement(i).target;
if (tt != null && tt.targetStatus == TextTarget.SOLVED)
result++;
}
return result;
}
public void reset() {
for (int i = 0; i < size(); i++)
getElement(i).reset();
}
public TargetMarker getElementByOffset(int offset, boolean includeEndPos) {
for (int i = 0; i < size(); i++) {
TargetMarker tm = getElement(i);
if (tm.contains(offset, includeEndPos))
return tm;
}
return null;
}
public TargetMarker getNearestElement(int offset, boolean searchForward) {
TargetMarker prev = null, next = null;
for (int i = 0; i < size(); i++) {
TargetMarker tm = getElement(i);
if (tm.begPos.getOffset() <= offset) {
prev = tm;
}
if (tm.endPos.getOffset() >= offset) {
next = tm;
break;
}
}
return searchForward ? next : prev;
}
public void setCurrentTarget(TargetMarker tm, TextActivityBase.Panel tabp) {
if (currentTarget != null/* && currentTarget!=tm*/) {
currentTarget.lostFocus(tabp);
}
if (tm != null && contains(tm)) {
currentTarget = tm;
if (currentTarget.target != null) {
currentTarget.target.setModified(false);
}
currentTarget.requestFocus(tabp);
} else {
currentTarget = null;
}
}
public TargetMarker getCurrentTarget() {
return currentTarget;
}
public TargetMarker getElement(TextTarget tt) {
for (int i = 0; i < size(); i++) {
TargetMarker tm = getElement(i);
if (tm.target == tt)
return tm;
}
return null;
}
public TargetMarker getNextTarget(TargetMarker tm) {
return getElement(Math.min(indexOf(tm == null ? currentTarget : tm) + 1, size() - 1));
}
public TargetMarker getPrevTarget(TargetMarker tm) {
return getElement(Math.max(indexOf(tm == null ? currentTarget : tm) - 1, 0));
}
public void swapTargets(TargetMarker tm1, TargetMarker tm2) {
TextActivityDocument doc = tm1.doc;
if (doc != tm2.doc) {
System.err.println("Error: unable to swap among different documents");
return;
}
try {
tm1.updateOffsets();
String tx1 = doc.getText(tm1.begOffset, tm1.getLength());
tm2.updateOffsets();
String tx2 = doc.getText(tm2.begOffset, tm2.getLength());
doc.remove(tm1.begOffset, tx1.length());
doc.insertString(tm1.begOffset, tx2, doc.getTargetAttributeSet());
tm1.endOffset = tm1.begOffset + tx2.length();
tm1.setPositions();
tm2.updateOffsets();
doc.remove(tm2.begOffset, tx2.length());
doc.insertString(tm2.begOffset, tx1, doc.getTargetAttributeSet());
tm2.endOffset = tm2.begOffset + tx1.length();
tm2.setPositions();
} catch (Exception ex) {
System.err.println("Error: unable to swap target texts:\n" + ex);
}
updateOffsets();
}
public int[] getParagragraphOffsets() {
if (size() == 0)
return null;
int[] pOffsets = new int[size()];
for (int i = 0; i < size(); i++)
pOffsets[i] = getElement(i).getParagraphBegOffset();
return pOffsets;
}
}