From 81054b12aefd275bb370a3392e78c3e2fb2b1c3f Mon Sep 17 00:00:00 2001 From: Alexander Kass Date: Mon, 14 Sep 2015 11:52:11 +0300 Subject: [PATCH] EditorTextFieldCellRenderer: ability to create non-abbreviating version + customize editor --- .../ui/EditorTextFieldCellRenderer.java | 163 ++++++++++-------- 1 file changed, 94 insertions(+), 69 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ui/EditorTextFieldCellRenderer.java b/platform/platform-impl/src/com/intellij/ui/EditorTextFieldCellRenderer.java index 667db0fb292d..d3c9019c2b8e 100644 --- a/platform/platform-impl/src/com/intellij/ui/EditorTextFieldCellRenderer.java +++ b/platform/platform-impl/src/com/intellij/ui/EditorTextFieldCellRenderer.java @@ -57,7 +57,7 @@ import java.util.List; */ public abstract class EditorTextFieldCellRenderer implements TableCellRenderer, Disposable { - private static final Key MY_PANEL_PROPERTY = Key.create("EditorTextFieldCellRenderer.MyEditorPanel"); + private static final Key MY_PANEL_PROPERTY = Key.create("EditorTextFieldCellRenderer.MyEditorPanel"); private final Project myProject; private final FileType myFileType; @@ -87,13 +87,16 @@ public abstract class EditorTextFieldCellRenderer implements TableCellRenderer, return getEditorPanel(table).getEditor().getColorsScheme(); } + protected void customizeEditor(@NotNull EditorEx editor, JTable table, Object value, boolean selected, int row, int column) { + String text = getText(table, value, row, column); + getEditorPanel(table).setText(text, getTextAttributes(table, value, row, column), selected); + } + @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean selected, boolean focused, int row, int column) { - RendererComponent panel = getEditorPanel(table); + SimpleRendererComponent panel = getEditorPanel(table); EditorEx editor = panel.getEditor(); editor.getColorsScheme().setEditorFontSize(table.getFont().getSize()); - String text = getText(table, value, row, column); - panel.setText(text, getTextAttributes(table, value, row, column), selected); editor.getColorsScheme().setColor(EditorColors.SELECTION_BACKGROUND_COLOR, table.getSelectionBackground()); editor.getColorsScheme().setColor(EditorColors.SELECTION_FOREGROUND_COLOR, table.getSelectionForeground()); @@ -102,19 +105,20 @@ public abstract class EditorTextFieldCellRenderer implements TableCellRenderer, panel.setBorder(null); // prevents double border painting when ExtendedItemRendererComponentWrapper is used + customizeEditor(editor, table, value, selected, row, column); return panel; } @NotNull - private RendererComponent getEditorPanel(final JTable table) { - RendererComponent panel = UIUtil.getClientProperty(table, MY_PANEL_PROPERTY); + private SimpleRendererComponent getEditorPanel(final JTable table) { + SimpleRendererComponent panel = UIUtil.getClientProperty(table, MY_PANEL_PROPERTY); if (panel != null) { - DelegateColorScheme scheme = (DelegateColorScheme)panel.myEditor.getColorsScheme(); + DelegateColorScheme scheme = (DelegateColorScheme)panel.getEditor().getColorsScheme(); scheme.setDelegate(EditorColorsManager.getInstance().getGlobalScheme()); return panel; } - panel = new RendererComponent(myProject, myFileType, myInheritFontFromLaF); + panel = createRendererComponent(myProject, myFileType, myInheritFontFromLaF); Disposer.register(this, panel); Disposer.register(this, new Disposable() { @Override @@ -127,23 +131,21 @@ public abstract class EditorTextFieldCellRenderer implements TableCellRenderer, return panel; } + @NotNull + protected SimpleRendererComponent createRendererComponent(@Nullable Project project, @Nullable FileType fileType, boolean inheritFontFromLaF) { + return new RendererComponent(project, fileType, inheritFontFromLaF); + } + @Override public void dispose() { } - public static class RendererComponent extends CellRendererPanel implements Disposable { - private static final char ABBREVIATION_SUFFIX = '\u2026'; // 2026 '...' - private static final char RETURN_SYMBOL = '\u23ce'; - - private final StringBuilder myDocumentTextBuilder = new StringBuilder(); + public static class SimpleRendererComponent extends CellRendererPanel implements Disposable { private final EditorEx myEditor; - - private Dimension myPreferredSize; - private String myRawText; - private TextAttributes myTextAttributes; + protected TextAttributes myTextAttributes; private boolean mySelected; - public RendererComponent(Project project, @Nullable FileType fileType, boolean inheritFontFromLaF) { + public SimpleRendererComponent(Project project, @Nullable FileType fileType, boolean inheritFontFromLaF) { myEditor = createEditor(project, fileType, inheritFontFromLaF); add(myEditor.getContentComponent()); } @@ -152,11 +154,32 @@ public abstract class EditorTextFieldCellRenderer implements TableCellRenderer, return myEditor; } + @NotNull + private static EditorEx createEditor(Project project, @Nullable FileType fileType, boolean inheritFontFromLaF) { + EditorTextField field = new EditorTextField(new MyDocument(), project, fileType, false, false); + field.setSupplementary(true); + field.setFontInheritedFromLAF(inheritFontFromLaF); + field.addNotify(); // creates editor + + EditorEx editor = (EditorEx)ObjectUtils.assertNotNull(field.getEditor()); + editor.setRendererMode(true); + + editor.setColorsScheme(editor.createBoundColorSchemeDelegate(null)); + editor.getSettings().setCaretRowShown(false); + + editor.getScrollPane().setBorder(null); + + return editor; + } + public void setText(String text, @Nullable TextAttributes textAttributes, boolean selected) { - myRawText = text; myTextAttributes = textAttributes; mySelected = selected; - myPreferredSize = null; + setText(text); + } + + public void setText(String text) { + setTextToEditor(text); } @Override @@ -168,6 +191,52 @@ public abstract class EditorTextFieldCellRenderer implements TableCellRenderer, super.setBackground(bg); } + @Override + protected void paintComponent(Graphics g) { + } + + @Override + public void dispose() { + myEditor.getComponent().removeNotify(); + EditorFactory.getInstance().releaseEditor(myEditor); + } + + protected void setTextToEditor(String text) { + myEditor.getMarkupModel().removeAllHighlighters(); + myEditor.getDocument().setText(text); + myEditor.getHighlighter().setText(text); + if (myTextAttributes != null) { + myEditor.getMarkupModel().addRangeHighlighter(0, myEditor.getDocument().getTextLength(), + HighlighterLayer.ADDITIONAL_SYNTAX, myTextAttributes, HighlighterTargetArea.EXACT_RANGE); + } + + ((EditorImpl)myEditor).resetSizes(); + + ((EditorImpl)myEditor).setPaintSelection(mySelected); + SelectionModel selectionModel = myEditor.getSelectionModel(); + selectionModel.setSelection(0, mySelected ? myEditor.getDocument().getTextLength() : 0); + } + } + + public static class RendererComponent extends SimpleRendererComponent { + private static final char ABBREVIATION_SUFFIX = '\u2026'; // 2026 '...' + private static final char RETURN_SYMBOL = '\u23ce'; + + private final StringBuilder myDocumentTextBuilder = new StringBuilder(); + + private Dimension myPreferredSize; + private String myRawText; + + public RendererComponent(Project project, @Nullable FileType fileType, boolean inheritFontFromLaF) { + super(project, fileType, inheritFontFromLaF); + } + + @Override + public void setText(String text) { + myRawText = text; + myPreferredSize = null; + } + @Override public Dimension getPreferredSize() { if (myPreferredSize == null) { @@ -179,8 +248,8 @@ public abstract class EditorTextFieldCellRenderer implements TableCellRenderer, linesCount++; } - FontMetrics fontMetrics = ((EditorImpl)myEditor).getFontMetrics(myTextAttributes != null ? myTextAttributes.getFontType() : Font.PLAIN); - int preferredHeight = myEditor.getLineHeight() * Math.max(1, linesCount); + FontMetrics fontMetrics = ((EditorImpl)getEditor()).getFontMetrics(myTextAttributes != null ? myTextAttributes.getFontType() : Font.PLAIN); + int preferredHeight = getEditor().getLineHeight() * Math.max(1, linesCount); int preferredWidth = fontMetrics.charWidth('m') * maxLineLength; Insets insets = getInsets(); @@ -194,35 +263,25 @@ public abstract class EditorTextFieldCellRenderer implements TableCellRenderer, return myPreferredSize; } - @Override - protected void paintComponent(Graphics g) { - } - @Override protected void paintChildren(Graphics g) { updateText(g.getClipBounds()); super.paintChildren(g); } - @Override - public void dispose() { - myEditor.getComponent().removeNotify(); - EditorFactory.getInstance().releaseEditor(myEditor); - } - private void updateText(Rectangle clip) { - FontMetrics fontMetrics = ((EditorImpl)myEditor).getFontMetrics(myTextAttributes != null ? myTextAttributes.getFontType() : Font.PLAIN); + FontMetrics fontMetrics = ((EditorImpl)getEditor()).getFontMetrics(myTextAttributes != null ? myTextAttributes.getFontType() : Font.PLAIN); Insets insets = getInsets(); int maxLineWidth = getWidth() - (insets != null ? insets.left + insets.right : 0); myDocumentTextBuilder.setLength(0); - boolean singleLineMode = getHeight() / (float)myEditor.getLineHeight() < 1.1f; + boolean singleLineMode = getHeight() / (float)getEditor().getLineHeight() < 1.1f; if (singleLineMode) { appendAbbreviated(myDocumentTextBuilder, myRawText, 0, myRawText.length(), fontMetrics, maxLineWidth, true); } else { - int lineHeight = myEditor.getLineHeight(); + int lineHeight = getEditor().getLineHeight(); int firstVisibleLine = clip.y / lineHeight; float visibleLinesCountFractional = clip.height / (float)lineHeight; int linesToAppend = 1 + (int)visibleLinesCountFractional; @@ -245,22 +304,6 @@ public abstract class EditorTextFieldCellRenderer implements TableCellRenderer, setTextToEditor(myDocumentTextBuilder.toString()); } - private void setTextToEditor(String text) { - myEditor.getMarkupModel().removeAllHighlighters(); - myEditor.getDocument().setText(text); - myEditor.getHighlighter().setText(text); - if (myTextAttributes != null) { - myEditor.getMarkupModel().addRangeHighlighter(0, myEditor.getDocument().getTextLength(), - HighlighterLayer.ADDITIONAL_SYNTAX, myTextAttributes, HighlighterTargetArea.EXACT_RANGE); - } - - ((EditorImpl)myEditor).resetSizes(); - - ((EditorImpl)myEditor).setPaintSelection(mySelected); - SelectionModel selectionModel = myEditor.getSelectionModel(); - selectionModel.setSelection(0, mySelected ? myEditor.getDocument().getTextLength() : 0); - } - private static void appendAbbreviated(StringBuilder to, String text, int start, int end, FontMetrics metrics, int maxWidth, boolean replaceLineTerminators) { int abbreviationLength = abbreviationLength(text, start, end, metrics, maxWidth, replaceLineTerminators); @@ -304,24 +347,6 @@ public abstract class EditorTextFieldCellRenderer implements TableCellRenderer, return abbrLength; } - - @NotNull - private static EditorEx createEditor(Project project, @Nullable FileType fileType, boolean inheritFontFromLaF) { - EditorTextField field = new EditorTextField(new MyDocument(), project, fileType, false, false); - field.setSupplementary(true); - field.setFontInheritedFromLAF(inheritFontFromLaF); - field.addNotify(); // creates editor - - EditorEx editor = (EditorEx)ObjectUtils.assertNotNull(field.getEditor()); - editor.setRendererMode(true); - - editor.setColorsScheme(editor.createBoundColorSchemeDelegate(null)); - editor.getSettings().setCaretRowShown(false); - - editor.getScrollPane().setBorder(null); - - return editor; - } } private static class MyDocument extends UserDataHolderBase implements DocumentEx {