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 bc2e9ce..51e23d3 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 JFormattedTextField maxFileLines; private final JBCheckBox fillProblemLabels = new JBCheckBox(SettingsBundle.message("settings.fillProblemLabels")); private final JBCheckBox boldProblemLabels = new JBCheckBox(SettingsBundle.message("settings.boldProblemLabels")); @@ -128,6 +129,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())); @@ -178,6 +182,8 @@ public SettingsComponent() { .addTooltip(SettingsBundle.message("settings.problemFilterListTooltip")) .addLabeledComponent(new JLabel(SettingsBundle.message("settings.fileExtensionBlacklistLabel")), fileExtensionBlacklist) .addTooltip(SettingsBundle.message("settings.fileExtensionBlacklistTooltip")) + .addLabeledComponent(new JBLabel(SettingsBundle.message("settings.maxProblemsPerLineLabel")), maxProblemsPerLine) + .addTooltip(SettingsBundle.message("settings.maxProblemsPerLineTooltip")) .addLabeledComponent(new JLabel(SettingsBundle.message("settings.maxFileLinesLabel")), maxFileLines) .addTooltip(SettingsBundle.message("settings.maxFileLinesTooltip")) .addSeparator() @@ -616,6 +622,19 @@ 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))); + } + public int getMaxFileLines() { try { return Math.max(Integer.parseInt(maxFileLines.getText()), 0); diff --git a/src/main/java/org/overengineer/inlineproblems/settings/SettingsConfigurable.java b/src/main/java/org/overengineer/inlineproblems/settings/SettingsConfigurable.java index d47271a..6e03266 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() && @@ -139,6 +140,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()); @@ -210,6 +212,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 26c0196..3b70f40 100644 --- a/src/main/java/org/overengineer/inlineproblems/settings/SettingsState.java +++ b/src/main/java/org/overengineer/inlineproblems/settings/SettingsState.java @@ -107,6 +107,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 5590349..9b661a5 100644 --- a/src/main/resources/messages/SettingsBundle_en.properties +++ b/src/main/resources/messages/SettingsBundle_en.properties @@ -53,5 +53,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 74fe855..6aac159 100644 --- a/src/main/resources/messages/SettingsBundle_zh_CN.properties +++ b/src/main/resources/messages/SettingsBundle_zh_CN.properties @@ -53,5 +53,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