Gridarta Editor
TextAreaPainter.java
Go to the documentation of this file.
1 /*
2  * TextAreaPainter.java - Paints the text area
3  * Copyright (C) 1999 Slava Pestov
4  * Copyright (C) 2000-2023 The Gridarta Developers.
5  *
6  * You may use and modify this package for any purpose. Redistribution is
7  * permitted, in both source and binary form, provided that this notice
8  * remains intact in all source distributions of this package.
9  */
10 
11 package net.sf.gridarta.textedit.textarea;
12 
13 import java.awt.Color;
14 import java.awt.Cursor;
15 import java.awt.Dimension;
16 import java.awt.Font;
17 import java.awt.FontMetrics;
18 import java.awt.Graphics;
19 import java.awt.Rectangle;
20 import java.awt.font.FontRenderContext;
21 import java.awt.font.TextLayout;
22 import java.util.Collections;
23 import java.util.LinkedList;
24 import java.util.List;
25 import javax.swing.JComponent;
26 import javax.swing.ToolTipManager;
27 import javax.swing.text.Segment;
28 import javax.swing.text.TabExpander;
29 import javax.swing.text.Utilities;
31 import org.apache.log4j.Category;
32 import org.apache.log4j.Logger;
33 import org.jetbrains.annotations.NotNull;
34 import org.jetbrains.annotations.Nullable;
35 
42 public class TextAreaPainter extends JComponent implements TabExpander {
43 
47  @NotNull
48  private static final Category LOG = Logger.getLogger(TextAreaPainter.class);
49 
53  private static final long serialVersionUID = 1L;
54 
58  private final FontRenderContext fontRenderContext = new FontRenderContext(null, false, false);
59 
64  @NotNull
65  private final JEditTextArea textArea;
66 
67  @NotNull
69 
70  @NotNull
71  private final TextAreaCaret caret;
72 
76  @NotNull
77  private final TextAreaBrackets brackets;
78 
82  @NotNull
83  private final TextAreaConfig config;
84 
89  private final boolean blockCaret;
90 
94  @NotNull
96 
101  private final int cols;
102 
107  private final int rows;
108 
113  @NotNull
114  private final Color caretColor;
115 
120  @NotNull
121  private final Color selectionColor;
122 
127  @NotNull
128  private final Color lineHighlightColor;
129 
134  private final boolean lineHighlight;
135 
140  @NotNull
141  private final Color bracketHighlightColor;
142 
147  private final boolean bracketHighlight;
148 
153  private final boolean paintInvalid;
154 
159  @NotNull
160  private final Color eolMarkerColor;
161 
166  private final boolean eolMarkers;
167 
172  private int currentLineIndex = -1;
173 
177  @Nullable
178  private List<Token> currentLineTokens;
179 
183  @NotNull
184  private final Segment currentLine = new Segment();
185 
190  private int tabSize;
191 
196  @Nullable
197  private FontMetrics fontMetrics;
198 
205  @Nullable
206  private Font defaultFont;
207 
213  private int defaultLineHeight;
214 
220  private int defaultCharWidth;
221 
222  private int visibleLines;
223 
224  private int firstLine;
225 
226  private int horizontalOffset;
227 
228  @NotNull
229  private final Segment lineSegment = new Segment();
230 
240  public TextAreaPainter(@NotNull final JEditTextArea textArea, @NotNull final TextAreaSelection selection, @NotNull final TextAreaCaret caret, @NotNull final TextAreaDefaults defaults, @NotNull final TextAreaBrackets brackets, @NotNull final TextAreaConfig config, final boolean paintInvalid) {
241  this.textArea = textArea;
242  this.selection = selection;
243  this.caret = caret;
244  this.brackets = brackets;
245  this.config = config;
246 
247  setAutoscrolls(true);
248  setDoubleBuffered(true);
249  setOpaque(true);
250 
251  ToolTipManager.sharedInstance().registerComponent(this);
252 
253  setCursor(Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR));
254 
255  final Font font = new Font("Monospaced", Font.PLAIN, 14);
256  super.setFont(font);
257  fontMetrics = getFontMetrics(font);
258  setForeground(Color.black);
259  setBackground(Color.white);
260 
261  blockCaret = defaults.getBlockCaret();
262  styles = defaults.getStyles();
263  cols = defaults.getCols();
264  rows = defaults.getRows();
265  caretColor = defaults.getCaretColor();
266  selectionColor = defaults.getSelectionColor();
267  lineHighlightColor = defaults.getLineHighlightColor();
268  lineHighlight = defaults.getLineHighlight();
269  bracketHighlightColor = defaults.getBracketHighlightColor();
270  bracketHighlight = defaults.getBracketHighlight();
271  this.paintInvalid = paintInvalid;
272  eolMarkerColor = defaults.getEolMarkerColor();
273  eolMarkers = defaults.getEolMarkers();
274  }
275 
280  private void updateLineInfo() {
281  final Font font = getFont();
282  if (defaultFont != null && defaultFont.equals(font)) {
283  return;
284  }
285 
286  defaultCharWidth = (int) Math.round(new TextLayout("WgGhdJj", font, fontRenderContext).getAdvance() / 7.0);
287  defaultLineHeight = Math.round(font.getLineMetrics("WgGhdJj", fontRenderContext).getHeight());
288  defaultFont = font;
289  }
290 
296  private int getDefaultLineHeight() {
297  updateLineInfo();
298  return defaultLineHeight;
299  }
300 
306  public int getDefaultCharWidth() {
307  updateLineInfo();
308  return defaultCharWidth;
309  }
310 
316  @NotNull
318  return styles;
319  }
320 
326  public void setStyles(@NotNull final SyntaxStyles styles) {
327  this.styles = styles;
328  repaint();
329  }
330 
337  public boolean isBracketHighlightEnabled() {
338  return bracketHighlight;
339  }
340 
345  public boolean isBlockCaretEnabled() {
346  return blockCaret;
347  }
348 
353  @Nullable
354  public FontMetrics getFontMetrics() {
355  return fontMetrics;
356  }
357 
358  @Override
359  public final void setFont(@NotNull final Font font) {
360  super.setFont(font);
361  fontMetrics = getFontMetrics(font);
363  }
364 
369  @Override
370  public void paint(@NotNull final Graphics g) {
371  tabSize = fontMetrics.charWidth(' ') * 4; // I want 4-space wide tabs
372 
373  final Rectangle clipRectangle = g.getClipBounds();
374 
375  g.setColor(getBackground());
376  g.fillRect(clipRectangle.x, clipRectangle.y, clipRectangle.width, clipRectangle.height);
377 
378  // We don't use yToLine() here because that method doesn't
379  // return lines past the end of the document
380  final int height = fontMetrics.getHeight();
381  final int firstInvalid = firstLine + clipRectangle.y / height;
382  // Because the clipRectangle's height is usually an even multiple
383  // of the font height, we subtract 1 from it, otherwise one
384  // too many lines will always be painted.
385  final int lastInvalid = firstLine + (clipRectangle.y + clipRectangle.height - 1) / height;
386 
387  try {
388  final TokenMarker tokenMarker = selection.getDocument().getTokenMarker();
389 
390  for (int line = firstInvalid; line <= lastInvalid; line++) {
391  paintLine(g, tokenMarker, line, horizontalOffset);
392  }
393 
394  if (tokenMarker != null && tokenMarker.isNextLineRequested()) {
395  final int h = clipRectangle.y + clipRectangle.height;
396  repaint(0, h, getWidth(), getHeight() - h);
397  }
398  } catch (final Exception e) {
399  LOG.error("Error repainting line range {" + firstInvalid + ", " + lastInvalid + "}", e);
400  }
401  }
402 
407  public void invalidateLine(final int line) {
408  repaint(0, lineToY(line) + fontMetrics.getMaxDescent() + fontMetrics.getLeading(), getWidth(), fontMetrics.getHeight());
409  }
410 
416  public void invalidateLineRange(final int firstLine, final int lastLine) {
417  repaint(0, lineToY(firstLine) + fontMetrics.getMaxDescent() + fontMetrics.getLeading(), getWidth(), (lastLine - firstLine + 1) * fontMetrics.getHeight());
418  }
419 
423  public void invalidateSelectedLines() {
425  }
426 
427  @Override
428  public float nextTabStop(final float x, final int tabOffset) {
429  final int nTabs = ((int) x - horizontalOffset) / tabSize;
430  return (nTabs + 1) * tabSize + horizontalOffset;
431  }
432 
433  @NotNull
434  @Override
435  public Dimension getPreferredSize() {
436  final Dimension dim = super.getPreferredSize();
437  return dim == null ? newDimension(cols, rows) : dim;
438  }
439 
440  @NotNull
441  @Override
442  public Dimension getMinimumSize() {
443  final Dimension dim = super.getMinimumSize();
444  return dim == null ? newDimension(1, 1) : dim;
445  }
446 
453  @NotNull
454  private Dimension newDimension(final int columns, final int rows) {
455  return new Dimension(columns * fontMetrics.charWidth('w'), rows * fontMetrics.getHeight());
456  }
457 
465  private void paintLine(@NotNull final Graphics gfx, @Nullable final TokenMarker tokenMarker, final int line, final int x) {
466  currentLineIndex = line;
467  final int y = lineToY(line);
468 
469  final Font font = getFont();
470  final Color foreground = getForeground();
471  if (line < 0 || line >= selection.getLineCount()) {
472  if (paintInvalid) {
473  paintHighlight(gfx, line, y);
475  gfx.drawString("~", 0, y + fontMetrics.getHeight());
476  }
477  } else if (tokenMarker == null) {
478  paintPlainLine(gfx, line, font, foreground, x, y);
479  } else {
480  paintSyntaxLine(gfx, tokenMarker, line, font, foreground, x, y);
481  }
482  }
483 
493  private void paintPlainLine(@NotNull final Graphics gfx, final int line, @NotNull final Font defaultFont, @NotNull final Color defaultColor, final int x, final int y) {
494  paintHighlight(gfx, line, y);
496 
497  gfx.setFont(defaultFont);
498  gfx.setColor(defaultColor);
499 
500  final int yy = y + fontMetrics.getHeight();
501  final int xx = Utilities.drawTabbedText(currentLine, x, yy, gfx, this, 0);
502 
503  if (eolMarkers) {
504  gfx.setColor(eolMarkerColor);
505  gfx.drawString(".", xx, yy);
506  }
507  }
508 
519  private void paintSyntaxLine(@NotNull final Graphics gfx, @NotNull final TokenMarker tokenMarker, final int line, @NotNull final Font defaultFont, @NotNull final Color defaultColor, final int x, final int y) {
521  currentLineTokens = tokenMarker.markTokens(currentLine, currentLineIndex);
522 
523  paintHighlight(gfx, line, y);
524 
525  gfx.setFont(defaultFont);
526  gfx.setColor(defaultColor);
527  final int yy = y + fontMetrics.getHeight();
528  final int xx = SyntaxUtilities.paintSyntaxLine(currentLine, currentLineTokens, styles, this, gfx, x, yy);
529 
530  if (eolMarkers) {
531  // draw End-Of-Line markers, if enabled
532  gfx.setColor(eolMarkerColor);
533  gfx.drawString(".", xx, yy);
534  }
535  }
536 
544  private void paintHighlight(@NotNull final Graphics gfx, final int line, final int y) {
545  if (line >= selection.getSelectionStartLine() && line <= selection.getSelectionEndLine()) {
546  paintLineHighlight(gfx, line, y);
547  }
548 
549  if (bracketHighlight && line == brackets.getBracketLine()) {
550  paintBracketHighlight(gfx, line, y);
551  }
552 
553  if (line == selection.getCaretLine()) {
554  paintCaret(gfx, line, y); // CARET gets drawn at this point (if currently visible)
555  }
556  }
557 
564  private void paintLineHighlight(@NotNull final Graphics gfx, final int line, final int y) {
565  final int height = fontMetrics.getHeight();
566  final int yy = y + fontMetrics.getLeading() + fontMetrics.getMaxDescent();
567 
568  final int selectionStart = selection.getSelectionStart();
569  final int selectionEnd = selection.getSelectionEnd();
570 
571  if (selectionStart == selectionEnd) {
572  if (lineHighlight) {
573  gfx.setColor(lineHighlightColor);
574  gfx.fillRect(0, yy, getWidth(), height);
575  }
576  } else {
577  gfx.setColor(selectionColor);
578 
579  final int selectionStartLine = selection.getSelectionStartLine();
580  final int selectionEndLine = selection.getSelectionEndLine();
581  final int lineStart = selection.getLineStartOffset(line);
582 
583  final int x1;
584  final int x2;
586  final int lineLen = selection.getLineLength(line);
587  x1 = offsetToX2(line, Math.min(lineLen, selectionStart - selection.getLineStartOffset(selectionStartLine)));
588  final int x3 = offsetToX2(line, Math.min(lineLen, selectionEnd - selection.getLineStartOffset(selectionEndLine)));
589  x2 = x3 + (x1 == x3 ? 1 : 0);
590  } else if (selectionStartLine == selectionEndLine) {
591  x1 = offsetToX2(line, selectionStart - lineStart);
592  x2 = offsetToX2(line, selectionEnd - lineStart);
593  } else if (line == selectionStartLine) {
594  x1 = offsetToX2(line, selectionStart - lineStart);
595  x2 = getWidth();
596  } else if (line == selectionEndLine) {
597  x1 = 0;
598  x2 = offsetToX2(line, selectionEnd - lineStart);
599  } else {
600  x1 = 0;
601  x2 = getWidth();
602  }
603 
604  gfx.fillRect(Math.min(x1, x2), yy, Math.abs(x1 - x2), height);
605  }
606 
607  }
608 
615  private void paintBracketHighlight(@NotNull final Graphics gfx, final int line, final int y) {
616  final int position = brackets.getBracketPosition();
617  if (position == -1) {
618  return;
619  }
620 
621  final int yy = y + fontMetrics.getLeading() + fontMetrics.getMaxDescent();
622  final int xx = offsetToX2(line, position);
623  gfx.setColor(bracketHighlightColor);
624  // Hack!!! Since there is no fast way to get the character
625  // from the bracket matching routine, we use ( since all
626  // brackets probably have the same width anyway
627  gfx.drawRect(xx, yy, fontMetrics.charWidth('(') - 1, fontMetrics.getHeight() - 1);
628  }
629 
636  private void paintCaret(@NotNull final Graphics gfx, final int line, final int y) {
637  if (caret.isCaretVisible()) {
638  final int offset = selection.getCaretPosition() - selection.getLineStartOffset(line);
639  final int caretX = offsetToX2(line, offset);
640  final int caretWidth = blockCaret || config.isOverwrite() ? fontMetrics.charWidth('w') : 1;
641  final int yy = y + fontMetrics.getLeading() + fontMetrics.getMaxDescent();
642  final int height = fontMetrics.getHeight();
643 
644  gfx.setColor(caretColor);
645 
646  if (config.isOverwrite()) {
647  gfx.fillRect(caretX, yy + height - 1, caretWidth, 1);
648  } else {
649  if (caretWidth <= 1) {
650  // This special case is very important: If 'caretWidth = 1' below rectangle would
651  // have zero width. With JDK 1.4.1, such a rectangle with zero width does not get drawn,
652  // which leads to incredible problems. (Damn this was hard to figure out!)
653  gfx.drawLine(caretX, yy, caretX, yy + height - 1);
654  } else {
655  gfx.drawRect(caretX, yy, caretWidth - 1, height - 1);
656  }
657  }
658  }
659  }
660 
665  public int getCurrentLineIndex() {
666  return currentLineIndex;
667  }
668 
673  public void setCurrentLineIndex(final int lineIndex) {
674  currentLineIndex = lineIndex;
675  }
676 
681  @Nullable
682  private List<Token> getCurrentLineTokens() {
683  return currentLineTokens == null ? null : Collections.unmodifiableList(currentLineTokens);
684  }
685 
690  private void setCurrentLineTokens(@Nullable final List<Token> tokens) {
691  currentLineTokens = tokens == null ? null : new LinkedList<>(tokens);
692  }
693 
698  public void recalculateVisibleLines() {
699  final int height = getHeight();
700 
701  // get line height
702  final int lineHeight;
703  if (fontMetrics == null) {
704  lineHeight = getDefaultLineHeight(); // default height might be wrong, take it only when needed
705  } else {
706  lineHeight = fontMetrics.getHeight();
707  }
708 
709  visibleLines = height / lineHeight;
711  }
712 
713  public int getVisibleLines() {
714  return visibleLines;
715  }
716 
720  public int getFirstLine() {
721  return firstLine;
722  }
723 
724  public boolean setFirstLine(final int firstLine) {
725  if (firstLine == this.firstLine) {
726  return false;
727  }
728 
729  this.firstLine = firstLine;
730  return true;
731  }
732 
737  public int lineToY(final int line) {
738  return (line - firstLine) * fontMetrics.getHeight() - (fontMetrics.getLeading() + fontMetrics.getMaxDescent());
739  }
740 
744  public int getHorizontalOffset() {
745  return horizontalOffset;
746  }
747 
748  public boolean setHorizontalOffset(final int horizontalOffset) {
749  if (this.horizontalOffset == horizontalOffset) {
750  return false;
751  }
752 
753  this.horizontalOffset = horizontalOffset;
754  return true;
755  }
756 
764  public int offsetToX2(final int line, final int offset) {
765  final TokenMarker tokenMarker = selection.getTokenMarker();
766 
767  /* Use painter's cached info for speed */
768  FontMetrics fm = fontMetrics;
769 
771 
772  final int segmentOffset = lineSegment.offset;
773  int x = horizontalOffset;
774 
775  /* If syntax coloring is disabled, do simple translation */
776  if (tokenMarker == null) {
777  lineSegment.count = offset;
778  return x + Utilities.getTabbedTextWidth(lineSegment, fm, x, this, 0);
779  }
780  /* If syntax coloring is enabled, we have to do this because
781  * tokens can vary in width */
782  final List<Token> tokens;
783  if (currentLineIndex == line && getCurrentLineTokens() != null) {
784  tokens = getCurrentLineTokens();
785  } else {
786  currentLineIndex = line;
787  tokens = tokenMarker.markTokens(lineSegment, line);
788  setCurrentLineTokens(tokens);
789  }
790 
791  final Font defaultFont = getFont();
792  for (final Token token : tokens) {
793  final byte id = token.getId();
794  fm = id == Token.NULL ? fontMetrics : styles.getStyle(id).getFontMetrics(defaultFont, getGraphics());
795 
796  final int length = token.getLength();
797 
798  if (offset + segmentOffset < lineSegment.offset + length) {
799  lineSegment.count = offset - (lineSegment.offset - segmentOffset);
800  return x + Utilities.getTabbedTextWidth(lineSegment, fm, x, this, 0);
801  }
802  lineSegment.count = length;
803  x += Utilities.getTabbedTextWidth(lineSegment, fm, x, this, 0);
804  lineSegment.offset += length;
805  }
806  return x;
807  }
808 
815  public int offsetToX(final int line, final int offset) {
816  // don't use cached tokens
817  setCurrentLineTokens(null);
818  return offsetToX2(line, offset);
819  }
820 
825  public int yToLine(final int y) {
826  final FontMetrics fm = fontMetrics;
827  final int height = fm.getHeight();
828  return Math.max(0, Math.min(selection.getLineCount() - 1, y / height + firstLine));
829  }
830 
836  public int xToOffset(final int line, final int x) {
837  final TokenMarker tokenMarker = selection.getTokenMarker();
838 
839  /* Use painter's cached info for speed */
840  FontMetrics fm = fontMetrics;
841 
843 
844  final char[] segmentArray = lineSegment.array;
845  final int segmentOffset = lineSegment.offset;
846  final int segmentCount = lineSegment.count;
847 
848  int width = horizontalOffset;
849 
850  if (tokenMarker == null) {
851  for (int i = 0; i < segmentCount; i++) {
852  final char c = segmentArray[i + segmentOffset];
853  final int charWidth;
854  if (c == '\t') {
855  charWidth = (int) nextTabStop(width, i) - width;
856  } else {
857  charWidth = fm.charWidth(c);
858  }
859 
860  if (blockCaret) {
861  if (x - charWidth <= width) {
862  return i;
863  }
864  } else {
865  if (x - charWidth / 2 <= width) {
866  return i;
867  }
868  }
869 
870  width += charWidth;
871  }
872 
873  return segmentCount;
874  }
875  final List<Token> tokens;
876  if (currentLineIndex == line && getCurrentLineTokens() != null) {
877  tokens = getCurrentLineTokens();
878  } else {
879  currentLineIndex = line;
880  tokens = tokenMarker.markTokens(lineSegment, line);
881  setCurrentLineTokens(tokens);
882  }
883 
884  int offset = 0;
885  final Font defaultFont = getFont();
886  for (final Token token : tokens) {
887  final byte id = token.getId();
888  fm = id == Token.NULL ? fontMetrics : styles.getStyle(id).getFontMetrics(defaultFont, getGraphics());
889 
890  final int length = token.getLength();
891 
892  for (int i = 0; i < length; i++) {
893  final char c = segmentArray[segmentOffset + offset + i];
894  final int charWidth;
895  if (c == '\t') {
896  charWidth = (int) nextTabStop(width, offset + i) - width;
897  } else {
898  charWidth = fm.charWidth(c);
899  }
900 
901  if (blockCaret) {
902  if (x - charWidth <= width) {
903  return offset + i;
904  }
905  } else {
906  if (x - charWidth / 2 <= width) {
907  return offset + i;
908  }
909  }
910 
911  width += charWidth;
912  }
913 
914  offset += length;
915  }
916  return offset;
917  }
918 
924  public int xyToOffset(final int x, final int y) {
925  final int line = yToLine(y);
926  final int start = selection.getLineStartOffset(line);
927  return start + xToOffset(line, x);
928  }
929 
930 }
net.sf.gridarta.textedit.textarea.TextAreaPainter.brackets
final TextAreaBrackets brackets
The brackets to paint.
Definition: TextAreaPainter.java:77
net.sf.gridarta.textedit.textarea.TextAreaPainter.LOG
static final Category LOG
The Logger for printing log messages.
Definition: TextAreaPainter.java:48
net.sf.gridarta.textedit.textarea.TextAreaPainter.setHorizontalOffset
boolean setHorizontalOffset(final int horizontalOffset)
Definition: TextAreaPainter.java:748
net.sf.gridarta.textedit.textarea.SyntaxDocument.getTokenMarker
TokenMarker getTokenMarker()
Returns the token marker that is to be used to split lines of this document up into tokens.
Definition: SyntaxDocument.java:42
net.sf.gridarta.textedit.textarea.TextAreaDefaults
Encapsulates default settings for a text area.
Definition: TextAreaDefaults.java:26
net.sf.gridarta.textedit.textarea.SyntaxStyle.setGraphicsFlags
void setGraphicsFlags(final Graphics gfx, final Font font)
Sets the text color and font of the specified graphics context to that specified in this style.
Definition: SyntaxStyle.java:145
net.sf.gridarta.textedit.textarea.TextAreaPainter.paintInvalid
final boolean paintInvalid
Whether invalid lines should be painted as red tildes.
Definition: TextAreaPainter.java:153
net.sf.gridarta.textedit.textarea.TextAreaPainter.textArea
final JEditTextArea textArea
The associated text area that is painted.
Definition: TextAreaPainter.java:65
net.sf.gridarta.textedit.textarea.TextAreaPainter.selectionColor
final Color selectionColor
The selection color.
Definition: TextAreaPainter.java:121
net.sf.gridarta.textedit.textarea.JEditTextArea
jEdit's text area component.
Definition: JEditTextArea.java:91
net.sf.gridarta.textedit.textarea.TextAreaSelection.getSelectionStart
int getSelectionStart()
Returns the selection start offset.
Definition: TextAreaSelection.java:60
net.sf.gridarta.textedit.textarea.TextAreaPainter.getVisibleLines
int getVisibleLines()
Definition: TextAreaPainter.java:713
net.sf.gridarta.textedit.textarea.TextAreaPainter.nextTabStop
float nextTabStop(final float x, final int tabOffset)
Definition: TextAreaPainter.java:428
net.sf.gridarta.textedit.textarea.TextAreaSelection.getSelectionEnd
int getSelectionEnd()
Returns the selection end offset.
Definition: TextAreaSelection.java:74
net.sf.gridarta.textedit.textarea.TextAreaPainter.horizontalOffset
int horizontalOffset
Definition: TextAreaPainter.java:226
net.sf.gridarta.textedit.textarea.TextAreaSelection.getSelectionEndLine
int getSelectionEndLine()
Returns the selection end line.
Definition: TextAreaSelection.java:81
net.sf.gridarta.textedit.textarea.TextAreaPainter.setCurrentLineTokens
void setCurrentLineTokens(@Nullable final List< Token > tokens)
Sets the tokens of the currently painted line.
Definition: TextAreaPainter.java:690
net.sf.gridarta.textedit.textarea
This package contains the other part of the script editor.
net.sf.gridarta
Base package of all Gridarta classes.
net.sf.gridarta.textedit.textarea.TextAreaPainter.invalidateLineRange
void invalidateLineRange(final int firstLine, final int lastLine)
Marks a range of lines as needing a repaint.
Definition: TextAreaPainter.java:416
net.sf.gridarta.textedit.textarea.TextAreaPainter.isBlockCaretEnabled
boolean isBlockCaretEnabled()
Returns whether the caret should be drawn as a block.
Definition: TextAreaPainter.java:345
net.sf.gridarta.textedit.textarea.TextAreaSelection.isSelectionRectangular
boolean isSelectionRectangular()
Returns true if the selection is rectangular, false otherwise.
Definition: TextAreaSelection.java:280
net.sf.gridarta.textedit.textarea.Token.NULL
static final byte NULL
Normal text token id.
Definition: Token.java:26
net.sf.gridarta.textedit.textarea.TextAreaPainter.getCurrentLineIndex
int getCurrentLineIndex()
Returns the currently painted line.
Definition: TextAreaPainter.java:665
net.sf.gridarta.textedit.textarea.TextAreaPainter.fontRenderContext
final FontRenderContext fontRenderContext
The font render context for this instance.
Definition: TextAreaPainter.java:58
net.sf.gridarta.textedit.textarea.TextAreaSelection.getTokenMarker
TokenMarker getTokenMarker()
Returns the document's token marker.
Definition: TextAreaSelection.java:306
net.sf.gridarta.textedit.textarea.TextAreaPainter.getHorizontalOffset
int getHorizontalOffset()
Returns the horizontal offset of drawn lines.
Definition: TextAreaPainter.java:744
net.sf
net.sf.gridarta.textedit.textarea.TextAreaPainter.config
final TextAreaConfig config
The TextAreaConfig options to use.
Definition: TextAreaPainter.java:83
net.sf.gridarta.textedit.textarea.TextAreaPainter.defaultFont
Font defaultFont
The Font from which defaultLineHeight and {} have been calculated.
Definition: TextAreaPainter.java:206
net.sf.gridarta.textedit.textarea.TextAreaPainter.caretColor
final Color caretColor
The caret color.
Definition: TextAreaPainter.java:114
net.sf.gridarta.textedit.textarea.TextAreaPainter.setStyles
void setStyles(@NotNull final SyntaxStyles styles)
Sets the syntax styles used to paint colorized text.
Definition: TextAreaPainter.java:326
net.sf.gridarta.textedit.textarea.TextAreaPainter.paintPlainLine
void paintPlainLine(@NotNull final Graphics gfx, final int line, @NotNull final Font defaultFont, @NotNull final Color defaultColor, final int x, final int y)
Paint a line without token highlighting.
Definition: TextAreaPainter.java:493
net.sf.gridarta.textedit.textarea.TextAreaPainter.invalidateSelectedLines
void invalidateSelectedLines()
Repaints the lines containing the selection.
Definition: TextAreaPainter.java:423
net.sf.gridarta.textedit.textarea.TextAreaSelection.getLineText
CharSequence getLineText(final int lineIndex)
Returns the text on the specified line.
Definition: TextAreaSelection.java:398
net.sf.gridarta.textedit.textarea.TextAreaPainter.lineHighlightColor
final Color lineHighlightColor
The color for line highlighting.
Definition: TextAreaPainter.java:128
net.sf.gridarta.textedit.textarea.TextAreaPainter.paint
void paint(@NotNull final Graphics g)
Repaints the text.
Definition: TextAreaPainter.java:370
net.sf.gridarta.textedit.textarea.TextAreaSelection.getDocument
SyntaxDocument getDocument()
Returns the document this text area is editing.
Definition: TextAreaSelection.java:297
net.sf.gridarta.textedit.textarea.TextAreaPainter.getFontMetrics
FontMetrics getFontMetrics()
Returns the font metrics used by this component.
Definition: TextAreaPainter.java:354
net.sf.gridarta.textedit
net.sf.gridarta.textedit.textarea.TextAreaPainter.recalculateVisibleLines
void recalculateVisibleLines()
Recalculates the number of visible lines.
Definition: TextAreaPainter.java:698
net.sf.gridarta.textedit.textarea.TextAreaBrackets.getBracketPosition
int getBracketPosition()
Returns the position of the highlighted bracket (the bracket matching the one before the caret).
Definition: TextAreaBrackets.java:43
net.sf.gridarta.textedit.textarea.TextAreaPainter.currentLineIndex
int currentLineIndex
The currently painted line.
Definition: TextAreaPainter.java:172
net.sf.gridarta.textedit.textarea.TextAreaPainter.setFirstLine
boolean setFirstLine(final int firstLine)
Definition: TextAreaPainter.java:724
net.sf.gridarta.textedit.textarea.TextAreaSelection
Definition: TextAreaSelection.java:29
net.sf.gridarta.textedit.textarea.TextAreaPainter.lineHighlight
final boolean lineHighlight
Whether line highlighting is enabled.
Definition: TextAreaPainter.java:134
net.sf.gridarta.textedit.textarea.TextAreaPainter
The text area repaint manager.
Definition: TextAreaPainter.java:42
net.sf.gridarta.textedit.textarea.TextAreaPainter.TextAreaPainter
TextAreaPainter(@NotNull final JEditTextArea textArea, @NotNull final TextAreaSelection selection, @NotNull final TextAreaCaret caret, @NotNull final TextAreaDefaults defaults, @NotNull final TextAreaBrackets brackets, @NotNull final TextAreaConfig config, final boolean paintInvalid)
Creates a new repaint manager.
Definition: TextAreaPainter.java:240
net.sf.gridarta.textedit.textarea.TextAreaPainter.paintCaret
void paintCaret(@NotNull final Graphics gfx, final int line, final int y)
Paints the caret highlight.
Definition: TextAreaPainter.java:636
net.sf.gridarta.textedit.textarea.tokenmarker.TokenMarker.isNextLineRequested
boolean isNextLineRequested()
Returns true if the next line should be repainted.
Definition: TokenMarker.java:188
net.sf.gridarta.textedit.textarea.Token
A linked list of tokens.
Definition: Token.java:21
net.sf.gridarta.textedit.textarea.TextAreaPainter.setCurrentLineIndex
void setCurrentLineIndex(final int lineIndex)
Sets the currently painted line.
Definition: TextAreaPainter.java:673
net.sf.gridarta.textedit.textarea.TextAreaSelection.getLineCount
int getLineCount()
Returns the number of lines in the document.
Definition: TextAreaSelection.java:321
net.sf.gridarta.textedit.textarea.TextAreaSelection.getLineStartOffset
int getLineStartOffset(final int line)
Returns the start offset of the specified line.
Definition: TextAreaSelection.java:339
net.sf.gridarta.textedit.textarea.tokenmarker
Definition: CrossfireDialogTokenMarker.java:20
net.sf.gridarta.textedit.textarea.TextAreaPainter.xToOffset
int xToOffset(final int line, final int x)
Converts a x co-ordinate to an offset within a line.
Definition: TextAreaPainter.java:836
net
net.sf.gridarta.textedit.textarea.TextAreaSelection.getCaretPosition
int getCaretPosition()
Returns the caret position.
Definition: TextAreaSelection.java:94
net.sf.gridarta.textedit.textarea.TextAreaPainter.getStyles
SyntaxStyles getStyles()
Returns the syntax styles used to paint colorized text.
Definition: TextAreaPainter.java:317
net.sf.gridarta.textedit.textarea.TextAreaPainter.offsetToX2
int offsetToX2(final int line, final int offset)
Converts an offset in a line into an x co-ordinate.
Definition: TextAreaPainter.java:764
net.sf.gridarta.textedit.textarea.Token.INVALID
static final byte INVALID
Invalid token id.
Definition: Token.java:84
net.sf.gridarta.textedit.textarea.TextAreaPainter.paintBracketHighlight
void paintBracketHighlight(@NotNull final Graphics gfx, final int line, final int y)
Paints the bracket highlight.
Definition: TextAreaPainter.java:615
net.sf.gridarta.textedit.textarea.TextAreaPainter.tabSize
int tabSize
The tab size in pixels.
Definition: TextAreaPainter.java:190
net.sf.gridarta.textedit.textarea.TextAreaPainter.caret
final TextAreaCaret caret
Definition: TextAreaPainter.java:71
net.sf.gridarta.textedit.textarea.TextAreaPainter.getFirstLine
int getFirstLine()
Returns the line displayed at the text area's origin.
Definition: TextAreaPainter.java:720
net.sf.gridarta.textedit.textarea.SyntaxStyles.getStyle
SyntaxStyle getStyle(final byte id)
Returns a style for a token id.
Definition: SyntaxStyles.java:59
net.sf.gridarta.textedit.textarea.TextAreaConfig.isOverwrite
boolean isOverwrite()
Returns whether overwrite mode is active.
Definition: TextAreaConfig.java:50
net.sf.gridarta.textedit.textarea.TextAreaPainter.yToLine
int yToLine(final int y)
Converts a y co-ordinate to a line index.
Definition: TextAreaPainter.java:825
net.sf.gridarta.textedit.textarea.TextAreaPainter.eolMarkers
final boolean eolMarkers
Whether end of line markers should be painted.
Definition: TextAreaPainter.java:166
net.sf.gridarta.textedit.textarea.TextAreaPainter.visibleLines
int visibleLines
Definition: TextAreaPainter.java:222
net.sf.gridarta.textedit.textarea.JEditTextArea.updateScrollBars
void updateScrollBars()
Updates the state of the scroll bars.
Definition: JEditTextArea.java:299
net.sf.gridarta.textedit.textarea.TextAreaPainter.fontMetrics
FontMetrics fontMetrics
The font metrics for this instance.
Definition: TextAreaPainter.java:197
net.sf.gridarta.textedit.textarea.TextAreaPainter.lineToY
int lineToY(final int line)
Converts a line index to a y co-ordinate.
Definition: TextAreaPainter.java:737
net.sf.gridarta.textedit.textarea.SyntaxStyle.getFontMetrics
FontMetrics getFontMetrics(final Font font, final Graphics g)
Returns the font metrics for the styled font.
Definition: SyntaxStyle.java:126
net.sf.gridarta.textedit.textarea.SyntaxUtilities
Class with several utility functions used by jEdit's syntax colorizing subsystem.
Definition: SyntaxUtilities.java:27
net.sf.gridarta.textedit.textarea.TextAreaPainter.getCurrentLineTokens
List< Token > getCurrentLineTokens()
Returns the tokens of the currently painted line.
Definition: TextAreaPainter.java:682
net.sf.gridarta.textedit.textarea.TextAreaPainter.currentLineTokens
List< Token > currentLineTokens
The tokens of the currently painted line.
Definition: TextAreaPainter.java:178
net.sf.gridarta.textedit.textarea.TextAreaPainter.serialVersionUID
static final long serialVersionUID
The serial version UID.
Definition: TextAreaPainter.java:53
net.sf.gridarta.textedit.textarea.TextAreaPainter.defaultCharWidth
int defaultCharWidth
The character width of defaultFont.
Definition: TextAreaPainter.java:220
net.sf.gridarta.textedit.textarea.TextAreaBrackets
Maintains information about the highlighted pairs of brackets.
Definition: TextAreaBrackets.java:25
net.sf.gridarta.textedit.textarea.TextAreaPainter.paintHighlight
void paintHighlight(@NotNull final Graphics gfx, final int line, final int y)
Adds highlights for a line: selections, custom highlights from client code, brackets,...
Definition: TextAreaPainter.java:544
net.sf.gridarta.textedit.textarea.TextAreaPainter.isBracketHighlightEnabled
boolean isBracketHighlightEnabled()
Returns whether bracket highlighting is enabled.
Definition: TextAreaPainter.java:337
net.sf.gridarta.textedit.textarea.TextAreaPainter.currentLine
final Segment currentLine
Holds the currently painted line.
Definition: TextAreaPainter.java:184
net.sf.gridarta.textedit.textarea.TextAreaPainter.rows
final int rows
The number of rows.
Definition: TextAreaPainter.java:107
net.sf.gridarta.textedit.textarea.TextAreaPainter.getDefaultLineHeight
int getDefaultLineHeight()
This works only for fonts with fixed line height.
Definition: TextAreaPainter.java:296
net.sf.gridarta.textedit.textarea.TextAreaPainter.paintLine
void paintLine(@NotNull final Graphics gfx, @Nullable final TokenMarker tokenMarker, final int line, final int x)
Paints one line.
Definition: TextAreaPainter.java:465
net.sf.gridarta.textedit.textarea.TextAreaPainter.eolMarkerColor
final Color eolMarkerColor
The color for painting eol markers.
Definition: TextAreaPainter.java:160
net.sf.gridarta.textedit.textarea.TextAreaPainter.setFont
final void setFont(@NotNull final Font font)
Definition: TextAreaPainter.java:359
net.sf.gridarta.textedit.textarea.TextAreaPainter.selection
final TextAreaSelection selection
Definition: TextAreaPainter.java:68
net.sf.gridarta.textedit.textarea.TextAreaPainter.newDimension
Dimension newDimension(final int columns, final int rows)
Returns a Dimension measured in default character sizes.
Definition: TextAreaPainter.java:454
net.sf.gridarta.textedit.textarea.TextAreaPainter.getPreferredSize
Dimension getPreferredSize()
Definition: TextAreaPainter.java:435
net.sf.gridarta.textedit.textarea.tokenmarker.TokenMarker
A token marker that splits lines of text into tokens.
Definition: TokenMarker.java:32
net.sf.gridarta.textedit.textarea.TextAreaCaret
Definition: TextAreaCaret.java:22
net.sf.gridarta.textedit.textarea.TextAreaPainter.updateLineInfo
void updateLineInfo()
Make sure defaultCharWidth and defaultLineHeight are up-to-date.
Definition: TextAreaPainter.java:280
net.sf.gridarta.textedit.textarea.SyntaxUtilities.paintSyntaxLine
static int paintSyntaxLine(@NotNull final Segment line, @NotNull final Iterable< Token > tokens, @NotNull final SyntaxStyles styles, @NotNull final TabExpander expander, @NotNull final Graphics gfx, final int x, final int y)
Paints the specified line onto the graphics context.
Definition: SyntaxUtilities.java:101
net.sf.gridarta.textedit.textarea.TextAreaPainter.offsetToX
int offsetToX(final int line, final int offset)
Converts an offset in a line into an x co-ordinate.
Definition: TextAreaPainter.java:815
net.sf.gridarta.textedit.textarea.TextAreaPainter.getMinimumSize
Dimension getMinimumSize()
Definition: TextAreaPainter.java:442
net.sf.gridarta.textedit.textarea.TextAreaCaret.isCaretVisible
boolean isCaretVisible()
Returns true if the caret is visible, false otherwise.
Definition: TextAreaCaret.java:38
net.sf.gridarta.textedit.textarea.TextAreaPainter.blockCaret
final boolean blockCaret
Whether the caret should be wide even in insert mode.
Definition: TextAreaPainter.java:89
net.sf.gridarta.textedit.textarea.TextAreaConfig
Miscellaneous configuration settings for JEditTextArea.
Definition: TextAreaConfig.java:25
net.sf.gridarta.textedit.textarea.TextAreaPainter.defaultLineHeight
int defaultLineHeight
The line height of defaultFont.
Definition: TextAreaPainter.java:213
net.sf.gridarta.textedit.textarea.TextAreaPainter.bracketHighlightColor
final Color bracketHighlightColor
The color for bracket highlighting.
Definition: TextAreaPainter.java:141
net.sf.gridarta.textedit.textarea.TextAreaSelection.getLineLength
int getLineLength(final int line)
Returns the length of the specified line.
Definition: TextAreaSelection.java:359
net.sf.gridarta.textedit.textarea.TextAreaPainter.paintLineHighlight
void paintLineHighlight(@NotNull final Graphics gfx, final int line, final int y)
Paints the selection highlight.
Definition: TextAreaPainter.java:564
net.sf.gridarta.textedit.textarea.TextAreaPainter.invalidateLine
void invalidateLine(final int line)
Marks a line as needing a repaint.
Definition: TextAreaPainter.java:407
net.sf.gridarta.textedit.textarea.TextAreaPainter.paintSyntaxLine
void paintSyntaxLine(@NotNull final Graphics gfx, @NotNull final TokenMarker tokenMarker, final int line, @NotNull final Font defaultFont, @NotNull final Color defaultColor, final int x, final int y)
Paint a line with token highlighting.
Definition: TextAreaPainter.java:519
net.sf.gridarta.textedit.textarea.TextAreaPainter.cols
final int cols
The number of columns.
Definition: TextAreaPainter.java:101
net.sf.gridarta.textedit.textarea.TextAreaPainter.lineSegment
final Segment lineSegment
Definition: TextAreaPainter.java:229
net.sf.gridarta.textedit.textarea.tokenmarker.TokenMarker.markTokens
List< Token > markTokens(@NotNull final Segment line, final int lineIndex)
A wrapper for the lower-level.
Definition: TokenMarker.java:72
net.sf.gridarta.textedit.textarea.TextAreaSelection.getSelectionStartLine
int getSelectionStartLine()
Returns the selection start line.
Definition: TextAreaSelection.java:67
net.sf.gridarta.textedit.textarea.TextAreaPainter.styles
SyntaxStyles styles
The syntax styles used to paint colorized text.
Definition: TextAreaPainter.java:95
net.sf.gridarta.textedit.textarea.TextAreaPainter.bracketHighlight
final boolean bracketHighlight
Whether bracket highlighting is enabled.
Definition: TextAreaPainter.java:147
net.sf.gridarta.textedit.textarea.TextAreaPainter.xyToOffset
int xyToOffset(final int x, final int y)
Converts a point to an offset, from the start of the text.
Definition: TextAreaPainter.java:924
net.sf.gridarta.textedit.textarea.TextAreaSelection.getCaretLine
int getCaretLine()
Returns the caret line.
Definition: TextAreaSelection.java:101
net.sf.gridarta.textedit.textarea.SyntaxStyles
A set of SyntaxStyle instances for painting colorized text.
Definition: SyntaxStyles.java:29
net.sf.gridarta.textedit.textarea.TextAreaPainter.firstLine
int firstLine
Definition: TextAreaPainter.java:224
net.sf.gridarta.textedit.textarea.TextAreaBrackets.getBracketLine
int getBracketLine()
Returns the line of the highlighted bracket (the bracket matching the one before the caret).
Definition: TextAreaBrackets.java:52
net.sf.gridarta.textedit.textarea.TextAreaPainter.getDefaultCharWidth
int getDefaultCharWidth()
This works only for fonts with fixed line height.
Definition: TextAreaPainter.java:306