package info.opencards.learnstrats.leitner;
import info.opencards.Utils;
import info.opencards.core.Item;
import info.opencards.core.ItemValuater;
import info.opencards.core.LearnMethod;
import info.opencards.core.LearnMethodListener;
/**
* DOCUMENT ME!
*
* @author Holger Brandl
*/
public class CardLimitLeitner extends LeitnerLearning {
private int numLearnt = 0;
private final int cardLimit;
private CardLimitLeitner(ItemValuater itemValuater, int cardLimit) {
super(itemValuater);
this.cardLimit = cardLimit;
}
protected boolean processItemFeedBack(Item item, Integer feedback) {
boolean didKnew = didKnew(feedback);
if (didKnew)
numLearnt++;
return updateLeitnerSystem((LeitnerItem) item, feedback);
}
protected boolean isFinished() {
return super.isFinished() || numLearnt >= cardLimit;
}
public void fireStatusInfo() {
double progress = computeProgress();
int numCardsLeft = cardLimit - numLearnt;
String msg = numCardsLeft > 1 ?
Utils.getRB().getString("AbstractLearnDialog.nCardsLeft") :
Utils.getRB().getString("AbstractLearnDialog.oneCardLeft");
for (LearnMethodListener procListener : procListeners) {
procListener.processStatusInfo(numCardsLeft + " " + msg, progress);
}
}
double computeProgress() {
return 100 * (numLearnt / (double) cardLimit);
}
/**
* Creates a factory which is able to instantiate <code>LeitnerLearning</code>-instances.
*/
public static LeitnerLearnMethodFactory getFactory(final int cardLimit) {
return new LeitnerLearnMethodFactory() {
public LearnMethod createLearner(ItemValuater itemValuater) {
return new CardLimitLeitner(itemValuater, cardLimit);
}
};
}
}