@@ -15,6 +15,7 @@ | |||||
*.manifest.res | *.manifest.res | ||||
*.o | *.o | ||||
*.d | *.d | ||||
*.sdf | |||||
xcuserdata | xcuserdata | ||||
contents.xcworkspacedata | contents.xcworkspacedata | ||||
.DS_Store | .DS_Store | ||||
@@ -142,7 +142,7 @@ void SourceCodeEditor::highlightLine (int lineNum, int characterIndex) | |||||
editor->getDocument().getNumLines() - editor->getNumLinesOnScreen()))); | editor->getDocument().getNumLines() - editor->getNumLinesOnScreen()))); | ||||
} | } | ||||
editor->moveCaretTo (CodeDocument::Position (&editor->getDocument(), lineNum - 1, characterIndex), false); | |||||
editor->moveCaretTo (CodeDocument::Position (editor->getDocument(), lineNum - 1, characterIndex), false); | |||||
} | } | ||||
void SourceCodeEditor::resized() | void SourceCodeEditor::resized() | ||||
@@ -135,10 +135,10 @@ void ResamplingAudioSource::getNextAudioBlock (const AudioSourceChannelInfo& inf | |||||
for (int m = info.numSamples; --m >= 0;) | for (int m = info.numSamples; --m >= 0;) | ||||
{ | { | ||||
const float alpha = (float) subSampleOffset; | const float alpha = (float) subSampleOffset; | ||||
const float invAlpha = 1.0f - alpha; | |||||
for (int channel = 0; channel < channelsToProcess; ++channel) | for (int channel = 0; channel < channelsToProcess; ++channel) | ||||
*destBuffers[channel]++ = srcBuffers[channel][bufferPos] * invAlpha + srcBuffers[channel][nextPos] * alpha; | |||||
*destBuffers[channel]++ = srcBuffers[channel][bufferPos] | |||||
+ alpha * (srcBuffers[channel][nextPos] - srcBuffers[channel][bufferPos]); | |||||
subSampleOffset += localRatio; | subSampleOffset += localRatio; | ||||
@@ -460,17 +460,17 @@ public: | |||||
{ | { | ||||
const ScopedLockType lock (getLock()); | const ScopedLockType lock (getLock()); | ||||
data.ensureAllocatedSize (numUsed + numberOfElements); | data.ensureAllocatedSize (numUsed + numberOfElements); | ||||
ElementType* insertPos; | |||||
ElementType* insertPos = data.elements; | |||||
if (isPositiveAndBelow (indexToInsertAt, numUsed)) | if (isPositiveAndBelow (indexToInsertAt, numUsed)) | ||||
{ | { | ||||
insertPos = data.elements + indexToInsertAt; | |||||
insertPos += indexToInsertAt; | |||||
const int numberToMove = numUsed - indexToInsertAt; | const int numberToMove = numUsed - indexToInsertAt; | ||||
memmove (insertPos + numberOfElements, insertPos, numberToMove * sizeof (ElementType)); | memmove (insertPos + numberOfElements, insertPos, numberToMove * sizeof (ElementType)); | ||||
} | } | ||||
else | else | ||||
{ | { | ||||
insertPos = data.elements + numUsed; | |||||
insertPos += numUsed; | |||||
} | } | ||||
numUsed += numberOfElements; | numUsed += numberOfElements; | ||||
@@ -292,6 +292,46 @@ public: | |||||
} | } | ||||
} | } | ||||
/** Inserts an array of values into this array at a given position. | |||||
If the index is less than 0 or greater than the size of the array, the | |||||
new elements will be added to the end of the array. | |||||
Otherwise, they will be inserted into the array, moving all the later elements | |||||
along to make room. | |||||
@param indexToInsertAt the index at which the first new element should be inserted | |||||
@param newObjects the new values to add to the array | |||||
@param numberOfElements how many items are in the array | |||||
@see insert, add, addSorted, set | |||||
*/ | |||||
void insertArray (int indexToInsertAt, | |||||
ObjectClass* const* newObjects, | |||||
int numberOfElements) | |||||
{ | |||||
if (numberOfElements > 0) | |||||
{ | |||||
const ScopedLockType lock (getLock()); | |||||
data.ensureAllocatedSize (numUsed + numberOfElements); | |||||
ObjectClass** insertPos = data.elements; | |||||
if (isPositiveAndBelow (indexToInsertAt, numUsed)) | |||||
{ | |||||
insertPos += indexToInsertAt; | |||||
const int numberToMove = numUsed - indexToInsertAt; | |||||
memmove (insertPos + numberOfElements, insertPos, numberToMove * sizeof (ObjectClass*)); | |||||
} | |||||
else | |||||
{ | |||||
insertPos += numUsed; | |||||
} | |||||
numUsed += numberOfElements; | |||||
while (--numberOfElements >= 0) | |||||
*insertPos++ = *newObjects++; | |||||
} | |||||
} | |||||
/** Appends a new object at the end of the array as long as the array doesn't | /** Appends a new object at the end of the array as long as the array doesn't | ||||
already contain it. | already contain it. | ||||
@@ -123,15 +123,15 @@ public: | |||||
}; | }; | ||||
//============================================================================== | //============================================================================== | ||||
CodeDocument::Iterator::Iterator (CodeDocument* const document_) | |||||
: document (document_), | |||||
CodeDocument::Iterator::Iterator (const CodeDocument& document_) noexcept | |||||
: document (&document_), | |||||
charPointer (nullptr), | charPointer (nullptr), | ||||
line (0), | line (0), | ||||
position (0) | position (0) | ||||
{ | { | ||||
} | } | ||||
CodeDocument::Iterator::Iterator (const CodeDocument::Iterator& other) | |||||
CodeDocument::Iterator::Iterator (const CodeDocument::Iterator& other) noexcept | |||||
: document (other.document), | : document (other.document), | ||||
charPointer (other.charPointer), | charPointer (other.charPointer), | ||||
line (other.line), | line (other.line), | ||||
@@ -153,13 +153,13 @@ CodeDocument::Iterator::~Iterator() noexcept | |||||
{ | { | ||||
} | } | ||||
juce_wchar CodeDocument::Iterator::nextChar() | |||||
juce_wchar CodeDocument::Iterator::nextChar() noexcept | |||||
{ | { | ||||
for (;;) | for (;;) | ||||
{ | { | ||||
if (charPointer.getAddress() == nullptr) | if (charPointer.getAddress() == nullptr) | ||||
{ | { | ||||
CodeDocumentLine* const l = document->lines[line]; | |||||
const CodeDocumentLine* const l = document->lines[line]; | |||||
if (l == nullptr) | if (l == nullptr) | ||||
return 0; | return 0; | ||||
@@ -182,16 +182,16 @@ juce_wchar CodeDocument::Iterator::nextChar() | |||||
} | } | ||||
} | } | ||||
void CodeDocument::Iterator::skip() | |||||
void CodeDocument::Iterator::skip() noexcept | |||||
{ | { | ||||
nextChar(); | nextChar(); | ||||
} | } | ||||
void CodeDocument::Iterator::skipToEndOfLine() | |||||
void CodeDocument::Iterator::skipToEndOfLine() noexcept | |||||
{ | { | ||||
if (charPointer.getAddress() == nullptr) | if (charPointer.getAddress() == nullptr) | ||||
{ | { | ||||
CodeDocumentLine* const l = document->lines[line]; | |||||
const CodeDocumentLine* const l = document->lines[line]; | |||||
if (l == nullptr) | if (l == nullptr) | ||||
return; | return; | ||||
@@ -204,11 +204,11 @@ void CodeDocument::Iterator::skipToEndOfLine() | |||||
charPointer = nullptr; | charPointer = nullptr; | ||||
} | } | ||||
juce_wchar CodeDocument::Iterator::peekNextChar() const | |||||
juce_wchar CodeDocument::Iterator::peekNextChar() const noexcept | |||||
{ | { | ||||
if (charPointer.getAddress() == nullptr) | if (charPointer.getAddress() == nullptr) | ||||
{ | { | ||||
CodeDocumentLine* const l = document->lines[line]; | |||||
const CodeDocumentLine* const l = document->lines[line]; | |||||
if (l == nullptr) | if (l == nullptr) | ||||
return 0; | return 0; | ||||
@@ -221,11 +221,11 @@ juce_wchar CodeDocument::Iterator::peekNextChar() const | |||||
if (c != 0) | if (c != 0) | ||||
return c; | return c; | ||||
CodeDocumentLine* const l = document->lines [line + 1]; | |||||
const CodeDocumentLine* const l = document->lines [line + 1]; | |||||
return l == nullptr ? 0 : l->line[0]; | return l == nullptr ? 0 : l->line[0]; | ||||
} | } | ||||
void CodeDocument::Iterator::skipWhitespace() | |||||
void CodeDocument::Iterator::skipWhitespace() noexcept | |||||
{ | { | ||||
while (CharacterFunctions::isWhitespace (peekNextChar())) | while (CharacterFunctions::isWhitespace (peekNextChar())) | ||||
skip(); | skip(); | ||||
@@ -238,23 +238,22 @@ bool CodeDocument::Iterator::isEOF() const noexcept | |||||
//============================================================================== | //============================================================================== | ||||
CodeDocument::Position::Position() noexcept | CodeDocument::Position::Position() noexcept | ||||
: owner (0), characterPos (0), line (0), | |||||
: owner (nullptr), characterPos (0), line (0), | |||||
indexInLine (0), positionMaintained (false) | indexInLine (0), positionMaintained (false) | ||||
{ | { | ||||
} | } | ||||
CodeDocument::Position::Position (const CodeDocument* const ownerDocument, | |||||
CodeDocument::Position::Position (const CodeDocument& ownerDocument, | |||||
const int line_, const int indexInLine_) noexcept | const int line_, const int indexInLine_) noexcept | ||||
: owner (const_cast <CodeDocument*> (ownerDocument)), | |||||
: owner (const_cast <CodeDocument*> (&ownerDocument)), | |||||
characterPos (0), line (line_), | characterPos (0), line (line_), | ||||
indexInLine (indexInLine_), positionMaintained (false) | indexInLine (indexInLine_), positionMaintained (false) | ||||
{ | { | ||||
setLineAndIndex (line_, indexInLine_); | setLineAndIndex (line_, indexInLine_); | ||||
} | } | ||||
CodeDocument::Position::Position (const CodeDocument* const ownerDocument, | |||||
const int characterPos_) noexcept | |||||
: owner (const_cast <CodeDocument*> (ownerDocument)), | |||||
CodeDocument::Position::Position (const CodeDocument& ownerDocument, const int characterPos_) noexcept | |||||
: owner (const_cast <CodeDocument*> (&ownerDocument)), | |||||
positionMaintained (false) | positionMaintained (false) | ||||
{ | { | ||||
setPosition (characterPos_); | setPosition (characterPos_); | ||||
@@ -324,25 +323,22 @@ void CodeDocument::Position::setLineAndIndex (const int newLineNum, const int ne | |||||
{ | { | ||||
line = owner->lines.size() - 1; | line = owner->lines.size() - 1; | ||||
CodeDocumentLine* const l = owner->lines.getUnchecked (line); | |||||
jassert (l != nullptr); | |||||
indexInLine = l->lineLengthWithoutNewLines; | |||||
characterPos = l->lineStartInFile + indexInLine; | |||||
const CodeDocumentLine& l = *owner->lines.getUnchecked (line); | |||||
indexInLine = l.lineLengthWithoutNewLines; | |||||
characterPos = l.lineStartInFile + indexInLine; | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
line = jmax (0, newLineNum); | line = jmax (0, newLineNum); | ||||
CodeDocumentLine* const l = owner->lines.getUnchecked (line); | |||||
jassert (l != nullptr); | |||||
const CodeDocumentLine& l = *owner->lines.getUnchecked (line); | |||||
if (l->lineLengthWithoutNewLines > 0) | |||||
indexInLine = jlimit (0, l->lineLengthWithoutNewLines, newIndexInLine); | |||||
if (l.lineLengthWithoutNewLines > 0) | |||||
indexInLine = jlimit (0, l.lineLengthWithoutNewLines, newIndexInLine); | |||||
else | else | ||||
indexInLine = 0; | indexInLine = 0; | ||||
characterPos = l->lineStartInFile + indexInLine; | |||||
characterPos = l.lineStartInFile + indexInLine; | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -366,15 +362,14 @@ void CodeDocument::Position::setPosition (const int newPosition) | |||||
{ | { | ||||
for (int i = lineStart; i < lineEnd; ++i) | for (int i = lineStart; i < lineEnd; ++i) | ||||
{ | { | ||||
CodeDocumentLine* const l = owner->lines.getUnchecked (i); | |||||
int index = newPosition - l->lineStartInFile; | |||||
const CodeDocumentLine& l = *owner->lines.getUnchecked (i); | |||||
const int index = newPosition - l.lineStartInFile; | |||||
if (index >= 0 && (index < l->lineLength || i == lineEnd - 1)) | |||||
if (index >= 0 && (index < l.lineLength || i == lineEnd - 1)) | |||||
{ | { | ||||
line = i; | line = i; | ||||
indexInLine = jmin (l->lineLengthWithoutNewLines, index); | |||||
characterPos = l->lineStartInFile + indexInLine; | |||||
indexInLine = jmin (l.lineLengthWithoutNewLines, index); | |||||
characterPos = l.lineStartInFile + indexInLine; | |||||
} | } | ||||
} | } | ||||
@@ -383,9 +378,8 @@ void CodeDocument::Position::setPosition (const int newPosition) | |||||
else | else | ||||
{ | { | ||||
const int midIndex = (lineStart + lineEnd + 1) / 2; | const int midIndex = (lineStart + lineEnd + 1) / 2; | ||||
CodeDocumentLine* const mid = owner->lines.getUnchecked (midIndex); | |||||
if (newPosition >= mid->lineStartInFile) | |||||
if (newPosition >= owner->lines.getUnchecked (midIndex)->lineStartInFile) | |||||
lineStart = midIndex; | lineStart = midIndex; | ||||
else | else | ||||
lineEnd = midIndex; | lineEnd = midIndex; | ||||
@@ -405,9 +399,10 @@ void CodeDocument::Position::moveBy (int characterDelta) | |||||
// If moving right, make sure we don't get stuck between the \r and \n characters.. | // If moving right, make sure we don't get stuck between the \r and \n characters.. | ||||
if (line < owner->lines.size()) | if (line < owner->lines.size()) | ||||
{ | { | ||||
CodeDocumentLine* const l = owner->lines.getUnchecked (line); | |||||
if (indexInLine + characterDelta < l->lineLength | |||||
&& indexInLine + characterDelta >= l->lineLengthWithoutNewLines + 1) | |||||
const CodeDocumentLine& l = *owner->lines.getUnchecked (line); | |||||
if (indexInLine + characterDelta < l.lineLength | |||||
&& indexInLine + characterDelta >= l.lineLengthWithoutNewLines + 1) | |||||
++characterDelta; | ++characterDelta; | ||||
} | } | ||||
} | } | ||||
@@ -415,21 +410,21 @@ void CodeDocument::Position::moveBy (int characterDelta) | |||||
setPosition (characterPos + characterDelta); | setPosition (characterPos + characterDelta); | ||||
} | } | ||||
const CodeDocument::Position CodeDocument::Position::movedBy (const int characterDelta) const | |||||
CodeDocument::Position CodeDocument::Position::movedBy (const int characterDelta) const | |||||
{ | { | ||||
CodeDocument::Position p (*this); | CodeDocument::Position p (*this); | ||||
p.moveBy (characterDelta); | p.moveBy (characterDelta); | ||||
return p; | return p; | ||||
} | } | ||||
const CodeDocument::Position CodeDocument::Position::movedByLines (const int deltaLines) const | |||||
CodeDocument::Position CodeDocument::Position::movedByLines (const int deltaLines) const | |||||
{ | { | ||||
CodeDocument::Position p (*this); | CodeDocument::Position p (*this); | ||||
p.setLineAndIndex (getLineNumber() + deltaLines, getIndexInLine()); | p.setLineAndIndex (getLineNumber() + deltaLines, getIndexInLine()); | ||||
return p; | return p; | ||||
} | } | ||||
const juce_wchar CodeDocument::Position::getCharacter() const | |||||
juce_wchar CodeDocument::Position::getCharacter() const | |||||
{ | { | ||||
const CodeDocumentLine* const l = owner->lines [line]; | const CodeDocumentLine* const l = owner->lines [line]; | ||||
return l == nullptr ? 0 : l->line [getIndexInLine()]; | return l == nullptr ? 0 : l->line [getIndexInLine()]; | ||||
@@ -480,8 +475,8 @@ CodeDocument::~CodeDocument() | |||||
String CodeDocument::getAllContent() const | String CodeDocument::getAllContent() const | ||||
{ | { | ||||
return getTextBetween (Position (this, 0), | |||||
Position (this, lines.size(), 0)); | |||||
return getTextBetween (Position (*this, 0), | |||||
Position (*this, lines.size(), 0)); | |||||
} | } | ||||
String CodeDocument::getTextBetween (const Position& start, const Position& end) const | String CodeDocument::getTextBetween (const Position& start, const Position& end) const | ||||
@@ -505,22 +500,22 @@ String CodeDocument::getTextBetween (const Position& start, const Position& end) | |||||
for (int i = jmax (0, startLine); i <= maxLine; ++i) | for (int i = jmax (0, startLine); i <= maxLine; ++i) | ||||
{ | { | ||||
const CodeDocumentLine* line = lines.getUnchecked(i); | |||||
int len = line->lineLength; | |||||
const CodeDocumentLine& line = *lines.getUnchecked(i); | |||||
int len = line.lineLength; | |||||
if (i == startLine) | if (i == startLine) | ||||
{ | { | ||||
const int index = start.getIndexInLine(); | const int index = start.getIndexInLine(); | ||||
mo << line->line.substring (index, len); | |||||
mo << line.line.substring (index, len); | |||||
} | } | ||||
else if (i == endLine) | else if (i == endLine) | ||||
{ | { | ||||
len = end.getIndexInLine(); | len = end.getIndexInLine(); | ||||
mo << line->line.substring (0, len); | |||||
mo << line.line.substring (0, len); | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
mo << line->line; | |||||
mo << line.line; | |||||
} | } | ||||
} | } | ||||
@@ -736,20 +731,13 @@ void CodeDocument::checkLastLineStatus() | |||||
} | } | ||||
//============================================================================== | //============================================================================== | ||||
void CodeDocument::addListener (CodeDocument::Listener* const listener) noexcept | |||||
{ | |||||
listeners.add (listener); | |||||
} | |||||
void CodeDocument::removeListener (CodeDocument::Listener* const listener) noexcept | |||||
{ | |||||
listeners.remove (listener); | |||||
} | |||||
void CodeDocument::addListener (CodeDocument::Listener* const l) noexcept { listeners.add (l); } | |||||
void CodeDocument::removeListener (CodeDocument::Listener* const l) noexcept { listeners.remove (l); } | |||||
void CodeDocument::sendListenerChangeMessage (const int startLine, const int endLine) | void CodeDocument::sendListenerChangeMessage (const int startLine, const int endLine) | ||||
{ | { | ||||
Position startPos (this, startLine, 0); | |||||
Position endPos (this, endLine, 0); | |||||
Position startPos (*this, startLine, 0); | |||||
Position endPos (*this, endLine, 0); | |||||
listeners.call (&CodeDocument::Listener::codeDocumentChanged, startPos, endPos); | listeners.call (&CodeDocument::Listener::codeDocumentChanged, startPos, endPos); | ||||
} | } | ||||
@@ -758,10 +746,8 @@ void CodeDocument::sendListenerChangeMessage (const int startLine, const int end | |||||
class CodeDocumentInsertAction : public UndoableAction | class CodeDocumentInsertAction : public UndoableAction | ||||
{ | { | ||||
public: | public: | ||||
CodeDocumentInsertAction (CodeDocument& owner_, const String& text_, const int insertPos_) noexcept | |||||
: owner (owner_), | |||||
text (text_), | |||||
insertPos (insertPos_) | |||||
CodeDocumentInsertAction (CodeDocument& doc, const String& t, const int pos) noexcept | |||||
: owner (doc), text (t), insertPos (pos) | |||||
{ | { | ||||
} | } | ||||
@@ -784,77 +770,72 @@ public: | |||||
private: | private: | ||||
CodeDocument& owner; | CodeDocument& owner; | ||||
const String text; | const String text; | ||||
int insertPos; | |||||
const int insertPos; | |||||
JUCE_DECLARE_NON_COPYABLE (CodeDocumentInsertAction); | JUCE_DECLARE_NON_COPYABLE (CodeDocumentInsertAction); | ||||
}; | }; | ||||
void CodeDocument::insert (const String& text, const int insertPos, const bool undoable) | void CodeDocument::insert (const String& text, const int insertPos, const bool undoable) | ||||
{ | { | ||||
if (text.isEmpty()) | |||||
return; | |||||
if (undoable) | |||||
if (text.isNotEmpty()) | |||||
{ | { | ||||
undoManager.perform (new CodeDocumentInsertAction (*this, text, insertPos)); | |||||
} | |||||
else | |||||
{ | |||||
Position pos (this, insertPos); | |||||
const int firstAffectedLine = pos.getLineNumber(); | |||||
int lastAffectedLine = firstAffectedLine + 1; | |||||
CodeDocumentLine* const firstLine = lines [firstAffectedLine]; | |||||
String textInsideOriginalLine (text); | |||||
if (firstLine != nullptr) | |||||
if (undoable) | |||||
{ | { | ||||
const int index = pos.getIndexInLine(); | |||||
textInsideOriginalLine = firstLine->line.substring (0, index) | |||||
+ textInsideOriginalLine | |||||
+ firstLine->line.substring (index); | |||||
undoManager.perform (new CodeDocumentInsertAction (*this, text, insertPos)); | |||||
} | } | ||||
else | |||||
{ | |||||
Position pos (*this, insertPos); | |||||
const int firstAffectedLine = pos.getLineNumber(); | |||||
int lastAffectedLine = firstAffectedLine + 1; | |||||
maximumLineLength = -1; | |||||
Array <CodeDocumentLine*> newLines; | |||||
CodeDocumentLine::createLines (newLines, textInsideOriginalLine); | |||||
jassert (newLines.size() > 0); | |||||
CodeDocumentLine* const firstLine = lines [firstAffectedLine]; | |||||
String textInsideOriginalLine (text); | |||||
CodeDocumentLine* const newFirstLine = newLines.getUnchecked (0); | |||||
newFirstLine->lineStartInFile = firstLine != nullptr ? firstLine->lineStartInFile : 0; | |||||
lines.set (firstAffectedLine, newFirstLine); | |||||
if (firstLine != nullptr) | |||||
{ | |||||
const int index = pos.getIndexInLine(); | |||||
textInsideOriginalLine = firstLine->line.substring (0, index) | |||||
+ textInsideOriginalLine | |||||
+ firstLine->line.substring (index); | |||||
} | |||||
if (newLines.size() > 1) | |||||
{ | |||||
for (int i = 1; i < newLines.size(); ++i) | |||||
maximumLineLength = -1; | |||||
Array <CodeDocumentLine*> newLines; | |||||
CodeDocumentLine::createLines (newLines, textInsideOriginalLine); | |||||
jassert (newLines.size() > 0); | |||||
CodeDocumentLine* const newFirstLine = newLines.getUnchecked (0); | |||||
newFirstLine->lineStartInFile = firstLine != nullptr ? firstLine->lineStartInFile : 0; | |||||
lines.set (firstAffectedLine, newFirstLine); | |||||
if (newLines.size() > 1) | |||||
{ | { | ||||
CodeDocumentLine* const l = newLines.getUnchecked (i); | |||||
lines.insert (firstAffectedLine + i, l); | |||||
lines.insertArray (firstAffectedLine + 1, newLines.getRawDataPointer() + 1, newLines.size() - 1); | |||||
lastAffectedLine = lines.size(); | |||||
} | } | ||||
lastAffectedLine = lines.size(); | |||||
} | |||||
int lineStart = newFirstLine->lineStartInFile; | |||||
for (int i = firstAffectedLine; i < lines.size(); ++i) | |||||
{ | |||||
CodeDocumentLine& l = *lines.getUnchecked (i); | |||||
l.lineStartInFile = lineStart; | |||||
lineStart += l.lineLength; | |||||
} | |||||
int i, lineStart = newFirstLine->lineStartInFile; | |||||
for (i = firstAffectedLine; i < lines.size(); ++i) | |||||
{ | |||||
CodeDocumentLine* const l = lines.getUnchecked (i); | |||||
l->lineStartInFile = lineStart; | |||||
lineStart += l->lineLength; | |||||
} | |||||
checkLastLineStatus(); | |||||
checkLastLineStatus(); | |||||
const int newTextLength = text.length(); | |||||
for (int i = 0; i < positionsToMaintain.size(); ++i) | |||||
{ | |||||
CodeDocument::Position& p = *positionsToMaintain.getUnchecked(i); | |||||
const int newTextLength = text.length(); | |||||
for (i = 0; i < positionsToMaintain.size(); ++i) | |||||
{ | |||||
CodeDocument::Position* const p = positionsToMaintain.getUnchecked(i); | |||||
if (p.getPosition() >= insertPos) | |||||
p.setPosition (p.getPosition() + newTextLength); | |||||
} | |||||
if (p->getPosition() >= insertPos) | |||||
p->setPosition (p->getPosition() + newTextLength); | |||||
sendListenerChangeMessage (firstAffectedLine, lastAffectedLine); | |||||
} | } | ||||
sendListenerChangeMessage (firstAffectedLine, lastAffectedLine); | |||||
} | } | ||||
} | } | ||||
@@ -862,13 +843,11 @@ void CodeDocument::insert (const String& text, const int insertPos, const bool u | |||||
class CodeDocumentDeleteAction : public UndoableAction | class CodeDocumentDeleteAction : public UndoableAction | ||||
{ | { | ||||
public: | public: | ||||
CodeDocumentDeleteAction (CodeDocument& owner_, const int startPos_, const int endPos_) noexcept | |||||
: owner (owner_), | |||||
startPos (startPos_), | |||||
endPos (endPos_) | |||||
CodeDocumentDeleteAction (CodeDocument& doc, const int start, const int end) noexcept | |||||
: owner (doc), startPos (start), endPos (end), | |||||
removedText (doc.getTextBetween (CodeDocument::Position (doc, start), | |||||
CodeDocument::Position (doc, end))) | |||||
{ | { | ||||
removedText = owner.getTextBetween (CodeDocument::Position (&owner, startPos), | |||||
CodeDocument::Position (&owner, endPos)); | |||||
} | } | ||||
bool perform() | bool perform() | ||||
@@ -885,12 +864,12 @@ public: | |||||
return true; | return true; | ||||
} | } | ||||
int getSizeInUnits() { return removedText.length() + 32; } | |||||
int getSizeInUnits() { return (endPos - startPos) + 32; } | |||||
private: | private: | ||||
CodeDocument& owner; | CodeDocument& owner; | ||||
int startPos, endPos; | |||||
String removedText; | |||||
const int startPos, endPos; | |||||
const String removedText; | |||||
JUCE_DECLARE_NON_COPYABLE (CodeDocumentDeleteAction); | JUCE_DECLARE_NON_COPYABLE (CodeDocumentDeleteAction); | ||||
}; | }; | ||||
@@ -906,57 +885,55 @@ void CodeDocument::remove (const int startPos, const int endPos, const bool undo | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
Position startPosition (this, startPos); | |||||
Position endPosition (this, endPos); | |||||
Position startPosition (*this, startPos); | |||||
Position endPosition (*this, endPos); | |||||
maximumLineLength = -1; | maximumLineLength = -1; | ||||
const int firstAffectedLine = startPosition.getLineNumber(); | const int firstAffectedLine = startPosition.getLineNumber(); | ||||
const int endLine = endPosition.getLineNumber(); | const int endLine = endPosition.getLineNumber(); | ||||
int lastAffectedLine = firstAffectedLine + 1; | int lastAffectedLine = firstAffectedLine + 1; | ||||
CodeDocumentLine* const firstLine = lines.getUnchecked (firstAffectedLine); | |||||
CodeDocumentLine& firstLine = *lines.getUnchecked (firstAffectedLine); | |||||
if (firstAffectedLine == endLine) | if (firstAffectedLine == endLine) | ||||
{ | { | ||||
firstLine->line = firstLine->line.substring (0, startPosition.getIndexInLine()) | |||||
+ firstLine->line.substring (endPosition.getIndexInLine()); | |||||
firstLine->updateLength(); | |||||
firstLine.line = firstLine.line.substring (0, startPosition.getIndexInLine()) | |||||
+ firstLine.line.substring (endPosition.getIndexInLine()); | |||||
firstLine.updateLength(); | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
lastAffectedLine = lines.size(); | lastAffectedLine = lines.size(); | ||||
CodeDocumentLine* const lastLine = lines.getUnchecked (endLine); | |||||
jassert (lastLine != nullptr); | |||||
CodeDocumentLine& lastLine = *lines.getUnchecked (endLine); | |||||
firstLine->line = firstLine->line.substring (0, startPosition.getIndexInLine()) | |||||
+ lastLine->line.substring (endPosition.getIndexInLine()); | |||||
firstLine->updateLength(); | |||||
firstLine.line = firstLine.line.substring (0, startPosition.getIndexInLine()) | |||||
+ lastLine.line.substring (endPosition.getIndexInLine()); | |||||
firstLine.updateLength(); | |||||
int numLinesToRemove = endLine - firstAffectedLine; | int numLinesToRemove = endLine - firstAffectedLine; | ||||
lines.removeRange (firstAffectedLine + 1, numLinesToRemove); | lines.removeRange (firstAffectedLine + 1, numLinesToRemove); | ||||
} | } | ||||
int i; | |||||
for (i = firstAffectedLine + 1; i < lines.size(); ++i) | |||||
for (int i = firstAffectedLine + 1; i < lines.size(); ++i) | |||||
{ | { | ||||
CodeDocumentLine* const l = lines.getUnchecked (i); | |||||
const CodeDocumentLine* const previousLine = lines.getUnchecked (i - 1); | |||||
l->lineStartInFile = previousLine->lineStartInFile + previousLine->lineLength; | |||||
CodeDocumentLine& l = *lines.getUnchecked (i); | |||||
const CodeDocumentLine& previousLine = *lines.getUnchecked (i - 1); | |||||
l.lineStartInFile = previousLine.lineStartInFile + previousLine.lineLength; | |||||
} | } | ||||
checkLastLineStatus(); | checkLastLineStatus(); | ||||
const int totalChars = getNumCharacters(); | const int totalChars = getNumCharacters(); | ||||
for (i = 0; i < positionsToMaintain.size(); ++i) | |||||
for (int i = 0; i < positionsToMaintain.size(); ++i) | |||||
{ | { | ||||
CodeDocument::Position* p = positionsToMaintain.getUnchecked(i); | |||||
CodeDocument::Position& p = *positionsToMaintain.getUnchecked(i); | |||||
if (p->getPosition() > startPosition.getPosition()) | |||||
p->setPosition (jmax (startPos, p->getPosition() + startPos - endPos)); | |||||
if (p.getPosition() > startPosition.getPosition()) | |||||
p.setPosition (jmax (startPos, p.getPosition() + startPos - endPos)); | |||||
if (p->getPosition() > totalChars) | |||||
p->setPosition (totalChars); | |||||
if (p.getPosition() > totalChars) | |||||
p.setPosition (totalChars); | |||||
} | } | ||||
sendListenerChangeMessage (firstAffectedLine, lastAffectedLine); | sendListenerChangeMessage (firstAffectedLine, lastAffectedLine); | ||||
@@ -77,7 +77,7 @@ public: | |||||
Lines are numbered from zero, and if the line or index are beyond the bounds of the document, | Lines are numbered from zero, and if the line or index are beyond the bounds of the document, | ||||
they will be adjusted to keep them within its limits. | they will be adjusted to keep them within its limits. | ||||
*/ | */ | ||||
Position (const CodeDocument* ownerDocument, | |||||
Position (const CodeDocument& ownerDocument, | |||||
int line, int indexInLine) noexcept; | int line, int indexInLine) noexcept; | ||||
/** Creates a position based on a character index in a document. | /** Creates a position based on a character index in a document. | ||||
@@ -87,7 +87,7 @@ public: | |||||
If the position is beyond the range of the document, it'll be adjusted to keep it | If the position is beyond the range of the document, it'll be adjusted to keep it | ||||
inside. | inside. | ||||
*/ | */ | ||||
Position (const CodeDocument* ownerDocument, | |||||
Position (const CodeDocument& ownerDocument, | |||||
int charactersFromStartOfDocument) noexcept; | int charactersFromStartOfDocument) noexcept; | ||||
/** Creates a copy of another position. | /** Creates a copy of another position. | ||||
@@ -101,6 +101,7 @@ public: | |||||
~Position(); | ~Position(); | ||||
Position& operator= (const Position& other); | Position& operator= (const Position& other); | ||||
bool operator== (const Position& other) const noexcept; | bool operator== (const Position& other) const noexcept; | ||||
bool operator!= (const Position& other) const noexcept; | bool operator!= (const Position& other) const noexcept; | ||||
@@ -159,18 +160,18 @@ public: | |||||
characters. | characters. | ||||
@see moveBy | @see moveBy | ||||
*/ | */ | ||||
const Position movedBy (int characterDelta) const; | |||||
Position movedBy (int characterDelta) const; | |||||
/** Returns a position which is the same as this one, moved up or down by the specified | /** Returns a position which is the same as this one, moved up or down by the specified | ||||
number of lines. | number of lines. | ||||
@see movedBy | @see movedBy | ||||
*/ | */ | ||||
const Position movedByLines (int deltaLines) const; | |||||
Position movedByLines (int deltaLines) const; | |||||
/** Returns the character in the document at this position. | /** Returns the character in the document at this position. | ||||
@see getLineText | @see getLineText | ||||
*/ | */ | ||||
const juce_wchar getCharacter() const; | |||||
juce_wchar getCharacter() const; | |||||
/** Returns the line from the document that this position is within. | /** Returns the line from the document that this position is within. | ||||
@see getCharacter, getLineNumber | @see getCharacter, getLineNumber | ||||
@@ -334,32 +335,30 @@ public: | |||||
class JUCE_API Iterator | class JUCE_API Iterator | ||||
{ | { | ||||
public: | public: | ||||
Iterator (CodeDocument* document); | |||||
Iterator (const Iterator& other); | |||||
Iterator (const CodeDocument& document) noexcept; | |||||
Iterator (const Iterator& other) noexcept; | |||||
Iterator& operator= (const Iterator& other) noexcept; | Iterator& operator= (const Iterator& other) noexcept; | ||||
~Iterator() noexcept; | ~Iterator() noexcept; | ||||
/** Reads the next character and returns it. | /** Reads the next character and returns it. | ||||
@see peekNextChar | @see peekNextChar | ||||
*/ | */ | ||||
juce_wchar nextChar(); | |||||
juce_wchar nextChar() noexcept; | |||||
/** Reads the next character without advancing the current position. */ | /** Reads the next character without advancing the current position. */ | ||||
juce_wchar peekNextChar() const; | |||||
juce_wchar peekNextChar() const noexcept; | |||||
/** Advances the position by one character. */ | /** Advances the position by one character. */ | ||||
void skip(); | |||||
void skip() noexcept; | |||||
/** Returns the position of the next character as its position within the | |||||
whole document. | |||||
*/ | |||||
/** Returns the position as the number of characters from the start of the document. */ | |||||
int getPosition() const noexcept { return position; } | int getPosition() const noexcept { return position; } | ||||
/** Skips over any whitespace characters until the next character is non-whitespace. */ | /** Skips over any whitespace characters until the next character is non-whitespace. */ | ||||
void skipWhitespace(); | |||||
void skipWhitespace() noexcept; | |||||
/** Skips forward until the next character will be the first character on the next line */ | /** Skips forward until the next character will be the first character on the next line */ | ||||
void skipToEndOfLine(); | |||||
void skipToEndOfLine() noexcept; | |||||
/** Returns the line number of the next character. */ | /** Returns the line number of the next character. */ | ||||
int getLine() const noexcept { return line; } | int getLine() const noexcept { return line; } | ||||
@@ -368,7 +367,7 @@ public: | |||||
bool isEOF() const noexcept; | bool isEOF() const noexcept; | ||||
private: | private: | ||||
CodeDocument* document; | |||||
const CodeDocument* document; | |||||
mutable String::CharPointerType charPointer; | mutable String::CharPointerType charPointer; | ||||
int line, position; | int line, position; | ||||
}; | }; | ||||
@@ -45,7 +45,7 @@ public: | |||||
} | } | ||||
else if (lineNum < document.getNumLines()) | else if (lineNum < document.getNumLines()) | ||||
{ | { | ||||
const CodeDocument::Position pos (&document, lineNum, 0); | |||||
const CodeDocument::Position pos (document, lineNum, 0); | |||||
createTokens (pos.getPosition(), pos.getLineText(), | createTokens (pos.getPosition(), pos.getLineText(), | ||||
source, *tokeniser, newTokens); | source, *tokeniser, newTokens); | ||||
} | } | ||||
@@ -59,7 +59,7 @@ public: | |||||
{ | { | ||||
const String line (document.getLine (lineNum)); | const String line (document.getLine (lineNum)); | ||||
CodeDocument::Position lineStart (&document, lineNum, 0), lineEnd (&document, lineNum + 1, 0); | |||||
CodeDocument::Position lineStart (document, lineNum, 0), lineEnd (document, lineNum + 1, 0); | |||||
newHighlightStart = indexToColumn (jmax (0, selectionStart.getPosition() - lineStart.getPosition()), | newHighlightStart = indexToColumn (jmax (0, selectionStart.getPosition() - lineStart.getPosition()), | ||||
line, spacesPerTab); | line, spacesPerTab); | ||||
newHighlightEnd = indexToColumn (jmin (lineEnd.getPosition() - lineStart.getPosition(), selectionEnd.getPosition() - lineStart.getPosition()), | newHighlightEnd = indexToColumn (jmin (lineEnd.getPosition() - lineStart.getPosition(), selectionEnd.getPosition() - lineStart.getPosition()), | ||||
@@ -71,24 +71,9 @@ public: | |||||
highlightColumnStart = newHighlightStart; | highlightColumnStart = newHighlightStart; | ||||
highlightColumnEnd = newHighlightEnd; | highlightColumnEnd = newHighlightEnd; | ||||
} | } | ||||
else | |||||
else if (tokens == newTokens) | |||||
{ | { | ||||
if (tokens.size() == newTokens.size()) | |||||
{ | |||||
bool allTheSame = true; | |||||
for (int i = newTokens.size(); --i >= 0;) | |||||
{ | |||||
if (tokens.getReference(i) != newTokens.getReference(i)) | |||||
{ | |||||
allTheSame = false; | |||||
break; | |||||
} | |||||
} | |||||
if (allTheSame) | |||||
return false; | |||||
} | |||||
return false; | |||||
} | } | ||||
tokens.swapWithArray (newTokens); | tokens.swapWithArray (newTokens); | ||||
@@ -144,14 +129,14 @@ public: | |||||
private: | private: | ||||
struct SyntaxToken | struct SyntaxToken | ||||
{ | { | ||||
SyntaxToken (const String& text_, const int type) noexcept | |||||
: text (text_), tokenType (type), width (-1.0f) | |||||
SyntaxToken (const String& t, const int type) noexcept | |||||
: text (t), tokenType (type), width (-1.0f) | |||||
{ | { | ||||
} | } | ||||
bool operator!= (const SyntaxToken& other) const noexcept | |||||
bool operator== (const SyntaxToken& other) const noexcept | |||||
{ | { | ||||
return text != other.text || tokenType != other.tokenType; | |||||
return tokenType == other.tokenType && text == other.text; | |||||
} | } | ||||
String text; | String text; | ||||
@@ -321,13 +306,13 @@ CodeEditorComponent::CodeEditorComponent (CodeDocument& document_, | |||||
horizontalScrollBar (false), | horizontalScrollBar (false), | ||||
codeTokeniser (codeTokeniser_) | codeTokeniser (codeTokeniser_) | ||||
{ | { | ||||
caretPos = CodeDocument::Position (&document_, 0, 0); | |||||
caretPos = CodeDocument::Position (document_, 0, 0); | |||||
caretPos.setPositionMaintained (true); | caretPos.setPositionMaintained (true); | ||||
selectionStart = CodeDocument::Position (&document_, 0, 0); | |||||
selectionStart = CodeDocument::Position (document_, 0, 0); | |||||
selectionStart.setPositionMaintained (true); | selectionStart.setPositionMaintained (true); | ||||
selectionEnd = CodeDocument::Position (&document_, 0, 0); | |||||
selectionEnd = CodeDocument::Position (document_, 0, 0); | |||||
selectionEnd.setPositionMaintained (true); | selectionEnd.setPositionMaintained (true); | ||||
setOpaque (true); | setOpaque (true); | ||||
@@ -509,8 +494,8 @@ void CodeEditorComponent::rebuildLineTokens() | |||||
jassert (numNeeded == lines.size()); | jassert (numNeeded == lines.size()); | ||||
CodeDocument::Iterator source (&document); | |||||
getIteratorForPosition (CodeDocument::Position (&document, firstLineOnScreen, 0).getPosition(), source); | |||||
CodeDocument::Iterator source (document); | |||||
getIteratorForPosition (CodeDocument::Position (document, firstLineOnScreen, 0).getPosition(), source); | |||||
for (int i = 0; i < numNeeded; ++i) | for (int i = 0; i < numNeeded; ++i) | ||||
{ | { | ||||
@@ -686,7 +671,7 @@ CodeDocument::Position CodeEditorComponent::getPositionAt (int x, int y) | |||||
const int column = roundToInt ((x - (getGutterSize() - xOffset * charWidth)) / charWidth); | const int column = roundToInt ((x - (getGutterSize() - xOffset * charWidth)) / charWidth); | ||||
const int index = columnToIndex (line, column); | const int index = columnToIndex (line, column); | ||||
return CodeDocument::Position (&document, line, index); | |||||
return CodeDocument::Position (document, line, index); | |||||
} | } | ||||
//============================================================================== | //============================================================================== | ||||
@@ -727,25 +712,25 @@ void CodeEditorComponent::insertTabAtCaret() | |||||
bool CodeEditorComponent::deleteWhitespaceBackwardsToTabStop() | bool CodeEditorComponent::deleteWhitespaceBackwardsToTabStop() | ||||
{ | { | ||||
if (! getHighlightedRegion().isEmpty()) | |||||
return false; | |||||
for (;;) | |||||
if (getHighlightedRegion().isEmpty()) | |||||
{ | { | ||||
const int currentColumn = indexToColumn (caretPos.getLineNumber(), caretPos.getIndexInLine()); | |||||
for (;;) | |||||
{ | |||||
const int currentColumn = indexToColumn (caretPos.getLineNumber(), caretPos.getIndexInLine()); | |||||
if (currentColumn <= 0 || (currentColumn % spacesPerTab) == 0) | |||||
break; | |||||
if (currentColumn <= 0 || (currentColumn % spacesPerTab) == 0) | |||||
break; | |||||
moveCaretLeft (false, true); | |||||
} | |||||
moveCaretLeft (false, true); | |||||
} | |||||
const String selected (getTextInRange (getHighlightedRegion())); | |||||
const String selected (getTextInRange (getHighlightedRegion())); | |||||
if (selected.isNotEmpty() && selected.trim().isEmpty()) | |||||
{ | |||||
cut(); | |||||
return true; | |||||
if (selected.isNotEmpty() && selected.trim().isEmpty()) | |||||
{ | |||||
cut(); | |||||
return true; | |||||
} | |||||
} | } | ||||
return false; | return false; | ||||
@@ -776,8 +761,8 @@ void CodeEditorComponent::indentSelectedLines (const int spacesToAdd) | |||||
if (nonWhitespaceStart > 0 || lineText.trimStart().isNotEmpty()) | if (nonWhitespaceStart > 0 || lineText.trimStart().isNotEmpty()) | ||||
{ | { | ||||
const CodeDocument::Position wsStart (&document, line, 0); | |||||
const CodeDocument::Position wsEnd (&document, line, nonWhitespaceStart); | |||||
const CodeDocument::Position wsStart (document, line, 0); | |||||
const CodeDocument::Position wsEnd (document, line, nonWhitespaceStart); | |||||
const int numLeadingSpaces = indexToColumn (line, wsEnd.getIndexInLine()); | const int numLeadingSpaces = indexToColumn (line, wsEnd.getIndexInLine()); | ||||
const int newNumLeadingSpaces = jmax (0, numLeadingSpaces + spacesToAdd); | const int newNumLeadingSpaces = jmax (0, numLeadingSpaces + spacesToAdd); | ||||
@@ -803,7 +788,6 @@ void CodeEditorComponent::cut() | |||||
bool CodeEditorComponent::copyToClipboard() | bool CodeEditorComponent::copyToClipboard() | ||||
{ | { | ||||
newTransaction(); | newTransaction(); | ||||
const String selection (document.getTextBetween (selectionStart, selectionEnd)); | const String selection (document.getTextBetween (selectionStart, selectionEnd)); | ||||
if (selection.isNotEmpty()) | if (selection.isNotEmpty()) | ||||
@@ -876,7 +860,7 @@ bool CodeEditorComponent::moveCaretDown (const bool selecting) | |||||
newTransaction(); | newTransaction(); | ||||
if (caretPos.getLineNumber() == document.getNumLines() - 1) | if (caretPos.getLineNumber() == document.getNumLines() - 1) | ||||
moveCaretTo (CodeDocument::Position (&document, std::numeric_limits<int>::max(), std::numeric_limits<int>::max()), selecting); | |||||
moveCaretTo (CodeDocument::Position (document, std::numeric_limits<int>::max(), std::numeric_limits<int>::max()), selecting); | |||||
else | else | ||||
moveLineDelta (1, selecting); | moveLineDelta (1, selecting); | ||||
@@ -888,7 +872,7 @@ bool CodeEditorComponent::moveCaretUp (const bool selecting) | |||||
newTransaction(); | newTransaction(); | ||||
if (caretPos.getLineNumber() == 0) | if (caretPos.getLineNumber() == 0) | ||||
moveCaretTo (CodeDocument::Position (&document, 0, 0), selecting); | |||||
moveCaretTo (CodeDocument::Position (document, 0, 0), selecting); | |||||
else | else | ||||
moveLineDelta (-1, selecting); | moveLineDelta (-1, selecting); | ||||
@@ -936,7 +920,7 @@ bool CodeEditorComponent::scrollDown() | |||||
bool CodeEditorComponent::moveCaretToTop (const bool selecting) | bool CodeEditorComponent::moveCaretToTop (const bool selecting) | ||||
{ | { | ||||
newTransaction(); | newTransaction(); | ||||
moveCaretTo (CodeDocument::Position (&document, 0, 0), selecting); | |||||
moveCaretTo (CodeDocument::Position (document, 0, 0), selecting); | |||||
return true; | return true; | ||||
} | } | ||||
@@ -949,21 +933,21 @@ bool CodeEditorComponent::moveCaretToStartOfLine (const bool selecting) | |||||
if (index >= caretPos.getIndexInLine() && caretPos.getIndexInLine() > 0) | if (index >= caretPos.getIndexInLine() && caretPos.getIndexInLine() > 0) | ||||
index = 0; | index = 0; | ||||
moveCaretTo (CodeDocument::Position (&document, caretPos.getLineNumber(), index), selecting); | |||||
moveCaretTo (CodeDocument::Position (document, caretPos.getLineNumber(), index), selecting); | |||||
return true; | return true; | ||||
} | } | ||||
bool CodeEditorComponent::moveCaretToEnd (const bool selecting) | bool CodeEditorComponent::moveCaretToEnd (const bool selecting) | ||||
{ | { | ||||
newTransaction(); | newTransaction(); | ||||
moveCaretTo (CodeDocument::Position (&document, std::numeric_limits<int>::max(), std::numeric_limits<int>::max()), selecting); | |||||
moveCaretTo (CodeDocument::Position (document, std::numeric_limits<int>::max(), std::numeric_limits<int>::max()), selecting); | |||||
return true; | return true; | ||||
} | } | ||||
bool CodeEditorComponent::moveCaretToEndOfLine (const bool selecting) | bool CodeEditorComponent::moveCaretToEndOfLine (const bool selecting) | ||||
{ | { | ||||
newTransaction(); | newTransaction(); | ||||
moveCaretTo (CodeDocument::Position (&document, caretPos.getLineNumber(), std::numeric_limits<int>::max()), selecting); | |||||
moveCaretTo (CodeDocument::Position (document, caretPos.getLineNumber(), std::numeric_limits<int>::max()), selecting); | |||||
return true; | return true; | ||||
} | } | ||||
@@ -1031,8 +1015,8 @@ bool CodeEditorComponent::deleteForwards (const bool moveInWholeWordSteps) | |||||
bool CodeEditorComponent::selectAll() | bool CodeEditorComponent::selectAll() | ||||
{ | { | ||||
newTransaction(); | newTransaction(); | ||||
moveCaretTo (CodeDocument::Position (&document, std::numeric_limits<int>::max(), std::numeric_limits<int>::max()), false); | |||||
moveCaretTo (CodeDocument::Position (&document, 0, 0), true); | |||||
moveCaretTo (CodeDocument::Position (document, std::numeric_limits<int>::max(), std::numeric_limits<int>::max()), false); | |||||
moveCaretTo (CodeDocument::Position (document, 0, 0), true); | |||||
return true; | return true; | ||||
} | } | ||||
@@ -1070,14 +1054,14 @@ Range<int> CodeEditorComponent::getHighlightedRegion() const | |||||
void CodeEditorComponent::setHighlightedRegion (const Range<int>& newRange) | void CodeEditorComponent::setHighlightedRegion (const Range<int>& newRange) | ||||
{ | { | ||||
moveCaretTo (CodeDocument::Position (&document, newRange.getStart()), false); | |||||
moveCaretTo (CodeDocument::Position (&document, newRange.getEnd()), true); | |||||
moveCaretTo (CodeDocument::Position (document, newRange.getStart()), false); | |||||
moveCaretTo (CodeDocument::Position (document, newRange.getEnd()), true); | |||||
} | } | ||||
String CodeEditorComponent::getTextInRange (const Range<int>& range) const | String CodeEditorComponent::getTextInRange (const Range<int>& range) const | ||||
{ | { | ||||
return document.getTextBetween (CodeDocument::Position (&document, range.getStart()), | |||||
CodeDocument::Position (&document, range.getEnd())); | |||||
return document.getTextBetween (CodeDocument::Position (document, range.getStart()), | |||||
CodeDocument::Position (document, range.getEnd())); | |||||
} | } | ||||
//============================================================================== | //============================================================================== | ||||
@@ -1379,7 +1363,7 @@ void CodeEditorComponent::updateCachedIterators (int maxLineNum) | |||||
const int linesBetweenCachedSources = jmax (10, document.getNumLines() / maxNumCachedPositions); | const int linesBetweenCachedSources = jmax (10, document.getNumLines() / maxNumCachedPositions); | ||||
if (cachedIterators.size() == 0) | if (cachedIterators.size() == 0) | ||||
cachedIterators.add (new CodeDocument::Iterator (&document)); | |||||
cachedIterators.add (new CodeDocument::Iterator (document)); | |||||
if (codeTokeniser != nullptr) | if (codeTokeniser != nullptr) | ||||
{ | { | ||||
@@ -1458,8 +1442,8 @@ CodeEditorComponent::State::State (const State& other) noexcept | |||||
void CodeEditorComponent::State::restoreState (CodeEditorComponent& editor) const | void CodeEditorComponent::State::restoreState (CodeEditorComponent& editor) const | ||||
{ | { | ||||
editor.moveCaretTo (CodeDocument::Position (&editor.getDocument(), lastSelectionEnd), false); | |||||
editor.moveCaretTo (CodeDocument::Position (&editor.getDocument(), lastCaretPos), true); | |||||
editor.moveCaretTo (CodeDocument::Position (editor.getDocument(), lastSelectionEnd), false); | |||||
editor.moveCaretTo (CodeDocument::Position (editor.getDocument(), lastCaretPos), true); | |||||
if (lastTopLine > 0 && lastTopLine < editor.getDocument().getNumLines()) | if (lastTopLine > 0 && lastTopLine < editor.getDocument().getNumLines()) | ||||
editor.scrollToLine (lastTopLine); | editor.scrollToLine (lastTopLine); | ||||