LMMS
Loading...
Searching...
No Matches
juce_CodeEditorComponent.cpp
Go to the documentation of this file.
1/*
2 ==============================================================================
3
4 This file is part of the JUCE library.
5 Copyright (c) 2022 - Raw Material Software Limited
6
7 JUCE is an open source library subject to commercial or open-source
8 licensing.
9
10 By using JUCE, you agree to the terms of both the JUCE 7 End-User License
11 Agreement and JUCE Privacy Policy.
12
13 End User License Agreement: www.juce.com/juce-7-licence
14 Privacy Policy: www.juce.com/juce-privacy-policy
15
16 Or: You may also use this code under the terms of the GPL v3 (see
17 www.gnu.org/licenses).
18
19 JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
20 EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
21 DISCLAIMED.
22
23 ==============================================================================
24*/
25
26namespace juce
27{
28
29//==============================================================================
31{
32public:
33 explicit CodeEditorAccessibilityHandler (CodeEditorComponent& codeEditorComponentToWrap)
34 : AccessibilityHandler (codeEditorComponentToWrap,
35 codeEditorComponentToWrap.isReadOnly() ? AccessibilityRole::staticText
37 {},
38 { std::make_unique<CodeEditorComponentTextInterface> (codeEditorComponentToWrap) })
39 {
40 }
41
42private:
44 {
45 public:
46 explicit CodeEditorComponentTextInterface (CodeEditorComponent& codeEditorComponentToWrap)
47 : codeEditorComponent (codeEditorComponentToWrap)
48 {
49 }
50
51 bool isDisplayingProtectedText() const override
52 {
53 return false;
54 }
55
56 bool isReadOnly() const override
57 {
58 return codeEditorComponent.isReadOnly();
59 }
60
61 int getTotalNumCharacters() const override
62 {
63 return codeEditorComponent.document.getAllContent().length();
64 }
65
66 Range<int> getSelection() const override
67 {
68 return { codeEditorComponent.selectionStart.getPosition(),
69 codeEditorComponent.selectionEnd.getPosition() };
70 }
71
72 void setSelection (Range<int> r) override
73 {
74 if (r == codeEditorComponent.getHighlightedRegion())
75 return;
76
77 if (r.isEmpty())
78 {
79 codeEditorComponent.caretPos.setPosition (r.getStart());
80 return;
81 }
82
83 auto& doc = codeEditorComponent.document;
84
85 const auto cursorAtStart = r.getEnd() == codeEditorComponent.getHighlightedRegion().getStart()
86 || r.getEnd() == codeEditorComponent.getHighlightedRegion().getEnd();
87 codeEditorComponent.selectRegion (CodeDocument::Position (doc, cursorAtStart ? r.getEnd() : r.getStart()),
88 CodeDocument::Position (doc, cursorAtStart ? r.getStart() : r.getEnd()));
89 }
90
91 String getText (Range<int> r) const override
92 {
93 auto& doc = codeEditorComponent.document;
94
95 return doc.getTextBetween (CodeDocument::Position (doc, r.getStart()),
96 CodeDocument::Position (doc, r.getEnd()));
97 }
98
99 void setText (const String& newText) override
100 {
101 codeEditorComponent.document.replaceAllContent (newText);
102 }
103
104 int getTextInsertionOffset() const override
105 {
106 return codeEditorComponent.caretPos.getPosition();
107 }
108
109 RectangleList<int> getTextBounds (Range<int> textRange) const override
110 {
111 auto& doc = codeEditorComponent.document;
112
113 RectangleList<int> localRects;
114
115 CodeDocument::Position startPosition (doc, textRange.getStart());
116 CodeDocument::Position endPosition (doc, textRange.getEnd());
117
118 for (int line = startPosition.getLineNumber(); line <= endPosition.getLineNumber(); ++line)
119 {
120 CodeDocument::Position lineStart (doc, line, 0);
121 CodeDocument::Position lineEnd (doc, line, doc.getLine (line).length());
122
123 if (line == startPosition.getLineNumber())
124 lineStart = lineStart.movedBy (startPosition.getIndexInLine());
125
126 if (line == endPosition.getLineNumber())
127 lineEnd = { doc, line, endPosition.getIndexInLine() };
128
129 auto startPos = codeEditorComponent.getCharacterBounds (lineStart).getTopLeft();
130 auto endPos = codeEditorComponent.getCharacterBounds (lineEnd).getTopLeft();
131
132 localRects.add (startPos.x,
133 startPos.y,
134 jmax (1, endPos.x - startPos.x),
135 codeEditorComponent.getLineHeight());
136 }
137
138 RectangleList<int> globalRects;
139
140 for (auto r : localRects)
141 globalRects.add (codeEditorComponent.localAreaToGlobal (r));
142
143 return globalRects;
144 }
145
146 int getOffsetAtPoint (Point<int> point) const override
147 {
148 return codeEditorComponent.getPositionAt (point.x, point.y).getPosition();
149 }
150
151 private:
153 };
154
155 //==============================================================================
157};
158
159//==============================================================================
161{
162public:
164
165 bool update (CodeDocument& codeDoc, int lineNum,
167 CodeTokeniser* tokeniser, const int tabSpaces,
168 const CodeDocument::Position& selStart,
169 const CodeDocument::Position& selEnd)
170 {
171 Array<SyntaxToken> newTokens;
172 newTokens.ensureStorageAllocated (8);
173
174 if (tokeniser == nullptr)
175 {
176 auto line = codeDoc.getLine (lineNum);
177 addToken (newTokens, line, line.length(), -1);
178 }
179 else if (lineNum < codeDoc.getNumLines())
180 {
181 const CodeDocument::Position pos (codeDoc, lineNum, 0);
183 source, *tokeniser, newTokens);
184 }
185
186 replaceTabsWithSpaces (newTokens, tabSpaces);
187
188 int newHighlightStart = 0;
189 int newHighlightEnd = 0;
190
191 if (selStart.getLineNumber() <= lineNum && selEnd.getLineNumber() >= lineNum)
192 {
193 auto line = codeDoc.getLine (lineNum);
194
195 CodeDocument::Position lineStart (codeDoc, lineNum, 0), lineEnd (codeDoc, lineNum + 1, 0);
196 newHighlightStart = indexToColumn (jmax (0, selStart.getPosition() - lineStart.getPosition()),
197 line, tabSpaces);
198 newHighlightEnd = indexToColumn (jmin (lineEnd.getPosition() - lineStart.getPosition(), selEnd.getPosition() - lineStart.getPosition()),
199 line, tabSpaces);
200 }
201
202 if (newHighlightStart != highlightColumnStart || newHighlightEnd != highlightColumnEnd)
203 {
204 highlightColumnStart = newHighlightStart;
205 highlightColumnEnd = newHighlightEnd;
206 }
207 else if (tokens == newTokens)
208 {
209 return false;
210 }
211
212 tokens.swapWith (newTokens);
213 return true;
214 }
215
216 void getHighlightArea (RectangleList<float>& area, float x, int y, int lineH, float characterWidth) const
217 {
219 area.add (Rectangle<float> (x + (float) highlightColumnStart * characterWidth - 1.0f, (float) y - 0.5f,
220 (float) (highlightColumnEnd - highlightColumnStart) * characterWidth + 1.5f, (float) lineH + 1.0f));
221 }
222
223 void draw (CodeEditorComponent& owner, Graphics& g, const Font& fontToUse,
224 const float rightClip, const float x, const int y,
225 const int lineH, const float characterWidth) const
226 {
229
230 int column = 0;
231
232 for (auto& token : tokens)
233 {
234 const float tokenX = x + (float) column * characterWidth;
235 if (tokenX > rightClip)
236 break;
237
238 as.append (token.text.initialSectionNotContaining ("\r\n"), fontToUse, owner.getColourForTokenType (token.tokenType));
239 column += token.length;
240 }
241
242 as.draw (g, { x, (float) y, (float) column * characterWidth + 10.0f, (float) lineH });
243 }
244
245private:
247 {
248 SyntaxToken (const String& t, const int len, const int type) noexcept
249 : text (t), length (len), tokenType (type)
250 {}
251
252 bool operator== (const SyntaxToken& other) const noexcept
253 {
254 return tokenType == other.tokenType
255 && length == other.length
256 && text == other.text;
257 }
258
262 };
263
266
267 static void createTokens (int startPosition, const String& lineText,
269 CodeTokeniser& tokeniser,
270 Array<SyntaxToken>& newTokens)
271 {
272 CodeDocument::Iterator lastIterator (source);
273 const int lineLength = lineText.length();
274
275 for (;;)
276 {
277 int tokenType = tokeniser.readNextToken (source);
278 int tokenStart = lastIterator.getPosition();
279 int tokenEnd = source.getPosition();
280
281 if (tokenEnd <= tokenStart)
282 break;
283
284 tokenEnd -= startPosition;
285
286 if (tokenEnd > 0)
287 {
288 tokenStart -= startPosition;
289 const int start = jmax (0, tokenStart);
290 addToken (newTokens, lineText.substring (start, tokenEnd),
291 tokenEnd - start, tokenType);
292
293 if (tokenEnd >= lineLength)
294 break;
295 }
296
297 lastIterator = source;
298 }
299
300 source = lastIterator;
301 }
302
304 {
305 int x = 0;
306
307 for (auto& t : tokens)
308 {
309 for (;;)
310 {
311 const int tabPos = t.text.indexOfChar ('\t');
312 if (tabPos < 0)
313 break;
314
315 const int spacesNeeded = spacesPerTab - ((tabPos + x) % spacesPerTab);
316 t.text = t.text.replaceSection (tabPos, 1, String::repeatedString (" ", spacesNeeded));
317 t.length = t.text.length();
318 }
319
320 x += t.length;
321 }
322 }
323
324 int indexToColumn (int index, const String& line, int tabSpaces) const noexcept
325 {
326 jassert (index <= line.length());
327
328 auto t = line.getCharPointer();
329 int col = 0;
330
331 for (int i = 0; i < index; ++i)
332 {
333 if (t.getAndAdvance() != '\t')
334 ++col;
335 else
336 col += tabSpaces - (col % tabSpaces);
337 }
338
339 return col;
340 }
341
342 static void addToken (Array<SyntaxToken>& dest, const String& text, int length, int type)
343 {
344 if (length > 1000)
345 {
346 // subdivide very long tokens to avoid unwieldy glyph sequences
347 addToken (dest, text.substring (0, length / 2), length / 2, type);
348 addToken (dest, text.substring (length / 2), length - length / 2, type);
349 }
350 else
351 {
352 dest.add (SyntaxToken (text, length, type));
353 }
354 }
355};
356
358{
359 static int findFirstNonWhitespaceChar (StringRef line) noexcept
360 {
361 auto t = line.text;
362 int i = 0;
363
364 while (! t.isEmpty())
365 {
366 if (! t.isWhitespace())
367 return i;
368
369 ++t;
370 ++i;
371 }
372
373 return 0;
374 }
375}
376
377//==============================================================================
379 public AsyncUpdater,
380 public ScrollBar::Listener,
382{
383public:
385
386private:
388
389 void timerCallback() override { owner.newTransaction(); }
390 void handleAsyncUpdate() override { owner.rebuildLineTokens(); }
391
392 void scrollBarMoved (ScrollBar* scrollBarThatHasMoved, double newRangeStart) override
393 {
394 if (scrollBarThatHasMoved->isVertical())
395 owner.scrollToLineInternal ((int) newRangeStart);
396 else
397 owner.scrollToColumnInternal (newRangeStart);
398 }
399
400 void codeDocumentTextInserted (const String& newText, int pos) override
401 {
402 owner.codeDocumentChanged (pos, pos + newText.length());
403 }
404
405 void codeDocumentTextDeleted (int start, int end) override
406 {
407 owner.codeDocumentChanged (start, end);
408 }
409
411};
412
413//==============================================================================
415{
416public:
418
419 void paint (Graphics& g) override
420 {
421 jassert (dynamic_cast<CodeEditorComponent*> (getParentComponent()) != nullptr);
422 auto& editor = *static_cast<CodeEditorComponent*> (getParentComponent());
423
424 g.fillAll (editor.findColour (CodeEditorComponent::backgroundColourId)
425 .overlaidWith (editor.findColour (lineNumberBackgroundId)));
426
427 auto clip = g.getClipBounds();
428 const int lineH = editor.lineHeight;
429 const float lineHeightFloat = (float) lineH;
430 const int firstLineToDraw = jmax (0, clip.getY() / lineH);
431 const int lastLineToDraw = jmin (editor.lines.size(), clip.getBottom() / lineH + 1,
432 lastNumLines - editor.firstLineOnScreen);
433
434 auto lineNumberFont = editor.getFont().withHeight (jmin (13.0f, lineHeightFloat * 0.8f));
435 auto w = (float) getWidth() - 2.0f;
437
438 for (int i = firstLineToDraw; i < lastLineToDraw; ++i)
439 ga.addFittedText (lineNumberFont, String (editor.firstLineOnScreen + i + 1),
440 0, (float) (lineH * i), w, lineHeightFloat,
442
443 g.setColour (editor.findColour (lineNumberTextId));
444 ga.draw (g);
445 }
446
447 void documentChanged (CodeDocument& doc, int newFirstLine)
448 {
449 auto newNumLines = doc.getNumLines();
450
451 if (newNumLines != lastNumLines || firstLine != newFirstLine)
452 {
453 firstLine = newFirstLine;
454 lastNumLines = newNumLines;
455 repaint();
456 }
457 }
458
459private:
461};
462
463
464//==============================================================================
466 : document (doc),
467 caretPos (doc, 0, 0),
468 selectionStart (doc, 0, 0),
469 selectionEnd (doc, 0, 0),
470 codeTokeniser (tokeniser)
471{
472 pimpl.reset (new Pimpl (*this));
473
474 caretPos.setPositionMaintained (true);
475 selectionStart.setPositionMaintained (true);
476 selectionEnd.setPositionMaintained (true);
477
478 setOpaque (true);
481
483 verticalScrollBar.setSingleStepSize (1.0);
484
486 horizontalScrollBar.setSingleStepSize (1.0);
487
488 Font f (12.0f);
489 f.setTypefaceName (Font::getDefaultMonospacedFontName());
490 setFont (f);
491
492 if (codeTokeniser != nullptr)
493 setColourScheme (codeTokeniser->getDefaultColourScheme());
494
495 setLineNumbersShown (true);
496
497 verticalScrollBar.addListener (pimpl.get());
498 horizontalScrollBar.addListener (pimpl.get());
499 document.addListener (pimpl.get());
500
502}
503
505{
506 document.removeListener (pimpl.get());
507}
508
513
515{
517 document.replaceAllContent (newContent);
518 document.clearUndoHistory();
519 document.setSavePoint();
520 caretPos.setPosition (0);
521 selectionStart.setPosition (0);
522 selectionEnd.setPosition (0);
523 scrollToLine (0);
524}
525
527{
528 return true;
529}
530
532{
533 jassertfalse; // TODO Windows IME not yet supported for this comp..
534}
535
537{
538 if (caret != nullptr)
539 return getLocalArea (caret.get(), caret->getLocalBounds());
540
541 return {};
542}
543
544void CodeEditorComponent::setLineNumbersShown (const bool shouldBeShown)
545{
546 if (showLineNumbers != shouldBeShown)
547 {
548 showLineNumbers = shouldBeShown;
549 gutter.reset();
550
551 if (shouldBeShown)
552 {
553 gutter.reset (new GutterComponent());
555 }
556
557 resized();
558 }
559}
560
562{
563 if (readOnly != b)
564 {
565 readOnly = b;
566
567 if (b)
569 else
570 addAndMakeVisible (caret.get());
571
573 }
574}
575
576//==============================================================================
578{
579 auto visibleWidth = getWidth() - scrollbarThickness - getGutterSize();
581 columnsOnScreen = jmax (1, (int) ((float) visibleWidth / charWidth));
582 lines.clear();
585
586 if (gutter != nullptr)
587 gutter->setBounds (0, 0, getGutterSize() - 2, getHeight());
588
591
593 visibleWidth, scrollbarThickness);
595}
596
598{
600
601 auto gutterSize = getGutterSize();
602 auto bottom = horizontalScrollBar.isVisible() ? horizontalScrollBar.getY() : getHeight();
603 auto right = verticalScrollBar.isVisible() ? verticalScrollBar.getX() : getWidth();
604
605 g.reduceClipRegion (gutterSize, 0, right - gutterSize, bottom);
606
607 g.setFont (font);
608
609 auto clip = g.getClipBounds();
610 auto firstLineToDraw = jmax (0, clip.getY() / lineHeight);
611 auto lastLineToDraw = jmin (lines.size(), clip.getBottom() / lineHeight + 1);
612 auto x = (float) (gutterSize - xOffset * charWidth);
613 auto rightClip = (float) clip.getRight();
614
615 {
616 RectangleList<float> highlightArea;
617
618 for (int i = firstLineToDraw; i < lastLineToDraw; ++i)
619 lines.getUnchecked(i)->getHighlightArea (highlightArea, x, lineHeight * i, lineHeight, charWidth);
620
622 g.fillRectList (highlightArea);
623 }
624
625 for (int i = firstLineToDraw; i < lastLineToDraw; ++i)
626 lines.getUnchecked(i)->draw (*this, g, font, rightClip, x, lineHeight * i, lineHeight, charWidth);
627}
628
630{
631 if (scrollbarThickness != thickness)
632 {
633 scrollbarThickness = thickness;
634 resized();
635 }
636}
637
639{
640 pimpl->triggerAsyncUpdate();
641}
642
644{
645 pimpl->cancelPendingUpdate();
646
647 auto numNeeded = linesOnScreen + 1;
648 auto minLineToRepaint = numNeeded;
649 int maxLineToRepaint = 0;
650
651 if (numNeeded != lines.size())
652 {
653 lines.clear();
654
655 for (int i = numNeeded; --i >= 0;)
656 lines.add (new CodeEditorLine());
657
658 minLineToRepaint = 0;
659 maxLineToRepaint = numNeeded;
660 }
661
662 jassert (numNeeded == lines.size());
663
666
667 for (int i = 0; i < numNeeded; ++i)
668 {
669 if (lines.getUnchecked(i)->update (document, firstLineOnScreen + i, source, codeTokeniser,
671 {
672 minLineToRepaint = jmin (minLineToRepaint, i);
673 maxLineToRepaint = jmax (maxLineToRepaint, i);
674 }
675 }
676
677 if (minLineToRepaint <= maxLineToRepaint)
678 repaint (0, lineHeight * minLineToRepaint - 1,
679 verticalScrollBar.getX(), lineHeight * (1 + maxLineToRepaint - minLineToRepaint) + 2);
680
681 if (gutter != nullptr)
682 gutter->documentChanged (document, firstLineOnScreen);
683}
684
685void CodeEditorComponent::codeDocumentChanged (const int startIndex, const int endIndex)
686{
687 const CodeDocument::Position affectedTextStart (document, startIndex);
688 const CodeDocument::Position affectedTextEnd (document, endIndex);
689
690 retokenise (startIndex, endIndex);
691
694
695 if (affectedTextEnd.getPosition() >= selectionStart.getPosition()
696 && affectedTextStart.getPosition() <= selectionEnd.getPosition())
697 deselectAll();
698
700 if (caretPos.getPosition() > affectedTextEnd.getPosition()
701 || caretPos.getPosition() < affectedTextStart.getPosition())
702 moveCaretTo (affectedTextStart, false);
703
705}
706
707void CodeEditorComponent::retokenise (int startIndex, int endIndex)
708{
709 const CodeDocument::Position affectedTextStart (document, startIndex);
710 juce::ignoreUnused (endIndex); // Leave room for more efficient impl in future.
711
712 clearCachedIterators (affectedTextStart.getLineNumber());
713
715}
716
717//==============================================================================
719{
720 if (caret != nullptr)
721 {
722 caret->setCaretPosition (getCharacterBounds (getCaretPos()));
723
724 if (auto* handler = getAccessibilityHandler())
725 handler->notifyAccessibilityEvent (AccessibilityEvent::textSelectionChanged);
726 }
727}
728
729void CodeEditorComponent::moveCaretTo (const CodeDocument::Position& newPos, const bool highlighting)
730{
731 caretPos = newPos;
733 bool selectionWasActive = isHighlightActive();
734
735 if (highlighting)
736 {
737 if (dragType == notDragging)
738 {
739 auto oldCaretPos = caretPos.getPosition();
740 auto isStart = std::abs (oldCaretPos - selectionStart.getPosition())
741 < std::abs (oldCaretPos - selectionEnd.getPosition());
742
744 }
745
747 {
748 if (selectionEnd.getPosition() < caretPos.getPosition())
749 {
752 }
753 else
754 {
756 }
757 }
758 else
759 {
760 if (caretPos.getPosition() < selectionStart.getPosition())
761 {
764 }
765 else
766 {
768 }
769 }
770
772 }
773 else
774 {
775 deselectAll();
776 }
777
782
783 if (auto* handler = getAccessibilityHandler())
784 handler->notifyAccessibilityEvent (AccessibilityEvent::textChanged);
785
786 if (appCommandManager != nullptr && selectionWasActive != isHighlightActive())
787 appCommandManager->commandStatusChanged();
788}
789
798
800{
801 verticalScrollBar.setRangeLimits (0, jmax (document.getNumLines(), firstLineOnScreen + linesOnScreen));
803
804 horizontalScrollBar.setRangeLimits (0, jmax ((double) document.getMaximumLineLength(), xOffset + columnsOnScreen));
806}
807
808void CodeEditorComponent::scrollToLineInternal (int newFirstLineOnScreen)
809{
810 newFirstLineOnScreen = jlimit (0, jmax (0, document.getNumLines() - 1),
811 newFirstLineOnScreen);
812
813 if (newFirstLineOnScreen != firstLineOnScreen)
814 {
815 firstLineOnScreen = newFirstLineOnScreen;
817
820 pimpl->handleUpdateNowIfNeeded();
821
823 }
824}
825
827{
828 const double newOffset = jlimit (0.0, document.getMaximumLineLength() + 3.0, column);
829
830 if (xOffset != newOffset)
831 {
832 xOffset = newOffset;
834 repaint();
835 }
836}
837
838void CodeEditorComponent::scrollToLine (int newFirstLineOnScreen)
839{
840 scrollToLineInternal (newFirstLineOnScreen);
842}
843
844void CodeEditorComponent::scrollToColumn (int newFirstColumnOnScreen)
845{
846 scrollToColumnInternal (newFirstColumnOnScreen);
848}
849
850void CodeEditorComponent::scrollBy (int deltaLines)
851{
852 scrollToLine (firstLineOnScreen + deltaLines);
853}
854
856{
857 if (rangeToShow.getStart() < firstLineOnScreen)
858 scrollBy (rangeToShow.getStart() - firstLineOnScreen);
859 else if (rangeToShow.getEnd() >= firstLineOnScreen + linesOnScreen)
860 scrollBy (rangeToShow.getEnd() - (firstLineOnScreen + linesOnScreen - 1));
861}
862
864{
865 if (getWidth() > 0 && getHeight() > 0)
866 {
867 auto caretLine = caretPos.getLineNumber();
868 scrollToKeepLinesOnScreen ({ caretLine, caretLine });
869
870 auto column = indexToColumn (caretPos.getLineNumber(), caretPos.getIndexInLine());
871
872 if (column >= xOffset + columnsOnScreen - 1)
874 else if (column < xOffset)
876 }
877}
878
886
888{
889 const int line = y / lineHeight + firstLineOnScreen;
890 const int column = roundToInt ((x - (getGutterSize() - xOffset * charWidth)) / charWidth);
891 const int index = columnToIndex (line, column);
892
893 return CodeDocument::Position (document, line, index);
894}
895
896//==============================================================================
898{
899 insertText (newText);
900}
901
903{
904 if (! readOnly)
905 {
906 document.deleteSection (selectionStart, selectionEnd);
907
908 if (newText.isNotEmpty())
909 document.insertText (caretPos, newText);
910
913
914 if (auto* handler = getAccessibilityHandler())
915 handler->notifyAccessibilityEvent (AccessibilityEvent::textChanged);
916 }
917}
918
920{
921 if (! readOnly)
922 {
923 if (CharacterFunctions::isWhitespace (caretPos.getCharacter())
924 && caretPos.getLineNumber() == caretPos.movedBy (1).getLineNumber())
925 {
926 moveCaretTo (document.findWordBreakAfter (caretPos), false);
927 }
928
930 {
931 auto caretCol = indexToColumn (caretPos.getLineNumber(), caretPos.getIndexInLine());
932 auto spacesNeeded = spacesPerTab - (caretCol % spacesPerTab);
933 insertTextAtCaret (String::repeatedString (" ", spacesNeeded));
934 }
935 else
936 {
937 insertTextAtCaret ("\t");
938 }
939 }
940}
941
943{
944 if (getHighlightedRegion().isEmpty() && ! readOnly)
945 {
946 for (;;)
947 {
948 auto currentColumn = indexToColumn (caretPos.getLineNumber(), caretPos.getIndexInLine());
949
950 if (currentColumn <= 0 || (currentColumn % spacesPerTab) == 0)
951 break;
952
953 moveCaretLeft (false, true);
954 }
955
956 auto selected = getTextInRange (getHighlightedRegion());
957
958 if (selected.isNotEmpty() && selected.trim().isEmpty())
959 {
960 cut();
961 return true;
962 }
963 }
964
965 return false;
966}
967
970
972{
973 if (! readOnly)
974 {
976
977 CodeDocument::Position oldSelectionStart (selectionStart), oldSelectionEnd (selectionEnd), oldCaret (caretPos);
978 oldSelectionStart.setPositionMaintained (true);
979 oldSelectionEnd.setPositionMaintained (true);
980 oldCaret.setPositionMaintained (true);
981
982 const int lineStart = selectionStart.getLineNumber();
983 int lineEnd = selectionEnd.getLineNumber();
984
985 if (lineEnd > lineStart && selectionEnd.getIndexInLine() == 0)
986 --lineEnd;
987
988 for (int line = lineStart; line <= lineEnd; ++line)
989 {
990 auto lineText = document.getLine (line);
991 auto nonWhitespaceStart = CodeEditorHelpers::findFirstNonWhitespaceChar (lineText);
992
993 if (nonWhitespaceStart > 0 || lineText.trimStart().isNotEmpty())
994 {
995 const CodeDocument::Position wsStart (document, line, 0);
996 const CodeDocument::Position wsEnd (document, line, nonWhitespaceStart);
997
998 const int numLeadingSpaces = indexToColumn (line, wsEnd.getIndexInLine());
999 const int newNumLeadingSpaces = jmax (0, numLeadingSpaces + spacesToAdd);
1000
1001 if (newNumLeadingSpaces != numLeadingSpaces)
1002 {
1003 document.deleteSection (wsStart, wsEnd);
1004 document.insertText (wsStart, getTabString (newNumLeadingSpaces));
1005 }
1006 }
1007 }
1008
1009 setSelection (oldSelectionStart, oldSelectionEnd);
1010
1011 if (caretPos != oldCaret)
1012 {
1013 caretPos = oldCaret;
1014
1015 if (auto* handler = getAccessibilityHandler())
1016 handler->notifyAccessibilityEvent (AccessibilityEvent::textChanged);
1017 }
1018 }
1019}
1020
1022{
1023 insertText ({});
1024}
1025
1027{
1029 auto selection = document.getTextBetween (selectionStart, selectionEnd);
1030
1031 if (selection.isNotEmpty())
1033
1034 return true;
1035}
1036
1038{
1040 cut();
1042 return true;
1043}
1044
1046{
1049
1050 if (clip.isNotEmpty())
1051 insertText (clip);
1052
1054 return true;
1055}
1056
1057bool CodeEditorComponent::moveCaretLeft (const bool moveInWholeWordSteps, const bool selecting)
1058{
1060
1061 if (selecting && dragType == notDragging)
1062 {
1065 }
1066
1067 if (isHighlightActive() && ! (selecting || moveInWholeWordSteps))
1068 {
1069 moveCaretTo (selectionStart, false);
1070 return true;
1071 }
1072
1073 if (moveInWholeWordSteps)
1074 moveCaretTo (document.findWordBreakBefore (caretPos), selecting);
1075 else
1076 moveCaretTo (caretPos.movedBy (-1), selecting);
1077
1078 return true;
1079}
1080
1081bool CodeEditorComponent::moveCaretRight (const bool moveInWholeWordSteps, const bool selecting)
1082{
1084
1085 if (selecting && dragType == notDragging)
1086 {
1089 }
1090
1091 if (isHighlightActive() && ! (selecting || moveInWholeWordSteps))
1092 {
1093 moveCaretTo (selectionEnd, false);
1094 return true;
1095 }
1096
1097 if (moveInWholeWordSteps)
1098 moveCaretTo (document.findWordBreakAfter (caretPos), selecting);
1099 else
1100 moveCaretTo (caretPos.movedBy (1), selecting);
1101
1102 return true;
1103}
1104
1105void CodeEditorComponent::moveLineDelta (const int delta, const bool selecting)
1106{
1108 auto newLineNum = pos.getLineNumber() + delta;
1109
1110 if (columnToTryToMaintain < 0)
1112
1113 pos.setLineAndIndex (newLineNum, columnToIndex (newLineNum, columnToTryToMaintain));
1114
1115 auto colToMaintain = columnToTryToMaintain;
1116 moveCaretTo (pos, selecting);
1117 columnToTryToMaintain = colToMaintain;
1118}
1119
1120bool CodeEditorComponent::moveCaretDown (const bool selecting)
1121{
1123
1124 if (caretPos.getLineNumber() == document.getNumLines() - 1)
1125 moveCaretTo (CodeDocument::Position (document, std::numeric_limits<int>::max(), std::numeric_limits<int>::max()), selecting);
1126 else
1127 moveLineDelta (1, selecting);
1128
1129 return true;
1130}
1131
1132bool CodeEditorComponent::moveCaretUp (const bool selecting)
1133{
1135
1136 if (caretPos.getLineNumber() == 0)
1137 moveCaretTo (CodeDocument::Position (document, 0, 0), selecting);
1138 else
1139 moveLineDelta (-1, selecting);
1140
1141 return true;
1142}
1143
1144bool CodeEditorComponent::pageDown (const bool selecting)
1145{
1148 moveLineDelta (linesOnScreen, selecting);
1149 return true;
1150}
1151
1152bool CodeEditorComponent::pageUp (const bool selecting)
1153{
1156 moveLineDelta (-linesOnScreen, selecting);
1157 return true;
1158}
1159
1161{
1163 scrollBy (1);
1164
1165 if (caretPos.getLineNumber() < firstLineOnScreen)
1166 moveLineDelta (1, false);
1167
1168 return true;
1169}
1170
1172{
1174 scrollBy (-1);
1175
1176 if (caretPos.getLineNumber() >= firstLineOnScreen + linesOnScreen)
1177 moveLineDelta (-1, false);
1178
1179 return true;
1180}
1181
1182bool CodeEditorComponent::moveCaretToTop (const bool selecting)
1183{
1185 moveCaretTo (CodeDocument::Position (document, 0, 0), selecting);
1186 return true;
1187}
1188
1190{
1192
1193 int index = CodeEditorHelpers::findFirstNonWhitespaceChar (caretPos.getLineText());
1194
1195 if (index >= caretPos.getIndexInLine() && caretPos.getIndexInLine() > 0)
1196 index = 0;
1197
1198 moveCaretTo (CodeDocument::Position (document, caretPos.getLineNumber(), index), selecting);
1199 return true;
1200}
1201
1202bool CodeEditorComponent::moveCaretToEnd (const bool selecting)
1203{
1205 moveCaretTo (CodeDocument::Position (document, std::numeric_limits<int>::max(),
1206 std::numeric_limits<int>::max()), selecting);
1207 return true;
1208}
1209
1211{
1214 std::numeric_limits<int>::max()), selecting);
1215 return true;
1216}
1217
1218bool CodeEditorComponent::deleteBackwards (const bool moveInWholeWordSteps)
1219{
1220 if (moveInWholeWordSteps)
1221 {
1222 cut(); // in case something is already highlighted
1223 moveCaretTo (document.findWordBreakBefore (caretPos), true);
1224 }
1226 {
1227 selectionStart.moveBy (-1);
1228 }
1229
1230 cut();
1231 return true;
1232}
1233
1235{
1236 auto currentLineText = caretPos.getLineText().removeCharacters ("\r\n");
1237 auto currentIndex = caretPos.getIndexInLine();
1238
1239 if (currentLineText.isNotEmpty() && currentLineText.length() == currentIndex)
1240 {
1241 const int currentLine = caretPos.getLineNumber();
1242 const int currentColumn = indexToColumn (currentLine, currentIndex);
1243 const int previousTabColumn = (currentColumn - 1) - ((currentColumn - 1) % spacesPerTab);
1244 const int previousTabIndex = columnToIndex (currentLine, previousTabColumn);
1245
1246 if (currentLineText.substring (previousTabIndex, currentIndex).trim().isEmpty())
1247 {
1248 selectionStart.moveBy (previousTabIndex - currentIndex);
1249 return true;
1250 }
1251 }
1252
1253 return false;
1254}
1255
1256bool CodeEditorComponent::deleteForwards (const bool moveInWholeWordSteps)
1257{
1258 if (moveInWholeWordSteps)
1259 {
1260 cut(); // in case something is already highlighted
1261 moveCaretTo (document.findWordBreakAfter (caretPos), true);
1262 }
1263 else
1264 {
1266 selectionEnd.moveBy (1);
1267 else
1269 }
1270
1271 cut();
1272 return true;
1273}
1274
1276{
1278 selectRegion (CodeDocument::Position (document, std::numeric_limits<int>::max(),
1279 std::numeric_limits<int>::max()),
1281 return true;
1282}
1283
1290
1291//==============================================================================
1293{
1294 if (readOnly)
1295 return false;
1296
1298 document.undo();
1300 return true;
1301}
1302
1304{
1305 if (readOnly)
1306 return false;
1307
1309 document.redo();
1311 return true;
1312}
1313
1315{
1316 document.newTransaction();
1317 pimpl->startTimer (600);
1318}
1319
1321{
1322 appCommandManager = newManager;
1323}
1324
1325//==============================================================================
1327{
1328 return { selectionStart.getPosition(),
1329 selectionEnd.getPosition() };
1330}
1331
1336
1342
1344{
1345 return document.getTextBetween (CodeDocument::Position (document, range.getStart()),
1347}
1348
1349//==============================================================================
1351{
1353 {
1354 if (readOnly)
1355 return false;
1356
1357 if (key == KeyPress::tabKey || key.getTextCharacter() == '\t') handleTabKey();
1362 else if (key.getTextCharacter() >= ' ') insertTextAtCaret (String::charToString (key.getTextCharacter()));
1363 else return false;
1364 }
1365
1366 pimpl->handleUpdateNowIfNeeded();
1367 return true;
1368}
1369
1371{
1372 insertTextAtCaret (document.getNewLineCharacters());
1373}
1374
1379
1384
1388
1392
1393//==============================================================================
1398
1411
1413{
1414 const bool anythingSelected = isHighlightActive();
1415
1416 switch (commandID)
1417 {
1419 result.setInfo (TRANS ("Cut"), TRANS ("Copies the currently selected text to the clipboard and deletes it."), "Editing", 0);
1420 result.setActive (anythingSelected && ! readOnly);
1421 result.defaultKeypresses.add (KeyPress ('x', ModifierKeys::commandModifier, 0));
1422 break;
1423
1425 result.setInfo (TRANS ("Copy"), TRANS ("Copies the currently selected text to the clipboard."), "Editing", 0);
1426 result.setActive (anythingSelected);
1427 result.defaultKeypresses.add (KeyPress ('c', ModifierKeys::commandModifier, 0));
1428 break;
1429
1431 result.setInfo (TRANS ("Paste"), TRANS ("Inserts text from the clipboard."), "Editing", 0);
1432 result.setActive (! readOnly);
1433 result.defaultKeypresses.add (KeyPress ('v', ModifierKeys::commandModifier, 0));
1434 break;
1435
1437 result.setInfo (TRANS ("Delete"), TRANS ("Deletes any selected text."), "Editing", 0);
1438 result.setActive (anythingSelected && ! readOnly);
1439 break;
1440
1442 result.setInfo (TRANS ("Select All"), TRANS ("Selects all the text in the editor."), "Editing", 0);
1443 result.defaultKeypresses.add (KeyPress ('a', ModifierKeys::commandModifier, 0));
1444 break;
1445
1447 result.setInfo (TRANS ("Undo"), TRANS ("Undo"), "Editing", 0);
1448 result.defaultKeypresses.add (KeyPress ('z', ModifierKeys::commandModifier, 0));
1449 result.setActive (document.getUndoManager().canUndo() && ! readOnly);
1450 break;
1451
1453 result.setInfo (TRANS ("Redo"), TRANS ("Redo"), "Editing", 0);
1455 result.setActive (document.getUndoManager().canRedo() && ! readOnly);
1456 break;
1457
1458 default:
1459 break;
1460 }
1461}
1462
1464{
1465 return performCommand (info.commandID);
1466}
1467
1469{
1470 caret.reset (getLookAndFeel().createCaretComponent (this));
1471 addAndMakeVisible (caret.get());
1472}
1473
1475{
1476 switch (commandID)
1477 {
1485 default: return false;
1486 }
1487
1488 return true;
1489}
1490
1492 CodeDocument::Position newSelectionEnd)
1493{
1494 if (selectionStart != newSelectionStart
1495 || selectionEnd != newSelectionEnd)
1496 {
1497 selectionStart = newSelectionStart;
1498 selectionEnd = newSelectionEnd;
1499
1500 if (auto* handler = getAccessibilityHandler())
1501 handler->notifyAccessibilityEvent (AccessibilityEvent::textSelectionChanged);
1502 }
1503}
1504
1505//==============================================================================
1507{
1509 m.addItem (StandardApplicationCommandIDs::copy, TRANS ("Copy"), ! getHighlightedRegion().isEmpty());
1510 m.addItem (StandardApplicationCommandIDs::paste, TRANS ("Paste"), ! readOnly);
1511 m.addItem (StandardApplicationCommandIDs::del, TRANS ("Delete"), ! readOnly);
1512 m.addSeparator();
1513 m.addItem (StandardApplicationCommandIDs::selectAll, TRANS ("Select All"));
1514 m.addSeparator();
1515 m.addItem (StandardApplicationCommandIDs::undo, TRANS ("Undo"), document.getUndoManager().canUndo());
1516 m.addItem (StandardApplicationCommandIDs::redo, TRANS ("Redo"), document.getUndoManager().canRedo());
1517}
1518
1520{
1521 performCommand (menuItemID);
1522}
1523
1524static void codeEditorMenuCallback (int menuResult, CodeEditorComponent* editor)
1525{
1526 if (editor != nullptr && menuResult != 0)
1527 editor->performPopupMenuAction (menuResult);
1528}
1529
1530//==============================================================================
1532{
1535
1536 if (e.mods.isPopupMenu())
1537 {
1539
1540 if (getHighlightedRegion().isEmpty())
1541 {
1543 document.findTokenContaining (getPositionAt (e.x, e.y), start, end);
1544
1545 if (start.getPosition() < end.getPosition())
1547 }
1548
1549 PopupMenu m;
1550 m.setLookAndFeel (&getLookAndFeel());
1551 addPopupMenuItems (m, &e);
1552
1553 m.showMenuAsync (PopupMenu::Options(),
1555 }
1556 else
1557 {
1558 beginDragAutoRepeat (100);
1559 moveCaretTo (getPositionAt (e.x, e.y), e.mods.isShiftDown());
1560 }
1561}
1562
1564{
1565 if (! e.mods.isPopupMenu())
1566 moveCaretTo (getPositionAt (e.x, e.y), true);
1567}
1568
1576
1578{
1579 CodeDocument::Position tokenStart (getPositionAt (e.x, e.y));
1580 CodeDocument::Position tokenEnd (tokenStart);
1581
1582 if (e.getNumberOfClicks() > 2)
1583 document.findLineContaining (tokenStart, tokenStart, tokenEnd);
1584 else
1585 document.findTokenContaining (tokenStart, tokenStart, tokenEnd);
1586
1587 selectRegion (tokenStart, tokenEnd);
1589}
1590
1592{
1593 if ((verticalScrollBar.isVisible() && wheel.deltaY != 0.0f)
1594 || (horizontalScrollBar.isVisible() && wheel.deltaX != 0.0f))
1595 {
1596 {
1597 MouseWheelDetails w (wheel);
1598 w.deltaX = 0;
1599 verticalScrollBar.mouseWheelMove (e, w);
1600 }
1601
1602 {
1603 MouseWheelDetails w (wheel);
1604 w.deltaY = 0;
1605 horizontalScrollBar.mouseWheelMove (e, w);
1606 }
1607 }
1608 else
1609 {
1611 }
1612}
1613
1614//==============================================================================
1617
1618//==============================================================================
1619void CodeEditorComponent::setTabSize (const int numSpaces, const bool insertSpaces)
1620{
1621 useSpacesForTabs = insertSpaces;
1622
1623 if (spacesPerTab != numSpaces)
1624 {
1625 spacesPerTab = numSpaces;
1627 }
1628}
1629
1631{
1632 return String::repeatedString (useSpacesForTabs ? " " : "\t",
1633 useSpacesForTabs ? numSpaces
1634 : (numSpaces / spacesPerTab));
1635}
1636
1637int CodeEditorComponent::indexToColumn (int lineNum, int index) const noexcept
1638{
1639 auto line = document.getLine (lineNum);
1640 auto t = line.getCharPointer();
1641 int col = 0;
1642
1643 for (int i = 0; i < index; ++i)
1644 {
1645 if (t.isEmpty())
1646 {
1648 break;
1649 }
1650
1651 if (t.getAndAdvance() != '\t')
1652 ++col;
1653 else
1654 col += getTabSize() - (col % getTabSize());
1655 }
1656
1657 return col;
1658}
1659
1660int CodeEditorComponent::columnToIndex (int lineNum, int column) const noexcept
1661{
1662 auto line = document.getLine (lineNum);
1663 auto t = line.getCharPointer();
1664 int i = 0, col = 0;
1665
1666 while (! t.isEmpty())
1667 {
1668 if (t.getAndAdvance() != '\t')
1669 ++col;
1670 else
1671 col += getTabSize() - (col % getTabSize());
1672
1673 if (col > column)
1674 break;
1675
1676 ++i;
1677 }
1678
1679 return i;
1680}
1681
1682//==============================================================================
1684{
1685 font = newFont;
1686 charWidth = font.getStringWidthFloat ("0");
1687 lineHeight = roundToInt (font.getHeight());
1688 resized();
1689}
1690
1692{
1693 for (auto& tt : types)
1694 {
1695 if (tt.name == name)
1696 {
1697 tt.colour = colour;
1698 return;
1699 }
1700 }
1701
1702 TokenType tt;
1703 tt.name = name;
1704 tt.colour = colour;
1705 types.add (tt);
1706}
1707
1709{
1710 colourScheme = scheme;
1711 repaint();
1712}
1713
1715{
1716 return isPositiveAndBelow (tokenType, colourScheme.types.size())
1717 ? colourScheme.types.getReference (tokenType).colour
1719}
1720
1721void CodeEditorComponent::clearCachedIterators (const int firstLineToBeInvalid)
1722{
1723 int i;
1724 for (i = cachedIterators.size(); --i >= 0;)
1725 if (cachedIterators.getUnchecked (i).getLine() < firstLineToBeInvalid)
1726 break;
1727
1728 cachedIterators.removeRange (jmax (0, i - 1), cachedIterators.size());
1729}
1730
1732{
1733 const int maxNumCachedPositions = 5000;
1734 const int linesBetweenCachedSources = jmax (10, document.getNumLines() / maxNumCachedPositions);
1735
1736 if (cachedIterators.size() == 0)
1738
1739 if (codeTokeniser != nullptr)
1740 {
1741 for (;;)
1742 {
1743 const auto last = cachedIterators.getLast();
1744
1745 if (last.getLine() >= maxLineNum)
1746 break;
1747
1749 auto& t = cachedIterators.getReference (cachedIterators.size() - 1);
1750 const int targetLine = jmin (maxLineNum, last.getLine() + linesBetweenCachedSources);
1751
1752 for (;;)
1753 {
1754 codeTokeniser->readNextToken (t);
1755
1756 if (t.getLine() >= targetLine)
1757 break;
1758
1759 if (t.isEOF())
1760 return;
1761 }
1762 }
1763 }
1764}
1765
1767{
1768 if (codeTokeniser != nullptr)
1769 {
1770 for (int i = cachedIterators.size(); --i >= 0;)
1771 {
1772 auto& t = cachedIterators.getReference (i);
1773
1774 if (t.getPosition() <= position)
1775 {
1776 source = t;
1777 break;
1778 }
1779 }
1780
1781 while (source.getPosition() < position)
1782 {
1783 const CodeDocument::Iterator original (source);
1784 codeTokeniser->readNextToken (source);
1785
1786 if (source.getPosition() > position || source.isEOF())
1787 {
1788 source = original;
1789 break;
1790 }
1791 }
1792 }
1793}
1794
1796 : lastTopLine (editor.getFirstLineOnScreen()),
1799{
1800 auto selection = editor.getHighlightedRegion();
1801
1802 if (lastCaretPos == selection.getStart())
1803 lastSelectionEnd = selection.getEnd();
1804 else
1805 lastSelectionEnd = selection.getStart();
1806}
1807
1809 : lastTopLine (other.lastTopLine),
1810 lastCaretPos (other.lastCaretPos),
1811 lastSelectionEnd (other.lastSelectionEnd)
1812{
1813}
1814
1823
1825{
1826 auto tokens = StringArray::fromTokens (s, ":", {});
1827
1828 lastTopLine = tokens[0].getIntValue();
1829 lastCaretPos = tokens[1].getIntValue();
1830 lastSelectionEnd = tokens[2].getIntValue();
1831}
1832
1837
1838//==============================================================================
1839std::unique_ptr<AccessibilityHandler> CodeEditorComponent::createAccessibilityHandler()
1840{
1841 return std::make_unique<CodeEditorAccessibilityHandler> (*this);
1842}
1843
1844} // namespace juce
Type jmin(const Type a, const Type b)
Definition MathsFunctions.h:60
Type jmax(const Type a, const Type b)
Definition MathsFunctions.h:48
#define noexcept
Definition DistrhoDefines.h:72
CAdPlugDatabase::CRecord::RecordType type
Definition adplugdb.cpp:93
static StringArray fromTokens(StringRef stringToTokenise, bool preserveQuotedStrings)
Definition StringArray.cpp:369
static String repeatedString(StringRef stringToRepeat, int numberOfTimesToRepeat)
Definition String.cpp:1028
AccessibilityHandler(Component &componentToWrap, AccessibilityRole accessibilityRole, AccessibilityActions actions={}, Interfaces interfaces={})
Definition juce_AccessibilityHandler.cpp:55
Definition juce_AccessibilityTextInterface.h:39
Definition juce_ApplicationCommandManager.h:88
ApplicationCommandTarget()
Definition juce_ApplicationCommandTarget.cpp:51
ApplicationCommandTarget * findFirstTargetParentComponent()
Definition juce_ApplicationCommandTarget.cpp:77
Definition juce_Array.h:56
void ensureStorageAllocated(int minNumElements)
Definition juce_Array.h:1065
void addArray(const Type *elementsToAdd, int numElementsToAdd)
Definition juce_Array.h:583
void add(const ElementType &newElement)
Definition juce_Array.h:418
AsyncUpdater()
Definition juce_AsyncUpdater.cpp:44
Definition juce_AttributedString.h:47
void draw(Graphics &g, const Rectangle< float > &area) const
Definition juce_AttributedString.cpp:267
void append(const String &textToAppend)
Definition juce_AttributedString.cpp:175
void setJustification(Justification newJustification) noexcept
Definition juce_AttributedString.cpp:223
static bool isWhitespace(char character) noexcept
Definition juce_CharacterFunctions.cpp:59
Definition juce_CodeDocument.h:360
bool isEOF() const noexcept
Definition juce_CodeDocument.cpp:293
int getPosition() const noexcept
Definition juce_CodeDocument.h:397
Definition juce_CodeDocument.h:328
Definition juce_CodeDocument.h:63
int getIndexInLine() const noexcept
Definition juce_CodeDocument.h:144
int getPosition() const noexcept
Definition juce_CodeDocument.h:120
int getLineNumber() const noexcept
Definition juce_CodeDocument.h:136
void setLineAndIndex(int newLineNumber, int newIndexInLine)
Definition juce_CodeDocument.cpp:399
void setPositionMaintained(bool isMaintained)
Definition juce_CodeDocument.cpp:532
Position movedBy(int characterDelta) const
Definition juce_CodeDocument.cpp:502
String getLineText() const
Definition juce_CodeDocument.cpp:524
Definition juce_CodeDocument.h:46
String getLine(int lineIndex) const noexcept
Definition juce_CodeDocument.cpp:623
int getNumLines() const noexcept
Definition juce_CodeDocument.h:204
CodeEditorComponent & codeEditorComponent
Definition juce_CodeEditorComponent.cpp:152
bool isDisplayingProtectedText() const override
Definition juce_CodeEditorComponent.cpp:51
void setSelection(Range< int > r) override
Definition juce_CodeEditorComponent.cpp:72
void setText(const String &newText) override
Definition juce_CodeEditorComponent.cpp:99
String getText(Range< int > r) const override
Definition juce_CodeEditorComponent.cpp:91
Range< int > getSelection() const override
Definition juce_CodeEditorComponent.cpp:66
int getOffsetAtPoint(Point< int > point) const override
Definition juce_CodeEditorComponent.cpp:146
int getTotalNumCharacters() const override
Definition juce_CodeEditorComponent.cpp:61
bool isReadOnly() const override
Definition juce_CodeEditorComponent.cpp:56
RectangleList< int > getTextBounds(Range< int > textRange) const override
Definition juce_CodeEditorComponent.cpp:109
int getTextInsertionOffset() const override
Definition juce_CodeEditorComponent.cpp:104
CodeEditorComponentTextInterface(CodeEditorComponent &codeEditorComponentToWrap)
Definition juce_CodeEditorComponent.cpp:46
Definition juce_CodeEditorComponent.cpp:31
CodeEditorAccessibilityHandler(CodeEditorComponent &codeEditorComponentToWrap)
Definition juce_CodeEditorComponent.cpp:33
Definition juce_CodeEditorComponent.cpp:161
int indexToColumn(int index, const String &line, int tabSpaces) const noexcept
Definition juce_CodeEditorComponent.cpp:324
CodeEditorLine() noexcept
Definition juce_CodeEditorComponent.cpp:163
bool update(CodeDocument &codeDoc, int lineNum, CodeDocument::Iterator &source, CodeTokeniser *tokeniser, const int tabSpaces, const CodeDocument::Position &selStart, const CodeDocument::Position &selEnd)
Definition juce_CodeEditorComponent.cpp:165
int highlightColumnStart
Definition juce_CodeEditorComponent.cpp:265
Array< SyntaxToken > tokens
Definition juce_CodeEditorComponent.cpp:264
void getHighlightArea(RectangleList< float > &area, float x, int y, int lineH, float characterWidth) const
Definition juce_CodeEditorComponent.cpp:216
static void replaceTabsWithSpaces(Array< SyntaxToken > &tokens, const int spacesPerTab)
Definition juce_CodeEditorComponent.cpp:303
static void addToken(Array< SyntaxToken > &dest, const String &text, int length, int type)
Definition juce_CodeEditorComponent.cpp:342
void draw(CodeEditorComponent &owner, Graphics &g, const Font &fontToUse, const float rightClip, const float x, const int y, const int lineH, const float characterWidth) const
Definition juce_CodeEditorComponent.cpp:223
int highlightColumnEnd
Definition juce_CodeEditorComponent.cpp:265
static void createTokens(int startPosition, const String &lineText, CodeDocument::Iterator &source, CodeTokeniser &tokeniser, Array< SyntaxToken > &newTokens)
Definition juce_CodeEditorComponent.cpp:267
Definition juce_CodeEditorComponent.cpp:415
void paint(Graphics &g) override
Definition juce_CodeEditorComponent.cpp:419
void documentChanged(CodeDocument &doc, int newFirstLine)
Definition juce_CodeEditorComponent.cpp:447
int lastNumLines
Definition juce_CodeEditorComponent.cpp:460
int firstLine
Definition juce_CodeEditorComponent.cpp:460
GutterComponent()
Definition juce_CodeEditorComponent.cpp:417
Definition juce_CodeEditorComponent.cpp:382
CodeEditorComponent & owner
Definition juce_CodeEditorComponent.cpp:387
void timerCallback() override
Definition juce_CodeEditorComponent.cpp:389
Pimpl(CodeEditorComponent &ed)
Definition juce_CodeEditorComponent.cpp:384
void scrollBarMoved(ScrollBar *scrollBarThatHasMoved, double newRangeStart) override
Definition juce_CodeEditorComponent.cpp:392
void codeDocumentTextInserted(const String &newText, int pos) override
Definition juce_CodeEditorComponent.cpp:400
void handleAsyncUpdate() override
Definition juce_CodeEditorComponent.cpp:390
void codeDocumentTextDeleted(int start, int end) override
Definition juce_CodeEditorComponent.cpp:405
Definition juce_CodeEditorComponent.h:44
CodeTokeniser * codeTokeniser
Definition juce_CodeEditorComponent.h:419
int getFirstLineOnScreen() const noexcept
Definition juce_CodeEditorComponent.h:85
void getCommandInfo(CommandID, ApplicationCommandInfo &) override
Definition juce_CodeEditorComponent.cpp:1412
int lineHeight
Definition juce_CodeEditorComponent.h:391
void rebuildLineTokensAsync()
Definition juce_CodeEditorComponent.cpp:638
Array< CodeDocument::Iterator > cachedIterators
Definition juce_CodeEditorComponent.h:428
void lookAndFeelChanged() override
Definition juce_CodeEditorComponent.cpp:1468
void mouseUp(const MouseEvent &) override
Definition juce_CodeEditorComponent.cpp:1569
void mouseDrag(const MouseEvent &) override
Definition juce_CodeEditorComponent.cpp:1563
bool moveCaretToStartOfLine(bool selecting)
Definition juce_CodeEditorComponent.cpp:1189
~CodeEditorComponent() override
Definition juce_CodeEditorComponent.cpp:504
void selectRegion(const CodeDocument::Position &start, const CodeDocument::Position &end)
Definition juce_CodeEditorComponent.cpp:1284
String getTabString(int numSpaces) const
Definition juce_CodeEditorComponent.cpp:1630
double xOffset
Definition juce_CodeEditorComponent.h:394
virtual bool pasteFromClipboard()
Definition juce_CodeEditorComponent.cpp:1045
CodeEditorComponent(CodeDocument &document, CodeTokeniser *codeTokeniser)
Definition juce_CodeEditorComponent.cpp:465
void scrollToLineInternal(int line)
Definition juce_CodeEditorComponent.cpp:808
bool pageDown(bool selecting)
Definition juce_CodeEditorComponent.cpp:1144
DragType dragType
Definition juce_CodeEditorComponent.h:416
std::unique_ptr< GutterComponent > gutter
Definition juce_CodeEditorComponent.h:405
void indentSelection()
Definition juce_CodeEditorComponent.cpp:968
void codeDocumentChanged(int start, int end)
Definition juce_CodeEditorComponent.cpp:685
void setTemporaryUnderlining(const Array< Range< int > > &) override
Definition juce_CodeEditorComponent.cpp:531
void updateCachedIterators(int maxLineNum)
Definition juce_CodeEditorComponent.cpp:1731
virtual void handleTabKey()
Definition juce_CodeEditorComponent.cpp:1375
void retokenise(int startIndex, int endIndex)
Definition juce_CodeEditorComponent.cpp:707
ApplicationCommandManager * appCommandManager
Definition juce_CodeEditorComponent.h:399
void clearCachedIterators(int firstLineToBeInvalid)
Definition juce_CodeEditorComponent.cpp:1721
ScrollBar verticalScrollBar
Definition juce_CodeEditorComponent.h:398
virtual void handleReturnKey()
Definition juce_CodeEditorComponent.cpp:1370
bool moveCaretRight(bool moveInWholeWordSteps, bool selecting)
Definition juce_CodeEditorComponent.cpp:1081
void setHighlightedRegion(const Range< int > &newRange) override
Definition juce_CodeEditorComponent.cpp:1337
void scrollToColumnInternal(double column)
Definition juce_CodeEditorComponent.cpp:826
void setSelection(CodeDocument::Position, CodeDocument::Position)
Definition juce_CodeEditorComponent.cpp:1491
void updateScrollBars()
Definition juce_CodeEditorComponent.cpp:799
void newTransaction()
Definition juce_CodeEditorComponent.cpp:1314
Colour getColourForTokenType(int tokenType) const
Definition juce_CodeEditorComponent.cpp:1714
int linesOnScreen
Definition juce_CodeEditorComponent.h:391
bool moveCaretToEndOfLine(bool selecting)
Definition juce_CodeEditorComponent.cpp:1210
void setReadOnly(bool shouldBeReadOnly) noexcept
Definition juce_CodeEditorComponent.cpp:561
void loadContent(const String &newContent)
Definition juce_CodeEditorComponent.cpp:514
bool readOnly
Definition juce_CodeEditorComponent.h:393
void setScrollbarThickness(int thickness)
Definition juce_CodeEditorComponent.cpp:629
void focusLost(FocusChangeType) override
Definition juce_CodeEditorComponent.cpp:1616
CodeDocument::Position selectionEnd
Definition juce_CodeEditorComponent.h:395
bool moveCaretToEnd(bool selecting)
Definition juce_CodeEditorComponent.cpp:1202
int getGutterSize() const noexcept
Definition juce_CodeEditorComponent.cpp:509
void scrollToKeepCaretOnScreen()
Definition juce_CodeEditorComponent.cpp:863
void moveLineDelta(int delta, bool selecting)
Definition juce_CodeEditorComponent.cpp:1105
bool deleteWhitespaceBackwardsToTabStop()
Definition juce_CodeEditorComponent.cpp:942
void paint(Graphics &) override
Definition juce_CodeEditorComponent.cpp:597
bool scrollDown()
Definition juce_CodeEditorComponent.cpp:1171
void indentSelectedLines(int spacesToAdd)
Definition juce_CodeEditorComponent.cpp:971
virtual void performPopupMenuAction(int menuItemID)
Definition juce_CodeEditorComponent.cpp:1519
int columnToTryToMaintain
Definition juce_CodeEditorComponent.h:392
bool selectAll()
Definition juce_CodeEditorComponent.cpp:1275
int indexToColumn(int line, int index) const noexcept
Definition juce_CodeEditorComponent.cpp:1637
virtual bool cutToClipboard()
Definition juce_CodeEditorComponent.cpp:1037
bool deleteForwards(bool moveInWholeWordSteps)
Definition juce_CodeEditorComponent.cpp:1256
CodeDocument::Position getCaretPos() const
Definition juce_CodeEditorComponent.h:93
virtual void caretPositionMoved()
Definition juce_CodeEditorComponent.cpp:1389
void getIteratorForPosition(int position, CodeDocument::Iterator &)
Definition juce_CodeEditorComponent.cpp:1766
int scrollbarThickness
Definition juce_CodeEditorComponent.h:392
float charWidth
Definition juce_CodeEditorComponent.h:390
void setTabSize(int numSpacesPerTab, bool insertSpacesInsteadOfTabCharacters)
Definition juce_CodeEditorComponent.cpp:1619
void setLineNumbersShown(bool shouldBeShown)
Definition juce_CodeEditorComponent.cpp:544
Range< int > getHighlightedRegion() const override
Definition juce_CodeEditorComponent.cpp:1326
@ notDragging
Definition juce_CodeEditorComponent.h:411
@ draggingSelectionStart
Definition juce_CodeEditorComponent.h:412
@ draggingSelectionEnd
Definition juce_CodeEditorComponent.h:413
void resized() override
Definition juce_CodeEditorComponent.cpp:577
bool useSpacesForTabs
Definition juce_CodeEditorComponent.h:393
bool performCommand(CommandID)
Definition juce_CodeEditorComponent.cpp:1474
void scrollToKeepLinesOnScreen(Range< int > linesToShow)
Definition juce_CodeEditorComponent.cpp:855
void insertText(const String &)
Definition juce_CodeEditorComponent.cpp:902
bool perform(const InvocationInfo &) override
Definition juce_CodeEditorComponent.cpp:1463
CodeDocument::Position caretPos
Definition juce_CodeEditorComponent.h:395
void focusGained(FocusChangeType) override
Definition juce_CodeEditorComponent.cpp:1615
void insertTextAtCaret(const String &textToInsert) override
Definition juce_CodeEditorComponent.cpp:897
CodeDocument & getDocument() const noexcept
Definition juce_CodeEditorComponent.h:63
void mouseDown(const MouseEvent &) override
Definition juce_CodeEditorComponent.cpp:1531
bool skipBackwardsToPreviousTab()
Definition juce_CodeEditorComponent.cpp:1234
int spacesPerTab
Definition juce_CodeEditorComponent.h:389
void setCommandManager(ApplicationCommandManager *newManager) noexcept
Definition juce_CodeEditorComponent.cpp:1320
virtual void handleEscapeKey()
Definition juce_CodeEditorComponent.cpp:1380
int columnToIndex(int line, int column) const noexcept
Definition juce_CodeEditorComponent.cpp:1660
int getTabSize() const noexcept
Definition juce_CodeEditorComponent.h:198
void scrollToColumn(int newFirstColumnOnScreen)
Definition juce_CodeEditorComponent.cpp:844
void scrollToLine(int newFirstLineOnScreen)
Definition juce_CodeEditorComponent.cpp:838
bool moveCaretLeft(bool moveInWholeWordSteps, bool selecting)
Definition juce_CodeEditorComponent.cpp:1057
void mouseDoubleClick(const MouseEvent &) override
Definition juce_CodeEditorComponent.cpp:1577
void setColourScheme(const ColourScheme &scheme)
Definition juce_CodeEditorComponent.cpp:1708
bool moveCaretUp(bool selecting)
Definition juce_CodeEditorComponent.cpp:1132
bool undo()
Definition juce_CodeEditorComponent.cpp:1292
int firstLineOnScreen
Definition juce_CodeEditorComponent.h:389
bool pageUp(bool selecting)
Definition juce_CodeEditorComponent.cpp:1152
void insertTabAtCaret()
Definition juce_CodeEditorComponent.cpp:919
Rectangle< int > getCharacterBounds(const CodeDocument::Position &pos) const
Definition juce_CodeEditorComponent.cpp:879
String getTextInRange(const Range< int > &range) const override
Definition juce_CodeEditorComponent.cpp:1343
ScrollBar horizontalScrollBar
Definition juce_CodeEditorComponent.h:398
bool moveCaretDown(bool selecting)
Definition juce_CodeEditorComponent.cpp:1120
std::unique_ptr< Pimpl > pimpl
Definition juce_CodeEditorComponent.h:402
ApplicationCommandTarget * getNextCommandTarget() override
Definition juce_CodeEditorComponent.cpp:1394
Rectangle< int > getCaretRectangle() override
Definition juce_CodeEditorComponent.cpp:536
CodeDocument & document
Definition juce_CodeEditorComponent.h:386
bool isTextInputActive() const override
Definition juce_CodeEditorComponent.cpp:526
void getAllCommands(Array< CommandID > &) override
Definition juce_CodeEditorComponent.cpp:1399
bool moveCaretToTop(bool selecting)
Definition juce_CodeEditorComponent.cpp:1182
void setFont(const Font &newFont)
Definition juce_CodeEditorComponent.cpp:1683
void rebuildLineTokens()
Definition juce_CodeEditorComponent.cpp:643
bool redo()
Definition juce_CodeEditorComponent.cpp:1303
bool showLineNumbers
Definition juce_CodeEditorComponent.h:393
virtual void updateCaretPosition()
Definition juce_CodeEditorComponent.cpp:718
void deselectAll()
Definition juce_CodeEditorComponent.cpp:790
CodeDocument::Position getPositionAt(int x, int y) const
Definition juce_CodeEditorComponent.cpp:887
bool deleteBackwards(bool moveInWholeWordSteps)
Definition juce_CodeEditorComponent.cpp:1218
void scrollBy(int deltaLines)
Definition juce_CodeEditorComponent.cpp:850
OwnedArray< CodeEditorLine > lines
Definition juce_CodeEditorComponent.h:423
Font font
Definition juce_CodeEditorComponent.h:388
virtual bool copyToClipboard()
Definition juce_CodeEditorComponent.cpp:1026
bool scrollUp()
Definition juce_CodeEditorComponent.cpp:1160
bool isHighlightActive() const noexcept
Definition juce_CodeEditorComponent.cpp:1332
std::unique_ptr< AccessibilityHandler > createAccessibilityHandler() override
Definition juce_CodeEditorComponent.cpp:1839
void mouseWheelMove(const MouseEvent &, const MouseWheelDetails &) override
Definition juce_CodeEditorComponent.cpp:1591
bool keyPressed(const KeyPress &) override
Definition juce_CodeEditorComponent.cpp:1350
void cut()
Definition juce_CodeEditorComponent.cpp:1021
bool isReadOnly() const noexcept
Definition juce_CodeEditorComponent.h:220
virtual void editorViewportPositionChanged()
Definition juce_CodeEditorComponent.cpp:1385
bool shouldFollowDocumentChanges
Definition juce_CodeEditorComponent.h:393
virtual void addPopupMenuItems(PopupMenu &menuToAddTo, const MouseEvent *mouseClickEvent)
Definition juce_CodeEditorComponent.cpp:1506
@ lineNumberTextId
Definition juce_CodeEditorComponent.h:281
@ backgroundColourId
Definition juce_CodeEditorComponent.h:277
@ highlightColourId
Definition juce_CodeEditorComponent.h:278
@ lineNumberBackgroundId
Definition juce_CodeEditorComponent.h:280
@ defaultTextColourId
Definition juce_CodeEditorComponent.h:279
std::unique_ptr< CaretComponent > caret
Definition juce_CodeEditorComponent.h:397
int columnsOnScreen
Definition juce_CodeEditorComponent.h:391
void unindentSelection()
Definition juce_CodeEditorComponent.cpp:969
void moveCaretTo(const CodeDocument::Position &newPos, bool selecting)
Definition juce_CodeEditorComponent.cpp:729
ColourScheme colourScheme
Definition juce_CodeEditorComponent.h:420
CodeDocument::Position selectionStart
Definition juce_CodeEditorComponent.h:395
Definition juce_CodeTokeniser.h:39
virtual int readNextToken(CodeDocument::Iterator &source)=0
Definition juce_Colour.h:38
Component * getParentComponent() const noexcept
Definition juce_Component.h:804
Point< int > getPosition() const noexcept
Definition juce_Component.h:286
int getHeight() const noexcept
Definition juce_Component.h:274
Rectangle< int > getLocalArea(const Component *sourceComponent, Rectangle< int > areaRelativeToSourceComponent) const
Definition juce_Component.cpp:1138
void addAndMakeVisible(Component *child, int zOrder=-1)
Definition juce_Component.cpp:1554
FocusChangeType
Definition juce_Component.h:1890
AccessibilityHandler * getAccessibilityHandler()
Definition juce_Component.cpp:3302
void setOpaque(bool shouldBeOpaque)
Definition juce_Component.cpp:829
void setMouseCursor(const MouseCursor &cursorType)
Definition juce_Component.cpp:1859
void repaint()
Definition juce_Component.cpp:1917
Component() noexcept
Definition juce_Component.cpp:517
void removeChildComponent(Component *childToRemove)
Definition juce_Component.cpp:1569
void setWantsKeyboardFocus(bool wantsFocus) noexcept
Definition juce_Component.cpp:2842
Colour findColour(int colourID, bool inheritFromParent=false) const
Definition juce_Component.cpp:2219
int getWidth() const noexcept
Definition juce_Component.h:271
void mouseWheelMove(const MouseEvent &event, const MouseWheelDetails &wheel) override
Definition juce_Component.cpp:2303
static void JUCE_CALLTYPE beginDragAutoRepeat(int millisecondsBetweenCallbacks)
Definition juce_Component.cpp:2745
LookAndFeel & getLookAndFeel() const noexcept
Definition juce_Component.cpp:2173
void invalidateAccessibilityHandler()
Definition juce_Component.cpp:3297
Definition juce_Font.h:42
static const String & getDefaultMonospacedFontName()
Definition juce_Font.cpp:467
Definition juce_GlyphArrangement.h:117
void addFittedText(const Font &font, const String &text, float x, float y, float width, float height, Justification layout, int maximumLinesToUse, float minimumHorizontalScale=0.0f)
Definition juce_GlyphArrangement.cpp:310
void draw(const Graphics &) const
Definition juce_GlyphArrangement.cpp:706
Definition juce_GraphicsContext.h:45
@ centredRight
Definition juce_Justification.h:148
@ centredLeft
Definition juce_Justification.h:143
Definition juce_KeyPress.h:40
static const int tabKey
Definition juce_KeyPress.h:192
static const int escapeKey
Definition juce_KeyPress.h:190
static const int returnKey
Definition juce_KeyPress.h:191
static ModalComponentManager::Callback * forComponent(void(*functionToCall)(int, ComponentType *), ComponentType *component)
Definition juce_ModalComponentManager.h:276
@ commandModifier
Definition juce_ModifierKeys.h:147
@ shiftModifier
Definition juce_ModifierKeys.h:121
@ NormalCursor
Definition juce_MouseCursor.h:48
@ IBeamCursor
Definition juce_MouseCursor.h:51
Definition juce_MouseEvent.h:39
Definition juce_Point.h:42
ValueType y
Definition juce_Point.h:247
ValueType x
Definition juce_Point.h:246
Definition juce_PopupMenu.h:457
Definition juce_PopupMenu.h:80
Definition juce_Range.h:40
constexpr ValueType getStart() const noexcept
Definition juce_Range.h:80
constexpr ValueType getEnd() const noexcept
Definition juce_Range.h:86
Definition juce_Rectangle.h:67
Definition juce_RectangleList.h:43
void add(RectangleType rect)
Definition juce_RectangleList.h:110
Definition juce_ScopedValueSetter.h:55
Definition juce_ScrollBar.h:309
Definition juce_ScrollBar.h:54
bool isVertical() const noexcept
Definition juce_ScrollBar.h:67
Definition juce_String.h:53
static String repeatedString(StringRef stringToRepeat, int numberOfTimesToRepeat)
Definition juce_String.cpp:1147
int length() const noexcept
Definition juce_String.cpp:511
static String charToString(juce_wchar character)
Definition juce_String.cpp:359
String substring(int startIndex, int endIndex) const
Definition juce_String.cpp:1498
bool isNotEmpty() const noexcept
Definition juce_String.h:316
Definition juce_StringRef.h:62
static String getTextFromClipboard()
Definition juce_linux_Windowing.cpp:798
static void copyTextToClipboard(const String &text)
Definition juce_linux_Windowing.cpp:793
Timer() noexcept
Definition juce_Timer.cpp:316
* e
Definition inflate.c:1404
UINT_D64 w
Definition inflate.c:942
unsigned * m
Definition inflate.c:1559
struct huft * t
Definition inflate.c:943
int y
Definition inflate.c:1588
int g
Definition inflate.c:1573
register unsigned i
Definition inflate.c:1575
unsigned s
Definition inflate.c:1555
unsigned x[BMAX+1]
Definition inflate.c:1586
unsigned f
Definition inflate.c:1572
struct @113205115357366127300225113341150224053346037032::@137033172036070230260373056156374243321245367362 right
static const char * name
Definition pugl.h:1582
virtual ASIOError start()=0
struct backing_store_struct * info
Definition jmemsys.h:183
#define TRANS(stringLiteral)
Definition juce_LocalisedStrings.h:208
#define jassert(expression)
#define JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(className)
#define jassertfalse
Definition juce_CodeEditorComponent.cpp:358
static int findFirstNonWhitespaceChar(StringRef line) noexcept
Definition juce_CodeEditorComponent.cpp:359
@ paste
Definition juce_ApplicationCommandID.h:74
@ del
Definition juce_ApplicationCommandID.h:65
@ redo
Definition juce_ApplicationCommandID.h:86
@ undo
Definition juce_ApplicationCommandID.h:83
@ cut
Definition juce_ApplicationCommandID.h:68
@ copy
Definition juce_ApplicationCommandID.h:71
@ selectAll
Definition juce_ApplicationCommandID.h:77
Definition carla_juce.cpp:31
constexpr Type jmin(Type a, Type b)
Definition juce_MathsFunctions.h:106
int CommandID
Definition juce_ApplicationCommandID.h:37
constexpr Type jmax(Type a, Type b)
Definition juce_MathsFunctions.h:94
RangedDirectoryIterator end(const RangedDirectoryIterator &)
Definition juce_RangedDirectoryIterator.h:184
Type jlimit(Type lowerLimit, Type upperLimit, Type valueToConstrain) noexcept
Definition juce_MathsFunctions.h:262
@ textChanged
Definition juce_AccessibilityEvent.h:71
@ textSelectionChanged
Definition juce_AccessibilityEvent.h:64
void ignoreUnused(Types &&...) noexcept
Definition juce_MathsFunctions.h:333
static void codeEditorMenuCallback(int menuResult, CodeEditorComponent *editor)
Definition juce_CodeEditorComponent.cpp:1524
bool isPositiveAndBelow(Type1 valueToTest, Type2 upperLimit) noexcept
Definition juce_MathsFunctions.h:279
int roundToInt(const FloatType value) noexcept
Definition juce_MathsFunctions.h:465
AccessibilityRole
Definition juce_AccessibilityRole.h:37
@ column
Definition juce_AccessibilityRole.h:52
@ staticText
Definition juce_AccessibilityRole.h:45
@ editableText
Definition juce_AccessibilityRole.h:46
constexpr int numElementsInArray(Type(&)[N]) noexcept
Definition juce_MathsFunctions.h:344
png_uint_32 length
Definition png.c:2247
Definition juce_ApplicationCommandInfo.h:45
Definition juce_ApplicationCommandTarget.h:61
Definition juce_CodeEditorComponent.cpp:247
String text
Definition juce_CodeEditorComponent.cpp:259
int length
Definition juce_CodeEditorComponent.cpp:260
int tokenType
Definition juce_CodeEditorComponent.cpp:261
SyntaxToken(const String &t, const int len, const int type) noexcept
Definition juce_CodeEditorComponent.cpp:248
Definition juce_CodeEditorComponent.h:228
Colour colour
Definition juce_CodeEditorComponent.h:230
String name
Definition juce_CodeEditorComponent.h:229
Definition juce_CodeEditorComponent.h:225
Array< TokenType > types
Definition juce_CodeEditorComponent.h:233
void set(const String &name, Colour colour)
Definition juce_CodeEditorComponent.cpp:1691
State(const CodeEditorComponent &)
Definition juce_CodeEditorComponent.cpp:1795
int lastCaretPos
Definition juce_CodeEditorComponent.h:185
int lastSelectionEnd
Definition juce_CodeEditorComponent.h:185
void restoreState(CodeEditorComponent &) const
Definition juce_CodeEditorComponent.cpp:1815
String toString() const
Definition juce_CodeEditorComponent.cpp:1833
int lastTopLine
Definition juce_CodeEditorComponent.h:185
Definition juce_MouseEvent.h:392
float deltaY
Definition juce_MouseEvent.h:410
float deltaX
Definition juce_MouseEvent.h:401
static bool invokeKeyFunction(CallbackClass &target, const KeyPress &key)
Definition juce_TextEditorKeyMapper.h:43
const char * text
Definition swell-functions.h:167
ZCONST char * key
Definition crypt.c:587
int r
Definition crypt.c:458
b
Definition crypt.c:628
void handler(int signal)
Definition fileio.c:1632
int result
Definition process.c:1455
#define const
Definition zconf.h:137