package org.geogebra.common.kernel;
import org.geogebra.common.plugin.Event;
import org.geogebra.common.plugin.EventType;
/**
* String based undo manager
*
* @author Balazs
*/
public class DefaultUndoManager extends UndoManager {
/**
* Wrapper around string
*/
static protected class DefaultAppState implements AppState {
private String xml;
/**
* @param xml
* wrapped XML
*/
DefaultAppState(String xml) {
this.xml = xml;
}
/**
* @return wrapped XML
*/
public String getXml() {
return xml;
}
@Override
public void delete() {
// overridden in subclases
}
}
/**
* @param cons
* construction
*/
public DefaultUndoManager(Construction cons) {
super(cons);
iterator = undoInfoList.listIterator();
}
@Override
public void processXML(String string) throws Exception {
construction.getXMLio().processXMLString(string, true, false);
}
@Override
public void storeUndoInfoAfterPasteOrAdd() {
// overridden in subclases
}
@Override
public void storeUndoInfo(StringBuilder currentUndoXML, boolean refresh) {
doStoreUndoInfo(currentUndoXML);
if (refresh) {
restoreCurrentUndoInfo();
}
}
/**
* Adds construction state to undo info list.
*
* @param undoXML
* string builder with construction XML
*/
private synchronized void doStoreUndoInfo(final StringBuilder undoXML) {
AppState appStateToAdd = new DefaultAppState(undoXML.toString());
iterator.add(appStateToAdd);
pruneStateList();
app.getEventDispatcher().dispatchEvent(new Event(EventType.STOREUNDO, null));
}
@Override
protected void loadUndoInfo(AppState state) {
try {
processXML(((DefaultAppState) state).getXml());
} catch (Exception e) {
e.printStackTrace();
}
}
}