From 821a6c3d6703bb4f87018578efed35000f58413c Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Wed, 19 Feb 2014 14:08:07 +0100 Subject: [PATCH] js repl: fix layout --- .../console/LanguageConsoleBuilder.java | 71 ++++++++++++------- 1 file changed, 47 insertions(+), 24 deletions(-) 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 07d97e0fa55c..90c525d107d6 100644 --- a/platform/lang-impl/src/com/intellij/execution/console/LanguageConsoleBuilder.java +++ b/platform/lang-impl/src/com/intellij/execution/console/LanguageConsoleBuilder.java @@ -137,27 +137,24 @@ public class LanguageConsoleBuilder { editor.getSettings().setAdditionalLinesCount(1); } else if (gutterContentProvider != null) { + final ConsoleIconGutterComponent lineStartGutter = new ConsoleIconGutterComponent(editor, gutterContentProvider); + final ConsoleGutterComponent lineEndGutter = new ConsoleGutterComponent(editor, gutterContentProvider); JLayeredPane layeredPane = new JBLayeredPane() { + @Override + public Dimension getPreferredSize() { + Dimension editorSize = getEditorComponent().getPreferredSize(); + return new Dimension(lineStartGutter.getPreferredSize().width + editorSize.width, editorSize.height); + } + + @Override + public Dimension getMinimumSize() { + Dimension editorSize = getEditorComponent().getMinimumSize(); + return new Dimension(lineStartGutter.getPreferredSize().width + editorSize.width, editorSize.height); + } + @Override public void doLayout() { - EditorComponentImpl editor = null; - Component lineStartGutter = null; - Component lineEndGutter = null; - for (int i = getComponentCount() - 1; i >= 0; i--) { - Component component = getComponent(i); - if (component instanceof EditorComponentImpl) { - editor = (EditorComponentImpl)component; - } - else if (getLayer(component) == JLayeredPane.DEFAULT_LAYER) { - lineStartGutter = component; - } - else { - lineEndGutter = component; - } - } - - assert editor != null && lineStartGutter != null && lineEndGutter != null; - + EditorComponentImpl editor = getEditorComponent(); int w = getWidth(); int h = getHeight(); Dimension lineStartGutterDimension = lineStartGutter.getPreferredSize(); @@ -168,15 +165,24 @@ public class LanguageConsoleBuilder { Dimension lineEndGutterDimension = lineEndGutter.getPreferredSize(); lineEndGutter.setBounds(w - lineEndGutterDimension.width - editor.getEditor().getScrollPane().getVerticalScrollBar().getWidth(), 0, lineEndGutterDimension.width, h); } + + @NotNull + private EditorComponentImpl getEditorComponent() { + for (int i = getComponentCount() - 1; i >= 0; i--) { + Component component = getComponent(i); + if (component instanceof EditorComponentImpl) { + return (EditorComponentImpl)component; + } + } + throw new IllegalStateException(); + } }; - ConsoleIconGutterComponent lineStartGutter = new ConsoleIconGutterComponent(editor, gutterContentProvider); layeredPane.add(lineStartGutter, JLayeredPane.DEFAULT_LAYER); JScrollPane scrollPane = editor.getScrollPane(); layeredPane.add(scrollPane.getViewport().getView(), JLayeredPane.DEFAULT_LAYER); - ConsoleGutterComponent lineEndGutter = new ConsoleGutterComponent(editor, gutterContentProvider); layeredPane.add(lineEndGutter, JLayeredPane.PALETTE_LAYER); scrollPane.setViewportView(layeredPane); @@ -202,6 +208,7 @@ public class LanguageConsoleBuilder { private final ConsoleGutterComponent lineEndGutter; private boolean lineSeparatorPainterAdded; + private Runnable gutterSizeUpdater; public GutterUpdateScheduler(@NotNull ConsoleIconGutterComponent lineStartGutter, @NotNull ConsoleGutterComponent lineEndGutter) { this.lineStartGutter = lineStartGutter; @@ -235,8 +242,7 @@ public 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) { - lineStartGutter.updateSize(); - lineEndGutter.updateSize(); + updateGutterSize(); } } else if (event.getOldLength() > 0) { @@ -258,8 +264,25 @@ public class LanguageConsoleBuilder { else { addLineSeparatorPainterIfNeed(); } - lineStartGutter.updateSize(); - lineEndGutter.updateSize(); + updateGutterSize(); + } + + private void updateGutterSize() { + if (gutterSizeUpdater != null) { + return; + } + + gutterSizeUpdater = new Runnable() { + @Override + public void run() { + if (!getHistoryViewer().isDisposed()) { + lineStartGutter.updateSize(); + lineEndGutter.updateSize(); + } + gutterSizeUpdater = null; + } + }; + SwingUtilities.invokeLater(gutterSizeUpdater); } }