diff --git a/src/main/java/org/overengineer/inlineproblems/DocumentMarkupModelScanner.java b/src/main/java/org/overengineer/inlineproblems/DocumentMarkupModelScanner.java index 004cec8..6d82c0d 100644 --- a/src/main/java/org/overengineer/inlineproblems/DocumentMarkupModelScanner.java +++ b/src/main/java/org/overengineer/inlineproblems/DocumentMarkupModelScanner.java @@ -19,7 +19,7 @@ import org.overengineer.inlineproblems.entities.enums.Listener; import org.overengineer.inlineproblems.listeners.HighlightProblemListener; import org.overengineer.inlineproblems.settings.SettingsState; -import org.overengineer.inlineproblems.utils.FileNameUtil; +import org.overengineer.inlineproblems.utils.FileUtil; import java.util.ArrayList; import java.util.Arrays; @@ -92,12 +92,16 @@ public void scanForProblemsManually() { FileEditorManager fileEditorManager = FileEditorManager.getInstance(project); for (var editor : fileEditorManager.getAllEditors()) { - if (editor.getFile() == null || FileNameUtil.ignoreFile(editor.getFile().getName())) { - continue; - } - if (editor instanceof TextEditor) { var textEditor = (TextEditor) editor; + + if ( + editor.getFile() == null || + FileUtil.ignoreFile(editor.getFile().getName(), textEditor.getEditor().getDocument().getLineCount()) + ) { + continue; + } + problems.addAll(getProblemsInEditor(textEditor)); } } @@ -112,7 +116,10 @@ public void scanForProblemsManually() { * millisecond if the HighlightProblemListener is used. */ public void scanForProblemsManuallyInTextEditor(TextEditor textEditor) { - if (textEditor.getFile() == null || FileNameUtil.ignoreFile(textEditor.getFile().getName())) { + if ( + textEditor.getFile() == null || + FileUtil.ignoreFile(textEditor.getFile().getName(), textEditor.getEditor().getDocument().getLineCount()) + ) { return; } diff --git a/src/main/java/org/overengineer/inlineproblems/ListenerManager.java b/src/main/java/org/overengineer/inlineproblems/ListenerManager.java index 30b799d..0d8452b 100644 --- a/src/main/java/org/overengineer/inlineproblems/ListenerManager.java +++ b/src/main/java/org/overengineer/inlineproblems/ListenerManager.java @@ -9,7 +9,7 @@ import org.overengineer.inlineproblems.listeners.HighlightProblemListener; import org.overengineer.inlineproblems.listeners.MarkupModelProblemListener; import org.overengineer.inlineproblems.settings.SettingsState; -import org.overengineer.inlineproblems.utils.FileNameUtil; +import org.overengineer.inlineproblems.utils.FileUtil; public class ListenerManager { @@ -40,12 +40,15 @@ public void installMarkupModelListenerOnAllProjects() { for (var project : manager.getOpenProjects()) { FileEditorManager fileEditorManager = FileEditorManager.getInstance(project); for (var editor : fileEditorManager.getAllEditors()) { - - if (editor.getFile() == null || FileNameUtil.ignoreFile(editor.getFile().getName())) { - continue; - } - if (editor instanceof TextEditor) { + var textEditor = (TextEditor) editor; + if ( + editor.getFile() == null || + FileUtil.ignoreFile(editor.getFile().getName(), textEditor.getEditor().getDocument().getLineCount()) + ) { + continue; + } + MarkupModelProblemListener.setup((TextEditor) editor); logger.debug("Installing MarkupModelListener"); } diff --git a/src/main/java/org/overengineer/inlineproblems/listeners/FileEditorListener.java b/src/main/java/org/overengineer/inlineproblems/listeners/FileEditorListener.java index aab7a87..2faba81 100644 --- a/src/main/java/org/overengineer/inlineproblems/listeners/FileEditorListener.java +++ b/src/main/java/org/overengineer/inlineproblems/listeners/FileEditorListener.java @@ -6,7 +6,7 @@ import org.jetbrains.annotations.NotNull; import org.overengineer.inlineproblems.entities.enums.Listener; import org.overengineer.inlineproblems.settings.SettingsState; -import org.overengineer.inlineproblems.utils.FileNameUtil; +import org.overengineer.inlineproblems.utils.FileUtil; import java.util.Arrays; @@ -24,13 +24,15 @@ public void fileOpenedSync( if (settingsState.getEnabledListener() != Listener.MARKUP_MODEL_LISTENER) return; - if (FileNameUtil.ignoreFile(file.getName())) { + // Precheck only file name, later we check the line count only + if (FileUtil.ignoreFile(file.getName(), -1)) { return; } Arrays.stream(editors.first) - .filter(e -> e instanceof TextEditor) - .map(e -> (TextEditor)e) - .forEach(MarkupModelProblemListener::setup); + .filter(e -> e instanceof TextEditor) + .map(e -> (TextEditor) e) + .filter(tE -> !FileUtil.ignoreFile(null, tE.getEditor().getDocument().getLineCount())) + .forEach(MarkupModelProblemListener::setup); } } diff --git a/src/main/java/org/overengineer/inlineproblems/listeners/HighlightProblemListener.java b/src/main/java/org/overengineer/inlineproblems/listeners/HighlightProblemListener.java index 4939646..307c0e4 100644 --- a/src/main/java/org/overengineer/inlineproblems/listeners/HighlightProblemListener.java +++ b/src/main/java/org/overengineer/inlineproblems/listeners/HighlightProblemListener.java @@ -12,7 +12,7 @@ import org.overengineer.inlineproblems.DocumentMarkupModelScanner; import org.overengineer.inlineproblems.entities.enums.Listener; import org.overengineer.inlineproblems.settings.SettingsState; -import org.overengineer.inlineproblems.utils.FileNameUtil; +import org.overengineer.inlineproblems.utils.FileUtil; public class HighlightProblemListener implements HighlightInfoFilter { @@ -29,7 +29,8 @@ public boolean accept(@NotNull HighlightInfo highlightInfo, @Nullable PsiFile fi if (file == null || !file.isValid()) return true; - if (FileNameUtil.ignoreFile(file.getName())) { + // Only check file name here, the line count is checked in the scanForProblemsManuallyInTextEditor call + if (FileUtil.ignoreFile(file.getName(), -1)) { return true; } @@ -48,7 +49,7 @@ public void handleAccept(PsiFile file) { return; FileEditor editor = FileEditorManager.getInstance(file.getProject()).getSelectedEditor(file.getVirtualFile()); - if (editor == null) { + if (editor == null || !(editor instanceof TextEditor)) { return; } diff --git a/src/main/java/org/overengineer/inlineproblems/settings/SettingsComponent.java b/src/main/java/org/overengineer/inlineproblems/settings/SettingsComponent.java index ca45b5e..bc2e9ce 100644 --- a/src/main/java/org/overengineer/inlineproblems/settings/SettingsComponent.java +++ b/src/main/java/org/overengineer/inlineproblems/settings/SettingsComponent.java @@ -65,6 +65,7 @@ public class SettingsComponent { private final JBCheckBox enableXmlUnescaping = new JBCheckBox(SettingsBundle.message("settings.enableXmlUnescaping")); private final JFormattedTextField inlayFontSizeDeltaText; private final JFormattedTextField manualScannerDelay; + private final JFormattedTextField maxFileLines; private final JBCheckBox fillProblemLabels = new JBCheckBox(SettingsBundle.message("settings.fillProblemLabels")); private final JBCheckBox boldProblemLabels = new JBCheckBox(SettingsBundle.message("settings.boldProblemLabels")); private final JBCheckBox italicProblemLabels = new JBCheckBox(SettingsBundle.message("settings.italicProblemLabels")); @@ -130,6 +131,9 @@ public SettingsComponent() { manualScannerDelay = new JFormattedTextField(numberFormatter); manualScannerDelay.setText(Integer.toString(settingsState.getManualScannerDelay())); + maxFileLines = new JFormattedTextField(numberFormatter); + maxFileLines.setText(Integer.toString(settingsState.getMaxFileLines())); + fillProblemLabels.setSelected(settingsState.isFillProblemLabels()); boldProblemLabels.setSelected(settingsState.isBoldProblemLabels()); italicProblemLabels.setSelected(settingsState.isItalicProblemLabels()); @@ -173,7 +177,9 @@ public SettingsComponent() { .addLabeledComponent(new JLabel(SettingsBundle.message("settings.problemFilterListLabel")), problemFilterList) .addTooltip(SettingsBundle.message("settings.problemFilterListTooltip")) .addLabeledComponent(new JLabel(SettingsBundle.message("settings.fileExtensionBlacklistLabel")), fileExtensionBlacklist) - .addTooltip(SettingsBundle.message("settings.fileExtensionBlaclistTooltip")) + .addTooltip(SettingsBundle.message("settings.fileExtensionBlacklistTooltip")) + .addLabeledComponent(new JLabel(SettingsBundle.message("settings.maxFileLinesLabel")), maxFileLines) + .addTooltip(SettingsBundle.message("settings.maxFileLinesTooltip")) .addSeparator() .addComponent(new JBLabel(SettingsBundle.message("settings.submenu.colors"))) .addComponent(showErrors) @@ -609,4 +615,17 @@ public int getManualScannerDelay() { public void setManualScannerDelay(int delay) { manualScannerDelay.setText(Integer.toString(Math.max(10, delay))); } + + public int getMaxFileLines() { + try { + return Math.max(Integer.parseInt(maxFileLines.getText()), 0); + } + catch (NumberFormatException e) { + return 0; + } + } + + public void setMaxFileLines(int lines) { + maxFileLines.setText(Integer.toString(Math.max(0, lines))); + } } diff --git a/src/main/java/org/overengineer/inlineproblems/settings/SettingsConfigurable.java b/src/main/java/org/overengineer/inlineproblems/settings/SettingsConfigurable.java index 276d653..d47271a 100644 --- a/src/main/java/org/overengineer/inlineproblems/settings/SettingsConfigurable.java +++ b/src/main/java/org/overengineer/inlineproblems/settings/SettingsConfigurable.java @@ -86,6 +86,7 @@ public boolean isModified() { state.getProblemFilterList().equals(settingsComponent.getProblemFilterList()) && state.getFileExtensionBlacklist().equals(settingsComponent.getFileExtensionBlacklist()) && + state.getMaxFileLines() == settingsComponent.getMaxFileLines() && state.getAdditionalInfoSeveritiesAsString().equals(settingsComponent.getAdditionalInfoSeverities()) && state.getAdditionalWarningSeveritiesAsString().equals(settingsComponent.getAdditionalWarningSeverities()) && @@ -103,6 +104,7 @@ public void apply() { boolean listenerChanged = state.getEnabledListener() != settingsComponent.getEnabledListener(); boolean fileExtensionBlacklistChanged = !Objects.equals(state.getFileExtensionBlacklist(), settingsComponent.getFileExtensionBlacklist()); boolean manualScannerDelayChanged = state.getManualScannerDelay() != settingsComponent.getManualScannerDelay(); + boolean maxFileLinesChanged = state.getMaxFileLines() != settingsComponent.getMaxFileLines(); state.setShowErrors(settingsComponent.isShowErrors()); state.setHighlightErrors(settingsComponent.isHighlightErrors()); @@ -148,6 +150,7 @@ public void apply() { state.setManualScannerDelay(settingsComponent.getManualScannerDelay()); state.setProblemFilterList(settingsComponent.getProblemFilterList()); state.setFileExtensionBlacklist(settingsComponent.getFileExtensionBlacklist()); + state.setMaxFileLines(settingsComponent.getMaxFileLines()); state.setAdditionalInfoSeverities(settingsComponent.getAdditionalInfoSeveritiesList()); state.setAdditionalWarningSeverities(settingsComponent.getAdditionalWarningSeveritiesList()); @@ -160,8 +163,8 @@ public void apply() { listenerManager.resetAndRescan(); - // When the blacklist changes we need to re-apply all MarkupModelProblemListeners - if (fileExtensionBlacklistChanged && state.getEnabledListener() == Listener.MARKUP_MODEL_LISTENER) { + // When the blacklist or maxFileLines changes we need to re-apply all MarkupModelProblemListeners + if ((fileExtensionBlacklistChanged || maxFileLinesChanged) && state.getEnabledListener() == Listener.MARKUP_MODEL_LISTENER) { listenerManager.resetMarkupModelProblemListeners(); } diff --git a/src/main/java/org/overengineer/inlineproblems/settings/SettingsState.java b/src/main/java/org/overengineer/inlineproblems/settings/SettingsState.java index b8ba8d6..26c0196 100644 --- a/src/main/java/org/overengineer/inlineproblems/settings/SettingsState.java +++ b/src/main/java/org/overengineer/inlineproblems/settings/SettingsState.java @@ -97,6 +97,7 @@ public class SettingsState implements PersistentStateComponent { private int enabledListener = Listener.MARKUP_MODEL_LISTENER; private String problemFilterList = "todo;fixme;open in browser"; private String fileExtensionBlacklist = ""; + private int maxFileLines = 0; private List additionalErrorSeverities = new ArrayList<>(); private List additionalWarningSeverities = new ArrayList<>(); diff --git a/src/main/java/org/overengineer/inlineproblems/utils/FileNameUtil.java b/src/main/java/org/overengineer/inlineproblems/utils/FileNameUtil.java deleted file mode 100644 index 94bd09e..0000000 --- a/src/main/java/org/overengineer/inlineproblems/utils/FileNameUtil.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.overengineer.inlineproblems.utils; - -import org.overengineer.inlineproblems.settings.SettingsState; - -public class FileNameUtil { - public static boolean ignoreFile(String fileName) { - boolean ignore = false; - - for (var e : SettingsState.getInstance().getFileExtensionBlacklist().split(";")) { - if (e.isBlank() || e.isEmpty() || e.equals(";")) continue; - if (fileName.endsWith(e)) { - ignore = true; - break; - } - } - - return ignore; - } -} diff --git a/src/main/java/org/overengineer/inlineproblems/utils/FileUtil.java b/src/main/java/org/overengineer/inlineproblems/utils/FileUtil.java new file mode 100644 index 0000000..d112476 --- /dev/null +++ b/src/main/java/org/overengineer/inlineproblems/utils/FileUtil.java @@ -0,0 +1,37 @@ +package org.overengineer.inlineproblems.utils; + +import org.overengineer.inlineproblems.settings.SettingsState; + +public class FileUtil { + + /** + * Returns true if the file should be ignored, current checks involve the file name and the line count + * @param fileName can be null to ignore + * @param lineCount can be -1 to ignore + * @return true if the file should be ignored, false otherwise + */ + public static boolean ignoreFile(String fileName, int lineCount) { + boolean ignore = false; + var settings = SettingsState.getInstance(); + + if (fileName != null) { + for (var e : settings.getFileExtensionBlacklist().split(";")) { + if (e.isBlank() || e.isEmpty() || e.equals(";")) continue; + if (fileName.endsWith(e)) { + ignore = true; + break; + } + } + } + + if (lineCount >= 0) { + var maxFileLines = settings.getMaxFileLines(); + + if (maxFileLines >= 0 && lineCount >= maxFileLines) { + ignore = true; + } + } + + return ignore; + } +} diff --git a/src/main/resources/messages/SettingsBundle_en.properties b/src/main/resources/messages/SettingsBundle_en.properties index f1a04b5..5590349 100644 --- a/src/main/resources/messages/SettingsBundle_en.properties +++ b/src/main/resources/messages/SettingsBundle_en.properties @@ -29,7 +29,9 @@ settings.inlaySizeDeltaTooltip=Used to have smaller font size for the inlays, sh settings.problemFilterListLabel=Problem filter list settings.problemFilterListTooltip=Semicolon separated list of problem text beginnings that will not be handled settings.fileExtensionBlacklistLabel=File extension blacklist -settings.fileExtensionBlaclistTooltip=Semicolon separated list of file extensions to ignore (like ".java;.md") +settings.fileExtensionBlacklistTooltip=Semicolon separated list of file extensions to ignore (like ".java;.md") +settings.maxFileLinesLabel=Maximum file lines +settings.maxFileLinesTooltip=Skip files with more lines than this value (0 = unlimited) settings.submenu.colors=Colors settings.errorTextColor=Error text color: settings.errorLabelBorderColor=Error label border color: diff --git a/src/main/resources/messages/SettingsBundle_zh_CN.properties b/src/main/resources/messages/SettingsBundle_zh_CN.properties index 0737999..74fe855 100644 --- a/src/main/resources/messages/SettingsBundle_zh_CN.properties +++ b/src/main/resources/messages/SettingsBundle_zh_CN.properties @@ -28,6 +28,10 @@ settings.inlaySizeDelta=\u5b57\u4f53\u5927\u5c0f\u5dee\u5f02 settings.inlaySizeDeltaTooltip=\u7528\u4e8e\u4e3a\u6807\u7b7e\u8bbe\u7f6e\u8f83\u5c0f\u7684\u5b57\u4f53\uff0c\u5fc5\u987b\u5c0f\u4e8e\u7f16\u8f91\u5668\u5b57\u4f53\u5927\u5c0f settings.problemFilterListLabel=\u95ee\u9898\u8fc7\u6ee4\u5217\u8868 settings.problemFilterListTooltip=\u4e0d\u5904\u7406\u7684\u95ee\u9898\u6587\u672c\u5f00\u5934\u7684\u7528\u5206\u53f7\u5206\u9694\u7684\u5217\u8868 +settings.fileExtensionBlacklistLabel=File extension blacklist +settings.fileExtensionBlacklistTooltip=Semicolon separated list of file extensions to ignore (like ".java;.md") +settings.maxFileLinesLabel=Maximum file lines +settings.maxFileLinesTooltip=Skip files with more lines than this value (0 = unlimited) settings.submenu.colors=\u989C\u8272 settings.errorTextColor=\u9519\u8BEF\u6587\u672C\u989C\u8272\uFF1A settings.errorLabelBorderColor=\u9519\u8BEF\u6807\u7B7E\u8FB9\u6846\u989C\u8272\uFF1A