mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-10-02 00:57:59 +07:00
IDEA-197789 diff: allow to switch file from editor menu in "Blank Diff Window"
This commit is contained in:
@@ -18,6 +18,8 @@ import com.intellij.openapi.actionSystem.AnActionEvent
|
||||
import com.intellij.openapi.actionSystem.CommonDataKeys
|
||||
import com.intellij.openapi.editor.EditorDropHandler
|
||||
import com.intellij.openapi.editor.impl.EditorImpl
|
||||
import com.intellij.openapi.fileChooser.FileChooser
|
||||
import com.intellij.openapi.fileChooser.FileChooserDescriptor
|
||||
import com.intellij.openapi.fileEditor.impl.EditorWindow
|
||||
import com.intellij.openapi.progress.ProgressIndicator
|
||||
import com.intellij.openapi.project.DumbAwareAction
|
||||
@@ -25,6 +27,7 @@ import com.intellij.openapi.project.Project
|
||||
import com.intellij.openapi.util.UserDataHolder
|
||||
import com.intellij.openapi.util.text.StringUtil
|
||||
import com.intellij.openapi.vfs.VfsUtil
|
||||
import com.intellij.openapi.vfs.VirtualFile
|
||||
import java.awt.datatransfer.DataFlavor
|
||||
import java.awt.datatransfer.Transferable
|
||||
import java.io.File
|
||||
@@ -53,7 +56,39 @@ class ShowBlankDiffWindowAction : DumbAwareAction() {
|
||||
}
|
||||
}
|
||||
|
||||
class SwitchToBlankEditorAction : DumbAwareAction() {
|
||||
internal class SwitchToBlankEditorAction : BlankActionBase() {
|
||||
override fun isEnabled(viewer: TwosideTextDiffViewer, chain: BlankWindowDiffRequestChain, context: DiffContextEx, side: Side): Boolean {
|
||||
val content = side.select(chain.content1, chain.content2)
|
||||
return content is FileContent
|
||||
}
|
||||
|
||||
override fun perform(viewer: TwosideTextDiffViewer, chain: BlankWindowDiffRequestChain, context: DiffContextEx, side: Side) {
|
||||
val newContent = createEditableContent(viewer.project, "")
|
||||
chain.setContent(newContent, side)
|
||||
|
||||
context.reloadDiffRequest()
|
||||
}
|
||||
}
|
||||
|
||||
internal class SwitchToFileEditorAction : BlankActionBase() {
|
||||
override fun isEnabled(viewer: TwosideTextDiffViewer, chain: BlankWindowDiffRequestChain, context: DiffContextEx, side: Side): Boolean {
|
||||
return true
|
||||
}
|
||||
|
||||
override fun perform(viewer: TwosideTextDiffViewer, chain: BlankWindowDiffRequestChain, context: DiffContextEx, side: Side) {
|
||||
val descriptor = FileChooserDescriptor(true, false, false, false, false, false)
|
||||
descriptor.title = "Select File to Compare"
|
||||
descriptor.description = ""
|
||||
val file = FileChooser.chooseFile(descriptor, viewer.component, viewer.project, null) ?: return
|
||||
|
||||
val newContent = createFileContent(viewer.project, file) ?: return
|
||||
chain.setContent(newContent, side)
|
||||
|
||||
context.reloadDiffRequest()
|
||||
}
|
||||
}
|
||||
|
||||
internal abstract class BlankActionBase : DumbAwareAction() {
|
||||
override fun update(e: AnActionEvent) {
|
||||
val viewer = e.getData(DiffDataKeys.DIFF_VIEWER) as? TwosideTextDiffViewer
|
||||
val request = e.getData(DiffDataKeys.DIFF_REQUEST) as? BlankWindowDiffRequest
|
||||
@@ -70,8 +105,7 @@ class SwitchToBlankEditorAction : DumbAwareAction() {
|
||||
return
|
||||
}
|
||||
|
||||
val content = side.select(request.chain.content1, request.chain.content2)
|
||||
e.presentation.isEnabledAndVisible = content is FileContent
|
||||
e.presentation.isEnabledAndVisible = isEnabled(viewer, request.chain, context, side)
|
||||
}
|
||||
|
||||
override fun actionPerformed(e: AnActionEvent) {
|
||||
@@ -82,11 +116,18 @@ class SwitchToBlankEditorAction : DumbAwareAction() {
|
||||
val editor = e.getData(CommonDataKeys.EDITOR)
|
||||
val side = Side.fromValue(viewer.editors, editor)!!
|
||||
|
||||
val newContent = createEditableContent(viewer.project, "")
|
||||
request.chain.setContent(newContent, side)
|
||||
|
||||
context.reloadDiffRequest()
|
||||
perform(viewer, request.chain, context, side)
|
||||
}
|
||||
|
||||
protected abstract fun isEnabled(viewer: TwosideTextDiffViewer,
|
||||
chain: BlankWindowDiffRequestChain,
|
||||
context: DiffContextEx,
|
||||
side: Side): Boolean
|
||||
|
||||
protected abstract fun perform(viewer: TwosideTextDiffViewer,
|
||||
chain: BlankWindowDiffRequestChain,
|
||||
context: DiffContextEx,
|
||||
side: Side)
|
||||
}
|
||||
|
||||
class ShowBlankDiffWindowDiffExtension : DiffExtension() {
|
||||
@@ -144,10 +185,14 @@ private fun createEditableContent(project: Project?, text: String): DocumentCont
|
||||
|
||||
private fun createFileContent(project: Project?, file: File): DocumentContent? {
|
||||
val virtualFile = VfsUtil.findFileByIoFile(file, true) ?: return null
|
||||
return DiffContentFactory.getInstance().createDocument(project, virtualFile)
|
||||
return createFileContent(project, virtualFile)
|
||||
}
|
||||
|
||||
private class BlankWindowDiffRequestChain(var content1: DocumentContent, var content2: DocumentContent) : DiffRequestChainBase() {
|
||||
private fun createFileContent(project: Project?, file: VirtualFile): DocumentContent? {
|
||||
return DiffContentFactory.getInstance().createDocument(project, file)
|
||||
}
|
||||
|
||||
internal class BlankWindowDiffRequestChain(var content1: DocumentContent, var content2: DocumentContent) : DiffRequestChainBase() {
|
||||
var title1: String? = getTitleFor(content1)
|
||||
var title2: String? = getTitleFor(content2)
|
||||
|
||||
|
||||
@@ -904,6 +904,11 @@
|
||||
|
||||
<action id="OpenBlankEditorInBlankDiffWindow" class="com.intellij.diff.actions.SwitchToBlankEditorAction" text="Switch to Blank Editor">
|
||||
<add-to-group group-id="Diff.EditorPopupMenu" anchor="last"/>
|
||||
<add-to-group group-id="Diff.KeymapGroup" relative-to-action="ShowBlankDiffWindow" anchor="after"/>
|
||||
</action>
|
||||
<action id="OpenFileEditorInBlankDiffWindow" class="com.intellij.diff.actions.SwitchToFileEditorAction" text="Switch to a File...">
|
||||
<add-to-group group-id="Diff.EditorPopupMenu" relative-to-action="OpenBlankEditorInBlankDiffWindow" anchor="after"/>
|
||||
<add-to-group group-id="Diff.KeymapGroup" relative-to-action="OpenBlankEditorInBlankDiffWindow" anchor="after"/>
|
||||
</action>
|
||||
|
||||
<action id="Rerun" class="com.intellij.execution.runners.FakeRerunAction" text="Rerun"/>
|
||||
|
||||
Reference in New Issue
Block a user