/* GanttProject is an opensource project management tool. Copyright (C) 2002-2010 Alexandre Thomas, Dmitry Barashev This program 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. This program 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 this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package net.sourceforge.ganttproject.undo; import java.io.IOException; import javax.swing.UIDefaults; import javax.swing.UIManager; import javax.swing.event.UndoableEditListener; import javax.swing.undo.CannotRedoException; import javax.swing.undo.CannotUndoException; import javax.swing.undo.UndoManager; import javax.swing.undo.UndoableEditSupport; import net.sourceforge.ganttproject.GPLogger; import net.sourceforge.ganttproject.IGanttProject; import net.sourceforge.ganttproject.document.DocumentManager; import net.sourceforge.ganttproject.language.GanttLanguage; import net.sourceforge.ganttproject.language.GanttLanguage.Event; import net.sourceforge.ganttproject.parser.ParserFactory; /** * UndoManager implementation, it manages the undoable edits in GanttProject * * @author bard */ public class UndoManagerImpl implements GPUndoManager { private UndoableEditSupport myUndoEventDispatcher; private UndoManager mySwingUndoManager; private DocumentManager myDocumentManager; private ParserFactory myParserFactory; private IGanttProject myProject; private UndoableEditImpl swingEditImpl; public UndoManagerImpl(IGanttProject project, ParserFactory parserFactory, DocumentManager documentManager) { myProject = project; myParserFactory = parserFactory; myDocumentManager = documentManager; mySwingUndoManager = new UndoManager(); myUndoEventDispatcher = new UndoableEditSupport(); GanttLanguage.getInstance().addListener(new GanttLanguage.Listener() { public void languageChanged(Event event) { UIManager.getDefaults().put("AbstractUndoableEdit.undoText", GanttLanguage.getInstance().getText("undo")); UIManager.getDefaults().put("AbstractUndoableEdit.redoText", GanttLanguage.getInstance().getText("redo")); } }); } @Override public void undoableEdit(String localizedName, Runnable editImpl) { try { swingEditImpl = new UndoableEditImpl(localizedName, editImpl, this); mySwingUndoManager.addEdit(swingEditImpl); fireUndoableEditHappened(swingEditImpl); } catch (IOException e) { if (!GPLogger.log(e)) { e.printStackTrace(System.err); } } } private void fireUndoableEditHappened(UndoableEditImpl swingEditImpl) { myUndoEventDispatcher.postEdit(swingEditImpl); } private void fireUndoOrRedoHappened() { UndoableEditListener[] listeners = myUndoEventDispatcher.getUndoableEditListeners(); for (int i = 0; i < listeners.length; i++) { ((GPUndoListener) listeners[i]).undoOrRedoHappened(); } } DocumentManager getDocumentManager() { return myDocumentManager; } protected ParserFactory getParserFactory() { return myParserFactory; } IGanttProject getProject() { return myProject; } @Override public boolean canUndo() { return mySwingUndoManager.canUndo(); } @Override public boolean canRedo() { return mySwingUndoManager.canRedo(); } @Override public void undo() throws CannotUndoException { mySwingUndoManager.undo(); fireUndoOrRedoHappened(); } @Override public void redo() throws CannotRedoException { mySwingUndoManager.redo(); fireUndoOrRedoHappened(); } @Override public String getUndoPresentationName() { return mySwingUndoManager.getUndoPresentationName(); } @Override public String getRedoPresentationName() { return mySwingUndoManager.getRedoPresentationName(); } @Override public void addUndoableEditListener(GPUndoListener listener) { myUndoEventDispatcher.addUndoableEditListener(listener); } @Override public void removeUndoableEditListener(GPUndoListener listener) { myUndoEventDispatcher.removeUndoableEditListener(listener); } @Override public void die() { if (swingEditImpl != null) { swingEditImpl.die(); } if (mySwingUndoManager != null) { mySwingUndoManager.discardAllEdits(); } } }