From 812c1c54138de2ff048aa39c49a6984a726c764e Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Wed, 16 Aug 2017 14:50:53 +0300 Subject: [PATCH] IDEA-171414 diff: warn that compared files are too big to be fully loaded --- .../openapi/fileEditor/FileDocumentManager.java | 8 ++++++++ .../intellij/mock/MockFileDocumentManagerImpl.java | 5 +++++ .../diff/tools/binary/TwosideBinaryDiffViewer.java | 6 ++++++ .../src/com/intellij/diff/util/DiffUtil.java | 12 +++++++++++- .../fileEditor/impl/FileDocumentManagerImpl.java | 13 ++++++++++--- 5 files changed, 40 insertions(+), 4 deletions(-) diff --git a/platform/core-api/src/com/intellij/openapi/fileEditor/FileDocumentManager.java b/platform/core-api/src/com/intellij/openapi/fileEditor/FileDocumentManager.java index 591fc7e71944..7b38114a00b1 100644 --- a/platform/core-api/src/com/intellij/openapi/fileEditor/FileDocumentManager.java +++ b/platform/core-api/src/com/intellij/openapi/fileEditor/FileDocumentManager.java @@ -20,6 +20,7 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.editor.Document; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Computable; +import com.intellij.openapi.util.io.FileUtilRt; import com.intellij.openapi.vfs.SavingRequestor; import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NotNull; @@ -123,6 +124,13 @@ public abstract class FileDocumentManager implements SavingRequestor { */ public abstract boolean isFileModified(@NotNull VirtualFile file); + /** + * Check if only beginning of the file was loaded for Document. + * + * @see FileUtilRt#isTooLarge + */ + public abstract boolean isPartialPreviewOfALargeFile(@NotNull Document document); + /** * Discards unsaved changes for the specified document and reloads it from disk. * diff --git a/platform/core-impl/src/com/intellij/mock/MockFileDocumentManagerImpl.java b/platform/core-impl/src/com/intellij/mock/MockFileDocumentManagerImpl.java index ecbb31c6f3b1..204ed444b998 100644 --- a/platform/core-impl/src/com/intellij/mock/MockFileDocumentManagerImpl.java +++ b/platform/core-impl/src/com/intellij/mock/MockFileDocumentManagerImpl.java @@ -99,6 +99,11 @@ public class MockFileDocumentManagerImpl extends FileDocumentManager { return false; } + @Override + public boolean isPartialPreviewOfALargeFile(@NotNull Document document) { + return false; + } + @Override public void reloadFromDisk(@NotNull Document document) { } diff --git a/platform/diff-impl/src/com/intellij/diff/tools/binary/TwosideBinaryDiffViewer.java b/platform/diff-impl/src/com/intellij/diff/tools/binary/TwosideBinaryDiffViewer.java index 214e403e40d9..e989b2c3d71d 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/binary/TwosideBinaryDiffViewer.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/binary/TwosideBinaryDiffViewer.java @@ -40,6 +40,7 @@ import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.util.io.FileUtilRt; import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -123,6 +124,11 @@ public class TwosideBinaryDiffViewer extends TwosideDiffViewer notifications = getCustomNotifications(content); + List notifications = new ArrayList<>(); + notifications.addAll(getCustomNotifications(content)); + + if (content instanceof DocumentContent) { + Document document = ((DocumentContent)content).getDocument(); + if (FileDocumentManager.getInstance().isPartialPreviewOfALargeFile(document)) { + notifications.add(DiffNotifications.createNotification("File is too large. Only preview is loaded.")); + } + } + if (notifications.isEmpty()) return title; JPanel panel = new JPanel(new BorderLayout(0, TITLE_GAP)); diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileDocumentManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileDocumentManagerImpl.java index 858da0e6a305..e522bd3d2398 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileDocumentManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileDocumentManagerImpl.java @@ -84,6 +84,7 @@ public class FileDocumentManagerImpl extends FileDocumentManager implements Virt private static final Key LINE_SEPARATOR_KEY = Key.create("LINE_SEPARATOR_KEY"); private static final Key FILE_KEY = Key.create("FILE_KEY"); private static final Key MUST_RECOMPUTE_FILE_TYPE = Key.create("Must recompute file type"); + private static final Key BIG_FILE_PREVIEW = Key.create("BIG_FILE_PREVIEW"); private final Set myUnsavedDocuments = ContainerUtil.newConcurrentSet(); @@ -196,6 +197,7 @@ public class FileDocumentManagerImpl extends FileDocumentManager implements Virt document = (DocumentEx)createDocument(text, file); document.setModificationStamp(file.getModificationStamp()); + document.putUserData(BIG_FILE_PREVIEW, tooLarge ? Boolean.TRUE : null); final FileType fileType = file.getFileType(); document.setReadOnly(tooLarge || !file.isWritable() || fileType.isBinary()); @@ -546,6 +548,11 @@ public class FileDocumentManagerImpl extends FileDocumentManager implements Virt return doc != null && isDocumentUnsaved(doc) && doc.getModificationStamp() != file.getModificationStamp(); } + @Override + public boolean isPartialPreviewOfALargeFile(@NotNull Document document) { + return document.getUserData(BIG_FILE_PREVIEW) == Boolean.TRUE; + } + @Override public void propertyChanged(@NotNull VirtualFilePropertyEvent event) { final VirtualFile file = event.getFile(); @@ -626,11 +633,11 @@ public class FileDocumentManagerImpl extends FileDocumentManager implements Virt boolean wasWritable = document.isWritable(); document.setReadOnly(false); boolean tooLarge = FileUtilRt.isTooLarge(file.getLength()); - CharSequence reloaded = tooLarge ? LoadTextUtil.loadText(file, getPreviewCharCount(file)) : LoadTextUtil.loadText(file); isReloadable[0] = isReloadable(file, document, project); if (isReloadable[0]) { - DocumentEx documentEx = (DocumentEx)document; - documentEx.replaceText(reloaded, file.getModificationStamp()); + CharSequence reloaded = tooLarge ? LoadTextUtil.loadText(file, getPreviewCharCount(file)) : LoadTextUtil.loadText(file); + ((DocumentEx)document).replaceText(reloaded, file.getModificationStamp()); + document.putUserData(BIG_FILE_PREVIEW, tooLarge ? Boolean.TRUE : null); } document.setReadOnly(!wasWritable); }