From d2e64e7dc35d745c7582213ca3c13e61ed9b8cd4 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Thu, 19 Feb 2015 12:43:59 +0300 Subject: [PATCH] diff: disable action if changes can't be shown * allow to create changes without Project --- .../diff/ChangeDiffRequestProducer.java | 27 +++++++++------- .../diff/ChangeDiffRequestProvider.java | 3 +- .../diff/ChangeDiffViewerWrapperProvider.java | 3 +- .../diff/FileAwareDocumentContent.java | 11 ++++--- .../changes/actions/diff/ShowDiffAction.java | 32 +++++++++++-------- .../vcs/changes/ui/ChangesBrowser.java | 2 +- .../difftool/SvnChangeDiffViewerProvider.java | 8 ++--- .../SvnPhantomChangeDiffRequestProvider.java | 2 +- .../SvnTreeConflictDiffRequestProvider.java | 2 +- 9 files changed, 50 insertions(+), 40 deletions(-) diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/diff/ChangeDiffRequestProducer.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/diff/ChangeDiffRequestProducer.java index 4fc7f19673e6..9cc14fc4a82b 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/diff/ChangeDiffRequestProducer.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/diff/ChangeDiffRequestProducer.java @@ -66,11 +66,11 @@ public class ChangeDiffRequestProducer implements DiffRequestProducer { private static Key> CONTEXT_KEY = Key.create("Diff.ChangeDiffRequestPresentableContextKey"); public static Key CHANGE_KEY = Key.create("DiffRequestPresentable.Change"); - @NotNull private final Project myProject; + @Nullable private final Project myProject; @NotNull private final Change myChange; @NotNull private final Map myChangeContext; - private ChangeDiffRequestProducer(@NotNull Project project, @NotNull Change change, @NotNull Map changeContext) { + private ChangeDiffRequestProducer(@Nullable Project project, @NotNull Change change, @NotNull Map changeContext) { myChange = change; myProject = project; myChangeContext = changeContext; @@ -81,7 +81,7 @@ public class ChangeDiffRequestProducer implements DiffRequestProducer { return myChange; } - @NotNull + @Nullable public Project getProject() { return myProject; } @@ -111,19 +111,19 @@ public class ChangeDiffRequestProducer implements DiffRequestProducer { } @Nullable - public static ChangeDiffRequestProducer create(@NotNull Project project, @NotNull Change change) { + public static ChangeDiffRequestProducer create(@Nullable Project project, @NotNull Change change) { return create(project, change, Collections.emptyMap()); } @Nullable - public static ChangeDiffRequestProducer create(@NotNull Project project, - @NotNull Change change, - @NotNull Map changeContext) { + public static ChangeDiffRequestProducer create(@Nullable Project project, + @NotNull Change change, + @NotNull Map changeContext) { if (!canCreate(project, change)) return null; return new ChangeDiffRequestProducer(project, change, changeContext); } - private static boolean canCreate(@NotNull Project project, @NotNull Change change) { + public static boolean canCreate(@Nullable Project project, @NotNull Change change) { for (ChangeDiffViewerWrapperProvider provider : ChangeDiffViewerWrapperProvider.EP_NAME.getExtensions()) { if (provider.canCreate(project, change)) return true; } @@ -223,7 +223,7 @@ public class ChangeDiffRequestProducer implements DiffRequestProducer { } @NotNull - private static DiffRequest createRequest(@NotNull Project project, + private static DiffRequest createRequest(@Nullable Project project, @NotNull Change change, @NotNull UserDataHolder context, @NotNull ProgressIndicator indicator) throws DiffRequestProducerException { @@ -238,6 +238,9 @@ public class ChangeDiffRequestProducer implements DiffRequestProducer { } if (file == null) throw new DiffRequestProducerException("Can't show merge conflict - file not found"); + if (project == null) { + throw new DiffRequestProducerException("Can't show merge conflict - project is unknown"); + } final AbstractVcs vcs = ChangesUtil.getVcsForChange(change, project); if (vcs == null || vcs.getMergeProvider() == null) { throw new DiffRequestProducerException("Can't show merge conflict - operation nos supported"); @@ -353,7 +356,7 @@ public class ChangeDiffRequestProducer implements DiffRequestProducer { } @NotNull - public static DiffContent createContent(@NotNull Project project, + public static DiffContent createContent(@Nullable Project project, @Nullable ContentRevision revision, @NotNull UserDataHolder context, @NotNull ProgressIndicator indicator) throws DiffRequestProducerException { @@ -400,7 +403,7 @@ public class ChangeDiffRequestProducer implements DiffRequestProducer { return DiffContentFactory.getInstance().create(CharsetToolkit.bytesToString(bytes, file.getCharset()), file.getFileType()); } - public static void checkContentRevision(@NotNull Project project, + public static void checkContentRevision(@Nullable Project project, @NotNull ContentRevision rev, @NotNull UserDataHolder context, @NotNull ProgressIndicator indicator) throws DiffRequestProducerException { @@ -409,7 +412,7 @@ public class ChangeDiffRequestProducer implements DiffRequestProducer { } } - private static void checkAssociate(@NotNull final Project project, + private static void checkAssociate(@Nullable final Project project, @NotNull final FilePath file, @NotNull final UserDataHolder context, @NotNull ProgressIndicator indicator) { diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/diff/ChangeDiffRequestProvider.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/diff/ChangeDiffRequestProvider.java index 59376437ed72..59c9b07a4221 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/diff/ChangeDiffRequestProvider.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/diff/ChangeDiffRequestProvider.java @@ -25,6 +25,7 @@ import com.intellij.diff.requests.DiffRequest; import com.intellij.openapi.vcs.changes.Change; import com.intellij.util.ThreeState; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public interface ChangeDiffRequestProvider { ExtensionPointName EP_NAME = @@ -33,7 +34,7 @@ public interface ChangeDiffRequestProvider { @NotNull ThreeState isEquals(@NotNull Change change1, @NotNull Change change2); - boolean canCreate(@NotNull Project project, @NotNull Change change); + boolean canCreate(@Nullable Project project, @NotNull Change change); @NotNull DiffRequest process(@NotNull ChangeDiffRequestProducer presentable, diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/diff/ChangeDiffViewerWrapperProvider.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/diff/ChangeDiffViewerWrapperProvider.java index cbfd30326f11..b82074fe80b1 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/diff/ChangeDiffViewerWrapperProvider.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/diff/ChangeDiffViewerWrapperProvider.java @@ -25,6 +25,7 @@ import com.intellij.diff.impl.DiffViewerWrapper; import com.intellij.openapi.vcs.changes.Change; import com.intellij.util.ThreeState; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public interface ChangeDiffViewerWrapperProvider { ExtensionPointName EP_NAME = @@ -33,7 +34,7 @@ public interface ChangeDiffViewerWrapperProvider { @NotNull ThreeState isEquals(@NotNull Change change1, @NotNull Change change2); - boolean canCreate(@NotNull Project project, @NotNull Change change); + boolean canCreate(@Nullable Project project, @NotNull Change change); @NotNull DiffViewerWrapper process(@NotNull ChangeDiffRequestProducer presentable, diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/diff/FileAwareDocumentContent.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/diff/FileAwareDocumentContent.java index fe8d0f4255f9..a32935b0c754 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/diff/FileAwareDocumentContent.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/diff/FileAwareDocumentContent.java @@ -20,10 +20,10 @@ import org.jetbrains.annotations.Nullable; import java.nio.charset.Charset; public class FileAwareDocumentContent extends DocumentContentImpl { - @NotNull private final Project myProject; + @Nullable private final Project myProject; @Nullable private final VirtualFile myLocalFile; - public FileAwareDocumentContent(@NotNull Project project, + public FileAwareDocumentContent(@Nullable Project project, @NotNull Document document, @Nullable FileType fileType, @Nullable VirtualFile localFile, @@ -35,11 +35,12 @@ public class FileAwareDocumentContent extends DocumentContentImpl { } public OpenFileDescriptor getOpenFileDescriptor(int offset) { - return myLocalFile == null ? null : new OpenFileDescriptor(myProject, myLocalFile, offset); + if (myProject == null || myLocalFile == null) return null; + return new OpenFileDescriptor(myProject, myLocalFile, offset); } @NotNull - public static DiffContent create(@NotNull Project project, + public static DiffContent create(@Nullable Project project, @NotNull String content, @NotNull FilePath path) { VirtualFile localFile = LocalFileSystem.getInstance().findFileByPath(path.getPath()); @@ -58,7 +59,7 @@ public class FileAwareDocumentContent extends DocumentContentImpl { } @NotNull - private static DiffContent create(@NotNull Project project, + private static DiffContent create(@Nullable Project project, @NotNull String content, @Nullable FileType fileType, @Nullable VirtualFile file, diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/diff/ShowDiffAction.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/diff/ShowDiffAction.java index c82b8b699568..b3bb193c51e1 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/diff/ShowDiffAction.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/diff/ShowDiffAction.java @@ -15,6 +15,10 @@ */ package com.intellij.openapi.vcs.changes.actions.diff; +import com.intellij.diff.DiffDialogHints; +import com.intellij.diff.DiffManager; +import com.intellij.diff.chains.DiffRequestChain; +import com.intellij.diff.util.DiffUserDataKeys; import com.intellij.icons.AllIcons; import com.intellij.idea.ActionsBundle; import com.intellij.openapi.actionSystem.AnAction; @@ -26,10 +30,6 @@ import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Key; -import com.intellij.diff.DiffDialogHints; -import com.intellij.diff.DiffManager; -import com.intellij.diff.chains.DiffRequestChain; -import com.intellij.diff.util.DiffUserDataKeys; import com.intellij.openapi.vcs.VcsDataKeys; import com.intellij.openapi.vcs.changes.*; import com.intellij.openapi.vcs.changes.actions.ShowDiffUIContext; @@ -55,11 +55,15 @@ public class ShowDiffAction extends AnAction implements DumbAware { public void update(@NotNull AnActionEvent e) { Change[] changes = e.getData(VcsDataKeys.CHANGES); Project project = e.getData(CommonDataKeys.PROJECT); - e.getPresentation().setEnabled(project != null && canShowDiff(changes)); + e.getPresentation().setEnabled(project != null && canShowDiff(project, changes)); } - protected static boolean canShowDiff(@Nullable Change[] changes) { - return changes != null && changes.length != 0; + protected static boolean canShowDiff(@Nullable Project project, @Nullable Change[] changes) { + if (changes == null || changes.length == 0) return false; + for (Change change : changes) { + if (ChangeDiffRequestProducer.canCreate(project, change)) return true; + } + return false; } public void actionPerformed(@NotNull final AnActionEvent e) { @@ -116,7 +120,7 @@ public class ShowDiffAction extends AnAction implements DumbAware { } } - private static boolean checkIfThereAreFakeRevisions(final Project project, final Change[] changes) { + private static boolean checkIfThereAreFakeRevisions(@NotNull Project project, @NotNull Change[] changes) { boolean needsConversion = false; for (Change change : changes) { final ContentRevision beforeRevision = change.getBeforeRevision(); @@ -134,7 +138,7 @@ public class ShowDiffAction extends AnAction implements DumbAware { } @Nullable - private static Change[] loadFakeRevisions(final Project project, final Change[] changes) { + private static Change[] loadFakeRevisions(@NotNull Project project, @NotNull Change[] changes) { List matchingChanges = new ArrayList(); for (Change change : changes) { matchingChanges.addAll(ChangeListManager.getInstance(project).getChangesIn(ChangesUtil.getFilePath(change))); @@ -146,15 +150,15 @@ public class ShowDiffAction extends AnAction implements DumbAware { // Impl // - public static void showDiffForChange(@NotNull Project project, @NotNull Iterable changes) { + public static void showDiffForChange(@Nullable Project project, @NotNull Iterable changes) { showDiffForChange(project, changes, 0); } - public static void showDiffForChange(@NotNull Project project, @NotNull Iterable changes, int index) { + public static void showDiffForChange(@Nullable Project project, @NotNull Iterable changes, int index) { showDiffForChange(project, changes, index, new ShowDiffContext()); } - public static void showDiffForChange(@NotNull Project project, + public static void showDiffForChange(@Nullable Project project, @NotNull Iterable changes, @NotNull Condition condition, @NotNull ShowDiffContext context) { @@ -169,7 +173,7 @@ public class ShowDiffAction extends AnAction implements DumbAware { showDiffForChange(project, presentables, index, context); } - public static void showDiffForChange(@NotNull Project project, + public static void showDiffForChange(@Nullable Project project, @NotNull Iterable changes, int index, @NotNull ShowDiffContext context) { @@ -188,7 +192,7 @@ public class ShowDiffAction extends AnAction implements DumbAware { showDiffForChange(project, presentables, newIndex, context); } - private static void showDiffForChange(@NotNull Project project, + private static void showDiffForChange(@Nullable Project project, @NotNull List presentables, int index, @NotNull ShowDiffContext context) { diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesBrowser.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesBrowser.java index 131190251673..86c5823e7e4b 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesBrowser.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesBrowser.java @@ -329,7 +329,7 @@ public class ChangesBrowser extends JPanel implements TypeSafeDataProvider { myDiffAction = new ShowDiffAction() { public void update(AnActionEvent e) { Change[] changes = e.getData(VcsDataKeys.CHANGES); - e.getPresentation().setEnabled(canShowDiff(changes)); + e.getPresentation().setEnabled(canShowDiff(myProject, changes)); } public void actionPerformed(AnActionEvent e) { diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/difftool/SvnChangeDiffViewerProvider.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/difftool/SvnChangeDiffViewerProvider.java index 367d76984baa..3a2cbfa5d67b 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/difftool/SvnChangeDiffViewerProvider.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/difftool/SvnChangeDiffViewerProvider.java @@ -1,13 +1,13 @@ package org.jetbrains.idea.svn.difftool; +import com.intellij.diff.chains.DiffRequestProducerException; +import com.intellij.diff.impl.DiffViewerWrapper; +import com.intellij.diff.requests.DiffRequest; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.UserDataHolder; -import com.intellij.diff.chains.DiffRequestProducerException; -import com.intellij.diff.impl.DiffViewerWrapper; -import com.intellij.diff.requests.DiffRequest; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vcs.VcsException; import com.intellij.openapi.vcs.changes.Change; @@ -41,7 +41,7 @@ public class SvnChangeDiffViewerProvider implements ChangeDiffViewerWrapperProvi } @Override - public boolean canCreate(@NotNull Project project, @NotNull Change change) { + public boolean canCreate(@Nullable Project project, @NotNull Change change) { return getSvnChangeLayer(change) != null; // TODO: do not show, if no properties are set in both revisions ? } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/difftool/SvnPhantomChangeDiffRequestProvider.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/difftool/SvnPhantomChangeDiffRequestProvider.java index a38c56c50760..99d2aca68ca5 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/difftool/SvnPhantomChangeDiffRequestProvider.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/difftool/SvnPhantomChangeDiffRequestProvider.java @@ -26,7 +26,7 @@ public class SvnPhantomChangeDiffRequestProvider implements ChangeDiffRequestPro } @Override - public boolean canCreate(@NotNull Project project, @NotNull Change change) { + public boolean canCreate(@Nullable Project project, @NotNull Change change) { return change.isPhantom(); } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/difftool/SvnTreeConflictDiffRequestProvider.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/difftool/SvnTreeConflictDiffRequestProvider.java index d59c305ec109..ed5245c639dc 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/difftool/SvnTreeConflictDiffRequestProvider.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/difftool/SvnTreeConflictDiffRequestProvider.java @@ -38,7 +38,7 @@ public class SvnTreeConflictDiffRequestProvider implements ChangeDiffRequestProv } @Override - public boolean canCreate(@NotNull Project project, @NotNull Change change) { + public boolean canCreate(@Nullable Project project, @NotNull Change change) { return change instanceof ConflictedSvnChange && ((ConflictedSvnChange)change).getConflictState().isTree(); }