1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-11 23:54:18 +00:00

Introjucer: some code editor fixes and functionality.

This commit is contained in:
jules 2012-07-20 20:57:39 +01:00
parent 21d7a993ab
commit 8ee1897916
5 changed files with 202 additions and 131 deletions

View file

@ -158,3 +158,143 @@ void SourceCodeEditor::valueTreeChildRemoved (ValueTree&, ValueTree&)
void SourceCodeEditor::valueTreeChildOrderChanged (ValueTree&) { updateColourScheme(); }
void SourceCodeEditor::valueTreeParentChanged (ValueTree&) { updateColourScheme(); }
void SourceCodeEditor::valueTreeRedirected (ValueTree&) { updateColourScheme(); }
//==============================================================================
namespace CppUtils
{
static CPlusPlusCodeTokeniser* getCppTokeniser()
{
static CPlusPlusCodeTokeniser cppTokeniser;
return &cppTokeniser;
}
static String getLeadingWhitespace (String line)
{
line = line.removeCharacters ("\r\n");
const String::CharPointerType endOfLeadingWS (line.getCharPointer().findEndOfWhitespace());
return String (line.getCharPointer(), endOfLeadingWS);
}
static bool getIndentForCurrentBlock (CodeDocument::Position pos, String& whitespace)
{
int braceCount = 0;
while (pos.getLineNumber() > 0)
{
pos = pos.movedByLines (-1);
const String line (pos.getLineText());
const String trimmedLine (line.trimStart());
String::CharPointerType l (trimmedLine.getCharPointer());
for (;;)
{
const juce_wchar c = l.getAndAdvance();
if (c == 0)
break;
if (c == '}')
++braceCount;
if (c == '{')
{
if (--braceCount < 0)
{
whitespace = getLeadingWhitespace (line);
return true;
}
}
if (c == '"' || c == '\'')
{
while (! (l.isEmpty() || l.getAndAdvance() == c))
{}
}
if (c == '/' && *l == '/')
break;
}
}
return false;
}
}
CppCodeEditorComponent::CppCodeEditorComponent (CodeDocument& codeDocument)
: CodeEditorComponent (codeDocument, CppUtils::getCppTokeniser())
{
}
void CppCodeEditorComponent::handleReturnKey()
{
CodeEditorComponent::handleReturnKey();
const CodeDocument::Position pos (getCaretPos());
if (pos.getLineNumber() > 0 && pos.getLineText().trim().isEmpty())
{
String indent;
CppUtils::getIndentForCurrentBlock (pos, indent);
const String previousLine (pos.movedByLines (-1).getLineText());
const String trimmedPreviousLine (previousLine.trim());
const String leadingWhitespace (CppUtils::getLeadingWhitespace (previousLine));
insertTextAtCaret (leadingWhitespace);
if (trimmedPreviousLine.endsWithChar ('{')
|| ((trimmedPreviousLine.startsWith ("if ")
|| trimmedPreviousLine.startsWith ("for ")
|| trimmedPreviousLine.startsWith ("while "))
&& trimmedPreviousLine.endsWithChar (')')))
insertTabAtCaret();
}
}
void CppCodeEditorComponent::insertTextAtCaret (const String& newText)
{
if (getHighlightedRegion().isEmpty())
{
const CodeDocument::Position pos (getCaretPos());
if ((newText == "{" || newText == "}")
&& pos.getLineNumber() > 0
&& pos.getLineText().trim().isEmpty())
{
moveCaretToStartOfLine (true);
String whitespace;
if (CppUtils::getIndentForCurrentBlock (pos, whitespace))
{
CodeEditorComponent::insertTextAtCaret (whitespace);
if (newText == "{")
insertTabAtCaret();
}
}
else if (newText == getDocument().getNewLineCharacters()
&& pos.getLineNumber() > 0)
{
const String remainderOfLine (pos.getLineText().substring (pos.getIndexInLine()));
if (remainderOfLine.startsWithChar ('{') || remainderOfLine.startsWithChar ('}'))
{
String whitespace;
if (CppUtils::getIndentForCurrentBlock (pos, whitespace))
{
CodeEditorComponent::insertTextAtCaret (newText + whitespace);
if (remainderOfLine.startsWithChar ('{'))
insertTabAtCaret();
return;
}
}
}
}
CodeEditorComponent::insertTextAtCaret (newText);
}