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 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(); }