package net.sourceforge.fidocadj.circuit.controllers;
import java.io.*;
import java.util.*;
import java.net.*;
import net.sourceforge.fidocadj.circuit.*;
import net.sourceforge.fidocadj.circuit.controllers.*;
import net.sourceforge.fidocadj.circuit.model.*;
import net.sourceforge.fidocadj.globals.FileUtils;
import net.sourceforge.fidocadj.undo.*;
/** UndoActions: perform undo operations. Since some parsing operations are
to be done, this class requires the ParserActions controller.
<pre>
This file is part of FidoCadJ.
FidoCadJ is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
FidoCadJ is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with FidoCadJ. If not,
@see <a href=http://www.gnu.org/licenses/>http://www.gnu.org/licenses/</a>.
Copyright 2007-2014 by Davide Bucci
</pre>
*/
public class UndoActions implements UndoActorListener
{
private final ParserActions pa;
// Undo manager
private final UndoManager um;
// Database of the temporary directories
private final Vector<String> tempDir;
// Maximum number of levels to be retained for undo operations.
private static final int MAX_UNDO=100;
// A drawing modification flag. If true, there are unsaved changes.
private boolean isModified;
private String tempLibraryDirectory="";
// Listeners
private LibraryUndoListener libraryUndoListener;
private HasChangedListener cl;
/** Public constructor.
@param a a parser controller (undo snapshots are kept in text format).
*/
public UndoActions(ParserActions a)
{
pa=a;
um=new UndoManager(MAX_UNDO);
libraryUndoListener=null;
tempDir=new Vector<String>();
cl =null;
}
/** Undo the last editing action
*/
public void undo()
{
UndoState r = (UndoState)um.undoPop();
// Check if it is an operation involving libraries.
if(um.isNextOperationOnALibrary() && libraryUndoListener!=null) {
libraryUndoListener.undoLibrary(r.libraryDir);
}
if(!"".equals(r.text)) {
StringBuffer s=new StringBuffer(r.text);
pa.parseString(s);
}
isModified = r.isModified;
pa.openFileName = r.fileName;
if(cl!=null) cl.somethingHasChanged();
}
/** Redo the last undo action
*/
public void redo()
{
UndoState r = (UndoState)um.undoRedo();
if(r.libraryOperation && libraryUndoListener!=null) {
libraryUndoListener.undoLibrary(r.libraryDir);
}
if(!"".equals(r.text)) {
StringBuffer s=new StringBuffer(r.text);
pa.parseString(s);
}
isModified = r.isModified;
pa.openFileName = r.fileName;
if(cl!=null) cl.somethingHasChanged();
}
/** Save the undo state, in the case an editing operation
has been done on the drawing.
*/
public void saveUndoState()
{
UndoState s = new UndoState();
// In fact, the whole drawing is stored as a text.
// In this way, we can easily store it on a string.
s.text=pa.getText(true).toString();
s.isModified=isModified;
s.fileName=pa.openFileName;
s.libraryDir=tempLibraryDirectory;
s.libraryOperation=false;
um.undoPush(s);
isModified = true;
if(cl!=null) cl.somethingHasChanged();
}
/** Save the undo state, in the case an editing operation
has been performed on a library.
@param t the library directory to be used.
*/
public void saveUndoLibrary(String t)
{
tempLibraryDirectory=t;
UndoState s = new UndoState();
s.text=pa.getText(true).toString();
s.libraryDir=tempLibraryDirectory;
s.isModified=isModified;
s.fileName=pa.openFileName;
s.libraryOperation=true;
tempDir.add(t);
um.undoPush(s);
}
/** Define a listener for a undo operation involving libraries.
@param l the library undo listener.
*/
public void setLibraryUndoListener(LibraryUndoListener l)
{
libraryUndoListener = l;
}
/** Determine if the drawing has been modified.
@return the state.
*/
public boolean getModified ()
{
return isModified;
}
/** Set the drawing modified state.
@param s the new state to be set.
*/
public void setModified (boolean s)
{
isModified = s;
if(cl!=null) cl.somethingHasChanged();
}
/** Set the listener of the state change.
@param l the new listener.
*/
public void setHasChangedListener (HasChangedListener l)
{
cl = l;
}
/** Clear all temporary files and directories created by the library undo
system.
*/
public void doTheDishes()
{
for (int i=0; i<tempDir.size();++i)
{
try {
FileUtils.deleteDirectory(new File(tempDir.get(i)));
} catch (IOException E) {
System.out.println("Warning: "+E);
}
}
}
}