void ClangPlugin::OnEditorHook(cbEditor* ed, wxScintillaEvent& event) { event.Skip(); if (!IsProviderFor(ed)) return; cbStyledTextCtrl* stc = ed->GetControl(); if (event.GetEventType() == wxEVT_SCI_MODIFIED) { if (event.GetModificationType() & (wxSCI_MOD_INSERTTEXT | wxSCI_MOD_DELETETEXT)) { const int pos = stc->GetCurrentPos(); const int line = stc->LineFromPosition(pos); if ( (m_LastModifyLine != -1)&&(line != m_LastModifyLine) ) { RequestReparse(); } m_LastModifyLine = line; } } else if (event.GetEventType() == wxEVT_SCI_CHANGE) { //fprintf(stdout,"wxEVT_SCI_CHANGE\n"); } }
void cbDebuggerPlugin::OnEditorHook(cb_unused cbEditor* editor, wxScintillaEvent& event) { if (event.GetEventType() == wxEVT_SCI_START_DRAG) m_DragInProgress = true; else if (event.GetEventType() == wxEVT_SCI_FINISHED_DRAG) m_DragInProgress = false; }
void Highlighter::Call(cbEditor* ctrl, wxScintillaEvent &event) const { // return if this event is not fired from the active editor (is it possible that an editor which is not active fires an event?) if ( Manager::Get()->GetEditorManager()->GetActiveEditor() != ctrl ) return; // check the event type if it is an update event if ( event.GetEventType() == wxEVT_SCI_UPDATEUI || event.GetEventType() == wxEVT_SCI_PAINTED ) { HighlightOccurrencesOfSelection(ctrl); OnEditorUpdateUI(ctrl); } else if ( event.GetEventType() == wxEVT_SCI_MODIFIED) { if(event.GetModificationType() & wxSCI_MOD_INSERTTEXT) { OnEditorChangeTextRange(ctrl, event.GetPosition(), event.GetPosition() + event.GetLength()); } else if (event.GetModificationType() & wxSCI_MOD_DELETETEXT) { OnEditorChangeTextRange(ctrl, event.GetPosition(), event.GetPosition()); } else if (event.GetModificationType() & wxSCI_MOD_CHANGESTYLE) { OnEditorChangeTextRange(ctrl, event.GetPosition(), event.GetPosition() + event.GetLength()); } } }
void SmartIndentPascal::OnEditorHook(cbEditor* ed, wxScintillaEvent& event) const { if (!ed) return; // check the event type and the currently set language // if it is not a CharAdded event or the language is not Pascal return wxEventType type = event.GetEventType(); if ( type != wxEVT_SCI_CHARADDED ) return; cbStyledTextCtrl* stc = ed->GetControl(); if ( !stc ) return; // check if smart indent is enabled const bool smartIndent = Manager::Get()->GetConfigManager(_T("editor"))->ReadBool(_T("/smart_indent"), true); if ( !smartIndent ) return; wxString langname = Manager::Get()->GetEditorManager()->GetColourSet()->GetLanguageName(ed->GetLanguage()); if ( langname != wxT("Pascal") ) return; ed->AutoIndentDone(); // we are responsible. wxChar ch = event.GetKey(); if ( (ch == wxT('\n')) || ( (stc->GetEOLMode() == wxSCI_EOL_CR) && (ch == wxT('\r')) ) ) DoIndent(ed, langname); // indent because \n added else if ( ch != wxT(' ') ) DoUnIndent(ed, langname); // un-indent because not a newline added bool braceCompleted = false; if ( SelectionBraceCompletionEnabled() || stc->IsBraceShortcutActive() ) braceCompleted = stc->DoSelectionBraceCompletion(ch); if (!braceCompleted && BraceCompletionEnabled()) stc->DoBraceCompletion(ch); }
void ClangCodeCompletion::OnEditorHook(cbEditor* ed, wxScintillaEvent& event) { event.Skip(); bool clearIndicator = false; bool reparse = false; //if (!m_pClangPlugin->IsProviderFor(ed)) // return; cbStyledTextCtrl* stc = ed->GetControl(); if (event.GetEventType() == wxEVT_SCI_MODIFIED) { m_ReparseTimer.Stop(); if (event.GetModificationType() & (wxSCI_MOD_INSERTTEXT | wxSCI_MOD_DELETETEXT)) { reparse = true; clearIndicator = true; } } else if (event.GetEventType() == wxEVT_SCI_UPDATEUI) { //fprintf(stdout,"wxEVT_SCI_UPDATEUI\n"); if (event.GetUpdated() & wxSCI_UPDATE_SELECTION) { m_HightlightTimer.Stop(); m_HightlightTimer.Start(HIGHTLIGHT_DELAY, wxTIMER_ONE_SHOT); } clearIndicator = true; } else if (event.GetEventType() == wxEVT_SCI_CHANGE) { //fprintf(stdout,"wxEVT_SCI_CHANGE\n"); } if (clearIndicator) { const int theIndicator = 16; stc->SetIndicatorCurrent(theIndicator); stc->IndicatorClearRange(0, stc->GetLength()); } if (reparse) { RequestReparse(); } }
void ClangPlugin::OnEditorHook(cbEditor* ed, wxScintillaEvent& event) { event.Skip(); if (!IsProviderFor(ed)) return; if (event.GetEventType() == wxEVT_SCI_MODIFIED) { if (event.GetModificationType() & (wxSCI_MOD_INSERTTEXT | wxSCI_MOD_DELETETEXT)) { m_ReparseTimer.Start(REPARSE_DELAY, wxTIMER_ONE_SHOT); m_DiagnosticTimer.Start(DIAGNOSTIC_DELAY, wxTIMER_ONE_SHOT); } } }
void SmartIndentCpp::OnEditorHook(cbEditor* ed, wxScintillaEvent& event) const { // check if smart indent is enabled // check the event type and the currently set language // if it is not a CharAdded event or the language is not C/C++, D, or Java return if (!ed) return; if ( !SmartIndentEnabled() ) return; wxEventType type = event.GetEventType(); if ( type != wxEVT_SCI_CHARADDED ) return; cbStyledTextCtrl* stc = ed->GetControl(); if (!stc) return; wxString langname = Manager::Get()->GetEditorManager()->GetColourSet()->GetLanguageName(ed->GetLanguage()); if ( langname != wxT("D") && (stc->GetLexer() != wxSCI_LEX_CPP || langname == wxT("Hitachi asm"))) return; ed->AutoIndentDone(); // we are responsible. const int pos = stc->GetCurrentPos(); int currLine = stc->LineFromPosition(pos); if (currLine == 0) return; const wxChar ch = event.GetKey(); if ( SelectionBraceCompletionEnabled() || stc->IsBraceShortcutActive() ) DoSelectionBraceCompletion(stc, ch); DoSmartIndent(ed, ch); if ( BraceCompletionEnabled() ) DoBraceCompletion(stc, ch); }
void CCManager::OnEditorHook(cbEditor* ed, wxScintillaEvent& event) { wxEventType evtType = event.GetEventType(); if (evtType == wxEVT_SCI_CHARADDED) { const wxChar ch = event.GetKey(); CCPluginCharMap::const_iterator ctChars = m_CallTipChars.find(GetProviderFor(ed)); if (ctChars == m_CallTipChars.end()) ctChars = m_CallTipChars.find(nullptr); // default if (ctChars->second.find(ch) != ctChars->second.end()) { CodeBlocksEvent evt(cbEVT_SHOW_CALL_TIP); Manager::Get()->ProcessEvent(evt); } else { cbStyledTextCtrl* stc = ed->GetControl(); const int pos = stc->GetCurrentPos(); const int wordStartPos = stc->WordStartPosition(pos, true); CCPluginCharMap::const_iterator alChars = m_AutoLaunchChars.find(GetProviderFor(ed)); if (alChars == m_AutoLaunchChars.end()) alChars = m_AutoLaunchChars.find(nullptr); // default // TODO: read settings if ( (pos - wordStartPos >= 3 && !stc->AutoCompActive()) || pos - wordStartPos == 3 + 4 ) { CodeBlocksEvent evt(cbEVT_COMPLETE_CODE); Manager::Get()->ProcessEvent(evt); } else if (alChars->second.find(ch) != alChars->second.end()) { m_AutoLaunchTimer.Start(10, wxTIMER_ONE_SHOT); m_AutocompPosition = pos; } } } else if (evtType == wxEVT_SCI_UPDATEUI) { if (event.GetUpdated() & (wxSCI_UPDATE_V_SCROLL|wxSCI_UPDATE_H_SCROLL)) { cbStyledTextCtrl* stc = ed->GetControl(); if (stc->CallTipActive()) { static_cast<wxScintilla*>(stc)->CallTipCancel(); if (m_CallTipActive != wxSCI_INVALID_POSITION && CCManagerHelper::IsPosVisible(m_CallTipActive, stc)) m_CallTipTimer.Start(SCROLL_REFRESH_DELAY, wxTIMER_ONE_SHOT); } else if (m_CallTipTimer.IsRunning()) { if (CCManagerHelper::IsPosVisible(stc->GetCurrentPos(), stc)) m_CallTipTimer.Start(SCROLL_REFRESH_DELAY, wxTIMER_ONE_SHOT); else { m_CallTipTimer.Stop(); m_CallTipActive = wxSCI_INVALID_POSITION; } } if (m_AutoLaunchTimer.IsRunning()) { if (CCManagerHelper::IsPosVisible(stc->GetCurrentPos(), stc)) m_AutoLaunchTimer.Start(SCROLL_REFRESH_DELAY, wxTIMER_ONE_SHOT); else m_AutoLaunchTimer.Stop(); } else if (stc->AutoCompActive()) { stc->AutoCompCancel(); m_AutocompPosition = stc->GetCurrentPos(); if (CCManagerHelper::IsPosVisible(m_AutocompPosition, stc)) m_AutoLaunchTimer.Start(SCROLL_REFRESH_DELAY, wxTIMER_ONE_SHOT); } } } else if (evtType == wxEVT_SCI_KEY) { cbStyledTextCtrl* stc = ed->GetControl(); switch (event.GetKey()) { case wxSCI_KEY_LEFT: case wxSCI_KEY_RIGHT: if (!stc->CallTipActive() && !stc->AutoCompActive()) m_CallTipActive = wxSCI_INVALID_POSITION; // fall through case wxSCI_KEY_UP: case wxSCI_KEY_DOWN: if (m_CallTipActive != wxSCI_INVALID_POSITION && !stc->AutoCompActive()) m_CallTipTimer.Start(CALLTIP_REFRESH_DELAY, wxTIMER_ONE_SHOT); break; default: break; } } else if (evtType == wxEVT_SCI_MODIFIED) { if (event.GetModificationType() & wxSCI_PERFORMED_UNDO) { cbStyledTextCtrl* stc = ed->GetControl(); if (m_CallTipActive != wxSCI_INVALID_POSITION && stc->GetCurrentPos() >= m_CallTipActive) m_CallTipTimer.Start(CALLTIP_REFRESH_DELAY, wxTIMER_ONE_SHOT); else static_cast<wxScintilla*>(stc)->CallTipCancel(); } } else if (evtType == wxEVT_SCI_AUTOCOMP_SELECTION) { DoHidePopup(); cbCodeCompletionPlugin* ccPlugin = GetProviderFor(ed); if (ccPlugin && m_OwnsAutocomp) { if ( m_LastAutocompIndex != wxNOT_FOUND && m_LastAutocompIndex < (int)m_AutocompTokens.size() ) { ccPlugin->DoAutocomplete(m_AutocompTokens[m_LastAutocompIndex], ed); } else { ccPlugin->DoAutocomplete(event.GetText(), ed); } } } else if (evtType == wxEVT_SCI_AUTOCOMP_CANCELLED) DoHidePopup(); else if (evtType == wxEVT_SCI_CALLTIP_CLICK) { switch (event.GetPosition()) { case 1: // up --m_CurCallTip; DoUpdateCallTip(ed); break; case 2: // down ++m_CurCallTip; DoUpdateCallTip(ed); break; case 0: // elsewhere default: break; } } event.Skip(); }
void SmartIndentFortran::OnEditorHook(cbEditor* ed, wxScintillaEvent& event) const { // check if smart indent is enabled // check the event type and the currently set language // if it is not a CharAdded event or the language is not Fortran return if (!ed) return; if ( !SmartIndentEnabled() ) return; wxEventType type = event.GetEventType(); if ( type != wxEVT_SCI_CHARADDED ) return; cbStyledTextCtrl* stc = ed->GetControl(); if (!stc) return; wxString langname = Manager::Get()->GetEditorManager()->GetColourSet()->GetLanguageName(ed->GetLanguage()); if ( langname != wxT("Fortran") && langname != wxT("Fortran77") ) return; ed->AutoIndentDone(); // we are responsible. const int pos = stc->GetCurrentPos(); wxChar ch = event.GetKey(); if ( (ch == _T('\n')) || ( (stc->GetEOLMode() == wxSCI_EOL_CR) && (ch == _T('\r')) ) ) { const bool autoIndent = AutoIndentEnabled(); stc->BeginUndoAction(); int currLine = stc->LineFromPosition(pos); // auto indent if (autoIndent && currLine > 0) { wxString indent = ed->GetLineIndentString(currLine - 1); stc->InsertText(pos, indent); stc->GotoPos(pos + indent.Length()); stc->ChooseCaretX(); } // smart indent bool smartIndent = SmartIndentEnabled(); if (smartIndent && currLine > 0) { int start = stc->GetLineIndentPosition(currLine - 1); int endt = stc->WordEndPosition(start, true); wxString text = stc->GetTextRange(start, endt).Lower(); wxString lineText = stc->GetLine(currLine - 1).BeforeFirst('!').Lower(); wxString lastText = lineText.AfterLast(')').Trim().Trim(false); wxString secText = lineText.Trim(false).Mid(text.Length()).Trim(false); if ( (text == _T("if") && lastText == _T("then")) || text == _T("else") || text == _T("elseif") || text == _T("enum") ||(text == _T("where") && lastText.IsEmpty()) || text == _T("elsewhere") || text == _T("block") || text == _T("blockdata") ||(text == _T("forall") && lastText.IsEmpty()) || text == _T("while") || text == _T("case") || text == _T("associate") || text == _T("block") || text == _T("critical") || text == _T("do") ||(text == _T("type") && !secText.StartsWith(_T("("))) || text == _T("program") || text == _T("function") || text == _T("subroutine") || text == _T("interface") ||( text == _T("module") && !secText.StartsWith(_T("procedure ")) && !secText.StartsWith(_T("procedure:")) ) ) { stc->Tab(); } } stc->EndUndoAction(); } bool braceCompleted = false; if ( SelectionBraceCompletionEnabled() || stc->IsBraceShortcutActive() ) braceCompleted = stc->DoSelectionBraceCompletion(ch); if (!braceCompleted && BraceCompletionEnabled()) stc->DoBraceCompletion(ch); }