package cz.cuni.lf1.lge.ThunderSTORM.results; import java.util.EnumMap; public class TripleStateTableModel extends GenericTableModel { public static enum StateName { ORIGINAL, UNDO, ACTUAL; } EnumMap<StateName, GenericTableModel> savedStates = new EnumMap<StateName, GenericTableModel>(StateName.class); StateName selectedState; TripleStateTableModel() { super(); selectedState = StateName.ORIGINAL; saveSelectedState(); savedStates.put(StateName.UNDO, savedStates.get(StateName.ORIGINAL)); savedStates.put(StateName.ACTUAL, savedStates.get(StateName.ORIGINAL).clone()); selectedState = StateName.ACTUAL; applySelectedState(); } public void setSelectedState(StateName s) { if(selectedState == s) { return; } saveSelectedState(); this.selectedState = s; applySelectedState(); fireTableStructureChanged(); } public StateName getSelectedState() { return selectedState; } public void copyActualToUndo() { if(selectedState == StateName.ACTUAL) { saveSelectedState(); } savedStates.put(StateName.UNDO, savedStates.get(StateName.ACTUAL).clone()); if(selectedState == StateName.UNDO) { applySelectedState(); fireTableStructureChanged(); } } public void copyUndoToActual() { if(selectedState == StateName.UNDO) { saveSelectedState(); } savedStates.put(StateName.ACTUAL, savedStates.get(StateName.UNDO).clone()); if(selectedState == StateName.ACTUAL) { applySelectedState(); fireTableStructureChanged(); } } public void copyOriginalToActual() { if(selectedState == StateName.ORIGINAL) { saveSelectedState(); } savedStates.put(StateName.ACTUAL, null); //drop the reference to the state so it can be garabge collected before creating a copy savedStates.put(StateName.ACTUAL, savedStates.get(StateName.ORIGINAL).clone()); savedStates.put(StateName.UNDO, savedStates.get(StateName.ORIGINAL)); if(selectedState == StateName.ACTUAL) { applySelectedState(); fireTableStructureChanged(); } } public void swapUndoAndActual() { if(selectedState == StateName.UNDO || selectedState == StateName.ACTUAL) { saveSelectedState(); } GenericTableModel pom = savedStates.get(StateName.UNDO); savedStates.put(StateName.UNDO, savedStates.get(StateName.ACTUAL)); savedStates.put(StateName.ACTUAL, pom); if(selectedState == StateName.UNDO || selectedState == StateName.ACTUAL) { applySelectedState(); fireTableStructureChanged(); } } @Override public void reset() { super.reset(); saveSelectedState(); } public void resetAll() { StateName s = selectedState; selectedState = StateName.ORIGINAL; reset(); selectedState = StateName.UNDO; reset(); selectedState = StateName.ACTUAL; reset(); selectedState = s; } private void applySelectedState() { setModelData(savedStates.get(selectedState)); } private void saveSelectedState() { savedStates.put(selectedState, new GenericTableModel(this)); } public void setOriginalState() { setSelectedState(StateName.ORIGINAL); } public void setActualState() { setSelectedState(StateName.ACTUAL); } }