blob: 256b6d555cb838f43eba094a39543417daf2a6fc [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004-2008 Istvan Rath and Daniel Varro
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Istvan Rath - initial API and implementation
*******************************************************************************/
package org.eclipse.viatra2.treeeditor.commands;
import org.eclipse.viatra2.errors.VPMCoreException;
import org.eclipse.viatra2.treeeditor.ViatraTreeEditor;
import java.util.Vector;
public class ViatraEditorCommandStack {
/**
* Internal marker class used for marking save points on the Command Stack.
* @author Istvan Rath
*
*/
private class SaveMark extends ViatraEditorCommand {
@Override
public void execute() throws VPMCoreException { }
@Override
public void undo() throws VPMCoreException { }
}
private Vector<ViatraEditorCommand> iCommands;
private ViatraTreeEditor iVTE;
/**
* Points to the last command which has been executed.
*/
private int iCurrentIndex = 0;
public ViatraEditorCommandStack(ViatraTreeEditor vte) {
iCommands = new Vector<ViatraEditorCommand>();
iCommands.add(new SaveMark()); // add initial savemark
iVTE = vte;
}
public void execute(ViatraEditorCommand cmd) {
try {
cmd.execute();
for (int i=iCurrentIndex+1; i<iCommands.size(); i++)
iCommands.remove(i);
iCommands.add(cmd);
iCurrentIndex++;
}
catch (VPMCoreException e) {
iVTE.getFramework().getLogger().fatal(e.toString());
iVTE.getFramework().getTopmodel().getTransactionManager().abortTransaction();
}
// iVTE.setDirty();
// debugmsg();
}
public void undo() {
try {
iCommands.get(iCurrentIndex).undo();
iCurrentIndex--;
} catch (VPMCoreException e) {
iVTE.getFramework().getLogger().fatal(e.toString());
}
iVTE.updateActions();
// debugmsg();
}
public void redo() {
try {
iCommands.get(iCurrentIndex+1).execute();
iCurrentIndex++;
} catch (VPMCoreException e) {
iVTE.getFramework().getLogger().fatal(e.toString());
}
iVTE.updateActions();
// debugmsg();
}
private void debugmsg() {
iVTE.getFramework().getLogger().debug("[VECommandStack] currindex is "+iCurrentIndex+", element at currindex is "+iCommands.get(iCurrentIndex).toString());
}
public boolean isUndoable() {
return isDirty();
}
public boolean isRedoable() {
return iCurrentIndex<iCommands.size()-1;
}
public void markSave() {
this.execute(new SaveMark());
}
public boolean isDirty() {
return !(iCommands.get(iCurrentIndex) instanceof SaveMark);
}
}