From ee39112b21b0de63b0022971f5cc6dcd9866ff09 Mon Sep 17 00:00:00 2001 From: "Ilya.Usov" Date: Wed, 1 May 2024 00:02:22 +0200 Subject: [PATCH] Improve undo if patch engine is enabled Reset undo history when we are rebasing patch engine requests Synchronize commands from backend and frontend GitOrigin-RevId: 67b7fda4e07a9db1b8f2dea013a78533d7276ef4 --- .../platform-impl/api-dump-unreviewed.txt | 1 + .../openapi/command/impl/UndoManagerImpl.java | 5 ++++- .../openapi/command/impl/UndoRedoListener.kt | 20 +++++++++++++++++++ .../editor/actions/EditorActionUtil.java | 2 +- 4 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 platform/platform-impl/src/com/intellij/openapi/command/impl/UndoRedoListener.kt diff --git a/platform/platform-impl/api-dump-unreviewed.txt b/platform/platform-impl/api-dump-unreviewed.txt index 49932014afa4..303861ee0c4d 100644 --- a/platform/platform-impl/api-dump-unreviewed.txt +++ b/platform/platform-impl/api-dump-unreviewed.txt @@ -13004,6 +13004,7 @@ f:com.intellij.openapi.editor.actions.DuplicateLinesAction - ():V f:com.intellij.openapi.editor.actions.EditorActionUtil - sf:DELETE_COMMAND_GROUP:java.lang.Object +- sf:EDIT_COMMAND_GROUP:java.lang.Object - s:findFirstNonSpaceColumnOnTheLine(com.intellij.openapi.editor.Editor,I):I - s:findFirstNonSpaceOffsetInRange(java.lang.CharSequence,I,I):I - s:findFirstNonSpaceOffsetOnTheLine(com.intellij.openapi.editor.Document,I):I 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 2ad6917180ff..e4772a708ae9 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 @@ -466,7 +466,7 @@ public final class UndoManagerImpl extends UndoManager { @Nullable @ApiStatus.Internal - public ResetUndoHistoryToken createResetUndoHistoryToken(FileEditor editor) { + public ResetUndoHistoryToken createResetUndoHistoryToken(@NotNull FileEditor editor) { Collection references = getDocumentReferences(editor); if (references.size() != 1) return null; @@ -519,9 +519,11 @@ public final class UndoManagerImpl extends UndoManager { return; } state.myCurrentOperationState = isUndo ? OperationState.UNDO : OperationState.REDO; + Disposable disposable = Disposer.newDisposable(); try { final RuntimeException[] exception = new RuntimeException[1]; Runnable executeUndoOrRedoAction = () -> { + ApplicationManager.getApplication().getMessageBus().syncPublisher(UndoRedoListener.Companion.getTOPIC()).undoRedoStarted(myProject, this, editor, isUndo, disposable); try { CopyPasteManager.getInstance().stopKillRings(); state.myMerger.undoOrRedo(editor, isUndo); @@ -536,6 +538,7 @@ public final class UndoManagerImpl extends UndoManager { if (exception[0] != null) throw exception[0]; } finally { + Disposer.dispose(disposable); state.myCurrentOperationState = OperationState.NONE; } } diff --git a/platform/platform-impl/src/com/intellij/openapi/command/impl/UndoRedoListener.kt b/platform/platform-impl/src/com/intellij/openapi/command/impl/UndoRedoListener.kt new file mode 100644 index 000000000000..bd2b7b68b460 --- /dev/null +++ b/platform/platform-impl/src/com/intellij/openapi/command/impl/UndoRedoListener.kt @@ -0,0 +1,20 @@ +// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.openapi.command.impl + +import com.intellij.openapi.Disposable +import com.intellij.openapi.command.undo.UndoManager +import com.intellij.openapi.fileEditor.FileEditor +import com.intellij.openapi.project.Project +import com.intellij.util.messages.Topic +import org.jetbrains.annotations.ApiStatus.Experimental +import org.jetbrains.annotations.ApiStatus.Internal + +@Internal +@Experimental +interface UndoRedoListener { + companion object { + val TOPIC: Topic = Topic(UndoRedoListener::class.java, Topic.BroadcastDirection.NONE) + } + + fun undoRedoStarted(project: Project?, undoManager: UndoManager, editor: FileEditor?, isUndo: Boolean, disposable: Disposable) +} \ No newline at end of file diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/actions/EditorActionUtil.java b/platform/platform-impl/src/com/intellij/openapi/editor/actions/EditorActionUtil.java index b27319b6bc7b..0ae79603c78c 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/actions/EditorActionUtil.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/actions/EditorActionUtil.java @@ -25,7 +25,7 @@ import java.awt.*; import static java.lang.Character.*; public final class EditorActionUtil { - static final Object EDIT_COMMAND_GROUP = Key.create("EditGroup"); + public static final Object EDIT_COMMAND_GROUP = Key.create("EditGroup"); public static final Object DELETE_COMMAND_GROUP = Key.create("DeleteGroup"); private EditorActionUtil() {