void cbStyledTextCtrl::OnKeyDown(wxKeyEvent& event) { switch (event.GetKeyCode()) { case WXK_TAB: { if (m_tabSmartJump && !(event.ControlDown() || event.ShiftDown() || event.AltDown())) { if (!AutoCompActive() && m_bracePosition != wxSCI_INVALID_POSITION) { m_lastPosition = GetCurrentPos(); GotoPos(m_bracePosition); // Need judge if it's the final brace HighlightRightBrace(); if (!m_tabSmartJump && CallTipActive()) CallTipCancel(); return; } } } break; case WXK_BACK: { if (m_tabSmartJump) { if (!(event.ControlDown() || event.ShiftDown() || event.AltDown())) { const int pos = GetCurrentPos(); const int index = s_leftBrace.Find((wxChar)GetCharAt(pos - 1)); if (index != wxNOT_FOUND && (wxChar)GetCharAt(pos) == s_rightBrace.GetChar(index)) { CharRight(); DeleteBack(); } } else if (m_lastPosition != wxSCI_INVALID_POSITION && event.ControlDown()) { GotoPos(m_lastPosition); m_lastPosition = wxSCI_INVALID_POSITION; return; } } } break; case WXK_RETURN: case WXK_ESCAPE: { if (m_tabSmartJump) m_tabSmartJump = false; } break; } event.Skip(); }
void ctlSQLBox::OnPositionStc(wxStyledTextEvent &event) { int pos = GetCurrentPos(); wxChar ch = GetCharAt(pos - 1); int st = GetStyleAt(pos - 1); int match; // Line numbers // Ensure we don't recurse through any paint handlers on Mac #ifdef __WXMAC__ Freeze(); #endif UpdateLineNumber(); #ifdef __WXMAC__ Thaw(); #endif // Clear all highlighting BraceBadLight(wxSTC_INVALID_POSITION); // Check for braces that aren't in comment styles, // double quoted styles or single quoted styles if ((ch == '{' || ch == '}' || ch == '[' || ch == ']' || ch == '(' || ch == ')') && st != 2 && st != 6 && st != 7) { match = BraceMatch(pos - 1); if (match != wxSTC_INVALID_POSITION) BraceHighlight(pos - 1, match); } // Roll back through the doc and highlight any unmatched braces while ((pos--) >= 0) { ch = GetCharAt(pos); st = GetStyleAt(pos); if ((ch == '{' || ch == '}' || ch == '[' || ch == ']' || ch == '(' || ch == ')') && st != 2 && st != 6 && st != 7) { match = BraceMatch(pos); if (match == wxSTC_INVALID_POSITION) { BraceBadLight(pos); break; } } } event.Skip(); }
/* TextEditor::trimWhitespace * Removes any unneeded whitespace from the ends of lines *******************************************************************/ void TextEditor::trimWhitespace() { // Go through lines for (int a = 0; a < GetLineCount(); a++) { // Get line start and end positions int pos = GetLineEndPosition(a) - 1; int start = pos - GetLineLength(a); while (pos > start) { int chr = GetCharAt(pos); // Check for whitespace character if (chr == ' ' || chr == '\t') { // Remove character if whitespace Remove(pos, pos+1); pos--; } else break; // Not whitespace, stop } } }
void CodeEditor::HighlightBraces() { int currPos = GetCurrentPos(); int newPos = BraceMatch(currPos); if (newPos == wxSCI_INVALID_POSITION) { if(currPos > 0) newPos = BraceMatch(--currPos); } wxChar ch = GetCharAt(currPos); if (ch == wxT('{') || ch == wxT('[') || ch == wxT('(') || ch == wxT('}') || ch == wxT(']') || ch == wxT(')')) { if (newPos != wxSCI_INVALID_POSITION) { BraceHighlight(currPos, newPos); } else { BraceBadLight(currPos); } } else BraceHighlight(-1, -1); Refresh(false); }
wxChar CodeEditor::GetLastNonWhitespaceChar(int position /* = -1 */) { if (position == -1) position = GetCurrentPos(); int count = 0; // Used to count the number of blank lines bool foundlf = false; // For the rare case of CR's without LF's while (position) { wxChar c = GetCharAt(--position); int style = GetStyleAt(position); bool inComment = style == wxSCI_C_COMMENT || style == wxSCI_C_COMMENTDOC || style == wxSCI_C_COMMENTDOCKEYWORD || style == wxSCI_C_COMMENTDOCKEYWORDERROR || style == wxSCI_C_COMMENTLINE || style == wxSCI_C_COMMENTLINEDOC; if (c == wxT('\n')) { count++; foundlf = true; } else if (c == wxT('\r') && !foundlf) count++; else foundlf = false; if (count > 1) return 0; // Don't over-indent if (!inComment && c != wxT(' ') && c != wxT('\t') && c != wxT('\n') && c != wxT('\r')) return c; } return 0; }
void MaterialScriptEditor::OnCharAdded(wxScintillaEvent &event) { ScintillaEditor::OnCharAdded(event); char ch = event.GetKey(); if(getCallTipManager().isTrigger(ch)) { int lineNum = GetCurrentLine(); if(lineNum != -1) { wxString line = GetLine(lineNum); int pos = GetCurrentPos() - 1; wxString word(""); wxChar ch; while(pos) { ch = GetCharAt(--pos); if(ch != ' ' && ch != '\n' && ch != '\r' && ch != '\t' && ch != '{' && ch != '}') word.Prepend(ch); else break; } wxString* tips = getCallTipManager().find(word); if(tips != NULL) { CallTipShow(pos, *tips); } } } }
/* TextEditor::onCharAdded * Called when a character is added to the text *******************************************************************/ void TextEditor::onCharAdded(wxStyledTextEvent& e) { // Update line numbers margin width string numlines = S_FMT("0%d", GetNumberOfLines()); SetMarginWidth(0, TextWidth(wxSTC_STYLE_LINENUMBER, numlines)); // Auto indent int currentLine = GetCurrentLine(); if (txed_auto_indent && e.GetKey() == '\n') { // Get indentation amount int lineInd = 0; if (currentLine > 0) lineInd = GetLineIndentation(currentLine - 1); // Do auto-indent if needed if (lineInd != 0) { SetLineIndentation(currentLine, lineInd); // Skip to end of tabs while (1) { int chr = GetCharAt(GetCurrentPos()); if (chr == '\t' || chr == ' ') GotoPos(GetCurrentPos()+1); else break; } } } // The following require a language to work if (language) { // Call tip if (e.GetKey() == '(' && txed_calltips_parenthesis) { openCalltip(GetCurrentPos()); } // End call tip if (e.GetKey() == ')') { CallTipCancel(); } // Comma, possibly update calltip if (e.GetKey() == ',' && txed_calltips_parenthesis) { //openCalltip(GetCurrentPos()); //if (CallTipActive()) updateCalltip(); } } // Continue e.Skip(); }
void cbStyledTextCtrl::DoBraceCompletion(const wxChar& ch) { const int pos = GetCurrentPos(); const int style = GetStyleAt(pos); if (IsComment(style) || IsComment(GetStyleAt(pos - 2))) return; // do nothing if (ch == wxT('\'') || ch == wxT('"')) { if (GetCharAt(pos) == ch) { DeleteBack(); CharRight(); } else if (!IsString(GetStyleAt(pos - 2)) && !IsCharacter(GetStyleAt(pos - 2))) InsertText(pos, ch); return; // done } if (IsString(style) || IsCharacter(style)) return; // do nothing const wxString opBraces(wxT("([{")); const int opBraceIdx = opBraces.Find(ch); const wxString clBraces(wxT(")]}")); const int clBraceIdx = clBraces.Find(ch); if ( (opBraceIdx != wxNOT_FOUND) || (clBraceIdx != wxNOT_FOUND) ) { if ( GetCharAt(pos) == ch ) { DeleteBack(); CharRight(); } else if (opBraceIdx != wxNOT_FOUND) { int nextPos = pos; while ( wxIsspace(GetCharAt(nextPos)) && (nextPos < GetLength()) ) ++nextPos; if ( ((wxChar)GetCharAt(nextPos) != clBraces[opBraceIdx]) || (BraceMatch(nextPos) != wxNOT_FOUND) ) { InsertText(pos, clBraces[opBraceIdx]); } } } }
UIdType Sequence::GetNumberAt(size_t& pos) const { UIdType n = 0; while ( isdigit(GetCharAt(pos)) ) { n *= 10; n += m_seq[pos++] - '0'; } return n; }
int CodeEditor::FindBlockStart(int position, wxChar blockStart, wxChar blockEnd, bool skipNested /* = true */) { int level = 0; wxChar ch = GetCharAt(position); while (ch) { if (ch == blockEnd) ++level; else if (ch == blockStart) { if (level == 0) return position; --level; } --position; ch = GetCharAt(position); } return -1; }
UIdType Sequence::GetNext(UIdType n, size_t& cookie) const { switch ( GetCharAt(cookie) ) { case ':': // we're inside a range, check if we didn't exhaust it { size_t pos = cookie + 1; UIdType last = GetNumberAt(pos); if ( n < last ) return n + 1; // done with this range, continue with the rest cookie = pos; } if ( GetCharAt(cookie) != '\0' ) { // nothing else can follow the end of the range ASSERT_MSG( GetCharAt(cookie) == ',', "bad sequence string format" ); cookie++; break; } //else: fall through case '\0': return UID_ILLEGAL; case ',': // skip comma and go to the next number cookie++; break; } return GetNumberAt(cookie); }
/* TextEditor::updateCalltip * Updates the current calltip, or attempts to open one if none is * currently showing *******************************************************************/ void TextEditor::updateCalltip() { // Don't bother if no language if (!language) return; if (!CallTipActive()) { // No calltip currently showing, check if we're in a function int pos = GetCurrentPos() - 1; while (pos >= 0) { // Get character int chr = GetCharAt(pos); // If we find a closing bracket, skip to matching brace if (chr == ')') { while (pos >= 0 && chr != '(') { pos--; chr = GetCharAt(pos); } pos--; continue; } // If we find an opening bracket, try to open a calltip if (chr == '(') { if (!openCalltip(pos)) return; else break; } // Go to previous character pos--; } } if (ct_function) { // Calltip currently showing, determine what arg we're at int pos = ct_start+1; int arg = 0; while (pos < GetCurrentPos() && pos < GetTextLength()) { // Get character int chr = GetCharAt(pos); // If it's an opening brace, skip until closing (ie skip a function as an arg) if (chr == '(') { while (chr != ')') { // Exit if we get to the current position or the end of the text if (pos == GetCurrentPos() || pos == GetTextLength()-1) break; // Get next character pos++; chr = GetCharAt(pos); } pos++; continue; } // If it's a comma, increment arg if (chr == ',') arg++; // If it's a closing brace, we're outside the function, so cancel the calltip if (chr == ')') { CallTipCancel(); ct_function = NULL; return; } // Go to next character pos++; } // Update calltip string with the selected arg set and the current arg highlighted CallTipShow(ct_start, ct_function->generateCallTipString(ct_argset)); point2_t arg_ext = ct_function->getArgTextExtent(arg, ct_argset); CallTipSetHighlight(arg_ext.x, arg_ext.y); } }
void cbStyledTextCtrl::HighlightRightBrace() { if (m_bracePosition == wxSCI_INVALID_POSITION) return; int pos = GetCurrentPos(); if (pos == wxSCI_INVALID_POSITION) return; const static wxColour caretForeground = GetCaretForeground(); const static int caretWidth = GetCaretWidth(); const int curLine = GetCurrentLine(); const int len = GetLength(); if (m_tabSmartJump && (curLine == LineFromPosition(m_bracePosition))) { SetIndicatorCurrent(s_indicHighlight); const int indPos = GetLineIndentPosition(curLine); IndicatorClearRange(indPos, GetLineEndPosition(curLine)-indPos); do { if (pos >= len) break; wxString cur((wxChar)GetCharAt(pos)); if (cur == _T("\n")) break; int style = GetStyleAt(pos); if (IsComment(style)) continue; if (IsString(style) || IsCharacter(style)) { const int nextOne = (pos == len) ? GetStyleAt(pos) : GetStyleAt(pos + 1); if (IsCharacter(nextOne) || IsString(nextOne)) continue; } if (s_rightBrace.Contains(cur)) { SetCaretForeground(wxColour(255, 0, 0)); SetCaretWidth(caretWidth + 1); IndicatorSetForeground(s_indicHighlight, wxColour(80, 236, 120)); IndicatorSetStyle(s_indicHighlight, wxSCI_INDIC_HIGHLIGHT); #ifndef wxHAVE_RAW_BITMAP IndicatorSetUnder(s_indicHighlight, true); #endif SetIndicatorCurrent(s_indicHighlight); IndicatorFillRange(pos, 1); m_bracePosition = pos + 1; return; } } while (++pos); } m_bracePosition = wxSCI_INVALID_POSITION; m_lastPosition = wxSCI_INVALID_POSITION; m_tabSmartJump = false; SetIndicatorCurrent(s_indicHighlight); IndicatorClearRange(0, len); SetCaretForeground(caretForeground); SetCaretWidth(caretWidth); }
void cbStyledTextCtrl::OnKeyUp(wxKeyEvent& event) { const int keyCode = event.GetKeyCode(); switch (keyCode) { case _T('['): // [ { case _T('\''): // ' " #ifdef __WXMSW__ case _T('9'): // ( for wxMSW #else case _T('('): // ( for wxGTK #endif { if ( !AllowTabSmartJump() ) break; wxChar ch = keyCode; if (event.ShiftDown()) { if (keyCode == _T('\'')) ch = _T('"'); else if (keyCode == _T('9')) ch = _T('('); else if (keyCode == _T('[')) ch = _T('{'); } int index = s_leftBrace.Find(ch); if (index != wxNOT_FOUND && (wxChar)GetCharAt(GetCurrentPos()) == s_rightBrace.GetChar(index)) { const int pos = GetCurrentPos(); if (pos != wxSCI_INVALID_POSITION) { m_tabSmartJump = true; m_bracePosition = pos; } } else if (keyCode == _T('\'')) // ' " m_tabSmartJump = false; } break; case _T(']'): // ] } #ifdef __WXMSW__ case _T('0'): // ) for wxMSW #else case _T(')'): // ) for wxGTK #endif { if (!AllowTabSmartJump()) break; if (keyCode == _T('0') && !event.ShiftDown()) break; m_tabSmartJump = false; } break; default: break; } HighlightRightBrace(); event.Skip(); }
void cbStyledTextCtrl::OnKeyDown(wxKeyEvent& event) { m_lastSelectedText = GetSelectedText(); bool emulateDwellStart = false; switch ( event.GetKeyCode() ) { case _T('I'): { if (event.GetModifiers() == wxMOD_ALT) m_braceShortcutState = true; break; } case WXK_TAB: { if (m_tabSmartJump && event.GetModifiers() == wxMOD_NONE) { if (!AutoCompActive() && m_bracePosition != wxSCI_INVALID_POSITION) { m_lastPosition = GetCurrentPos(); GotoPos(m_bracePosition); // Need judge if it's the final brace HighlightRightBrace(); if (!m_tabSmartJump && CallTipActive()) CallTipCancel(); return; } } } break; case WXK_BACK: { if (m_tabSmartJump) { if (!(event.ControlDown() || event.ShiftDown() || event.AltDown())) { const int pos = GetCurrentPos(); const int index = s_leftBrace.Find((wxChar)GetCharAt(pos - 1)); if (index != wxNOT_FOUND && (wxChar)GetCharAt(pos) == s_rightBrace.GetChar(index)) { CharRight(); DeleteBack(); } } else if (m_lastPosition != wxSCI_INVALID_POSITION && event.ControlDown()) { GotoPos(m_lastPosition); m_lastPosition = wxSCI_INVALID_POSITION; return; } } } break; case WXK_RETURN: case WXK_NUMPAD_ENTER: case WXK_ESCAPE: { if (m_tabSmartJump) m_tabSmartJump = false; } break; case WXK_CONTROL: { EmulateDwellStart(); emulateDwellStart = true; } break; default: break; } if (event.ControlDown() && !emulateDwellStart) EmulateDwellStart(); event.Skip(); }
/* TextEditor::updateCalltip * Updates the current calltip, or attempts to open one if none is * currently showing *******************************************************************/ void TextEditor::updateCalltip() { // Don't bother if no language if (!language) return; if (!call_tip->IsShown()) { // No calltip currently showing, check if we're in a function int pos = GetCurrentPos() - 1; while (pos >= 0) { // Get character int chr = GetCharAt(pos); // If we find a closing bracket, skip to matching brace if (chr == ')') { while (pos >= 0 && chr != '(') { pos--; chr = GetCharAt(pos); } pos--; continue; } // If we find an opening bracket, try to open a calltip if (chr == '(') { if (!openCalltip(pos, 0)) return; else break; } // Go to previous character pos--; } } if (ct_function) { // Hide calltip if we've gone before the start of the function if (GetCurrentPos() < ct_start) { hideCalltip(); ct_function = nullptr; return; } // Calltip currently showing, determine what arg we're at int pos = ct_start+1; int arg = 0; while (pos < GetCurrentPos() && pos < GetTextLength()) { // Get character int chr = GetCharAt(pos); // If it's an opening brace, skip until closing (ie skip a function as an arg) if (chr == '(') { while (chr != ')') { // Exit if we get to the current position or the end of the text if (pos == GetCurrentPos() || pos == GetTextLength()-1) break; // Get next character pos++; chr = GetCharAt(pos); } pos++; continue; } // If it's a comma, increment arg if (chr == ',') arg++; // If it's a closing brace, we're outside the function, so cancel the calltip if (chr == ')') { hideCalltip(); ct_function = nullptr; return; } // Go to next character pos++; } // Update calltip string with the selected arg set and the current arg highlighted call_tip->setCurrentArg(arg); } }