diff --git a/java/testFramework/src/com/intellij/testFramework/PsiTestCase.java b/java/testFramework/src/com/intellij/testFramework/PsiTestCase.java index 381631c604ff..4f8ecf5136e9 100644 --- a/java/testFramework/src/com/intellij/testFramework/PsiTestCase.java +++ b/java/testFramework/src/com/intellij/testFramework/PsiTestCase.java @@ -18,6 +18,7 @@ package com.intellij.testFramework; import com.intellij.openapi.application.Result; import com.intellij.openapi.application.WriteAction; import com.intellij.openapi.application.ex.PathManagerEx; +import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.module.Module; import com.intellij.openapi.projectRoots.impl.JavaSdkImpl; import com.intellij.openapi.roots.ModuleRootManager; @@ -228,6 +229,10 @@ public abstract class PsiTestCase extends ModuleTestCase { return PsiDocumentManager.getInstance(getProject()).getDocument(file); } + public com.intellij.openapi.editor.Document getDocument(VirtualFile file) { + return FileDocumentManager.getInstance().getDocument(file); + } + public void commitDocument(com.intellij.openapi.editor.Document document) { PsiDocumentManager.getInstance(getProject()).commitDocument(document); } diff --git a/platform/platform-impl/src/com/intellij/openapi/command/impl/DocumentUndoProvider.java b/platform/platform-impl/src/com/intellij/openapi/command/impl/DocumentUndoProvider.java index 10c7773742a9..710e037e3279 100644 --- a/platform/platform-impl/src/com/intellij/openapi/command/impl/DocumentUndoProvider.java +++ b/platform/platform-impl/src/com/intellij/openapi/command/impl/DocumentUndoProvider.java @@ -16,7 +16,6 @@ package com.intellij.openapi.command.impl; import com.intellij.openapi.Disposable; -import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.command.undo.DocumentReference; import com.intellij.openapi.command.undo.DocumentReferenceManager; import com.intellij.openapi.command.undo.UndoConstants; @@ -31,7 +30,6 @@ import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Key; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.ExternalChangeAction; import org.jetbrains.annotations.Nullable; public class DocumentUndoProvider implements Disposable { @@ -115,8 +113,7 @@ public class DocumentUndoProvider implements Disposable { } private boolean isUndoable(Document document) { - boolean isFromRefresh = ApplicationManager.getApplication().hasWriteAction(ExternalChangeAction.class); - if (!isFromRefresh) return true; + if (!UndoManagerImpl.isRefresh()) return true; return getUndoManager().isUndoOrRedoAvailable(DocumentReferenceManager.getInstance().create(document)); } diff --git a/platform/platform-impl/src/com/intellij/openapi/command/impl/UndoManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/command/impl/UndoManagerImpl.java index b412d811ea4d..d473da4e3ebf 100644 --- a/platform/platform-impl/src/com/intellij/openapi/command/impl/UndoManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/command/impl/UndoManagerImpl.java @@ -46,6 +46,7 @@ import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.wm.ex.WindowManagerEx; +import com.intellij.psi.ExternalChangeAction; import com.intellij.psi.PsiDocumentManager; import com.intellij.util.containers.HashSet; import gnu.trove.THashSet; @@ -89,6 +90,10 @@ public class UndoManagerImpl extends UndoManager implements ProjectComponent, Ap private DocumentReference myOriginatorReference; + public static boolean isRefresh() { + return ApplicationManager.getApplication().hasWriteAction(ExternalChangeAction.class); + } + public static int getGlobalUndoLimit() { return Registry.intValue("undo.globalUndoLimit", 10); } @@ -229,7 +234,7 @@ public class UndoManagerImpl extends UndoManager implements ProjectComponent, Ap myCurrentActionProject = project; } - commandStarted(undoConfirmationPolicy); + commandStarted(undoConfirmationPolicy, myProject == project); LOG.assertTrue(myCommandLevel == 0 || !(myCurrentActionProject instanceof DummyProject)); } @@ -245,11 +250,11 @@ public class UndoManagerImpl extends UndoManager implements ProjectComponent, Ap LOG.assertTrue(myCommandLevel == 0 || !(myCurrentActionProject instanceof DummyProject)); } - private void commandStarted(UndoConfirmationPolicy undoConfirmationPolicy) { + private void commandStarted(UndoConfirmationPolicy undoConfirmationPolicy, boolean recordOriginalReference) { if (myCommandLevel == 0) { myCurrentMerger = new CommandMerger(this, CommandProcessor.getInstance().isUndoTransparentActionInProgress()); - if (myProject != null) { + if (recordOriginalReference && myProject != null) { Editor editor = null; if (ApplicationManager.getApplication().isUnitTestMode()) { editor = PlatformDataKeys.EDITOR.getData(DataManager.getInstance().getDataContext()); @@ -344,12 +349,14 @@ public class UndoManagerImpl extends UndoManager implements ProjectComponent, Ap if (myCommandLevel == 0) { LOG.assertTrue(action instanceof NonUndoableAction, "Undoable actions allowed inside commands only (see com.intellij.openapi.command.CommandProcessor.executeCommand())"); - commandStarted(UndoConfirmationPolicy.DEFAULT); + commandStarted(UndoConfirmationPolicy.DEFAULT, false); myCurrentMerger.addAction(action); commandFinished("", null); return; } + if (isRefresh()) myOriginatorReference = null; + myCurrentMerger.addAction(action); }