IDEA-153246 diff: clarify notification message in case of equal contents

This commit is contained in:
Aleksey Pivovarov
2016-03-21 17:59:49 +03:00
parent c932c993e5
commit 116bb6e247
6 changed files with 54 additions and 33 deletions
@@ -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),
@@ -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()) {
@@ -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"));
}
@@ -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<? extends DiffContent> contents) {
return areEqualDocumentContentProperties(contents, DocumentContent::getLineSeparator);
}
public static boolean areEqualCharsets(@NotNull List<? extends DiffContent> contents) {
return areEqualDocumentContentProperties(contents, DocumentContent::getCharset);
}
private static <T> boolean areEqualDocumentContentProperties(@NotNull List<? extends DiffContent> contents,
@NotNull Function<DocumentContent, T> propertyGetter) {
List<T> 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
//
@@ -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<DiffContent> contents = request.getContents();
List<String> titles = request.getContentTitles();
List<Charset> charsets = ContainerUtil.map(contents, new Function<DiffContent, Charset>() {
@Override
public Charset fun(DiffContent content) {
if (content instanceof EmptyContent) return null;
return ((DocumentContent)content).getCharset();
}
});
List<LineSeparator> separators = ContainerUtil.map(contents, new Function<DiffContent, LineSeparator>() {
@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<JComponent> result = new ArrayList<JComponent>(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,
@@ -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