From 737d7b8ecfc647c1dae0674f88692f4b32e13ac0 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Fri, 10 Apr 2015 17:34:46 +0300 Subject: [PATCH] diff: detect FileType in "Compare clipboard with selection" from diff viewer --- .../com/intellij/diff/DiffContentFactory.java | 3 ++ .../intellij/diff/DiffContentFactoryImpl.java | 7 +++++ .../CompareClipboardWithSelectionAction.java | 28 +++++++++++++++++-- .../diff/tools/util/DiffDataKeys.java | 2 ++ .../tools/util/base/TextDiffViewerBase.java | 3 +- .../threeside/ThreesideTextDiffViewer.java | 12 ++++++-- .../util/twoside/TwosideTextDiffViewer.java | 14 +++++++--- 7 files changed, 57 insertions(+), 12 deletions(-) diff --git a/platform/diff-api/src/com/intellij/diff/DiffContentFactory.java b/platform/diff-api/src/com/intellij/diff/DiffContentFactory.java index ffe4824fed78..98e5745c2b8d 100644 --- a/platform/diff-api/src/com/intellij/diff/DiffContentFactory.java +++ b/platform/diff-api/src/com/intellij/diff/DiffContentFactory.java @@ -52,6 +52,9 @@ public abstract class DiffContentFactory { @NotNull public abstract DocumentContent create(@Nullable Project project, @NotNull Document document); + @NotNull + public abstract DocumentContent create(@Nullable Project project, @NotNull Document document, @Nullable FileType fileType); + @NotNull public abstract DocumentContent create(@Nullable Project project, @NotNull Document document, @Nullable VirtualFile file); diff --git a/platform/diff-impl/src/com/intellij/diff/DiffContentFactoryImpl.java b/platform/diff-impl/src/com/intellij/diff/DiffContentFactoryImpl.java index f342f7a378d7..a98a4c8dae75 100644 --- a/platform/diff-impl/src/com/intellij/diff/DiffContentFactoryImpl.java +++ b/platform/diff-impl/src/com/intellij/diff/DiffContentFactoryImpl.java @@ -77,7 +77,14 @@ public class DiffContentFactoryImpl extends DiffContentFactory { @Override @NotNull public DocumentContent create(@Nullable Project project, @NotNull Document document) { + return create(project, document, (FileType)null); + } + + @Override + @NotNull + public DocumentContent create(@Nullable Project project, @NotNull Document document, @Nullable FileType fileType) { VirtualFile file = FileDocumentManager.getInstance().getFile(document); + if (file == null) return new DocumentContentImpl(document, fileType, null, null, null); return create(project, document, file); } diff --git a/platform/diff-impl/src/com/intellij/diff/actions/CompareClipboardWithSelectionAction.java b/platform/diff-impl/src/com/intellij/diff/actions/CompareClipboardWithSelectionAction.java index 560728a6f6a1..1474e012cda2 100644 --- a/platform/diff-impl/src/com/intellij/diff/actions/CompareClipboardWithSelectionAction.java +++ b/platform/diff-impl/src/com/intellij/diff/actions/CompareClipboardWithSelectionAction.java @@ -17,9 +17,12 @@ package com.intellij.diff.actions; import com.intellij.diff.DiffContentFactory; import com.intellij.diff.DiffRequestFactory; +import com.intellij.diff.contents.DiffContent; import com.intellij.diff.contents.DocumentContent; +import com.intellij.diff.requests.ContentDiffRequest; import com.intellij.diff.requests.DiffRequest; import com.intellij.diff.requests.SimpleDiffRequest; +import com.intellij.diff.tools.util.DiffDataKeys; import com.intellij.diff.util.DiffUserDataKeys; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.CommonDataKeys; @@ -28,6 +31,8 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.SelectionModel; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.fileEditor.FileEditorManager; +import com.intellij.openapi.fileTypes.FileType; +import com.intellij.openapi.fileTypes.UnknownFileType; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.VirtualFile; @@ -49,6 +54,22 @@ public class CompareClipboardWithSelectionAction extends BaseShowDiffAction { return null; } + @Nullable + private static FileType getEditorFileType(@NotNull AnActionEvent e) { + DiffContent content = e.getData(DiffDataKeys.CURRENT_CONTENT); + if (content != null && content.getContentType() != null) return content.getContentType(); + + DiffRequest request = e.getData(DiffDataKeys.DIFF_REQUEST); + if (request != null && request instanceof ContentDiffRequest) { + for (DiffContent diffContent : ((ContentDiffRequest)request).getContents()) { + FileType type = diffContent.getContentType(); + if (type != null && type != UnknownFileType.INSTANCE) return type; + } + } + + return null; + } + @Override protected boolean isAvailable(@NotNull AnActionEvent e) { Editor editor = getEditor(e); @@ -60,9 +81,10 @@ public class CompareClipboardWithSelectionAction extends BaseShowDiffAction { protected DiffRequest getDiffRequest(@NotNull AnActionEvent e) { Project project = e.getRequiredData(CommonDataKeys.PROJECT); Editor editor = getEditor(e); + FileType editorFileType = getEditorFileType(e); assert editor != null; - DocumentContent content2 = createContent(project, editor); + DocumentContent content2 = createContent(project, editor, editorFileType); DocumentContent content1 = DiffContentFactory.getInstance().createClipboardContent(content2); String title1 = DiffBundle.message("diff.content.clipboard.content.title"); @@ -78,8 +100,8 @@ public class CompareClipboardWithSelectionAction extends BaseShowDiffAction { } @NotNull - private static DocumentContent createContent(@NotNull Project project, @NotNull Editor editor) { - DocumentContent content = DiffContentFactory.getInstance().create(project, editor.getDocument()); + private static DocumentContent createContent(@NotNull Project project, @NotNull Editor editor, @Nullable FileType type) { + DocumentContent content = DiffContentFactory.getInstance().create(project, editor.getDocument(), type); SelectionModel selectionModel = editor.getSelectionModel(); if (selectionModel.hasSelection()) { diff --git a/platform/diff-impl/src/com/intellij/diff/tools/util/DiffDataKeys.java b/platform/diff-impl/src/com/intellij/diff/tools/util/DiffDataKeys.java index e9c274e3ace5..94f2fe6c1537 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/util/DiffDataKeys.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/util/DiffDataKeys.java @@ -17,6 +17,7 @@ package com.intellij.diff.tools.util; import com.intellij.diff.DiffContext; import com.intellij.diff.FrameDiffTool; +import com.intellij.diff.contents.DiffContent; import com.intellij.diff.requests.DiffRequest; import com.intellij.openapi.actionSystem.DataKey; import com.intellij.openapi.editor.Editor; @@ -24,6 +25,7 @@ import com.intellij.openapi.fileEditor.OpenFileDescriptor; public interface DiffDataKeys { DataKey CURRENT_EDITOR = DataKey.create("diff_current_editor"); + DataKey CURRENT_CONTENT = DataKey.create("diff_current_content"); DataKey DIFF_REQUEST = DataKey.create("diff_request"); DataKey DIFF_CONTEXT = DataKey.create("diff_context"); diff --git a/platform/diff-impl/src/com/intellij/diff/tools/util/base/TextDiffViewerBase.java b/platform/diff-impl/src/com/intellij/diff/tools/util/base/TextDiffViewerBase.java index 2ecd2fbca6f8..28753c454b6c 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/util/base/TextDiffViewerBase.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/util/base/TextDiffViewerBase.java @@ -26,7 +26,6 @@ import com.intellij.diff.util.DiffUtil; import com.intellij.icons.AllIcons; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.actionSystem.ex.ComboBoxAction; -import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.actions.EditorActionUtil; import com.intellij.openapi.editor.event.EditorMouseEvent; import com.intellij.openapi.editor.ex.EditorEx; @@ -114,7 +113,7 @@ public abstract class TextDiffViewerBase extends ListenerDiffViewerBase { @NotNull protected List createEditorPopupActions() { return ContainerUtil.list( - ActionManager.getInstance().getAction("CompareClipboardWithSelection") // TODO: pass FileType to DataContext for highlighting + ActionManager.getInstance().getAction("CompareClipboardWithSelection") ); } diff --git a/platform/diff-impl/src/com/intellij/diff/tools/util/threeside/ThreesideTextDiffViewer.java b/platform/diff-impl/src/com/intellij/diff/tools/util/threeside/ThreesideTextDiffViewer.java index 244f81e4a138..076134271e1d 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/util/threeside/ThreesideTextDiffViewer.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/util/threeside/ThreesideTextDiffViewer.java @@ -262,6 +262,11 @@ public abstract class ThreesideTextDiffViewer extends TextDiffViewerBase { return myCurrentSide.select(myEditors); } + @NotNull + public DocumentContent getCurrentContent() { + return myCurrentSide.select(myActualContents); + } + @NotNull @Override protected List getEditors() { @@ -306,10 +311,8 @@ public abstract class ThreesideTextDiffViewer extends TextDiffViewerBase { protected OpenFileDescriptor getOpenFileDescriptor() { EditorEx editor = getCurrentEditor(); - DocumentContent content = getCurrentSide().select(myActualContents); - int offset = editor.getCaretModel().getOffset(); - return content.getOpenFileDescriptor(offset); + return getCurrentContent().getOpenFileDescriptor(offset); } public static boolean canShowRequest(@NotNull DiffContext context, @NotNull DiffRequest request) { @@ -392,6 +395,9 @@ public abstract class ThreesideTextDiffViewer extends TextDiffViewerBase { if (DiffDataKeys.CURRENT_EDITOR.is(dataId)) { return getCurrentEditor(); } + else if (DiffDataKeys.CURRENT_CONTENT.is(dataId)) { + return getCurrentContent(); + } return super.getData(dataId); } diff --git a/platform/diff-impl/src/com/intellij/diff/tools/util/twoside/TwosideTextDiffViewer.java b/platform/diff-impl/src/com/intellij/diff/tools/util/twoside/TwosideTextDiffViewer.java index 0e37c71bbb47..6ae251d9c390 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/util/twoside/TwosideTextDiffViewer.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/util/twoside/TwosideTextDiffViewer.java @@ -302,6 +302,12 @@ public abstract class TwosideTextDiffViewer extends TextDiffViewerBase { return getCurrentSide().isLeft() ? myEditor1 : myEditor2; } + @NotNull + public DocumentContent getCurrentContent() { + //noinspection ConstantConditions + return getCurrentSide().isLeft() ? myActualContent1 : myActualContent2; + } + @Nullable protected EditorEx getEditor1() { return myEditor1; @@ -359,11 +365,8 @@ public abstract class TwosideTextDiffViewer extends TextDiffViewerBase { protected OpenFileDescriptor getOpenFileDescriptor() { EditorEx editor = getCurrentEditor(); - DocumentContent content = getCurrentSide().select(myActualContent1, myActualContent2); - assert content != null; - int offset = editor.getCaretModel().getOffset(); - return content.getOpenFileDescriptor(offset); + return getCurrentContent().getOpenFileDescriptor(offset); } public static boolean canShowRequest(@NotNull DiffContext context, @NotNull DiffRequest request) { @@ -443,6 +446,9 @@ public abstract class TwosideTextDiffViewer extends TextDiffViewerBase { if (DiffDataKeys.CURRENT_EDITOR.is(dataId)) { return getCurrentEditor(); } + else if (DiffDataKeys.CURRENT_CONTENT.is(dataId)) { + return getCurrentContent(); + } return super.getData(dataId); }