diff --git a/platform/lang-impl/src/com/intellij/execution/console/ConsoleGutterComponent.java b/platform/lang-impl/src/com/intellij/execution/console/ConsoleGutterComponent.java index 7dfdfc198a71..ecb6cfc2a586 100644 --- a/platform/lang-impl/src/com/intellij/execution/console/ConsoleGutterComponent.java +++ b/platform/lang-impl/src/com/intellij/execution/console/ConsoleGutterComponent.java @@ -60,9 +60,9 @@ class ConsoleGutterComponent extends JComponent implements MouseMotionListener { }); } - public void updateSize() { + public void updateSize(int start, int end) { int oldAnnotationsWidth = maxAnnotationWidth; - computeMaxAnnotationWidth(); + computeMaxAnnotationWidth(start, end); if (oldAnnotationsWidth != maxAnnotationWidth || myLastPreferredHeight != editor.getPreferredHeight()) { fireResized(); } @@ -73,7 +73,7 @@ class ConsoleGutterComponent extends JComponent implements MouseMotionListener { processComponentEvent(new ComponentEvent(this, ComponentEvent.COMPONENT_RESIZED)); } - private void computeMaxAnnotationWidth() { + private void computeMaxAnnotationWidth(int start, int end) { gutterContentProvider.beforeUiComponentUpdate(editor); if (!gutterContentProvider.hasText()) { @@ -82,10 +82,10 @@ class ConsoleGutterComponent extends JComponent implements MouseMotionListener { } FontMetrics fontMetrics = editor.getFontMetrics(Font.PLAIN); - int lineCount = editor.getDocument().getLineCount(); + int lineCount = Math.min(end, editor.getDocument().getLineCount()); int gutterSize = 0; - for (int i = 0; i < lineCount; i++) { - String text = gutterContentProvider.getText(i, editor); + for (int line = start; line < lineCount; line++) { + String text = gutterContentProvider.getText(line, editor); if (text != null) { gutterSize = Math.max(gutterSize, fontMetrics.stringWidth(text)); } @@ -94,7 +94,9 @@ class ConsoleGutterComponent extends JComponent implements MouseMotionListener { if (gutterSize != 0) { gutterSize += lineEndInset; } - maxAnnotationWidth = gutterSize; + maxAnnotationWidth = Math.max(gutterSize, maxAnnotationWidth); + + editor.getSettings().setAdditionalColumnsCount(1 + (maxAnnotationWidth / EditorUtil.getSpaceWidth(Font.PLAIN, editor))); } @Override diff --git a/platform/lang-impl/src/com/intellij/execution/console/LanguageConsoleBuilder.java b/platform/lang-impl/src/com/intellij/execution/console/LanguageConsoleBuilder.java index fb5593bcd4bb..ac16686432c7 100644 --- a/platform/lang-impl/src/com/intellij/execution/console/LanguageConsoleBuilder.java +++ b/platform/lang-impl/src/com/intellij/execution/console/LanguageConsoleBuilder.java @@ -125,7 +125,7 @@ public final class LanguageConsoleBuilder { return new Pair(action, historyController); } - public LanguageConsoleBuilder historyAnnotation(@Nullable GutterContentProvider value) { + public LanguageConsoleBuilder gutterContentProvider(@Nullable GutterContentProvider value) { gutterContentProvider = value; return this; } @@ -196,6 +196,11 @@ public final class LanguageConsoleBuilder { this.psiFileFactory = psiFileFactory; } + @Override + boolean isHistoryViewerForceAdditionalColumnsUsage() { + return gutterContentProvider == null; + } + @NotNull @Override protected PsiFile createFile(@NotNull LightVirtualFile virtualFile, @NotNull Document document, @NotNull Project project) { @@ -288,7 +293,7 @@ public final class LanguageConsoleBuilder { private final ConsoleIconGutterComponent lineStartGutter; private final ConsoleGutterComponent lineEndGutter; - private Runnable gutterSizeUpdater; + private Task gutterSizeUpdater; private RangeHighlighterEx lineSeparatorPainter; public GutterUpdateScheduler(@NotNull ConsoleIconGutterComponent lineStartGutter, @NotNull ConsoleGutterComponent lineEndGutter) { @@ -333,7 +338,7 @@ public final class LanguageConsoleBuilder { int startDocLine = document.getLineNumber(event.getOffset()); int endDocLine = document.getLineNumber(event.getOffset() + event.getNewLength()); if (event.getOldLength() > event.getNewLength() || startDocLine != endDocLine || StringUtil.indexOf(event.getOldFragment(), '\n') != -1) { - updateGutterSize(); + updateGutterSize(0, Integer.MAX_VALUE); } } else if (event.getOldLength() > 0) { @@ -342,6 +347,8 @@ public final class LanguageConsoleBuilder { } private void documentCleared() { + gutterSizeUpdater = null; + assert gutterContentProvider != null; gutterContentProvider.documentCleared(getHistoryViewer()); } @@ -358,26 +365,38 @@ public final class LanguageConsoleBuilder { else { addLineSeparatorPainterIfNeed(); } - updateGutterSize(); + updateGutterSize(0, Integer.MAX_VALUE); } - private void updateGutterSize() { + private void updateGutterSize(int start, int end) { if (gutterSizeUpdater != null) { + gutterSizeUpdater.start = Math.min(start, gutterSizeUpdater.start); + gutterSizeUpdater.end = Math.max(end, gutterSizeUpdater.end); return; } - gutterSizeUpdater = new Runnable() { - @Override - public void run() { - if (!getHistoryViewer().isDisposed()) { - lineStartGutter.updateSize(); - lineEndGutter.updateSize(); - } - gutterSizeUpdater = null; - } - }; + gutterSizeUpdater = new Task(start, end); SwingUtilities.invokeLater(gutterSizeUpdater); } + + private final class Task implements Runnable { + private int start; + private int end; + + public Task(int start, int end) { + this.start = start; + this.end = end; + } + + @Override + public void run() { + if (!getHistoryViewer().isDisposed()) { + lineStartGutter.updateSize(); + lineEndGutter.updateSize(start, end); + } + gutterSizeUpdater = null; + } + } } private final class LineSeparatorPainter extends RangeMarkerImpl implements RangeHighlighterEx, Getter { diff --git a/platform/lang-impl/src/com/intellij/execution/console/LanguageConsoleImpl.java b/platform/lang-impl/src/com/intellij/execution/console/LanguageConsoleImpl.java index 3ec577da2259..da38faf0f8f5 100644 --- a/platform/lang-impl/src/com/intellij/execution/console/LanguageConsoleImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/console/LanguageConsoleImpl.java @@ -682,6 +682,10 @@ public class LanguageConsoleImpl implements Disposable, TypeSafeDataProvider { return ObjectUtils.assertNotNull(PsiManager.getInstance(project).findFile(virtualFile)); } + boolean isHistoryViewerForceAdditionalColumnsUsage() { + return true; + } + private class MyLayout extends AbstractLayoutManager { @Override public Dimension preferredLayoutSize(final Container parent) { @@ -713,9 +717,11 @@ public class LanguageConsoleImpl implements Disposable, TypeSafeDataProvider { // deal with width final int width = Math.max(editorSize.width, historySize.width); newEditorSize.width = width + editor.getScrollPane().getHorizontalScrollBar().getHeight(); - history.getSoftWrapModel().forceAdditionalColumnsUsage(); - editor.getSettings().setAdditionalColumnsCount(2 + (width - editorSize.width) / EditorUtil.getSpaceWidth(Font.PLAIN, editor)); - history.getSettings().setAdditionalColumnsCount(2 + (width - historySize.width) / EditorUtil.getSpaceWidth(Font.PLAIN, history)); + if (isHistoryViewerForceAdditionalColumnsUsage()) { + history.getSoftWrapModel().forceAdditionalColumnsUsage(); + editor.getSettings().setAdditionalColumnsCount(2 + (width - editorSize.width) / EditorUtil.getSpaceWidth(Font.PLAIN, editor)); + history.getSettings().setAdditionalColumnsCount(2 + (width - historySize.width) / EditorUtil.getSpaceWidth(Font.PLAIN, history)); + } // deal with height if (historySize.width == 0) {