From 8af6e21afdd3a3efa99f11e2e8bfa80cc6615cb2 Mon Sep 17 00:00:00 2001 From: 0verEngineer Date: Tue, 30 Sep 2025 13:46:52 +0200 Subject: [PATCH] Max problems per line feature --- .../inlineproblems/ProblemManager.java | 6 ++++++ .../settings/SettingsComponent.java | 19 +++++++++++++++++++ .../settings/SettingsConfigurable.java | 3 +++ .../settings/SettingsState.java | 1 + .../messages/SettingsBundle_en.properties | 2 ++ .../messages/SettingsBundle_zh_CN.properties | 2 ++ 6 files changed, 33 insertions(+) diff --git a/src/main/java/org/overengineer/inlineproblems/ProblemManager.java b/src/main/java/org/overengineer/inlineproblems/ProblemManager.java index b35f2e4..c8b877a 100644 --- a/src/main/java/org/overengineer/inlineproblems/ProblemManager.java +++ b/src/main/java/org/overengineer/inlineproblems/ProblemManager.java @@ -64,6 +64,12 @@ public void addProblem(InlineProblem problem) { removeProblem(p); }); + // Limit problems per line + int maxProblemsPerLine = settingsState.getMaxProblemsPerLine(); + if (maxProblemsPerLine > 0 && problemsInLine.size() > maxProblemsPerLine) { + problemsInLine.subList(maxProblemsPerLine, problemsInLine.size()).clear(); + } + /* This only works when using a method reference, if we move the code from the addProblemPrivate func into a lambda * it does not work like expected, that is because there are differences in the evaluation and the way it is called */ problemsInLine.forEach(this::addProblemPrivate); diff --git a/src/main/java/org/overengineer/inlineproblems/settings/SettingsComponent.java b/src/main/java/org/overengineer/inlineproblems/settings/SettingsComponent.java index ca45b5e..fe29908 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 maxProblemsPerLine; 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")); @@ -127,6 +128,9 @@ public SettingsComponent() { inlayFontSizeDeltaText = new JFormattedTextField(numberFormatter); inlayFontSizeDeltaText.setText(Integer.toString(settingsState.getInlayFontSizeDelta())); + maxProblemsPerLine = new JFormattedTextField(numberFormatter); + maxProblemsPerLine.setText(Integer.toString(settingsState.getMaxProblemsPerLine())); + manualScannerDelay = new JFormattedTextField(numberFormatter); manualScannerDelay.setText(Integer.toString(settingsState.getManualScannerDelay())); @@ -174,6 +178,8 @@ public SettingsComponent() { .addTooltip(SettingsBundle.message("settings.problemFilterListTooltip")) .addLabeledComponent(new JLabel(SettingsBundle.message("settings.fileExtensionBlacklistLabel")), fileExtensionBlacklist) .addTooltip(SettingsBundle.message("settings.fileExtensionBlaclistTooltip")) + .addLabeledComponent(new JBLabel(SettingsBundle.message("settings.maxProblemsPerLineLabel")), maxProblemsPerLine) + .addTooltip(SettingsBundle.message("settings.maxProblemsPerLineTooltip")) .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 getMaxProblemsPerLine() { + try { + return Math.max(Integer.parseInt(maxProblemsPerLine.getText()), 0); + } + catch (NumberFormatException e) { + return 0; + } + } + + public void setMaxProblemsPerLine(int max) { + maxProblemsPerLine.setText(Integer.toString(Math.max(0, max))); + } } diff --git a/src/main/java/org/overengineer/inlineproblems/settings/SettingsConfigurable.java b/src/main/java/org/overengineer/inlineproblems/settings/SettingsConfigurable.java index 276d653..a461746 100644 --- a/src/main/java/org/overengineer/inlineproblems/settings/SettingsConfigurable.java +++ b/src/main/java/org/overengineer/inlineproblems/settings/SettingsConfigurable.java @@ -46,6 +46,7 @@ public boolean isModified() { state.isRoundedCornerBoxes() == settingsComponent.isRoundedCornerBoxes() && state.isUseEditorFont() == settingsComponent.isUseEditorFont() && state.isShowOnlyHighestSeverityPerLine() == settingsComponent.isShowOnlyHighestSeverityPerLine() && + state.getMaxProblemsPerLine() == settingsComponent.getMaxProblemsPerLine() && state.isEnableHtmlStripping() == settingsComponent.isEnableHtmlStripping() && state.isEnableXmlUnescaping() == settingsComponent.isEnableXmlUnescaping() && state.getInlayFontSizeDelta() == settingsComponent.getInlayFontSizeDelta() && @@ -137,6 +138,7 @@ public void apply() { state.setRoundedCornerBoxes(settingsComponent.isRoundedCornerBoxes()); state.setUseEditorFont(settingsComponent.isUseEditorFont()); state.setShowOnlyHighestSeverityPerLine(settingsComponent.isShowOnlyHighestSeverityPerLine()); + state.setMaxProblemsPerLine(settingsComponent.getMaxProblemsPerLine()); state.setEnableHtmlStripping(settingsComponent.isEnableHtmlStripping()); state.setEnableXmlUnescaping(settingsComponent.isEnableXmlUnescaping()); state.setInlayFontSizeDelta(settingsComponent.getInlayFontSizeDelta()); @@ -207,6 +209,7 @@ public void reset() { settingsComponent.setRoundedCornerBoxes(state.isRoundedCornerBoxes()); settingsComponent.setUseEditorFont(state.isUseEditorFont()); settingsComponent.setShowOnlyHighestSeverityPerLine(state.isShowOnlyHighestSeverityPerLine()); + settingsComponent.setMaxProblemsPerLine(state.getMaxProblemsPerLine()); settingsComponent.setEnableHtmlStripping(state.isEnableHtmlStripping()); settingsComponent.setEnableXmlUnescaping(state.isEnableXmlUnescaping()); settingsComponent.setInlayFontSizeDelta(state.getInlayFontSizeDelta()); diff --git a/src/main/java/org/overengineer/inlineproblems/settings/SettingsState.java b/src/main/java/org/overengineer/inlineproblems/settings/SettingsState.java index b8ba8d6..e4593e3 100644 --- a/src/main/java/org/overengineer/inlineproblems/settings/SettingsState.java +++ b/src/main/java/org/overengineer/inlineproblems/settings/SettingsState.java @@ -106,6 +106,7 @@ public class SettingsState implements PersistentStateComponent { private boolean showOnlyHighestSeverityPerLine = false; private boolean enableHtmlStripping = true; private boolean enableXmlUnescaping = true; + private int maxProblemsPerLine = 20; // migration booleans private boolean highlightProblemListenerDeprecateMigrationDone = false; diff --git a/src/main/resources/messages/SettingsBundle_en.properties b/src/main/resources/messages/SettingsBundle_en.properties index f1a04b5..7fecc0b 100644 --- a/src/main/resources/messages/SettingsBundle_en.properties +++ b/src/main/resources/messages/SettingsBundle_en.properties @@ -51,5 +51,7 @@ settings.additionalSeveritiesInfoDesc=Semicolon separated list of additional inf settings.forceProblemsInOneLine=Force problems in the same line even if they are too long to fit settings.useEditorFont=Use editor font instead of tooltip font settings.showOnlyHighestPerLine=Show only the problem with the highest severity per line +settings.maxProblemsPerLineLabel=Max problems per line (0 = unlimited) +settings.maxProblemsPerLineTooltip=Limits the number of problems shown per line. Set to 0 for unlimited. settings.enableHtmlStripping=Enable stripping of HTML in the messages settings.enableXmlUnescaping=Enable unescaping of XML in the messages \ No newline at end of file diff --git a/src/main/resources/messages/SettingsBundle_zh_CN.properties b/src/main/resources/messages/SettingsBundle_zh_CN.properties index 0737999..2eecc60 100644 --- a/src/main/resources/messages/SettingsBundle_zh_CN.properties +++ b/src/main/resources/messages/SettingsBundle_zh_CN.properties @@ -49,5 +49,7 @@ settings.additionalSeveritiesInfoDesc=\u9644\u52A0\u4FE1\u606F\u4E25\u91CD\u6027 settings.forceProblemsInOneLine=\u5F3A\u5236\u5728\u540C\u4E00\u884C\u663E\u793A\u95EE\u9898\uFF0C\u5373\u4F7F\u5B83\u4EEC\u592A\u957F\u800C\u65E0\u6CD5\u9002\u5E94 settings.useEditorFont=\u4F7F\u7528\u7F16\u8F91\u5668\u5B57\u4F53\u800C\u4E0D\u662F\u63D0\u793A\u5B57\u4F53 settings.showOnlyHighestPerLine=\u4ec5\u663e\u793a\u6bcf\u884c\u4e2d\u6700\u4e25\u91cd\u7684\u95ee\u9898 +settings.maxProblemsPerLineLabel=Max problems per line (0 = unlimited) +settings.maxProblemsPerLineTooltip=Limits the number of problems shown per line. Set to 0 for unlimited. settings.enableHtmlStripping=Enable stripping of HTML in the messages settings.enableXmlUnescaping=Enable unescaping of XML in the messages