package info.opencards.ui;
import info.opencards.Utils;
import info.opencards.learnstrats.ltm.LTMItem;
import info.opencards.learnstrats.ltm.ScheduleUtils;
import info.opencards.ui.preferences.GlobLearnSettings;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.util.*;
import java.util.List;
/**
* DOCUMENT ME!
*
* @author Holger Brandl
*/
public class SMLearnDialog extends AbstractLearnDialog {
private final Map<Integer, Boolean> keystates = new HashMap<Integer, Boolean>();
public SMLearnDialog() {
boolean useSimpleInterface = Utils.getPrefs().getBoolean(GlobLearnSettings.USE_SIMPLIFIED_INTERFACE, false);
scoreButtonsContainer.setLayout(new GridLayout(1, useSimpleInterface ? 3 : 5));
if (useSimpleInterface) {
scoreButtonsContainer.add(fiveButton);
scoreButtonsContainer.add(threeButton);
scoreButtonsContainer.add(oneButton);
} else {
scoreButtonsContainer.add(fiveButton);
scoreButtonsContainer.add(fourButton);
scoreButtonsContainer.add(threeButton);
scoreButtonsContainer.add(twoButton);
scoreButtonsContainer.add(oneButton);
}
invalidate();
// validateTree();
}
public boolean postProcessKeyEvent(KeyEvent e) {
// super.postProcessKeyEvent(e);
if (super.postProcessKeyEvent(e))
return true;
int keyCode = e.getKeyCode();
if (!isShowingComplete())
return false;
if (e.paramString().startsWith("KEY_RELEASED")) {
switch (keyCode) {
case KeyEvent.VK_LEFT:
case KeyEvent.VK_DOWN:
case KeyEvent.VK_RIGHT:
keystates.put(keyCode, false);
}
// test wether only one arrow-key was pressed and became released now
Set<Integer> curKeys = keystates.keySet();
if (keystates.size() == 1 && Utils.isAllFalse(keystates.values())) {
switch (curKeys.iterator().next()) {
case KeyEvent.VK_LEFT:
fiveButton.getAction().actionPerformed(null);
keystates.clear();
break;
case KeyEvent.VK_DOWN:
threeButton.getAction().actionPerformed(null);
keystates.clear();
break;
case KeyEvent.VK_RIGHT:
oneButton.getAction().actionPerformed(null);
keystates.clear();
break;
}
} else if (keystates.size() == 2 && Utils.isAllFalse(keystates.values())) {
if (!keystates.containsKey(KeyEvent.VK_DOWN)) {
keystates.clear();
} else {
if (curKeys.contains(KeyEvent.VK_LEFT)) {
fourButton.getAction().actionPerformed(null);
keystates.clear();
} else if (curKeys.contains(KeyEvent.VK_RIGHT)) {
twoButton.getAction().actionPerformed(null);
keystates.clear();
}
}
}
} else {
// reset the keystate if some other keys were pressed before which didn't became
if (Utils.isAllFalse(keystates.values()))
keystates.clear();
// update the current keystate
switch (keyCode) {
case KeyEvent.VK_LEFT:
case KeyEvent.VK_DOWN:
case KeyEvent.VK_RIGHT:
keystates.put(keyCode, true);
}
}
return false;
}
public double getSizeRatio() {
return (double) getWidth() / (double) getHeight();
}
protected void showCompleteCardButtonActionPerformed() {
super.showCompleteCardButtonActionPerformed();
threeButton.requestFocusInWindow();
keystates.clear();
// set meaningful tooltips for the feedback-buttons if the option was selected in the OC-settings
boolean showFeedbackToTips = Utils.getPrefs().getBoolean(GlobLearnSettings.DO_SHOW_FEEBACK_TOTIPS, GlobLearnSettings.DO_SHOW_FEEBACK_TOTIPS_DEFAULT);
if (showFeedbackToTips) {
List<JButton> fbButtons = Arrays.asList(oneButton, twoButton, threeButton, fourButton, fiveButton);
LTMItem ltmItem = (LTMItem) curItem;
Map<Integer, Integer> logIncDaysList = new LinkedHashMap<Integer, Integer>();
for (JButton fbButton : fbButtons) {
int actionScore = ((ScoreAction) fbButton.getAction()).getActionScore();
LTMItem cloneItem = (LTMItem) ltmItem.clone();
cloneItem.updateEFactor(actionScore);
int days = ScheduleUtils.getDayDiff(cloneItem.getNextScheduledDate(), ScheduleUtils.getToday());
logIncDaysList.put(actionScore, days);
// set the appropriate tooltip
String toolTipText;
String nextTest = "--> next test in " + days + " days";
ResourceBundle rb = Utils.getRB();
switch (actionScore) {
case 1:
toolTipText = rb.getString("SMLearnDialog.feedback.notatall");
break;
case 2:
toolTipText = rb.getString("SMLearnDialog.feedback.hardly");
break;
case 3:
toolTipText = rb.getString("SMLearnDialog.feedback.soso") + nextTest;
break;
case 4:
toolTipText = rb.getString("SMLearnDialog.feedback.well") + nextTest;
break;
case 5:
toolTipText = rb.getString("SMLearnDialog.feedback.perfectly") + nextTest;
break;
default:
toolTipText = "!!!invalid feeback-code!!!";
}
fbButton.setToolTipText(toolTipText);
}
// print a debug message to the log-monitor
StringBuilder sb = new StringBuilder();
for (Integer actionCode : logIncDaysList.keySet()) {
sb.append(actionCode + "->" + logIncDaysList.get(actionCode) + ";");
}
Utils.log(sb.toString());
}
}
}