diff --git a/platform/diff-impl/src/com/intellij/diff/tools/fragmented/UnifiedDiffViewer.java b/platform/diff-impl/src/com/intellij/diff/tools/fragmented/UnifiedDiffViewer.java index fccd126640ad..bc69178dc9ab 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/fragmented/UnifiedDiffViewer.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/fragmented/UnifiedDiffViewer.java @@ -385,7 +385,11 @@ public class UnifiedDiffViewer extends ListenerDiffViewerBase { myFoldingModel.updateContext(myRequest, getFoldingModelSettings()); clearDiffPresentation(); - if (isContentsEqual) myPanel.addNotification(DiffNotifications.createEqualContents()); + if (isContentsEqual) { + boolean equalCharsets = TextDiffViewerUtil.areEqualCharsets(getContents()); + boolean equalSeparators = TextDiffViewerUtil.areEqualLineSeparators(getContents()); + myPanel.addNotification(DiffNotifications.createEqualContents(equalCharsets, equalSeparators)); + } TIntFunction separatorLines = myFoldingModel.getLineNumberConvertor(); myEditor.getGutterComponentEx().setLineNumberConvertor(mergeConverters(data.getLineConvertor1(), separatorLines), diff --git a/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleDiffViewer.java b/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleDiffViewer.java index f3fcf63c4237..f1ffaaafb92c 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleDiffViewer.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleDiffViewer.java @@ -19,6 +19,7 @@ import com.intellij.diff.DiffContext; import com.intellij.diff.actions.BufferedLineIterator; import com.intellij.diff.actions.NavigationContextChecker; import com.intellij.diff.comparison.DiffTooBigException; +import com.intellij.diff.contents.DocumentContent; import com.intellij.diff.fragments.LineFragment; import com.intellij.diff.requests.ContentDiffRequest; import com.intellij.diff.requests.DiffRequest; @@ -52,6 +53,7 @@ import org.jetbrains.annotations.*; import javax.swing.*; import java.awt.*; +import java.nio.charset.Charset; import java.util.ArrayList; import java.util.BitSet; import java.util.Iterator; @@ -237,7 +239,11 @@ public class SimpleDiffViewer extends TwosideTextDiffViewer { clearDiffPresentation(); myIsContentsEqual = data.isContentsEqual(); - if (data.isContentsEqual()) myPanel.addNotification(DiffNotifications.createEqualContents()); + if (data.isContentsEqual()) { + boolean equalCharsets = TextDiffViewerUtil.areEqualCharsets(getContents()); + boolean equalSeparators = TextDiffViewerUtil.areEqualLineSeparators(getContents()); + myPanel.addNotification(DiffNotifications.createEqualContents(equalCharsets, equalSeparators)); + } if (data.getFragments() != null) { for (LineFragment fragment : data.getFragments()) { diff --git a/platform/diff-impl/src/com/intellij/diff/tools/util/DiffNotifications.java b/platform/diff-impl/src/com/intellij/diff/tools/util/DiffNotifications.java index 7681a2c5bae9..6c0fa383b977 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/util/DiffNotifications.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/util/DiffNotifications.java @@ -45,6 +45,20 @@ public class DiffNotifications { @NotNull public static JPanel createEqualContents() { + return createEqualContents(true, true); + } + + @NotNull + public static JPanel createEqualContents(boolean equalCharsets, boolean equalSeparators) { + if (!equalCharsets && !equalSeparators) { + return createNotification(DiffBundle.message("diff.contents.have.differences.only.in.charset.and.line.separators.message.text")); + } + if (!equalSeparators) { + return createNotification(DiffBundle.message("diff.contents.have.differences.only.in.line.separators.message.text")); + } + if (!equalCharsets) { + return createNotification(DiffBundle.message("diff.contents.have.differences.only.in.charset.message.text")); + } return createNotification(DiffBundle.message("diff.contents.are.identical.message.text")); } diff --git a/platform/diff-impl/src/com/intellij/diff/tools/util/base/TextDiffViewerUtil.java b/platform/diff-impl/src/com/intellij/diff/tools/util/base/TextDiffViewerUtil.java index f0be1ed3a70a..acb6f14a902e 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/util/base/TextDiffViewerUtil.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/util/base/TextDiffViewerUtil.java @@ -18,6 +18,7 @@ package com.intellij.diff.tools.util.base; import com.intellij.diff.DiffContext; import com.intellij.diff.contents.DiffContent; import com.intellij.diff.contents.DocumentContent; +import com.intellij.diff.contents.EmptyContent; import com.intellij.diff.requests.ContentDiffRequest; import com.intellij.diff.tools.util.FoldingModelSupport; import com.intellij.diff.tools.util.base.TextDiffSettingsHolder.TextDiffSettings; @@ -38,6 +39,7 @@ import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Key; import com.intellij.ui.ToggleActionButton; import com.intellij.util.EditorPopupHandler; +import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; @@ -127,6 +129,25 @@ public class TextDiffViewerUtil { } } + public static boolean areEqualLineSeparators(@NotNull List contents) { + return areEqualDocumentContentProperties(contents, DocumentContent::getLineSeparator); + } + + public static boolean areEqualCharsets(@NotNull List contents) { + return areEqualDocumentContentProperties(contents, DocumentContent::getCharset); + } + + private static boolean areEqualDocumentContentProperties(@NotNull List contents, + @NotNull Function propertyGetter) { + List properties = ContainerUtil.mapNotNull(contents, (content) -> { + if (content instanceof EmptyContent) return null; + return propertyGetter.fun((DocumentContent)content); + }); + + if (properties.size() < 2) return true; + return ContainerUtil.newHashSet(properties).size() == 1; + } + // // Actions // diff --git a/platform/diff-impl/src/com/intellij/diff/util/DiffUtil.java b/platform/diff-impl/src/com/intellij/diff/util/DiffUtil.java index fbd81919c2e6..d93881d78e88 100644 --- a/platform/diff-impl/src/com/intellij/diff/util/DiffUtil.java +++ b/platform/diff-impl/src/com/intellij/diff/util/DiffUtil.java @@ -36,6 +36,7 @@ import com.intellij.diff.requests.ContentDiffRequest; import com.intellij.diff.requests.DiffRequest; import com.intellij.diff.tools.util.base.HighlightPolicy; import com.intellij.diff.tools.util.base.IgnorePolicy; +import com.intellij.diff.tools.util.base.TextDiffViewerUtil; import com.intellij.icons.AllIcons; import com.intellij.lang.Language; import com.intellij.openapi.actionSystem.AnAction; @@ -98,6 +99,8 @@ import java.util.BitSet; import java.util.Collections; import java.util.List; +import static com.intellij.diff.tools.util.base.TextDiffViewerUtil.areEqualLineSeparators; + public class DiffUtil { private static final Logger LOG = Logger.getInstance(DiffUtil.class); @@ -376,23 +379,8 @@ public class DiffUtil { List contents = request.getContents(); List titles = request.getContentTitles(); - List charsets = ContainerUtil.map(contents, new Function() { - @Override - public Charset fun(DiffContent content) { - if (content instanceof EmptyContent) return null; - return ((DocumentContent)content).getCharset(); - } - }); - List separators = ContainerUtil.map(contents, new Function() { - @Override - public LineSeparator fun(DiffContent content) { - if (content instanceof EmptyContent) return null; - return ((DocumentContent)content).getLineSeparator(); - } - }); - - boolean equalCharsets = isEqualElements(charsets); - boolean equalSeparators = isEqualElements(separators); + boolean equalCharsets = TextDiffViewerUtil.areEqualCharsets(contents); + boolean equalSeparators = TextDiffViewerUtil.areEqualLineSeparators(contents); List result = new ArrayList(contents.size()); @@ -421,20 +409,6 @@ public class DiffUtil { return createStackedComponents(components, TITLE_GAP); } - private static boolean isEqualElements(@NotNull List elements) { - for (int i = 0; i < elements.size(); i++) { - for (int j = i + 1; j < elements.size(); j++) { - if (!isEqualElements(elements.get(i), elements.get(j))) return false; - } - } - return true; - } - - private static boolean isEqualElements(@Nullable Object element1, @Nullable Object element2) { - if (element1 == null || element2 == null) return true; - return element1.equals(element2); - } - @Nullable private static JComponent createTitle(@NotNull String title, @NotNull DiffContent content, diff --git a/platform/platform-resources-en/src/messages/DiffBundle.properties b/platform/platform-resources-en/src/messages/DiffBundle.properties index 21c7b42012cd..6a872087a243 100644 --- a/platform/platform-resources-en/src/messages/DiffBundle.properties +++ b/platform/platform-resources-en/src/messages/DiffBundle.properties @@ -57,6 +57,8 @@ select.external.diff.program.dialog.title=Select External Diff Program select.external.merge.program.dialog.title=Select External Merge Program diff.contents.are.identical.message.text=Contents are identical diff.contents.have.differences.only.in.line.separators.message.text=Contents have differences only in line separators +diff.contents.have.differences.only.in.charset.message.text=Contents have differences only in encoding +diff.contents.have.differences.only.in.charset.and.line.separators.message.text=Contents have differences only in line separators and encoding diff.contents.have.differences.only.in.line.separators.or.whitespaces=Contents have differences only in line separators or whitespaces show.diff.anyway.dialog.message=Show diff anyway? no.differences.dialog.title=No Differences