IDEA-197789 diff: allow to switch file from editor menu in "Blank Diff Window"

This commit is contained in:
Aleksey Pivovarov
2019-02-03 13:37:14 +03:00
parent cc05f152c4
commit ac3c6e550f
2 changed files with 59 additions and 9 deletions
@@ -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"/>