mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
EditorTextFieldCellRenderer: ability to create non-abbreviating version + customize editor
This commit is contained in:
@@ -57,7 +57,7 @@ import java.util.List;
|
||||
*/
|
||||
public abstract class EditorTextFieldCellRenderer implements TableCellRenderer, Disposable {
|
||||
|
||||
private static final Key<RendererComponent> MY_PANEL_PROPERTY = Key.create("EditorTextFieldCellRenderer.MyEditorPanel");
|
||||
private static final Key<SimpleRendererComponent> 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 {
|
||||
|
||||
Reference in New Issue
Block a user