Gridarta Editor
JEditTextArea.java
Go to the documentation of this file.
1 /*
2  * JEditTextArea.java - jEdit's text component
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.AWTEvent;
14 import java.awt.Adjustable;
15 import java.awt.Font;
16 import java.awt.datatransfer.Clipboard;
17 import java.awt.datatransfer.DataFlavor;
18 import java.awt.datatransfer.StringSelection;
19 import java.awt.datatransfer.UnsupportedFlavorException;
20 import java.awt.event.ActionEvent;
21 import java.awt.event.ActionListener;
22 import java.awt.event.AdjustmentEvent;
23 import java.awt.event.AdjustmentListener;
24 import java.awt.event.ComponentAdapter;
25 import java.awt.event.ComponentEvent;
26 import java.awt.event.FocusEvent;
27 import java.awt.event.FocusListener;
28 import java.awt.event.InputEvent;
29 import java.awt.event.KeyEvent;
30 import java.awt.event.MouseAdapter;
31 import java.awt.event.MouseEvent;
32 import java.awt.event.MouseMotionListener;
33 import java.awt.event.MouseWheelEvent;
34 import java.io.IOException;
35 import java.lang.reflect.Field;
36 import java.lang.reflect.InvocationTargetException;
37 import java.lang.reflect.Method;
38 import java.util.HashSet;
39 import java.util.Set;
40 import javax.swing.JComponent;
41 import javax.swing.JPopupMenu;
42 import javax.swing.JScrollBar;
43 import javax.swing.KeyStroke;
44 import javax.swing.SwingUtilities;
45 import javax.swing.Timer;
46 import javax.swing.event.DocumentEvent;
47 import javax.swing.event.DocumentEvent.ElementChange;
48 import javax.swing.event.DocumentListener;
49 import javax.swing.text.BadLocationException;
50 import javax.swing.text.Document;
51 import javax.swing.text.Segment;
52 import javax.swing.undo.AbstractUndoableEdit;
53 import javax.swing.undo.CannotRedoException;
54 import javax.swing.undo.CannotUndoException;
55 import javax.swing.undo.UndoableEdit;
56 import org.apache.log4j.Category;
57 import org.apache.log4j.Logger;
58 import org.jetbrains.annotations.NotNull;
59 import org.jetbrains.annotations.Nullable;
60 
91 public class JEditTextArea extends JComponent {
92 
96  private static final Category LOG = Logger.getLogger(JEditTextArea.class);
97 
101  private static final long serialVersionUID = 1L;
102 
106  @NotNull
107  private String unmodifiedText = "";
108 
109  @Nullable
111 
112  @NotNull
113  private static final Timer CARET_TIMER = new Timer(500, new CaretBlinker());
114 
115  static {
116  CARET_TIMER.setInitialDelay(500);
117  CARET_TIMER.start();
118  }
119 
120  @NotNull
121  private final TextAreaPainter painter;
122 
123  @Nullable
124  private final JPopupMenu popup;
125 
126  @NotNull
127  private final TextAreaCaret caret;
128 
129  @NotNull
130  private final JScrollBar vertical = new JScrollBar(Adjustable.VERTICAL);
131 
132  @NotNull
133  private final JScrollBar horizontal = new JScrollBar(Adjustable.HORIZONTAL);
134 
135  private boolean scrollBarsInitialized;
136 
137  @NotNull
138  private final InputHandler inputHandler;
139 
140  @NotNull
141  private final SyntaxDocument document;
142 
143  @NotNull
145 
146  @NotNull
148 
152  @NotNull
153  private final TextAreaConfig config;
154 
161  public JEditTextArea(@NotNull final TextAreaDefaults defaults, @NotNull final SyntaxDocument document, final boolean paintInvalid) {
162  // Enable the necessary events
163  enableEvents(AWTEvent.KEY_EVENT_MASK);
164 
165  // Initialize some misc. stuff
166  caret = new TextAreaCaret(defaults.getCaretVisible(), defaults.getCaretBlinks());
168  config = new TextAreaConfig(defaults.getEditable(), defaults.getElectricScroll());
169  painter = new TextAreaPainter(this, selection, caret, defaults, brackets, config, paintInvalid);
171 
172  // Initialize the GUI
173  setLayout(new ScrollLayout(this));
177 
178  // Add some event listeners
179  vertical.addAdjustmentListener(new AdjustHandler());
180  horizontal.addAdjustmentListener(new AdjustHandler());
181  painter.addComponentListener(new ComponentHandler());
182  final MouseHandler mouseHandler = new MouseHandler();
183  painter.addMouseListener(mouseHandler);
184  painter.addMouseWheelListener(mouseHandler);
185  painter.addMouseMotionListener(new DragHandler());
186  addFocusListener(new FocusHandler());
187 
188  // Load the defaults
189  inputHandler = defaults.getInputHandler();
190  this.document = document;
191  document.addDocumentListener(new DocumentHandler());
192  select(0, 0);
194 
195  popup = defaults.getPopup();
196 
197  // free tab key from the focus traversal manager
199 
200  // We don't seem to get the initial focus event?
201  focusedComponent = this;
202  }
203 
230  try {
231  // preparing the key set first, this should be harmless
232  final Set<KeyStroke> forwardTraversalKeys = new HashSet<>();
233  forwardTraversalKeys.add(KeyStroke.getKeyStroke("control TAB"));
234 
235  // here we try to access java.awt.KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS
236  final Field field = Class.forName("java.awt.KeyboardFocusManager").getField("FORWARD_TRAVERSAL_KEYS");
237  final Integer value = field.getInt(field); // store the value of this field
238 
239  for (final Method method : getClass().getMethods()) {
240  // here we try to find the method "setFocusTraversalKeys", and execute it if found
241  if (method.getName().equalsIgnoreCase("setFocusTraversalKeys")) {
242  method.invoke(this, value, forwardTraversalKeys);
243  // System.err.println("freeTabKeyFromFocusTraversal() succeeded!");
244  }
245  }
246  } catch (final ClassNotFoundException | IllegalAccessException | InvocationTargetException | NoSuchFieldException ignored) {
247  // ignore
248  }
249  }
250 
255  @Override
256  public void setFont(@NotNull final Font font) {
257  painter.setFont(font);
258  }
259 
263  @NotNull
265  return inputHandler;
266  }
267 
272  private void setCaretVisible(final boolean caretVisible) {
273  caret.setCaretVisible(caretVisible);
275  }
276 
280  private void blinkCaret() {
281  if (caret.blinkCaret()) {
283  }
284  }
285 
290  public int getElectricScroll() {
291  return config.getElectricScroll();
292  }
293 
299  public void updateScrollBars() {
300  final int visibleLines = getVisibleLines();
301  if (visibleLines != 0) {
302  vertical.setValues(painter.getFirstLine(), visibleLines, 0, selection.getLineCount());
303  //vertical.setUnitIncrement(2);
304  vertical.setUnitIncrement(1); // scroll one line per click
305  vertical.setBlockIncrement(visibleLines);
306  }
307 
308  final int width = painter.getWidth();
309  if (width != 0) {
310  horizontal.setValues(-painter.getHorizontalOffset(), width, 0, width * 5);
311  //horizontal.setUnitIncrement(painter.getFontMetrics().charWidth('w'));
312  horizontal.setUnitIncrement(painter.getDefaultCharWidth());
313  horizontal.setBlockIncrement(width / 2);
314  }
315  }
316 
320  public int getFirstLine() {
321  return painter.getFirstLine();
322  }
323 
328  public void setFirstLine(final int firstLine) {
329  if (!painter.setFirstLine(firstLine)) {
330  return;
331  }
332 
333  if (firstLine != vertical.getValue()) {
335  }
336  painter.repaint();
337  }
338 
342  public int getVisibleLines() {
343  return painter.getVisibleLines();
344  }
345 
351  private void setHorizontalOffset(final int horizontalOffset) {
352  if (!painter.setHorizontalOffset(horizontalOffset)) {
353  return;
354  }
355 
356  if (horizontalOffset != horizontal.getValue()) {
358  }
359 
360  painter.repaint();
361  }
362 
368  private void setOrigin(final int firstLine, final int horizontalOffset) {
369  boolean changed = false;
370 
371  if (painter.setHorizontalOffset(horizontalOffset)) {
372  changed = true;
373  }
374 
375  if (painter.setFirstLine(firstLine)) {
376  changed = true;
377  }
378 
379  if (changed) {
381  painter.repaint();
382  }
383  }
384 
389  private void scrollToCaret() {
390  final int line = selection.getCaretLine();
391  final int lineStart = selection.getLineStartOffset(line);
392  final int offset = Math.max(0, Math.min(selection.getLineLength(line) - 1, selection.getCaretPosition() - lineStart));
393 
394  scrollTo(line, offset);
395  }
396 
402  public void setEditingFocus() {
403  try {
404  requestFocus();
405  setCaretVisible(true);
406  focusedComponent = this;
407  setCaretPosition(0); // set caret to 0, 0 coordinates
408  } catch (final NullPointerException e) {
409  LOG.error("Null Pointer Exception in JEditTextArea.setEditingFocus()");
410  }
411  }
412 
419  private void scrollTo(final int line, final int offset) {
420  // visibleLines == 0 before the component is realized
421  // we can't do any proper scrolling then, so we have
422  // this hack...
423  final int visibleLines = getVisibleLines();
424  final int electricScroll = config.getElectricScroll();
425  if (visibleLines == 0) {
426  setFirstLine(Math.max(0, line - electricScroll));
427  return;
428  }
429 
430  int newFirstLine = painter.getFirstLine();
431  final int horizontalOffset = painter.getHorizontalOffset();
432 
433  if (line < newFirstLine + electricScroll) {
434  newFirstLine = Math.max(0, line - electricScroll);
435  } else if (line + electricScroll >= newFirstLine + visibleLines) {
436  newFirstLine = (line - visibleLines) + electricScroll + 1;
437  if (newFirstLine + visibleLines >= selection.getLineCount()) {
438  newFirstLine = selection.getLineCount() - visibleLines;
439  }
440  if (newFirstLine < 0) {
441  newFirstLine = 0;
442  }
443  }
444 
445  final int x = painter.offsetToX2(line, offset);
446  final int width = painter.getFontMetrics().charWidth('w');
447 
448  int newHorizontalOffset = horizontalOffset;
449  if (x < 0) {
450  newHorizontalOffset = Math.min(0, horizontalOffset - x + width + 5);
451  } else if (x + width >= painter.getWidth()) {
452  newHorizontalOffset = horizontalOffset + (painter.getWidth() - x) - width - 5;
453  }
454 
455  setOrigin(newFirstLine, newHorizontalOffset);
456  }
457 
462  public int lineToY(final int line) {
463  return painter.lineToY(line);
464  }
465 
472  public int offsetToX(final int line, final int offset) {
473  return painter.offsetToX(line, offset);
474  }
475 
483  public int offsetToX2(final int line, final int offset) {
484  return painter.offsetToX2(line, offset);
485  }
486 
492  public int xToOffset(final int line, final int x) {
493  return painter.xToOffset(line, x);
494  }
495 
499  @NotNull
500  public Document getDocument() {
501  return selection.getDocument();
502  }
503 
508  public int getDocumentLength() {
509  return selection.getDocumentLength();
510  }
511 
515  public int getLineCount() {
516  return selection.getLineCount();
517  }
518 
525  public int getLineStartOffset(final int line) {
526  return selection.getLineStartOffset(line);
527  }
528 
535  public int getLineEndOffset(final int line) {
536  return selection.getLineEndOffset(line);
537  }
538 
542  @NotNull
543  public String getText() {
544  return selection.getText();
545  }
546 
550  public void setText(@NotNull final String text) {
551  selection.setText(text);
552  }
553 
560  @Nullable
561  public String getText(final int start, final int len) {
562  return selection.getText(start, len);
563  }
564 
572  public void getText(final int start, final int len, @NotNull final Segment segment) {
573  selection.getText(start, len, segment);
574  }
575 
581  @NotNull
582  public CharSequence getLineText(final int lineIndex) {
583  return selection.getLineText(lineIndex);
584  }
585 
589  public int getSelectionStart() {
590  return selection.getSelectionStart();
591  }
592 
596  public int getSelectionEnd() {
597  return selection.getSelectionEnd();
598  }
599 
605  public int getCaretPosition() {
606  return selection.getCaretPosition();
607  }
608 
612  public int getCaretLine() {
613  return selection.getCaretLine();
614  }
615 
621  public int getMarkPosition() {
622  return selection.getMarkPosition();
623  }
624 
631  public void setCaretPosition(final int caret) {
632  select(caret, caret);
633  }
634 
638  public void selectAll() {
640  }
641 
649  public void select(final int start, final int end) {
650  final int newStart;
651  final int newEnd;
652  final boolean newBias;
653  if (start <= end) {
654  newStart = start;
655  newEnd = end;
656  newBias = false;
657  } else {
658  newStart = end;
659  newEnd = start;
660  newBias = true;
661  }
662 
663  if (newStart < 0 || newEnd > getDocumentLength()) {
664  throw new IllegalArgumentException("Bounds out of range: " + newStart + ", " + newEnd);
665  }
666 
667  // If the new position is the same as the old, we don't
668  // do all this crap, however we still do the stuff at
669  // the end (clearing magic position, scrolling)
670  if (newStart != selection.getSelectionStart() || newEnd != selection.getSelectionEnd() || newBias != selection.getBiasLeft()) {
671  final int newStartLine = selection.getLineOfOffset(newStart);
672  final int newEndLine = selection.getLineOfOffset(newEnd);
673 
675  final int oldBracketLine = brackets.getBracketLine();
676  if (oldBracketLine != -1) {
677  painter.invalidateLine(oldBracketLine);
678  }
680  final int newBracketLine = brackets.getBracketLine();
681  if (newBracketLine != -1) {
682  painter.invalidateLine(newBracketLine);
683  }
684  }
685 
687  painter.invalidateLineRange(newStartLine, newEndLine);
688 
690  selection.setSelection(newStart, newEnd, newStartLine, newEndLine, newBias);
691  }
692 
693  // When the user is typing, etc, we don't want the caret
694  // to blink
695  caret.setBlink(true);
696  CARET_TIMER.restart();
697 
699 
700  config.setMagicCaret(-1); // Clear the `magic' caret position used by up/down
701 
702  scrollToCaret();
703  }
704 
708  @Nullable
709  public String getSelectedText() {
710  return selection.getSelectedText();
711  }
712 
717  public void setSelectedText(@NotNull final String selectedText) {
718  if (!config.isEditable()) {
719  throw new InternalError("Text component read only");
720  }
721 
722  selection.setSelectedText(selectedText);
723 
725  }
726 
730  public boolean isEditable() {
731  return config.isEditable();
732  }
733 
738  public int getMagicCaretPosition() {
739  return config.getMagicCaret();
740  }
741 
747  public void setMagicCaretPosition(final int magicCaret) {
748  config.setMagicCaret(magicCaret);
749  }
750 
758  public void overwriteSetSelectedText(@NotNull final String str) {
759  // Don't overstrike if there is a selection
761  setSelectedText(str);
762  return;
763  }
764 
765  // Don't overstrike if we're on the end of
766  // the line
767  final int caret = selection.getCaretPosition();
768  final int caretLineEnd = selection.getLineEndOffset(selection.getCaretLine());
769  if (caretLineEnd - caret <= str.length()) {
770  setSelectedText(str);
771  return;
772  }
773 
775 
776  try {
777  document.remove(caret, str.length());
778  document.insertString(caret, str, null);
779  } catch (final BadLocationException bl) {
780  bl.printStackTrace();
781  } finally {
783  }
784  }
785 
790  public boolean isOverwriteEnabled() {
791  return config.isOverwrite();
792  }
793 
798  public void setOverwriteEnabled(final boolean overwrite) {
799  config.setOverwrite(overwrite);
801  }
802 
806  public boolean isSelectionRectangular() {
808  }
809 
815  public void setSelectionRectangular(final boolean rectangleSelect) {
816  selection.setSelectionRectangular(rectangleSelect);
818  }
819 
824  public void cut() {
825  if (config.isEditable()) {
826  copy();
827  setSelectedText("");
828  }
829  }
830 
834  private void copy() {
836  final Clipboard clipboard = getToolkit().getSystemClipboard();
837 
838  final String selection = this.selection.getSelectedText();
839 
840  final int repeatCount = inputHandler.getRepeatCount();
841  final StringBuilder buf = new StringBuilder();
842  for (int i = 0; i < repeatCount; i++) {
843  buf.append(selection);
844  }
845 
846  clipboard.setContents(new StringSelection(buf.toString()), null);
847  }
848  }
849 
853  public void paste() {
854  if (config.isEditable()) {
855  final Clipboard clipboard = getToolkit().getSystemClipboard();
856  try {
857  // The MacOS MRJ doesn't convert \r to \n,
858  // so do it here
859  final String selection = ((String) clipboard.getContents(this).getTransferData(DataFlavor.stringFlavor)).replace('\r', '\n');
860 
861  final int repeatCount = inputHandler.getRepeatCount();
862  final StringBuilder buf = new StringBuilder();
863  for (int i = 0; i < repeatCount; i++) {
864  buf.append(selection);
865  }
866  setSelectedText(buf.toString());
867  } catch (final IOException | UnsupportedFlavorException e) {
868  getToolkit().beep();
869  LOG.error("Clipboard does not contain a string");
870  }
871  }
872  }
873 
878  @Override
879  public void removeNotify() {
880  super.removeNotify();
881  if (focusedComponent == this) {
882  focusedComponent = null;
883  }
884  }
885 
890  @Override
891  public void processKeyEvent(@NotNull final KeyEvent e) {
892  switch (e.getID()) {
893  case KeyEvent.KEY_TYPED:
894  inputHandler.keyTyped(e);
895  break;
896 
897  case KeyEvent.KEY_PRESSED:
898  inputHandler.keyPressed(e);
899  break;
900 
901  case KeyEvent.KEY_RELEASED:
902  inputHandler.keyReleased(e);
903  break;
904  }
905 
906  super.processKeyEvent(e);
907  }
908 
909  private void updateBracketHighlight(final int newCaretPosition) {
910  if (newCaretPosition == 0) {
911  brackets.clear();
912  return;
913  }
914 
915  try {
916  final int offset = TextUtilities.findMatchingBracket(document, newCaretPosition - 1);
917  if (offset != -1) {
918  final int bracketLine = selection.getLineOfOffset(offset);
919  final int bracketPosition = offset - selection.getLineStartOffset(bracketLine);
920  brackets.set(bracketPosition, bracketLine);
921  return;
922  }
923  } catch (final BadLocationException bl) {
924  bl.printStackTrace();
925  }
926 
927  brackets.clear();
928  }
929 
930  private void documentChanged(@NotNull final DocumentEvent evt) {
931  final ElementChange ch = evt.getChange(document.getDefaultRootElement());
932  final int count = ch == null ? 0 : ch.getChildrenAdded().length - ch.getChildrenRemoved().length;
933  final int line = selection.getLineOfOffset(evt.getOffset());
934  if (count == 0) {
935  painter.invalidateLine(line);
936  } else {
937  final int firstLine = painter.getFirstLine();
938  if (line < firstLine) {
939  // do magic stuff
940  setFirstLine(firstLine + count);
941  // end of magic stuff
942  } else {
943  painter.invalidateLineRange(line, firstLine + getVisibleLines());
945  }
946  }
947  }
948 
955  public boolean isModified() {
956  return !unmodifiedText.equals(selection.getText());
957  }
958 
962  public void resetModified() {
964  }
965 
966  private static class CaretBlinker implements ActionListener {
967 
968  @Override
969  public void actionPerformed(@NotNull final ActionEvent e) {
970  if (focusedComponent != null && focusedComponent.hasFocus()) {
972  }
973  }
974 
975  }
976 
977  private class AdjustHandler implements AdjustmentListener {
978 
979  @Override
980  public void adjustmentValueChanged(@NotNull final AdjustmentEvent e) {
981  if (!scrollBarsInitialized) {
982  return;
983  }
984 
985  // If this is not done, mousePressed events accumulate
986  // and the result is that scrolling doesn't stop after
987  // the mouse is released
988  SwingUtilities.invokeLater(() -> {
989  if (e.getAdjustable() == vertical) {
990  setFirstLine(vertical.getValue());
991  } else {
992  setHorizontalOffset(-horizontal.getValue());
993  }
994  });
995  }
996 
997  }
998 
999  private class ComponentHandler extends ComponentAdapter {
1000 
1001  @Override
1002  public void componentResized(@NotNull final ComponentEvent e) {
1004  scrollBarsInitialized = true;
1005  }
1006 
1007  }
1008 
1009  private class DocumentHandler implements DocumentListener {
1010 
1011  @Override
1012  public void insertUpdate(@NotNull final DocumentEvent e) {
1013  documentChanged(e);
1014 
1015  final int offset = e.getOffset();
1016  final int length = e.getLength();
1017  final int selectionStart = selection.getSelectionStart();
1018  final int selectionEnd = selection.getSelectionEnd();
1019 
1020  final int newStart;
1021  if (selectionStart > offset || (selectionStart == selectionEnd && selectionStart == offset)) {
1022  newStart = selectionStart + length;
1023  } else {
1024  newStart = selectionStart;
1025  }
1026 
1027  final int newEnd;
1028  if (selectionEnd >= offset) {
1029  newEnd = selectionEnd + length;
1030  } else {
1031  newEnd = selectionEnd;
1032  }
1033 
1034  select(newStart, newEnd);
1035  }
1036 
1037  @Override
1038  public void removeUpdate(@NotNull final DocumentEvent e) {
1039  documentChanged(e);
1040 
1041  final int offset = e.getOffset();
1042  final int length = e.getLength();
1043  final int selectionStart = selection.getSelectionStart();
1044  final int selectionEnd = selection.getSelectionEnd();
1045 
1046  final int newStart;
1047  if (selectionStart > offset) {
1048  if (selectionStart > offset + length) {
1049  newStart = selectionStart - length;
1050  } else {
1051  newStart = offset;
1052  }
1053  } else {
1054  newStart = selectionStart;
1055  }
1056 
1057  final int newEnd;
1058  if (selectionEnd > offset) {
1059  if (selectionEnd > offset + length) {
1060  newEnd = selectionEnd - length;
1061  } else {
1062  newEnd = offset;
1063  }
1064  } else {
1065  newEnd = selectionEnd;
1066  }
1067 
1068  select(newStart, newEnd);
1069  }
1070 
1071  @Override
1072  public void changedUpdate(@NotNull final DocumentEvent e) {
1073  }
1074 
1075  }
1076 
1077  private class DragHandler implements MouseMotionListener {
1078 
1079  @Override
1080  public void mouseDragged(@NotNull final MouseEvent e) {
1081  if (popup != null && popup.isVisible()) {
1082  return;
1083  }
1084 
1085  setSelectionRectangular((e.getModifiers() & InputEvent.CTRL_MASK) != 0);
1086  select(selection.getMarkPosition(), painter.xyToOffset(e.getX(), e.getY()));
1087  }
1088 
1089  @Override
1090  public void mouseMoved(@NotNull final MouseEvent e) {
1091  }
1092 
1093  }
1094 
1095  private class FocusHandler implements FocusListener {
1096 
1097  @Override
1098  public void focusGained(@NotNull final FocusEvent e) {
1099  setCaretVisible(true);
1101  }
1102 
1103  @Override
1104  public void focusLost(@NotNull final FocusEvent e) {
1105  setCaretVisible(false);
1106  focusedComponent = null;
1107  }
1108 
1109  }
1110 
1114  private class MouseHandler extends MouseAdapter {
1115 
1116  @Override
1117  public void mousePressed(@NotNull final MouseEvent e) {
1118  requestFocus();
1119 
1120  // Focus events not fired sometimes?
1121  setCaretVisible(true);
1123 
1124  if ((e.getModifiers() & InputEvent.BUTTON3_MASK) != 0 && popup != null) {
1125  popup.show(painter, e.getX(), e.getY());
1126  return;
1127  }
1128 
1129  final int line = painter.yToLine(e.getY());
1130  final int offset = xToOffset(line, e.getX());
1131  final int dot = selection.getLineStartOffset(line) + offset;
1132 
1133  switch (e.getClickCount()) {
1134  case 1:
1135  doSingleClick(e, dot);
1136  break;
1137  case 2:
1138  doDoubleClick(line, offset, dot);
1139  break;
1140  case 3:
1141  doTripleClick(line);
1142  break;
1143  }
1144  }
1145 
1146  @Override
1147  public void mouseWheelMoved(@NotNull final MouseWheelEvent e) {
1148  final int diff;
1149  if (e.getScrollType() == MouseWheelEvent.WHEEL_UNIT_SCROLL) {
1150  diff = e.getUnitsToScroll() * vertical.getUnitIncrement(1);
1151  } else {
1152  diff = e.getWheelRotation() * vertical.getBlockIncrement();
1153  }
1154  vertical.setValue(vertical.getValue() + diff);
1155  }
1156 
1157  private void doSingleClick(@NotNull final InputEvent evt, final int dot) {
1158  if ((evt.getModifiers() & InputEvent.SHIFT_MASK) == 0) {
1159  setCaretPosition(dot);
1160  } else {
1161  selection.setSelectionRectangular((evt.getModifiers() & InputEvent.CTRL_MASK) != 0);
1163  }
1164  }
1165 
1166  private void doDoubleClick(final int line, final int offset, final int dot) {
1167  // Ignore empty lines
1168  if (selection.getLineLength(line) == 0) {
1169  return;
1170  }
1171 
1172  try {
1173  int bracket = TextUtilities.findMatchingBracket(document, Math.max(0, dot - 1));
1174  if (bracket != -1) {
1175  int mark = selection.getMarkPosition();
1176  // Hack
1177  if (bracket > mark) {
1178  bracket++;
1179  mark--;
1180  }
1181  select(mark, bracket);
1182  return;
1183  }
1184  } catch (final BadLocationException bl) {
1185  bl.printStackTrace();
1186  }
1187 
1188  // Ok, it's not a bracket... select the word
1189  final CharSequence lineText = selection.getLineText(line);
1190  char ch = lineText.charAt(Math.max(0, offset - 1));
1191 
1192  String noWordSep = (String) document.getProperty("noWordSep");
1193  if (noWordSep == null) {
1194  noWordSep = "";
1195  }
1196 
1197  // If the user clicked on a non-letter char,
1198  // we select the surrounding non-letters
1199  final boolean selectNoLetter = !Character.isLetterOrDigit(ch) && noWordSep.indexOf(ch) == -1;
1200 
1201  int wordStart = 0;
1202 
1203  for (int i = offset - 1; i >= 0; i--) {
1204  ch = lineText.charAt(i);
1205  if (selectNoLetter ^ (!Character.isLetterOrDigit(ch) && noWordSep.indexOf(ch) == -1)) {
1206  wordStart = i + 1;
1207  break;
1208  }
1209  }
1210 
1211  int wordEnd = lineText.length();
1212  for (int i = offset; i < lineText.length(); i++) {
1213  ch = lineText.charAt(i);
1214  if (selectNoLetter ^ (!Character.isLetterOrDigit(ch) && noWordSep.indexOf(ch) == -1)) {
1215  wordEnd = i;
1216  break;
1217  }
1218  }
1219 
1220  final int lineStart = selection.getLineStartOffset(line);
1221  select(lineStart + wordStart, lineStart + wordEnd);
1222 
1223  /*
1224  String lineText = getLineText(line);
1225  String noWordSep = (String)document.getProperty("noWordSep");
1226  int wordStart = TextUtilities.findWordStart(lineText, offset, noWordSep);
1227  int wordEnd = TextUtilities.findWordEnd(lineText, offset, noWordSep);
1228 
1229  int lineStart = getLineStartOffset(line);
1230  select(lineStart + wordStart, lineStart + wordEnd);
1231  */
1232  }
1233 
1234  private void doTripleClick(final int line) {
1236  }
1237 
1238  }
1239 
1240  private class CaretUndo extends AbstractUndoableEdit {
1241 
1245  private static final long serialVersionUID = 1L;
1246 
1247  private int start;
1248 
1249  private int end;
1250 
1251  private CaretUndo(final int start, final int end) {
1252  this.start = start;
1253  this.end = end;
1254  }
1255 
1256  @Override
1257  public boolean isSignificant() {
1258  return false;
1259  }
1260 
1261  @NotNull
1262  @Override
1263  public String getPresentationName() {
1264  return "caret move";
1265  }
1266 
1267  @Override
1268  public void undo() throws CannotUndoException {
1269  super.undo();
1270 
1271  select(start, end);
1272  }
1273 
1274  @Override
1275  public void redo() throws CannotRedoException {
1276  super.redo();
1277 
1278  select(start, end);
1279  }
1280 
1281  @Override
1282  public boolean addEdit(@NotNull final UndoableEdit anEdit) {
1283  if (anEdit instanceof CaretUndo) {
1284  final CaretUndo caretUndo = (CaretUndo) anEdit;
1285  start = caretUndo.start;
1286  end = caretUndo.end;
1287  caretUndo.die();
1288 
1289  return true;
1290  }
1291  return false;
1292  }
1293 
1294  }
1295 
1296 }
net.sf.gridarta.textedit.textarea.TextAreaPainter.setHorizontalOffset
boolean setHorizontalOffset(final int horizontalOffset)
Definition: TextAreaPainter.java:748
net.sf.gridarta.textedit.textarea.TextAreaDefaults
Encapsulates default settings for a text area.
Definition: TextAreaDefaults.java:26
net.sf.gridarta.textedit.textarea.JEditTextArea.JEditTextArea
JEditTextArea(@NotNull final TextAreaDefaults defaults, @NotNull final SyntaxDocument document, final boolean paintInvalid)
Creates a new JEditTextArea with the specified settings.
Definition: JEditTextArea.java:161
net.sf.gridarta.textedit.textarea.JEditTextArea.getDocument
Document getDocument()
Returns the document this text area is editing.
Definition: JEditTextArea.java:500
net.sf.gridarta.textedit.textarea.JEditTextArea.DocumentHandler.insertUpdate
void insertUpdate(@NotNull final DocumentEvent e)
Definition: JEditTextArea.java:1012
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.JEditTextArea.cut
void cut()
Deletes the selected text from the text area and places it into the clipboard.
Definition: JEditTextArea.java:824
net.sf.gridarta.textedit.textarea.TextAreaPainter.getVisibleLines
int getVisibleLines()
Definition: TextAreaPainter.java:713
net.sf.gridarta.textedit.textarea.JEditTextArea.document
final SyntaxDocument document
Definition: JEditTextArea.java:141
net.sf.gridarta.textedit.textarea.TextAreaSelection.getSelectionEnd
int getSelectionEnd()
Returns the selection end offset.
Definition: TextAreaSelection.java:74
net.sf.gridarta.textedit.textarea.TextAreaSelection.getBiasLeft
boolean getBiasLeft()
Definition: TextAreaSelection.java:85
net.sf.gridarta.textedit.textarea.TextAreaSelection.getLineEndOffset
int getLineEndOffset(final int line)
Returns the end offset of the specified line.
Definition: TextAreaSelection.java:350
net.sf.gridarta.textedit.textarea.JEditTextArea.paste
void paste()
Inserts the clipboard contents into the text.
Definition: JEditTextArea.java:853
net.sf.gridarta.textedit.textarea.JEditTextArea.getElectricScroll
int getElectricScroll()
Returns the number of lines from the top and button of the text area that are always visible.
Definition: JEditTextArea.java:290
net.sf.gridarta.textedit.textarea.TextAreaSelection.getSelectionEndLine
int getSelectionEndLine()
Returns the selection end line.
Definition: TextAreaSelection.java:81
net.sf.gridarta.textedit.textarea.JEditTextArea.setHorizontalOffset
void setHorizontalOffset(final int horizontalOffset)
Sets the horizontal offset of drawn lines.
Definition: JEditTextArea.java:351
net.sf.gridarta.textedit.textarea.JEditTextArea.setEditingFocus
void setEditingFocus()
Sets the focus to this TextArea, so this component is instantly registered for key press events.
Definition: JEditTextArea.java:402
net.sf.gridarta.textedit.textarea.JEditTextArea.getVisibleLines
int getVisibleLines()
Returns the number of lines visible in this text area.
Definition: JEditTextArea.java:342
net.sf.gridarta.textedit.textarea.TextUtilities.findMatchingBracket
static int findMatchingBracket(final Document doc, final int offset)
Returns the offset of the bracket matching the one at the specified offset of the document,...
Definition: TextUtilities.java:38
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.JEditTextArea.getCaretLine
int getCaretLine()
Returns the caret line.
Definition: JEditTextArea.java:612
net.sf.gridarta.textedit.textarea.JEditTextArea.getSelectionStart
int getSelectionStart()
Returns the selection start offset.
Definition: JEditTextArea.java:589
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.JEditTextArea.popup
final JPopupMenu popup
Definition: JEditTextArea.java:124
net.sf.gridarta.textedit.textarea.JEditTextArea.isOverwriteEnabled
boolean isOverwriteEnabled()
Returns whether overwrite mode is active.
Definition: JEditTextArea.java:790
net.sf.gridarta.textedit.textarea.JEditTextArea.getFirstLine
int getFirstLine()
Returns the line displayed at the text area's origin.
Definition: JEditTextArea.java:320
net.sf.gridarta.textedit.textarea.JEditTextArea.CaretUndo.serialVersionUID
static final long serialVersionUID
Serial Version UID.
Definition: JEditTextArea.java:1245
net.sf.gridarta.textedit.textarea.JEditTextArea.MouseHandler.mousePressed
void mousePressed(@NotNull final MouseEvent e)
Definition: JEditTextArea.java:1117
net.sf.gridarta.textedit.textarea.TextAreaPainter.getHorizontalOffset
int getHorizontalOffset()
Returns the horizontal offset of drawn lines.
Definition: TextAreaPainter.java:744
net.sf.gridarta.textedit.textarea.TextAreaBrackets.clear
void clear()
Clears the highlighted bracket.
Definition: TextAreaBrackets.java:59
net.sf.gridarta.textedit.textarea.JEditTextArea.MouseHandler.mouseWheelMoved
void mouseWheelMoved(@NotNull final MouseWheelEvent e)
Definition: JEditTextArea.java:1147
net.sf.gridarta.textedit.textarea.JEditTextArea.setFont
void setFont(@NotNull final Font font)
Set the TextArea font.
Definition: JEditTextArea.java:256
net.sf.gridarta.textedit.textarea.JEditTextArea.getMarkPosition
int getMarkPosition()
Returns the mark position.
Definition: JEditTextArea.java:621
net.sf.gridarta.textedit.textarea.JEditTextArea.xToOffset
int xToOffset(final int line, final int x)
Converts a x co-ordinate to an offset within a line.
Definition: JEditTextArea.java:492
net.sf.gridarta.textedit.textarea.JEditTextArea.removeNotify
void removeNotify()
Called by the AWT when this component is removed from it's parent.
Definition: JEditTextArea.java:879
net.sf.gridarta.textedit.textarea.JEditTextArea.FocusHandler.focusLost
void focusLost(@NotNull final FocusEvent e)
Definition: JEditTextArea.java:1104
net.sf.gridarta.textedit.textarea.TextAreaPainter.invalidateSelectedLines
void invalidateSelectedLines()
Repaints the lines containing the selection.
Definition: TextAreaPainter.java:423
net.sf.gridarta.textedit.textarea.JEditTextArea.isModified
boolean isModified()
Return whether the text content has been modified from the "unmodified" state.
Definition: JEditTextArea.java:955
net.sf.gridarta.textedit.textarea.JEditTextArea.copy
void copy()
Places the selected text into the clipboard.
Definition: JEditTextArea.java:834
net.sf.gridarta.textedit.textarea.JEditTextArea.CaretBlinker
Definition: JEditTextArea.java:966
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.JEditTextArea.getText
String getText()
Returns the entire text of this text area.
Definition: JEditTextArea.java:543
net.sf.gridarta.textedit.textarea.TextUtilities
Class with several utility functions used by the text area component.
Definition: TextUtilities.java:20
net.sf.gridarta.textedit.textarea.TextAreaSelection.getSelectedText
String getSelectedText()
Returns the selected text, or null if no selection is active.
Definition: TextAreaSelection.java:126
net.sf.gridarta.textedit.textarea.InputHandler
An input handler converts the user's key strokes into concrete actions.
Definition: InputHandler.java:36
net.sf.gridarta.textedit.textarea.JEditTextArea.offsetToX2
int offsetToX2(final int line, final int offset)
Converts an offset in a line into an x co-ordinate.
Definition: JEditTextArea.java:483
net.sf.gridarta.textedit.textarea.JEditTextArea.setFirstLine
void setFirstLine(final int firstLine)
Sets the line displayed at the text area's origin without updating the scroll bars.
Definition: JEditTextArea.java:328
net.sf.gridarta.textedit.textarea.ScrollLayout
Definition: ScrollLayout.java:32
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.textarea.JEditTextArea.resetModified
void resetModified()
Reset the "modified" state.
Definition: JEditTextArea.java:962
net.sf.gridarta.textedit.textarea.TextAreaPainter.recalculateVisibleLines
void recalculateVisibleLines()
Recalculates the number of visible lines.
Definition: TextAreaPainter.java:698
net.sf.gridarta.textedit.textarea.JEditTextArea.setOverwriteEnabled
void setOverwriteEnabled(final boolean overwrite)
Sets whether overwrite mode is active.
Definition: JEditTextArea.java:798
net.sf.gridarta.textedit.textarea.JEditTextArea.getSelectionEnd
int getSelectionEnd()
Returns the selection end offset.
Definition: JEditTextArea.java:596
net.sf.gridarta.textedit.textarea.JEditTextArea.FocusHandler
Definition: JEditTextArea.java:1095
net.sf.gridarta.textedit.textarea.TextAreaPainter.setFirstLine
boolean setFirstLine(final int firstLine)
Definition: TextAreaPainter.java:724
net.sf.gridarta.textedit.textarea.JEditTextArea.setMagicCaretPosition
void setMagicCaretPosition(final int magicCaret)
Sets the ‘magic’ caret position.
Definition: JEditTextArea.java:747
net.sf.gridarta.textedit.textarea.JEditTextArea.scrollBarsInitialized
boolean scrollBarsInitialized
Definition: JEditTextArea.java:135
net.sf.gridarta.textedit.textarea.JEditTextArea.vertical
final JScrollBar vertical
Definition: JEditTextArea.java:130
net.sf.gridarta.textedit.textarea.TextAreaSelection
Definition: TextAreaSelection.java:29
net.sf.gridarta.textedit.textarea.SyntaxDocument
A document implementation that can be tokenized by the syntax highlighting system.
Definition: SyntaxDocument.java:29
net.sf.gridarta.textedit.textarea.JEditTextArea.CaretUndo.addEdit
boolean addEdit(@NotNull final UndoableEdit anEdit)
Definition: JEditTextArea.java:1282
net.sf.gridarta.textedit.textarea.TextAreaPainter
The text area repaint manager.
Definition: TextAreaPainter.java:42
net.sf.gridarta.textedit.textarea.JEditTextArea.serialVersionUID
static final long serialVersionUID
Serial Version UID.
Definition: JEditTextArea.java:101
net.sf.gridarta.textedit.textarea.JEditTextArea.processKeyEvent
void processKeyEvent(@NotNull final KeyEvent e)
Forwards key events directly to the input handler.
Definition: JEditTextArea.java:891
net.sf.gridarta.textedit.textarea.JEditTextArea.offsetToX
int offsetToX(final int line, final int offset)
Converts an offset in a line into an x co-ordinate.
Definition: JEditTextArea.java:472
net.sf.gridarta.textedit.textarea.JEditTextArea.getInputHandler
InputHandler getInputHandler()
Returns the input handler.
Definition: JEditTextArea.java:264
net.sf.gridarta.textedit.textarea.JEditTextArea.getText
String getText(final int start, final int len)
Returns the specified substring of the document.
Definition: JEditTextArea.java:561
net.sf.gridarta.textedit.textarea.JEditTextArea.getSelectedText
String getSelectedText()
Returns the selected text, or null if no selection is active.
Definition: JEditTextArea.java:709
net.sf.gridarta.textedit.textarea.JEditTextArea.MouseHandler.doTripleClick
void doTripleClick(final int line)
Definition: JEditTextArea.java:1234
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.TextAreaCaret.setCaretVisible
void setCaretVisible(final boolean caretVisible)
Sets if the caret should be visible.
Definition: TextAreaCaret.java:46
net.sf.gridarta.textedit.textarea.TextAreaCaret.blinkCaret
boolean blinkCaret()
Blinks the caret.
Definition: TextAreaCaret.java:54
net.sf.gridarta.textedit.textarea.TextAreaSelection.getDocumentLength
int getDocumentLength()
Returns the length of the document.
Definition: TextAreaSelection.java:314
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.sf.gridarta.textedit.textarea.TextAreaSelection.getCaretPosition
int getCaretPosition()
Returns the caret position.
Definition: TextAreaSelection.java:94
net.sf.gridarta.textedit.textarea.SyntaxDocument.beginCompoundEdit
static void beginCompoundEdit()
Starts a compound edit that can be undone in one operation.
Definition: SyntaxDocument.java:102
net.sf.gridarta.textedit.textarea.JEditTextArea.setOrigin
void setOrigin(final int firstLine, final int horizontalOffset)
A fast way of changing both the first line and horizontal offset.
Definition: JEditTextArea.java:368
net.sf.gridarta.textedit.textarea.JEditTextArea.caret
final TextAreaCaret caret
Definition: JEditTextArea.java:127
net.sf.gridarta.textedit.textarea.JEditTextArea.getLineEndOffset
int getLineEndOffset(final int line)
Returns the end offset of the specified line.
Definition: JEditTextArea.java:535
net.sf.gridarta.textedit.textarea.JEditTextArea.setSelectedText
void setSelectedText(@NotNull final String selectedText)
Replaces the selection with the specified text.
Definition: JEditTextArea.java:717
net.sf.gridarta.textedit.textarea.TextAreaConfig.setMagicCaret
void setMagicCaret(final int magicCaret)
Definition: TextAreaConfig.java:66
net.sf.gridarta.textedit.textarea.JEditTextArea.inputHandler
final InputHandler inputHandler
Definition: JEditTextArea.java:138
net.sf.gridarta.textedit.textarea.JEditTextArea.MouseHandler.doDoubleClick
void doDoubleClick(final int line, final int offset, final int dot)
Definition: JEditTextArea.java:1166
net.sf.gridarta.textedit.textarea.JEditTextArea.DocumentHandler.removeUpdate
void removeUpdate(@NotNull final DocumentEvent e)
Definition: JEditTextArea.java:1038
net.sf.gridarta.textedit.textarea.JEditTextArea.DragHandler
Definition: JEditTextArea.java:1077
net.sf.gridarta.textedit.textarea.JEditTextArea.DocumentHandler.changedUpdate
void changedUpdate(@NotNull final DocumentEvent e)
Definition: JEditTextArea.java:1072
net.sf.gridarta.textedit.textarea.JEditTextArea.CaretUndo.getPresentationName
String getPresentationName()
Definition: JEditTextArea.java:1263
net.sf.gridarta.textedit.textarea.JEditTextArea.MouseHandler.doSingleClick
void doSingleClick(@NotNull final InputEvent evt, final int dot)
Definition: JEditTextArea.java:1157
net.sf.gridarta.textedit.textarea.TextAreaConfig.setOverwrite
void setOverwrite(final boolean overwrite)
Sets whether overwrite mode is active.
Definition: TextAreaConfig.java:58
net.sf.gridarta.textedit.textarea.TextAreaSelection.setSelection
void setSelection(final int newStart, final int newEnd, final int newStartLine, final int newEndLine, final boolean newBias)
Definition: TextAreaSelection.java:114
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.JEditTextArea.focusedComponent
static JEditTextArea focusedComponent
Definition: JEditTextArea.java:110
net.sf.gridarta.textedit.textarea.JEditTextArea.setSelectionRectangular
void setSelectionRectangular(final boolean rectangleSelect)
Sets if the selection should be rectangular.
Definition: JEditTextArea.java:815
net.sf.gridarta.textedit.textarea.TextAreaSelection.getLineOfOffset
int getLineOfOffset(final int offset)
Returns the line containing the specified offset.
Definition: TextAreaSelection.java:329
net.sf.gridarta.textedit.textarea.TextAreaSelection.setSelectionRectangular
void setSelectionRectangular(final boolean rectangleSelect)
Sets if the selection should be rectangular.
Definition: TextAreaSelection.java:289
net.sf.gridarta.textedit.textarea.JEditTextArea.updateBracketHighlight
void updateBracketHighlight(final int newCaretPosition)
Definition: JEditTextArea.java:909
net.sf.gridarta.textedit.textarea.JEditTextArea.freeTabKeyFromFocusTraversal
void freeTabKeyFromFocusTraversal()
In JDKs above 1.4, the tab key is used for focus traversal.
Definition: JEditTextArea.java:229
net.sf.gridarta.textedit.textarea.JEditTextArea.setCaretVisible
void setCaretVisible(final boolean caretVisible)
Sets if the caret should be visible.
Definition: JEditTextArea.java:272
net.sf.gridarta.textedit.textarea.JEditTextArea.setCaretPosition
void setCaretPosition(final int caret)
Sets the caret position.
Definition: JEditTextArea.java:631
net.sf.gridarta.textedit.textarea.JEditTextArea.scrollToCaret
void scrollToCaret()
Ensures that the caret is visible by scrolling the text area if necessary.
Definition: JEditTextArea.java:389
net.sf.gridarta.textedit.textarea.JEditTextArea.lineToY
int lineToY(final int line)
Converts a line index to a y co-ordinate.
Definition: JEditTextArea.java:462
net.sf.gridarta.textedit.textarea.JEditTextArea.ComponentHandler
Definition: JEditTextArea.java:999
net.sf.gridarta.textedit.textarea.SyntaxDocument.endCompoundEdit
static void endCompoundEdit()
Ends a compound edit that can be undone in one operation.
Definition: SyntaxDocument.java:110
net.sf.gridarta.textedit.textarea.JEditTextArea.config
final TextAreaConfig config
The TextAreaConfig for this instance.
Definition: JEditTextArea.java:153
net.sf.gridarta.textedit.textarea.JEditTextArea.selectAll
void selectAll()
Selects all text in the document.
Definition: JEditTextArea.java:638
net.sf.gridarta.textedit.textarea.JEditTextArea.isSelectionRectangular
boolean isSelectionRectangular()
Returns true if the selection is rectangular, false otherwise.
Definition: JEditTextArea.java:806
net.sf.gridarta.textedit.textarea.JEditTextArea.LOG
static final Category LOG
The Logger for printing log messages.
Definition: JEditTextArea.java:96
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.ScrollLayout.BOTTOM
static final String BOTTOM
Definition: ScrollLayout.java:38
net.sf.gridarta.textedit.textarea.JEditTextArea.getDocumentLength
int getDocumentLength()
Returns the length of the document.
Definition: JEditTextArea.java:508
net.sf.gridarta.textedit.textarea.TextAreaConfig.isOverwrite
boolean isOverwrite()
Returns whether overwrite mode is active.
Definition: TextAreaConfig.java:50
net.sf.gridarta.textedit.textarea.JEditTextArea.CaretUndo.CaretUndo
CaretUndo(final int start, final int end)
Definition: JEditTextArea.java:1251
net.sf.gridarta.textedit.textarea.JEditTextArea.CaretUndo.isSignificant
boolean isSignificant()
Definition: JEditTextArea.java:1257
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.TextAreaConfig.getElectricScroll
int getElectricScroll()
Definition: TextAreaConfig.java:74
net.sf.gridarta.textedit.textarea.TextAreaSelection.setText
void setText(@NotNull final String text)
Sets the entire text of this text area.
Definition: TextAreaSelection.java:380
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.JEditTextArea.overwriteSetSelectedText
void overwriteSetSelectedText(@NotNull final String str)
Similar to.
Definition: JEditTextArea.java:758
net.sf.gridarta.textedit.textarea.JEditTextArea.isEditable
boolean isEditable()
Returns true if this text area is editable, false otherwise.
Definition: JEditTextArea.java:730
net.sf.gridarta.textedit.textarea.JEditTextArea.selection
final TextAreaSelection selection
Definition: JEditTextArea.java:144
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.JEditTextArea.getLineCount
int getLineCount()
Returns the number of lines in the document.
Definition: JEditTextArea.java:515
net.sf.gridarta.textedit.textarea.JEditTextArea.brackets
final TextAreaBrackets brackets
Definition: JEditTextArea.java:147
net.sf.gridarta.textedit.textarea.JEditTextArea.scrollTo
void scrollTo(final int line, final int offset)
Ensures that the specified line and offset is visible by scrolling the text area if necessary.
Definition: JEditTextArea.java:419
net.sf.gridarta.textedit.textarea.JEditTextArea.CaretUndo.undo
void undo()
Definition: JEditTextArea.java:1268
net.sf.gridarta.textedit.textarea.JEditTextArea.CaretUndo.end
int end
Definition: JEditTextArea.java:1249
net.sf.gridarta.textedit.textarea.TextAreaConfig.getMagicCaret
int getMagicCaret()
Definition: TextAreaConfig.java:62
net.sf.gridarta.textedit.textarea.TextAreaBrackets
Maintains information about the highlighted pairs of brackets.
Definition: TextAreaBrackets.java:25
net.sf.gridarta.textedit.textarea.TextAreaPainter.isBracketHighlightEnabled
boolean isBracketHighlightEnabled()
Returns whether bracket highlighting is enabled.
Definition: TextAreaPainter.java:337
net.sf.gridarta.textedit.textarea.JEditTextArea.documentChanged
void documentChanged(@NotNull final DocumentEvent evt)
Definition: JEditTextArea.java:930
net.sf.gridarta.textedit.textarea.TextAreaBrackets.set
void set(final int bracketPosition, final int bracketLine)
Sets the highlighted bracket.
Definition: TextAreaBrackets.java:69
net.sf.gridarta.textedit.textarea.TextAreaSelection.disableSelectionIfEmpty
void disableSelectionIfEmpty()
Definition: TextAreaSelection.java:170
net.sf.gridarta.textedit.textarea.TextAreaSelection.getText
String getText(final int start, final int len)
Returns the specified substring of the document.
Definition: TextAreaSelection.java:184
net.sf.gridarta.textedit.textarea.JEditTextArea.MouseHandler
@noinspection RefusedBequest
Definition: JEditTextArea.java:1114
net.sf.gridarta.textedit.textarea.InputHandler.getRepeatCount
int getRepeatCount()
Returns the number of times the next action will be repeated.
Definition: InputHandler.java:83
net.sf.gridarta.textedit.textarea.JEditTextArea.getLineStartOffset
int getLineStartOffset(final int line)
Returns the start offset of the specified line.
Definition: JEditTextArea.java:525
net.sf.gridarta.textedit.textarea.TextAreaPainter.setFont
final void setFont(@NotNull final Font font)
Definition: TextAreaPainter.java:359
net.sf.gridarta.textedit.textarea.TextAreaSelection.getMarkPosition
int getMarkPosition()
Returns the mark position.
Definition: TextAreaSelection.java:110
net.sf.gridarta.textedit.textarea.JEditTextArea.getText
void getText(final int start, final int len, @NotNull final Segment segment)
Copies the specified substring of the document into a segment.
Definition: JEditTextArea.java:572
net.sf.gridarta.textedit.textarea.JEditTextArea.FocusHandler.focusGained
void focusGained(@NotNull final FocusEvent e)
Definition: JEditTextArea.java:1098
net.sf.gridarta.textedit.textarea.JEditTextArea.ComponentHandler.componentResized
void componentResized(@NotNull final ComponentEvent e)
Definition: JEditTextArea.java:1002
net.sf.gridarta.textedit.textarea.JEditTextArea.getMagicCaretPosition
int getMagicCaretPosition()
Returns the ‘magic’ caret position.
Definition: JEditTextArea.java:738
net.sf.gridarta.textedit.textarea.JEditTextArea.CaretUndo
Definition: JEditTextArea.java:1240
net.sf.gridarta.textedit.textarea.JEditTextArea.blinkCaret
void blinkCaret()
Blinks the caret.
Definition: JEditTextArea.java:280
net.sf.gridarta.textedit.textarea.JEditTextArea.AdjustHandler.adjustmentValueChanged
void adjustmentValueChanged(@NotNull final AdjustmentEvent e)
Definition: JEditTextArea.java:980
net.sf.gridarta.textedit.textarea.ScrollLayout.CENTER
static final String CENTER
Definition: ScrollLayout.java:34
net.sf.gridarta.textedit.textarea.TextAreaCaret
Definition: TextAreaCaret.java:22
net.sf.gridarta.textedit.textarea.ScrollLayout.RIGHT
static final String RIGHT
Definition: ScrollLayout.java:36
net.sf.gridarta.textedit.textarea.JEditTextArea.CARET_TIMER
static final Timer CARET_TIMER
Definition: JEditTextArea.java:113
net.sf.gridarta.textedit.textarea.JEditTextArea.DragHandler.mouseMoved
void mouseMoved(@NotNull final MouseEvent e)
Definition: JEditTextArea.java:1090
net.sf.gridarta.textedit.textarea.JEditTextArea.AdjustHandler
Definition: JEditTextArea.java:977
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.TextAreaConfig.isEditable
boolean isEditable()
Definition: TextAreaConfig.java:70
net.sf.gridarta.textedit.textarea.JEditTextArea.CaretUndo.start
int start
Definition: JEditTextArea.java:1247
net.sf.gridarta.textedit.textarea.TextAreaConfig
Miscellaneous configuration settings for JEditTextArea.
Definition: TextAreaConfig.java:25
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.invalidateLine
void invalidateLine(final int line)
Marks a line as needing a repaint.
Definition: TextAreaPainter.java:407
net.sf.gridarta.textedit.textarea.JEditTextArea.DocumentHandler
Definition: JEditTextArea.java:1009
net.sf.gridarta.textedit.textarea.JEditTextArea.DragHandler.mouseDragged
void mouseDragged(@NotNull final MouseEvent e)
Definition: JEditTextArea.java:1080
net.sf.gridarta.textedit.textarea.JEditTextArea.unmodifiedText
String unmodifiedText
The text contents in the last "unmodified" state.
Definition: JEditTextArea.java:107
net.sf.gridarta.textedit.textarea.JEditTextArea.select
void select(final int start, final int end)
Selects from the start offset to the end offset.
Definition: JEditTextArea.java:649
net.sf.gridarta.textedit.textarea.JEditTextArea.painter
final TextAreaPainter painter
Definition: JEditTextArea.java:121
net.sf.gridarta.textedit.textarea.TextAreaSelection.setSelectedText
void setSelectedText(@NotNull final String selectedText)
Replaces the selection with the specified text.
Definition: TextAreaSelection.java:214
net.sf.gridarta.textedit.textarea.SyntaxDocument.addUndoableEdit
static void addUndoableEdit(@NotNull final UndoableEdit edit)
Adds an undoable edit to this document's undo list.
Definition: SyntaxDocument.java:119
net.sf.gridarta.textedit.textarea.TextAreaSelection.getSelectionStartLine
int getSelectionStartLine()
Returns the selection start line.
Definition: TextAreaSelection.java:67
net.sf.gridarta.textedit.textarea.JEditTextArea.setText
void setText(@NotNull final String text)
Sets the entire text of this text area.
Definition: JEditTextArea.java:550
net.sf.gridarta.textedit.textarea.JEditTextArea.getCaretPosition
int getCaretPosition()
Returns the caret position.
Definition: JEditTextArea.java:605
net.sf.gridarta.textedit.textarea.JEditTextArea.CaretUndo.redo
void redo()
Definition: JEditTextArea.java:1275
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.JEditTextArea.horizontal
final JScrollBar horizontal
Definition: JEditTextArea.java:133
net.sf.gridarta.textedit.textarea.JEditTextArea.getLineText
CharSequence getLineText(final int lineIndex)
Returns the text on the specified line.
Definition: JEditTextArea.java:582
net.sf.gridarta.textedit.textarea.JEditTextArea.CaretBlinker.actionPerformed
void actionPerformed(@NotNull final ActionEvent e)
Definition: JEditTextArea.java:969
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.TextAreaCaret.setBlink
void setBlink(final boolean blink)
Definition: TextAreaCaret.java:63
net.sf.gridarta.textedit.textarea.TextAreaPainter.getDefaultCharWidth
int getDefaultCharWidth()
This works only for fonts with fixed line height.
Definition: TextAreaPainter.java:306