diff --git a/src/main/java/io/github/linwancen/plugin/show/LineEnd.java b/src/main/java/io/github/linwancen/plugin/show/LineEnd.java index a852309..acf96cd 100644 --- a/src/main/java/io/github/linwancen/plugin/show/LineEnd.java +++ b/src/main/java/io/github/linwancen/plugin/show/LineEnd.java @@ -5,6 +5,7 @@ import com.intellij.json.json5.Json5FileType; import com.intellij.openapi.editor.*; import com.intellij.openapi.editor.markup.TextAttributes; import com.intellij.openapi.fileEditor.FileEditorManager; +import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; @@ -22,6 +23,7 @@ import org.slf4j.LoggerFactory; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.function.Consumer; public class LineEnd extends EditorLinePainter { @@ -47,17 +49,17 @@ public class LineEnd extends EditorLinePainter { } @NotNull GlobalSettingsState globalSettingsState = GlobalSettingsState.getInstance(); if (globalSettingsState.onlySelectLine) { - Editor editor = FileEditorManager.getInstance(project).getSelectedTextEditor(); + @Nullable Editor editor = FileEditorManager.getInstance(project).getSelectedTextEditor(); if (editor != null) { - SelectionModel select = editor.getSelectionModel(); - VisualPosition start = select.getSelectionStartPosition(); + @NotNull SelectionModel select = editor.getSelectionModel(); + @Nullable VisualPosition start = select.getSelectionStartPosition(); int lineNum = lineNumber + 1; if (start != null) { if (lineNum < start.getLine()) { return null; } } - VisualPosition end = select.getSelectionEndPosition(); + @Nullable VisualPosition end = select.getSelectionEndPosition(); if (end != null && lineNum > end.getLine()) { return null; } @@ -82,8 +84,10 @@ public class LineEnd extends EditorLinePainter { return Collections.singletonList(info); } - @NotNull - public static String textWithDoc(@NotNull FileInfo fileInfo, int startLine, int endLine) { + public static void textWithDoc(@NotNull FileInfo fileInfo, int startLine, int endLine, + @NotNull ProgressIndicator indicator, @NotNull Consumer func) { + boolean needFraction = indicator.getFraction() != 0; + int size = endLine - startLine; @NotNull StringBuilder sb = new StringBuilder(); for (int i = startLine; i <= endLine; i++) { @Nullable LineInfo lineInfo = LineInfo.of(fileInfo, i); @@ -97,11 +101,15 @@ public class LineEnd extends EditorLinePainter { sb.append(lineInfo.appSettings.lineEndPrefix).append(doc); } sb.append("\n"); + indicator.setText2(i + " / " + size + " line"); + if (needFraction) { + indicator.setFraction(1.0 * i / size); + } } if (sb.length() > 0) { sb.delete(sb.length() - 1, sb.length()); } - return sb.toString(); + func.accept(sb.toString()); } private static @Nullable String lineDocSkipHave(@Nullable LineInfo lineInfo) { diff --git a/src/main/java/io/github/linwancen/plugin/show/LineEndAdd.java b/src/main/java/io/github/linwancen/plugin/show/LineEndAdd.java index cec7d4d..b9e32bd 100644 --- a/src/main/java/io/github/linwancen/plugin/show/LineEndAdd.java +++ b/src/main/java/io/github/linwancen/plugin/show/LineEndAdd.java @@ -2,8 +2,9 @@ package io.github.linwancen.plugin.show; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.CommonDataKeys; -import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.command.WriteCommandAction; +import com.intellij.openapi.progress.ProgressIndicator; +import com.intellij.openapi.progress.Task; import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.popup.JBPopupFactory; @@ -18,6 +19,8 @@ import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.ArrayList; + /** * on ProjectViewPopupMenu */ @@ -50,34 +53,52 @@ public class LineEndAdd extends DumbAwareAction { } @NotNull ListPopup confirmation = JBPopupFactory.getInstance().createConfirmation( "Add Line Comment?", "Add and replace files!", "Don't add.", - () -> ApplicationManager.getApplication().runReadAction(() -> addDocAll(project, files)), 2); + () -> addDocAll(project, files), 2); confirmation.showInFocusCenter(); } private void addDocAll(@NotNull Project project, @NotNull VirtualFile[] files) { + @NotNull ArrayList list = new ArrayList<>(); for (@NotNull VirtualFile file : files) { VfsUtilCore.visitChildrenRecursively(file, new VirtualFileVisitor() { @Override public boolean visitFile(@NotNull VirtualFile file) { if (!file.isDirectory()) { - ApplicationManager.getApplication().runReadAction(() -> addDoc(project, file)); + list.add(file); } return true; } }); } + if (list.isEmpty()) { + return; + } + new Task.Backgroundable(project, "Show LineEndAdd " + list.size() + " " + list.get(0)) { + @Override + public void run(@NotNull ProgressIndicator indicator) { + WriteCommandAction.runWriteCommandAction(project, () -> { + for (int i = 0; i < list.size(); i++) { + VirtualFile file = list.get(i); + if (file.exists()) { + indicator.setText(i + " / " + list.size() + " file"); + indicator.setFraction(1.0 * i / list.size()); + addDoc(project, file, indicator); + } + } + }); + } + }.queue(); } - private void addDoc(@NotNull Project project, @NotNull VirtualFile file) { + private void addDoc(@NotNull Project project, @NotNull VirtualFile file, @NotNull ProgressIndicator indicator) { @Nullable FileInfo fileInfo = FileInfo.of(file, project); if (fileInfo == null) { return; } int startLine = 0; int endLine = fileInfo.document.getLineCount() - 1; - @NotNull String textWithDoc = LineEnd.textWithDoc(fileInfo, startLine, endLine); - WriteCommandAction.runWriteCommandAction(project, () -> - fileInfo.document.replaceString(0, fileInfo.document.getTextLength() - 1, textWithDoc) + LineEnd.textWithDoc(fileInfo, startLine, endLine, indicator, s -> + fileInfo.document.replaceString(0, fileInfo.document.getTextLength() - 1, s) ); } } \ No newline at end of file diff --git a/src/main/java/io/github/linwancen/plugin/show/LineEndCopy.java b/src/main/java/io/github/linwancen/plugin/show/LineEndCopy.java index 08db62f..d12d195 100644 --- a/src/main/java/io/github/linwancen/plugin/show/LineEndCopy.java +++ b/src/main/java/io/github/linwancen/plugin/show/LineEndCopy.java @@ -6,7 +6,10 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.ide.CopyPasteManager; +import com.intellij.openapi.progress.ProgressIndicator; +import com.intellij.openapi.progress.Task; import com.intellij.openapi.project.DumbAwareAction; +import com.intellij.openapi.project.Project; import io.github.linwancen.plugin.show.bean.FileInfo; import io.github.linwancen.plugin.show.settings.ShowBundle; import org.jetbrains.annotations.NotNull; @@ -31,34 +34,46 @@ public class LineEndCopy extends DumbAwareAction { @Override public void actionPerformed(@NotNull AnActionEvent event) { try { - ApplicationManager.getApplication().runReadAction(() -> copyWithDoc(event)); + copyWithDoc(event); } catch (Throwable e) { LOG.info("LineEndCopy catch Throwable but log to record.", e); } } private void copyWithDoc(@NotNull AnActionEvent event) { + @Nullable Project project = event.getProject(); + if (project == null) { + return; + } @Nullable FileInfo fileInfo = FileInfo.of(event); if (fileInfo == null) { return; } - int startLine = 0; - int endLine = fileInfo.document.getLineCount() - 1; - // if select - @Nullable Editor editor = event.getData(CommonDataKeys.EDITOR); - if (editor != null) { - @NotNull Caret primaryCaret = editor.getCaretModel().getPrimaryCaret(); - int start = primaryCaret.getSelectionStart(); - int end = primaryCaret.getSelectionEnd(); - try { - startLine = fileInfo.document.getLineNumber(start); - endLine = fileInfo.document.getLineNumber(end); - } catch (Exception e) { - return; + new Task.Backgroundable(project, "Show LineEndCopy " + fileInfo.file.getName()) { + @Override + public void run(@NotNull ProgressIndicator indicator) { + ApplicationManager.getApplication().runReadAction(() -> { + int startLine = 0; + int endLine = fileInfo.document.getLineCount() - 1; + // if select + @Nullable Editor editor = event.getData(CommonDataKeys.EDITOR); + if (editor != null) { + @NotNull Caret primaryCaret = editor.getCaretModel().getPrimaryCaret(); + int start = primaryCaret.getSelectionStart(); + int end = primaryCaret.getSelectionEnd(); + try { + startLine = fileInfo.document.getLineNumber(start); + endLine = fileInfo.document.getLineNumber(end); + } catch (Exception e) { + return; + } + } + LineEnd.textWithDoc(fileInfo, startLine, endLine, indicator, s -> { + @NotNull StringSelection content = new StringSelection(s); + CopyPasteManager.getInstance().setContents(content); + }); + }); } - } - @NotNull String textWithDoc = LineEnd.textWithDoc(fileInfo, startLine, endLine); - @NotNull StringSelection content = new StringSelection(textWithDoc); - CopyPasteManager.getInstance().setContents(content); + }.queue(); } } \ No newline at end of file diff --git a/src/main/java/io/github/linwancen/plugin/show/Tree.java b/src/main/java/io/github/linwancen/plugin/show/Tree.java index 80e1ef8..b44daaa 100644 --- a/src/main/java/io/github/linwancen/plugin/show/Tree.java +++ b/src/main/java/io/github/linwancen/plugin/show/Tree.java @@ -49,7 +49,7 @@ public class Tree implements ProjectViewNodeDecorator { if (DumbService.isDumb(project)) { return; } - DumbService.getInstance(project).runReadActionInSmartMode(() -> + DumbService.getInstance(project).smartInvokeLater(() -> ApplicationManager.getApplication().runReadAction(() -> { @Nullable String doc = treeDoc(node, project); if (doc == null) { @@ -59,7 +59,13 @@ public class Tree implements ProjectViewNodeDecorator { if (coloredText.isEmpty()) { data.addText(data.getPresentableText(), SimpleTextAttributes.REGULAR_ATTRIBUTES); } - data.addText(" " + doc, SimpleTextAttributes.GRAY_ATTRIBUTES); + @NotNull String text = " " + doc; + for (@NotNull ColoredFragment fragment : coloredText) { + if (text.equals(fragment.getText())) { + return; + } + } + data.addText(text, SimpleTextAttributes.GRAY_ATTRIBUTES); })); } diff --git a/src/main/java/io/github/linwancen/plugin/show/ext/conf/ConfCache.java b/src/main/java/io/github/linwancen/plugin/show/ext/conf/ConfCache.java index f596299..d33f42e 100644 --- a/src/main/java/io/github/linwancen/plugin/show/ext/conf/ConfCache.java +++ b/src/main/java/io/github/linwancen/plugin/show/ext/conf/ConfCache.java @@ -117,23 +117,22 @@ public class ConfCache { } static void loadAll(@NotNull Project project) { - DumbService.getInstance(project).runReadActionInSmartMode(() -> - ApplicationManager.getApplication().runReadAction(() -> { - @NotNull Collection files = FilenameIndex.getAllFilesByExt(project, TsvLoader.EXT); - @NotNull StringBuilder sb = new StringBuilder(); - for (@NotNull VirtualFile file : files) { - load(file); - sb.append(file.getName()).append("\n"); - } - if (files.isEmpty()) { - return; - } - LOG.info("Ext doc conf load all complete {} files\n{}", files.size(), sb); - })); + DumbService.getInstance(project).smartInvokeLater(() -> { + @NotNull Collection files = FilenameIndex.getAllFilesByExt(project, TsvLoader.EXT); + @NotNull StringBuilder sb = new StringBuilder(); + for (@NotNull VirtualFile file : files) { + load(file); + sb.append(file.getName()).append("\n"); + } + if (files.isEmpty()) { + return; + } + LOG.info("Ext doc conf load all complete {} files\n{}", files.size(), sb); + }); } static void loadFile(@NotNull VirtualFile file) { - ApplicationManager.getApplication().runReadAction(() -> ConfCache.load(file)); + ApplicationManager.getApplication().invokeLater(() -> ConfCache.load(file)); } private static void load(@NotNull VirtualFile file) { diff --git a/src/main/java/io/github/linwancen/plugin/show/ext/conf/ReloadExtDocAction.java b/src/main/java/io/github/linwancen/plugin/show/ext/conf/ReloadExtDocAction.java index 48ba1f5..742f983 100644 --- a/src/main/java/io/github/linwancen/plugin/show/ext/conf/ReloadExtDocAction.java +++ b/src/main/java/io/github/linwancen/plugin/show/ext/conf/ReloadExtDocAction.java @@ -1,9 +1,9 @@ package io.github.linwancen.plugin.show.ext.conf; import com.intellij.ide.projectView.ProjectView; -import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.project.Project; import io.github.linwancen.plugin.show.settings.ShowBundle; import org.jetbrains.annotations.NotNull; @@ -14,7 +14,7 @@ import org.slf4j.LoggerFactory; /** * call ConfCache.loadAll */ -public class ReloadExtDocAction extends AnAction { +public class ReloadExtDocAction extends DumbAwareAction { private static final Logger LOG = LoggerFactory.getLogger(ReloadExtDocAction.class);