mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-03-22 15:19:59 +07:00
IJPL-160366 IDEA-104009 patch: suggest switching into editable view for patches
GitOrigin-RevId: aa883807ee8fe1ff50dc609420899d8c3071eb5f
This commit is contained in:
committed by
intellij-monorepo-bot
parent
cb94bd7cff
commit
0f0a21de9a
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,6 +75,8 @@ internal class PatchDiffViewer(
|
||||
}
|
||||
editorSettingsAction = SetEditorSettingsAction(TextDiffViewerUtil.getTextSettings(diffContext), editors)
|
||||
editorSettingsAction.applyDefaults()
|
||||
|
||||
listenTypingAttempts(diffContext, editor)
|
||||
}
|
||||
|
||||
override fun getComponent(): JComponent = panel
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user