/** * */ package uk.co.bytemark.vm.enigma.inquisition.gui.quiz; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import javax.swing.JTextField; import uk.co.bytemark.vm.enigma.inquisition.questions.Answer; import uk.co.bytemark.vm.enigma.inquisition.questions.DragAndDropAnswer; public class DragAndDropTextFieldManager { private Map<Integer, Set<JTextField>> textFieldsMap = new HashMap<Integer, Set<JTextField>>(); private Map<Integer, String> correctTextMap = new HashMap<Integer, String>(); public void addTextField(Integer id, String correctText, JTextField textField) { if (!textFieldsMap.containsKey(id)) textFieldsMap.put(id, new HashSet<JTextField>()); Set<JTextField> textFields = textFieldsMap.get(id); textFields.add(textField); if (correctTextMap.containsKey(id)) { String previousCorrectText = correctTextMap.get(id); if (!correctText.equals("") && !previousCorrectText.equals(correctText)) throw new AssertionError("Inconsistent generation of text fields in drag and drop panel. id=" + id + ", previousCorrectText=" + previousCorrectText + ", correctText=" + correctText); } else { correctTextMap.put(id, correctText); } } public void colourTextFieldsAccordingToWhetherTheyAreEmptyOrNot() { for (Integer id : textFieldsMap.keySet()) { Set<JTextField> textFields = textFieldsMap.get(id); for (JTextField textField : textFields) { if (textField.getText().equals("")) textField.setBackground(DragAndDropPanel.NORMAL_COLOUR); else textField.setBackground(DragAndDropFragmentBinPanel.FRAGMENT_FILL_COLOUR); } } } public void colourTextFieldsAccordingToCorrectness() { for (Integer id : textFieldsMap.keySet()) { Set<JTextField> textFields = textFieldsMap.get(id); String correctText = correctTextMap.get(id); for (JTextField textField : textFields) { if (textField.getText().equals(correctText)) textField.setBackground(DragAndDropPanel.CORRECT_COLOUR); else textField.setBackground(DragAndDropPanel.INCORRECT_COLOUR); } } } public int getLargestId() { int largest = -1; for (Integer id : textFieldsMap.keySet()) if (id > largest) largest = id; return largest; } public void checkIdsAreContiguous() { int largestId = getLargestId(); for (int id = 0; id <= largestId; id++) { if (!textFieldsMap.containsKey(id)) { throw new RuntimeException("Slot ids are not continuous"); } } } public Answer getAnswer() { checkIdsAreContiguous(); List<String> slotAnswers = new ArrayList<String>(); for (int id = 0; id <= getLargestId(); id++) { Set<JTextField> textFields = textFieldsMap.get(id); String currentText = null; for (JTextField textField : textFields) { String actualText = textField.getText(); if (!actualText.equals("")) { currentText = actualText; break; } } if (currentText == null) currentText = ""; slotAnswers.add(currentText); } return new DragAndDropAnswer(slotAnswers); } public void blankAllTextFields() { for (Integer id : textFieldsMap.keySet()) for (JTextField textField : textFieldsMap.get(id)) textField.setText(""); } public void setFields(List<String> slotAnswers) { int numberOfSlotAnswers = slotAnswers.size(); if (numberOfSlotAnswers > getLargestId() + 1) throw new AssertionError("Too many slot answers: " + slotAnswers + "; ids = " + textFieldsMap.keySet()); for (int id = 0; id < numberOfSlotAnswers; id++) { String slotText = slotAnswers.get(id); Set<JTextField> textFields = textFieldsMap.get(id); for (JTextField textField : textFields) { textField.setText(slotText); } } } }