default quick doc for files: show basic attributes (for IDEA-145898)

This commit is contained in:
Gregory.Shrago
2018-03-21 19:46:22 +03:00
parent bbe71a45f0
commit 64cdfb7dd2
@@ -13,6 +13,7 @@ import com.intellij.codeInsight.lookup.LookupEx;
import com.intellij.codeInsight.lookup.LookupManager;
import com.intellij.ide.BrowserUtil;
import com.intellij.ide.actions.BaseNavigateToSourceAction;
import com.intellij.ide.highlighter.ArchiveFileType;
import com.intellij.ide.util.PropertiesComponent;
import com.intellij.ide.util.gotoByName.ChooseByNameBase;
import com.intellij.lang.Language;
@@ -28,6 +29,9 @@ import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.fileTypes.PlainTextFileType;
import com.intellij.openapi.fileTypes.UnknownFileType;
import com.intellij.openapi.preview.PreviewManager;
import com.intellij.openapi.project.IndexNotReadyException;
import com.intellij.openapi.project.Project;
@@ -37,6 +41,8 @@ import com.intellij.openapi.roots.ui.configuration.ProjectSettingsService;
import com.intellij.openapi.ui.popup.JBPopup;
import com.intellij.openapi.ui.popup.JBPopupFactory;
import com.intellij.openapi.util.*;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.wm.*;
import com.intellij.openapi.wm.ex.ToolWindowEx;
@@ -51,6 +57,7 @@ import com.intellij.ui.popup.AbstractPopup;
import com.intellij.ui.popup.PopupUpdateProcessor;
import com.intellij.util.Alarm;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.text.DateFormatUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -60,7 +67,12 @@ import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.lang.ref.WeakReference;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.*;
import java.util.List;
@@ -1152,8 +1164,12 @@ public class DocumentationManager extends DockablePopupManager<DocumentationComp
final Ref<String> result = new Ref<>();
QuickDocUtil.runInReadActionWithWriteActionPriorityWithRetries(() -> {
if (!myElement.isValid()) return;
final SmartPsiElementPointer originalElement = myElement.getUserData(ORIGINAL_ELEMENT_KEY);
String doc = provider.generateDoc(myElement, originalElement != null ? originalElement.getElement() : null);
SmartPsiElementPointer originalPointer = myElement.getUserData(ORIGINAL_ELEMENT_KEY);
PsiElement originalPsi = originalPointer != null ? originalPointer.getElement() : null;
String doc = provider.generateDoc(myElement, originalPsi);
if (doc == null && myElement instanceof PsiFile) {
doc = generateFileDoc((PsiFile)myElement);
}
result.set(doc);
}, DOC_GENERATION_TIMEOUT_MILLISECONDS, DOC_GENERATION_PAUSE_MILLISECONDS, null);
return result.get();
@@ -1176,5 +1192,29 @@ public class DocumentationManager extends DockablePopupManager<DocumentationComp
public String getRef() {
return myRef;
}
}
@Nullable
private static String generateFileDoc(@NotNull PsiFile psiFile) {
VirtualFile file = PsiUtilCore.getVirtualFile(psiFile);
File ioFile = file == null ? null : VfsUtilCore.virtualToIoFile(file);
BasicFileAttributes attr = null;
try {
attr = ioFile == null ? null : Files.readAttributes(Paths.get(ioFile.toURI()), BasicFileAttributes.class);
}
catch (IOException ignored) { }
if (attr == null) return null;
FileType type = psiFile.getFileType();
String typeName = type == UnknownFileType.INSTANCE ? "Unknown" :
type == PlainTextFileType.INSTANCE ? "Text" :
type == ArchiveFileType.INSTANCE ? "Archive" :
type.getName();
String text =
"File size " + StringUtil.formatFileSize(attr.size()) +
"\n" + typeName + (type.isBinary() ? "" : " (" + psiFile.getLanguage().getDisplayName() + ")") +
"\nModified on " + DateFormatUtil.formatDateTime(attr.lastModifiedTime().toMillis()) +
"\nCreated on " + DateFormatUtil.formatDateTime(attr.creationTime().toMillis());
return StringUtil.replace(StringUtil.escapeXml(text), "\n", "<br>");
}
}