IJPL-160366 IDEA-104009 patch: suggest switching into editable view for patches

GitOrigin-RevId: aa883807ee8fe1ff50dc609420899d8c3071eb5f
This commit is contained in:
Aleksey Pivovarov
2024-08-16 12:45:28 +02:00
committed by intellij-monorepo-bot
parent cb94bd7cff
commit 0f0a21de9a
7 changed files with 39 additions and 7 deletions

View File

@@ -272,6 +272,7 @@ option.three.side.color.policy.merge.resolved=Resolved merge conflict
notification.action.text.blank.diff.select.file=Select file\u2026
notification.action.text.blank.diff.recent=Recent
editing.viewer.hint.enable.editing.text=This view is read-only. <a href="">Enable editing</a>
patch.editing.viewer.hint.enable.editing.text=This view is read-only. <a href="">Switch to editing</a>
diff.unchanged.lines.folding.marker.renderer=marker: collapsed unchanged lines
column.dirdiff.name=Name
column.dirdiff.size=Size

View File

@@ -2701,6 +2701,7 @@ com.intellij.diff.util.DiffUserDataKeysEx
- sf:MERGE_CANCEL_HANDLER:com.intellij.openapi.util.Key
- sf:MERGE_CANCEL_MESSAGE:com.intellij.openapi.util.Key
- sf:NAVIGATION_CONTEXT:com.intellij.openapi.util.Key
- sf:PATCH_FILE_PREVIEW_MODIFICATION_SWITCH:com.intellij.openapi.util.Key
- sf:SCROLL_TO_CHANGE:com.intellij.openapi.util.Key
- sf:SHOW_READ_ONLY_LOCK:com.intellij.openapi.util.Key
- sf:TWO_SIDE_SPLITTER_PROPORTION:com.intellij.openapi.util.Key

View File

@@ -77,6 +77,8 @@ public interface DiffUserDataKeysEx extends DiffUserDataKeys {
Key<ActionToolbar> LEFT_TOOLBAR = Key.create("Diff.LeftToolbar");
Key<Runnable> PATCH_FILE_PREVIEW_MODIFICATION_SWITCH = Key.create("Diff.PatchFilePreviewModificationSwitch");
/**
* Add panel to the bottom of diff window.
* If passed panel implements Disposable, it will be disposed when window is closed.

View File

@@ -109,7 +109,7 @@ public abstract class TypedAction {
private static final class Handler implements TypedActionHandler {
@Override
public void execute(@NotNull Editor editor, char charTyped, @NotNull DataContext dataContext) {
if (editor.isViewer()) {
if (!EditorModificationUtil.checkModificationAllowed(editor)) {
return;
}

View File

@@ -1,6 +1,7 @@
// Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.openapi.vcs.changes.patch.tool
import com.intellij.diff.DiffContext
import com.intellij.diff.editor.DiffEditorViewerFileEditor
import com.intellij.diff.requests.DiffRequest
import com.intellij.diff.requests.ErrorDiffRequest
@@ -9,18 +10,18 @@ import com.intellij.diff.tools.combined.CombinedBlockProducer
import com.intellij.diff.tools.combined.CombinedDiffComponentProcessor
import com.intellij.diff.tools.combined.CombinedDiffManager
import com.intellij.diff.tools.combined.CombinedDiffRegistry
import com.intellij.diff.util.DiffUserDataKeysEx
import com.intellij.diff.util.DiffUtil
import com.intellij.ide.structureView.StructureViewBuilder
import com.intellij.openapi.ListSelection
import com.intellij.openapi.diff.DiffBundle
import com.intellij.openapi.diff.impl.patch.*
import com.intellij.openapi.editor.Document
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.editor.EditorModificationUtil
import com.intellij.openapi.editor.event.DocumentEvent
import com.intellij.openapi.editor.event.DocumentListener
import com.intellij.openapi.fileEditor.FileDocumentManager
import com.intellij.openapi.fileEditor.FileEditor
import com.intellij.openapi.fileEditor.FileEditorPolicy
import com.intellij.openapi.fileEditor.FileEditorProvider
import com.intellij.openapi.fileEditor.*
import com.intellij.openapi.fileEditor.ex.StructureViewFileEditorProvider
import com.intellij.openapi.fileEditor.impl.JComponentFileEditor
import com.intellij.openapi.fileEditor.impl.text.TextEditorProvider
@@ -43,7 +44,9 @@ import com.intellij.util.ui.update.MergingUpdateQueue
import com.intellij.util.ui.update.Update
import com.intellij.util.ui.update.queueTracked
import com.intellij.vcsUtil.VcsUtil
import kotlinx.coroutines.Runnable
import org.jetbrains.annotations.Nls
import javax.swing.event.HyperlinkEvent
internal class DiffPatchFileEditorProvider : FileEditorProvider, StructureViewFileEditorProvider, DumbAware {
/**
@@ -65,6 +68,8 @@ internal class DiffPatchFileEditorProvider : FileEditorProvider, StructureViewFi
if (CombinedDiffRegistry.isEnabled()) {
val processor = CombinedDiffManager.getInstance(project).createProcessor()
processor.context.putUserData(DiffUserDataKeysEx.PATCH_FILE_PREVIEW_MODIFICATION_SWITCH,
Runnable { switchToEditableView(project, file) })
processor.setBlocks(buildCombinedDiffModel(document))
val editor = DiffEditorViewerFileEditor(file, processor)
@@ -75,8 +80,10 @@ internal class DiffPatchFileEditorProvider : FileEditorProvider, StructureViewFi
return editor
}
else {
val chain = PatchDiffRequestChain(document)
val processor = MutableDiffRequestChainProcessor(project, chain)
val processor = MutableDiffRequestChainProcessor(project, null)
processor.context.putUserData(DiffUserDataKeysEx.PATCH_FILE_PREVIEW_MODIFICATION_SWITCH,
Runnable { switchToEditableView(project, file) })
processor.chain = PatchDiffRequestChain(document)
val editor = DiffEditorViewerFileEditor(file, processor)
@@ -100,6 +107,10 @@ internal class DiffPatchFileEditorProvider : FileEditorProvider, StructureViewFi
}
}
private fun switchToEditableView(project: Project, file: VirtualFile) {
FileEditorManager.getInstance(project).openTextEditor(OpenFileDescriptor(project, file), true)
}
private fun buildCombinedDiffModel(document: Document): List<CombinedBlockProducer> {
val producers = createDiffRequestProducers(document)
val diffModel = prepareCombinedBlocksFromProducers(producers)
@@ -181,3 +192,14 @@ private class ErrorDiffRequestProducer(private val file: VirtualFile,
return ErrorDiffRequest(message)
}
}
internal fun listenTypingAttempts(diffContext: DiffContext, editor: Editor) {
val onTypingSwitch = diffContext.getUserData(DiffUserDataKeysEx.PATCH_FILE_PREVIEW_MODIFICATION_SWITCH)
if (onTypingSwitch != null) {
EditorModificationUtil.setReadOnlyHint(editor, DiffBundle.message("patch.editing.viewer.hint.enable.editing.text"), { e ->
if (e.eventType == HyperlinkEvent.EventType.ACTIVATED) {
onTypingSwitch.run()
}
})
}
}

View File

@@ -75,6 +75,8 @@ internal class PatchDiffViewer(
}
editorSettingsAction = SetEditorSettingsAction(TextDiffViewerUtil.getTextSettings(diffContext), editors)
editorSettingsAction.applyDefaults()
listenTypingAttempts(diffContext, editor)
}
override fun getComponent(): JComponent = panel

View File

@@ -16,6 +16,7 @@ import com.intellij.diff.tools.simple.AlignableChange
import com.intellij.diff.tools.simple.AlignedDiffModel
import com.intellij.diff.tools.simple.AlignedDiffModelBase
import com.intellij.diff.tools.util.*
import com.intellij.diff.tools.util.BaseSyncScrollable.ScrollHelper
import com.intellij.diff.tools.util.FocusTrackerSupport.Twoside
import com.intellij.diff.tools.util.SyncScrollSupport.TwosideSyncScrollSupport
import com.intellij.diff.tools.util.base.TextDiffSettingsHolder.TextDiffSettings
@@ -119,6 +120,9 @@ internal class SideBySidePatchDiffViewer(
editorSettingsAction = SetEditorSettingsAction(textSettings, editors)
editorSettingsAction.setSyncScrollSupport(syncScrollSupport)
editorSettingsAction.applyDefaults()
listenTypingAttempts(diffContext, editor1)
listenTypingAttempts(diffContext, editor2)
}
override fun getComponent(): JComponent = panel