void ClangPlugin::RequestReparse(const ClTranslUnitId translUnitId, const wxString& filename) { EditorManager* edMgr = Manager::Get()->GetEditorManager(); cbEditor* ed = edMgr->GetBuiltinActiveEditor(); if (!ed) { return; } if (translUnitId == wxNOT_FOUND) { std::cout<<"Translation unit not found: "<<translUnitId<<" file="<<(const char*)ed->GetFilename().c_str()<<std::endl; return; } if ( translUnitId == m_TranslUnitId ) { m_ReparseNeeded = 0; } std::map<wxString, wxString> unsavedFiles; for (int i = 0; i < edMgr->GetEditorsCount(); ++i) { ed = edMgr->GetBuiltinEditor(i); if (ed && ed->GetModified()) unsavedFiles.insert(std::make_pair(ed->GetFilename(), ed->GetControl()->GetText())); } ClangProxy::ReparseJob job( cbEVT_CLANG_ASYNCTASK_FINISHED, idClangReparse, translUnitId, m_CompileCommand, filename, unsavedFiles); m_Proxy.AppendPendingJob(job); }
void ClangDiagnostics::OnGotoPrevDiagnostic(wxCommandEvent& WXUNUSED(event)) { EditorManager* edMgr = Manager::Get()->GetEditorManager(); cbEditor* ed = edMgr->GetBuiltinActiveEditor(); if (!ed) { return; } cbStyledTextCtrl* stc = ed->GetControl(); int prevLine = -1; for (std::vector<ClDiagnostic>::const_iterator it = m_Diagnostics.begin(); it != m_Diagnostics.end(); ++it) { if ((it->line - 1) < stc->GetCurrentLine()) { prevLine = it->line - 1; } else break; } if (prevLine >= 0) { if (prevLine < stc->GetFirstVisibleLine()) { stc->GotoLine( prevLine ); stc->ScrollLines(-stc->LinesOnScreen() / 2); } else { stc->GotoLine(prevLine); stc->MakeNearbyLinesVisible(prevLine); } } }
void WorkspaceBrowserF::OnTreeItemSelected(wxTreeEvent& event) { if (Manager::IsAppShuttingDown()) return; if (m_pBrowserBuilder) { if (!m_pBrowserBuilder->SelectNode(event.GetItem())) return; } event.Allow(); EditorManager* edMan = Manager::Get()->GetEditorManager(); if (!edMan) return; cbEditor* ed = edMan->GetBuiltinActiveEditor(); if (!ed) return; cbStyledTextCtrl* control = ed->GetControl(); int currentLine = control->GetCurrentLine() + 1; wxString activeFilename = ed->GetFilename(); if (activeFilename.IsEmpty()) return; MarkSymbol(UnixFilename(activeFilename), currentLine); }
wxString CodeRefactoring::GetSymbolUnderCursor() { EditorManager* edMan = Manager::Get()->GetEditorManager(); cbEditor* editor = edMan->GetBuiltinActiveEditor(); if (!editor) return wxEmptyString; cbStyledTextCtrl* control = editor->GetControl(); const int style = control->GetStyleAt(control->GetCurrentPos()); if (control->IsString(style) || control->IsComment(style)) return wxEmptyString; if (!m_NativeParser.GetParser().Done()) { wxString msg(_("The Parser is still parsing files.")); cbMessageBox(msg, _("Code Refactoring"), wxOK | wxICON_WARNING); msg += m_NativeParser.GetParser().NotDoneReason(); CCLogger::Get()->DebugLog(msg); return wxEmptyString; } const int pos = editor->GetControl()->GetCurrentPos(); const int start = editor->GetControl()->WordStartPosition(pos, true); const int end = editor->GetControl()->WordEndPosition(pos, true); return editor->GetControl()->GetTextRange(start, end); }
void ClangCodeCompletion::OnCodeCompleteFinished( ClangEvent& event ) { //fprintf(stdout,"%s\n", __PRETTY_FUNCTION__ ); if( event.GetTranslationUnitId() != m_TranslUnitId ) { return; } if (m_CCOutstanding > 0) { EditorManager* edMgr = Manager::Get()->GetEditorManager(); cbEditor* ed = edMgr->GetBuiltinActiveEditor(); if (ed) { if (ed->GetControl()->GetCurrentPos() == m_CCOutstandingPos) { m_CCOutstandingResults = event.GetCodeCompletionResults(); if ( m_CCOutstandingResults.size() > 0 ) { CodeBlocksEvent evt(cbEVT_COMPLETE_CODE); evt.SetInt(1); Manager::Get()->ProcessEvent(evt); return; } } } m_CCOutstanding--; } }
int copystrings::Execute() { //do your magic ;) EditorManager* man = Manager::Get()->GetEditorManager(); if(!man) return -1; cbEditor* myeditor = man->GetBuiltinActiveEditor(); if(!myeditor) return -1; if(cbStyledTextCtrl* ctrl = myeditor->GetControl()) { wxString result(_T("")); wxString input(_T("")); input = ctrl->GetText(); GetStrings(input, result); if (wxTheClipboard->Open()) { wxTheClipboard->SetData( new wxTextDataObject(result)); wxTheClipboard->Close(); } cbMessageBox(_T("Literal strings copied to clipboard.")); } return -1; }
void Exporter::ExportFile(BaseExporter *exp, const wxString &default_extension, const wxString &wildcard) { if (!IsAttached()) { return; } EditorManager* em = Manager::Get()->GetEditorManager(); cbEditor* cb = em->GetBuiltinActiveEditor(); wxString filename = wxFileSelector(_("Choose the filename"), _T(""), wxFileName(cb->GetFilename()).GetName() + _T(".") + default_extension, default_extension, wildcard, wxFD_SAVE | wxFD_OVERWRITE_PROMPT); if (filename.IsEmpty()) { return; } cbStyledTextCtrl* stc = cb->GetControl(); if (!stc) return; int lineCount = -1; if (wxMessageBox(_("Would you like to have the line numbers printed in the exported file?"), _("Export line numbers"), wxYES_NO | wxYES_DEFAULT | wxICON_QUESTION) == wxYES) { lineCount = stc->GetLineCount(); } exp->Export(filename, cb->GetFilename(), stc->GetStyledText(0, stc->GetLength() - 1), cb->GetColourSet(), lineCount, stc->GetTabWidth()); }
void CodeRefactoring::DoRenameSymbols(const wxString& targetText, const wxString& replaceText) { EditorManager* edMan = Manager::Get()->GetEditorManager(); cbEditor* editor = edMan->GetBuiltinActiveEditor(); if (!editor) return; cbProject* project = m_NativeParser.GetProjectByEditor(editor); for (SearchDataMap::iterator it = m_SearchDataMap.begin(); it != m_SearchDataMap.end(); ++it) { // check if the file is already opened in built-in editor and do search in it cbEditor* ed = edMan->IsBuiltinOpen(it->first); if (!ed) { ProjectFile* pf = project ? project->GetFileByFilename(it->first) : 0; ed = edMan->Open(it->first, it->second.front().pos, pf); } cbStyledTextCtrl* control = ed->GetControl(); control->BeginUndoAction(); for (SearchDataList::reverse_iterator rIter = it->second.rbegin(); rIter != it->second.rend(); ++rIter) { control->SetTargetStart(rIter->pos); control->SetTargetEnd(rIter->pos + targetText.Len()); control->ReplaceTarget(replaceText); // for find references rIter->text.Replace(targetText, replaceText); } control->EndUndoAction(); } }
void ClangPlugin::OnCreateTranslationUnit( wxCommandEvent& event ) { if ( m_TranslUnitId != wxNOT_FOUND ) { return; } wxString filename = event.GetString(); if (filename.Length() == 0) return; EditorManager* edMgr = Manager::Get()->GetEditorManager(); cbEditor* ed = edMgr->GetBuiltinActiveEditor(); if (ed) { if (filename != ed->GetFilename()) return; std::map<wxString, wxString> unsavedFiles; for (int i = 0; i < edMgr->GetEditorsCount(); ++i) { ed = edMgr->GetBuiltinEditor(i); if (ed && ed->GetModified()) unsavedFiles.insert(std::make_pair(ed->GetFilename(), ed->GetControl()->GetText())); } ClangProxy::CreateTranslationUnitJob job( cbEVT_CLANG_ASYNCTASK_FINISHED, idClangCreateTU, filename, m_CompileCommand, unsavedFiles ); m_Proxy.AppendPendingJob(job); } }
wxString ClangCodeCompletion::GetDocumentation( const cbCodeCompletionPlugin::CCToken &token ) { EditorManager* edMgr = Manager::Get()->GetEditorManager(); cbEditor* ed = edMgr->GetBuiltinActiveEditor(); if (ed) { return m_pClangPlugin->GetCodeCompletionTokenDocumentation( m_TranslUnitId, ed->GetFilename(), ClTokenPosition(0,0), token.id ); } return wxEmptyString; }
wxString CBTSVN::GetEditorFilename() { EditorManager* man = Manager::Get()->GetEditorManager(); if (!man) return _(""); // prevent invocation on "start here" cbEditor* builtin_active_editor = man->GetBuiltinActiveEditor(); if (!builtin_active_editor) return _(""); EditorBase* active_editor = man->GetActiveEditor(); if (!active_editor) return _(""); return active_editor->GetFilename(); }
size_t CodeRefactoring::SearchInFiles(const wxArrayString& files, const wxString& targetText) { EditorManager* edMan = Manager::Get()->GetEditorManager(); m_SearchDataMap.clear(); // now that list is filled, we'll search wxWindow* parent = edMan->GetBuiltinActiveEditor()->GetParent(); cbStyledTextCtrl* control = new cbStyledTextCtrl(parent, wxID_ANY, wxDefaultPosition, wxSize(0, 0)); control->Show(false); // let's create a progress dialog because it might take some time depending on the files count wxProgressDialog* progress = new wxProgressDialog(_("Code Refactoring"), _("Please wait while searching inside the project..."), files.GetCount(), Manager::Get()->GetAppWindow(), wxPD_AUTO_HIDE | wxPD_APP_MODAL | wxPD_CAN_ABORT); PlaceWindow(progress); for (size_t i = 0; i < files.GetCount(); ++i) { // update the progress bar if (!progress->Update(i)) break; // user pressed "Cancel" // check if the file is already opened in built-in editor and do search in it cbEditor* ed = edMan->IsBuiltinOpen(files[i]); if (ed) control->SetText(ed->GetControl()->GetText()); else // else load the file in the control { EncodingDetector detector(files[i]); if (!detector.IsOK()) continue; // failed control->SetText(detector.GetWxStr()); } Find(control, files[i], targetText); } delete control; // done with it delete progress; // done here too return m_SearchDataMap.size(); }
void ClangPlugin::OnReparse( wxCommandEvent& /*event*/ ) { #ifdef CLANGPLUGIN_TRACE_FUNCTIONS fprintf(stdout,"%s\n", __PRETTY_FUNCTION__); #endif //m_DiagnosticTimer.Stop(); EditorManager* edMgr = Manager::Get()->GetEditorManager(); cbEditor* ed = edMgr->GetBuiltinActiveEditor(); if (!ed) { std::cout<<"No editor..."<<std::endl; return; } m_ReparseNeeded = 0; if (ed != m_pLastEditor) { //m_TranslUnitId = m_Proxy.GetTranslationUnitId(ed->GetFilename()); m_TranslUnitId = wxNOT_FOUND; m_pLastEditor = ed; std::cout<<"Reparse: TranslUnitId set to "<<m_TranslUnitId<<std::endl; } if (m_TranslUnitId == wxNOT_FOUND) { std::cout<<"Translation unit not found: "<<m_TranslUnitId<<" file="<<(const char*)ed->GetFilename().c_str()<<std::endl; return; } //std::cout<<"Reparsing with translUnitId "<<m_TranslUnitId<<std::endl; std::map<wxString, wxString> unsavedFiles; for (int i = 0; i < edMgr->GetEditorsCount(); ++i) { ed = edMgr->GetBuiltinEditor(i); if (ed && ed->GetModified()) unsavedFiles.insert(std::make_pair(ed->GetFilename(), ed->GetControl()->GetText())); } ClangProxy::ReparseJob job( cbEVT_CLANG_ASYNCTASK_FINISHED, idClangReparse, m_TranslUnitId, m_CompileCommand, ed->GetFilename(), unsavedFiles); m_Proxy.AppendPendingJob(job); //m_ReparseBusy++; }
void ClangDiagnostics::OnGotoNextDiagnostic(wxCommandEvent& WXUNUSED(event)) { EditorManager* edMgr = Manager::Get()->GetEditorManager(); cbEditor* ed = edMgr->GetBuiltinActiveEditor(); if (!ed) { return; } cbStyledTextCtrl* stc = ed->GetControl(); for (std::vector<ClDiagnostic>::const_iterator it = m_Diagnostics.begin(); it != m_Diagnostics.end(); ++it) { if ((it->line - 1) > stc->GetCurrentLine()) { stc->GotoLine(it->line - 1); stc->MakeNearbyLinesVisible(it->line - 1); break; } } }
void Exporter::OnUpdateUI(wxUpdateUIEvent &event) { if (Manager::IsAppShuttingDown()) { event.Skip(); return; } wxMenuBar *mbar = Manager::Get()->GetAppFrame()->GetMenuBar(); if (mbar) { EditorManager *em = Manager::Get()->GetEditorManager(); // Enabled if there's a source file opened (be sure it isn't the "Start here" page) bool disable = !em || !em->GetActiveEditor() || !em->GetBuiltinActiveEditor(); mbar->Enable(idFileExportHTML, !disable); mbar->Enable(idFileExportRTF, !disable); mbar->Enable(idFileExportODT, !disable); mbar->Enable(idFileExportPDF, !disable); } event.Skip(); }
void ClangPlugin::OnClangGetDiagnosticsFinished( wxEvent& event ) { #ifdef CLANGPLUGIN_TRACE_FUNCTIONS //fprintf(stdout,"%s\n", __PRETTY_FUNCTION__); #endif ClDiagnosticLevel diagLv = dlFull; // TODO ClangProxy::GetDiagnosticsJob* pJob = static_cast<ClangProxy::GetDiagnosticsJob*>(event.GetEventObject()); ClangEvent evt( clEVT_DIAGNOSTICS_UPDATED, pJob->GetTranslationUnitId(), pJob->GetFilename(), ClTokenPosition(0,0), pJob->GetResults()); ProcessEvent(evt); #if 0 EditorManager* edMgr = Manager::Get()->GetEditorManager(); cbEditor* ed = edMgr->GetBuiltinActiveEditor(); if (!ed) { std::cout<<"No editor..."<<std::endl; return; } if ((pJob->m_TranslId != m_TranslUnitId)||(ed != m_pLastEditor)) { // No longer the current editor std::cout<<"Diagnostics requested but another file was loaded..."<<std::endl; return; } cbStyledTextCtrl* stc = ed->GetControl(); if (diagLv == dlFull) stc->AnnotationClearAll(); const int warningIndicator = 0; // predefined const int errorIndicator = 15; // hopefully we do not clash with someone else... stc->SetIndicatorCurrent(warningIndicator); stc->IndicatorClearRange(0, stc->GetLength()); stc->IndicatorSetStyle(errorIndicator, wxSCI_INDIC_SQUIGGLE); stc->IndicatorSetForeground(errorIndicator, *wxRED); stc->SetIndicatorCurrent(errorIndicator); stc->IndicatorClearRange(0, stc->GetLength()); const wxString& fileNm = ed->GetFilename(); for ( std::vector<ClDiagnostic>::const_iterator dgItr = pJob->m_Diagnostic.begin(); dgItr != pJob->m_Diagnostic.end(); ++dgItr ) { //Manager::Get()->GetLogManager()->Log(dgItr->file + wxT(" ") + dgItr->message + F(wxT(" %d, %d"), dgItr->range.first, dgItr->range.second)); if (dgItr->file != fileNm) continue; if (diagLv == dlFull) { wxString str = stc->AnnotationGetText(dgItr->line - 1); if (!str.IsEmpty()) str += wxT('\n'); stc->AnnotationSetText(dgItr->line - 1, str + dgItr->message); stc->AnnotationSetStyle(dgItr->line - 1, 50); } int pos = stc->PositionFromLine(dgItr->line - 1) + dgItr->range.first - 1; int range = dgItr->range.second - dgItr->range.first; if (range == 0) { range = stc->WordEndPosition(pos, true) - pos; if (range == 0) { pos = stc->WordStartPosition(pos, true); range = stc->WordEndPosition(pos, true) - pos; } } if (dgItr->severity == sError) stc->SetIndicatorCurrent(errorIndicator); else if ( dgItr != pJob->m_Diagnostics.begin() && dgItr->line == (dgItr - 1)->line && dgItr->range.first <= (dgItr - 1)->range.second ) { continue; // do not overwrite the last indicator } else stc->SetIndicatorCurrent(warningIndicator); stc->IndicatorFillRange(pos, range); } if (diagLv == dlFull) stc->AnnotationSetVisible(wxSCI_ANNOTATION_BOXED); #endif }
void ClangDiagnostics::OnDiagnosticsUpdated(ClangEvent& event) { event.Skip(); if (!IsAttached()) return; ClDiagnosticLevel diagLv = dlFull; // TODO bool update = false; EditorManager* edMgr = Manager::Get()->GetEditorManager(); cbEditor* ed = edMgr->GetBuiltinActiveEditor(); if (!ed) return; if (event.GetTranslationUnitId() != GetCurrentTranslationUnitId()) { CCLogger::Get()->DebugLog( wxT("OnDiagnostics: tu ID mismatch") ); // Switched translation unit before event delivered return; } const std::vector<ClDiagnostic>& diagnostics = event.GetDiagnosticResults(); if ( (diagLv == dlFull)&&(event.GetLocation().line != 0) && (event.GetLocation().column != 0) ) { CCLogger::Get()->DebugLog( wxT("OnDiagnostics: Doing partial update") ); update = true; } else { CCLogger::Get()->DebugLog( wxT("OnDiagnostics: Doing full update") ); m_Diagnostics = diagnostics; } cbStyledTextCtrl* stc = ed->GetControl(); int firstVisibleLine = stc->GetFirstVisibleLine(); const int warningIndicator = 0; // predefined const int errorIndicator = 15; // hopefully we do not clash with someone else... stc->SetIndicatorCurrent(warningIndicator); if (!update) stc->IndicatorClearRange(0, stc->GetLength()); stc->IndicatorSetStyle(errorIndicator, wxSCI_INDIC_SQUIGGLE); stc->IndicatorSetForeground(errorIndicator, *wxRED); stc->SetIndicatorCurrent(errorIndicator); if (!update) stc->IndicatorClearRange(0, stc->GetLength()); const wxString& filename = ed->GetFilename(); if (!m_bShowInline) stc->AnnotationClearAll(); else if ((diagLv == dlFull) && update) { int line = event.GetLocation().line-1; stc->AnnotationClearLine(line); } else stc->AnnotationClearAll(); int lastLine = 0; for (std::vector<ClDiagnostic>::const_iterator dgItr = diagnostics.begin(); dgItr != diagnostics.end(); ++dgItr) { Manager::Get()->GetLogManager()->Log(dgItr->file + wxT(" ") + dgItr->message + F(wxT(" %d, %d"), dgItr->range.first, dgItr->range.second)); if (dgItr->file != filename) { CCLogger::Get()->Log(wxT("WARNING: Filename mismatch in diagnostics !!")); continue; } if (update) { m_Diagnostics.push_back( *dgItr ); } if (diagLv == dlFull) { if (update && (lastLine != (dgItr->line - 1))) { stc->AnnotationClearLine(dgItr->line - 1); } if (m_bShowInline) { wxString str = stc->AnnotationGetText(dgItr->line - 1); if (!str.IsEmpty()) str += wxT('\n'); if (!str.Contains(dgItr->message)) { switch (dgItr->severity) { case sWarning: if (m_bShowWarning) { stc->AnnotationSetText(dgItr->line - 1, str + dgItr->message); stc->AnnotationSetStyle(dgItr->line - 1, 51); } break; case sError: if (m_bShowError) { stc->AnnotationSetText(dgItr->line - 1, str + dgItr->message); stc->AnnotationSetStyle(dgItr->line - 1, 52); } break; case sNote: break; } } } } int pos = stc->PositionFromLine(dgItr->line - 1) + dgItr->range.first - 1; int range = dgItr->range.second - dgItr->range.first; if (range == 0) { range = stc->WordEndPosition(pos, true) - pos; if (range == 0) { pos = stc->WordStartPosition(pos, true); range = stc->WordEndPosition(pos, true) - pos; } } if (dgItr->severity == sError) stc->SetIndicatorCurrent(errorIndicator); else if ( dgItr != diagnostics.begin() && dgItr->line == (dgItr - 1)->line && dgItr->range.first <= (dgItr - 1)->range.second ) { continue; // do not overwrite the last indicator } else stc->SetIndicatorCurrent(warningIndicator); stc->IndicatorFillRange(pos, range); lastLine = dgItr->line - 1; } if (diagLv == dlFull) { stc->AnnotationSetVisible(wxSCI_ANNOTATION_BOXED); stc->ScrollLines(firstVisibleLine - stc->GetFirstVisibleLine()); } }
void ClangDiagnostics::OnDiagnostics( ClangEvent& event ) { ClDiagnosticLevel diagLv = dlFull; // TODO bool update = false; EditorManager* edMgr = Manager::Get()->GetEditorManager(); cbEditor* ed = edMgr->GetBuiltinActiveEditor(); if (!ed) { std::cout<<"No editor..."<<std::endl; return; } if( event.GetTranslationUnitId() != GetCurrentTranslationUnitId() ) { // Switched translation unit before event delivered return; } if( (diagLv == dlFull)&&(event.GetLocation().line != 0)&&(event.GetLocation().column != 0) ) { update = true; } const std::vector<ClDiagnostic>& diagnostics = event.GetDiagnosticResults(); cbStyledTextCtrl* stc = ed->GetControl(); int firstVisibleLine = stc->GetFirstVisibleLine(); if ((diagLv == dlFull)&&(!update) ) stc->AnnotationClearAll(); const int warningIndicator = 0; // predefined const int errorIndicator = 15; // hopefully we do not clash with someone else... stc->SetIndicatorCurrent(warningIndicator); if ( !update ) stc->IndicatorClearRange(0, stc->GetLength()); stc->IndicatorSetStyle(errorIndicator, wxSCI_INDIC_SQUIGGLE); stc->IndicatorSetForeground(errorIndicator, *wxRED); stc->SetIndicatorCurrent(errorIndicator); if ( !update ) stc->IndicatorClearRange(0, stc->GetLength()); const wxString& filename = ed->GetFilename(); if ( (diagLv == dlFull)&&(update) ) { int line = event.GetLocation().line-1; stc->AnnotationClearLine(line); } for ( std::vector<ClDiagnostic>::const_iterator dgItr = diagnostics.begin(); dgItr != diagnostics.end(); ++dgItr ) { //Manager::Get()->GetLogManager()->Log(dgItr->file + wxT(" ") + dgItr->message + F(wxT(" %d, %d"), dgItr->range.first, dgItr->range.second)); if (dgItr->file != filename) continue; if (diagLv == dlFull) { if( (!update) || ((int)dgItr->line == (int)event.GetLocation().line) ) { wxString str = stc->AnnotationGetText(dgItr->line - 1); if (!str.IsEmpty()) str += wxT('\n'); stc->AnnotationSetText(dgItr->line - 1, str + dgItr->message); stc->AnnotationSetStyle(dgItr->line - 1, 50); } } int pos = stc->PositionFromLine(dgItr->line - 1) + dgItr->range.first - 1; int range = dgItr->range.second - dgItr->range.first; if (range == 0) { range = stc->WordEndPosition(pos, true) - pos; if (range == 0) { pos = stc->WordStartPosition(pos, true); range = stc->WordEndPosition(pos, true) - pos; } } if (dgItr->severity == sError) stc->SetIndicatorCurrent(errorIndicator); else if ( dgItr != diagnostics.begin() && dgItr->line == (dgItr - 1)->line && dgItr->range.first <= (dgItr - 1)->range.second ) { continue; // do not overwrite the last indicator } else stc->SetIndicatorCurrent(warningIndicator); stc->IndicatorFillRange(pos, range); } if ( diagLv == dlFull ) { stc->AnnotationSetVisible(wxSCI_ANNOTATION_BOXED); stc->ScrollToLine(firstVisibleLine); } }
size_t CodeRefactoring::VerifyResult(const TokenIdxSet& targetResult, const wxString& targetText, bool isLocalVariable) { EditorManager* edMan = Manager::Get()->GetEditorManager(); cbEditor* editor = edMan->GetBuiltinActiveEditor(); if (!editor) return 0; const Token* parentOfLocalVariable = nullptr; if (isLocalVariable) { TokenTree* tree = m_NativeParser.GetParser().GetTokenTree(); CC_LOCKER_TRACK_TT_MTX_LOCK(s_TokenTreeMutex) const Token* token = tree->at(*targetResult.begin()); parentOfLocalVariable = tree->at(token->m_ParentIndex); CC_LOCKER_TRACK_TT_MTX_UNLOCK(s_TokenTreeMutex) } // now that list is filled, we'll search cbStyledTextCtrl* control = new cbStyledTextCtrl(editor->GetParent(), wxID_ANY, wxDefaultPosition, wxSize(0, 0)); control->Show(false); // styled the text to support control->GetStyleAt() cbEditor::ApplyStyles(control); EditorColourSet edColSet; size_t totalCount = 0; for (SearchDataMap::const_iterator it = m_SearchDataMap.begin(); it != m_SearchDataMap.end(); ++it) totalCount += it->second.size(); // let's create a progress dialog because it might take some time depending on the files count wxProgressDialog* progress = new wxProgressDialog(_("Code Refactoring"), _("Please wait while verifying result..."), totalCount, Manager::Get()->GetAppWindow(), wxPD_AUTO_HIDE | wxPD_APP_MODAL | wxPD_CAN_ABORT); PlaceWindow(progress); size_t task = totalCount; TokenIdxSet result; bool userBreak = false; for (SearchDataMap::iterator it = m_SearchDataMap.begin(); it != m_SearchDataMap.end();) { // check if the file is already opened in built-in editor and do search in it cbEditor* ed = edMan->IsBuiltinOpen(it->first); if (ed) control->SetText(ed->GetControl()->GetText()); else // else load the file in the control { EncodingDetector detector(it->first); if (!detector.IsOK()) { task -= it->second.size(); m_SearchDataMap.erase(it++); continue; // failed } control->SetText(detector.GetWxStr()); } // apply the corlor setting edColSet.Apply(editor->GetLanguage(), control); ccSearchData searchData = { control, it->first }; for (SearchDataList::iterator itList = it->second.begin(); itList != it->second.end();) { // update the progress bar if (!progress->Update(totalCount - (--task))) { userBreak = true; break; // user pressed "Cancel" } // skip string or comment const int style = control->GetStyleAt(itList->pos); if (control->IsString(style) || control->IsComment(style)) { it->second.erase(itList++); continue; } // do cc search const int endOfWord = itList->pos + targetText.Len(); control->GotoPos(endOfWord); m_NativeParser.MarkItemsByAI(&searchData, result, true, false, true, endOfWord); if (result.empty()) { it->second.erase(itList++); continue; } // verify result TokenIdxSet::const_iterator findIter = targetResult.begin(); for (; findIter != targetResult.end(); ++findIter) { if (result.find(*findIter) != result.end()) break; } if (findIter == targetResult.end()) // not found it->second.erase(itList++); else { // handle for local variable if (isLocalVariable) { bool do_continue = false; TokenTree* tree = m_NativeParser.GetParser().GetTokenTree(); CC_LOCKER_TRACK_TT_MTX_LOCK(s_TokenTreeMutex) const Token* token = tree->at(*findIter); if (token) { const Token* parent = tree->at(token->m_ParentIndex); if (parent != parentOfLocalVariable) { it->second.erase(itList++); do_continue = true; } } CC_LOCKER_TRACK_TT_MTX_UNLOCK(s_TokenTreeMutex) if (do_continue) continue; } ++itList; } } if (it->second.empty()) m_SearchDataMap.erase(it++); else ++it; if (userBreak) break; } delete control; // done with it delete progress; // done here too return m_SearchDataMap.size(); }
void ClangPlugin::OnTimer(wxTimerEvent& event) { if (!IsAttached()) return; const int evId = event.GetId(); if (evId == idEdOpenTimer) { cbEditor* ed = Manager::Get()->GetEditorManager()->GetBuiltinActiveEditor(); if (!ed || !IsProviderFor(ed)) return; else if (m_Proxy.GetTranslationUnitId(ed->GetFilename()) != wxNOT_FOUND) { m_DiagnosticTimer.Start(DIAGNOSTIC_DELAY, wxTIMER_ONE_SHOT); return; } wxString compileCommand; ProjectFile* pf = ed->GetProjectFile(); ProjectBuildTarget* target = nullptr; Compiler* comp = nullptr; if (pf && pf->GetParentProject() && !pf->GetBuildTargets().IsEmpty() ) { target = pf->GetParentProject()->GetBuildTarget(pf->GetBuildTargets()[0]); comp = CompilerFactory::GetCompiler(target->GetCompilerID()); if (pf->GetUseCustomBuildCommand(target->GetCompilerID())) { compileCommand = pf->GetCustomBuildCommand(target->GetCompilerID()).AfterFirst(wxT(' ')); } } if (compileCommand.IsEmpty()) compileCommand = wxT("$options $includes"); cbProject* proj = (pf ? pf->GetParentProject() : nullptr); if (!comp && proj) comp = CompilerFactory::GetCompiler(proj->GetCompilerID()); if (!comp) { cbProject* tmpPrj = Manager::Get()->GetProjectManager()->GetActiveProject(); if (tmpPrj) comp = CompilerFactory::GetCompiler(tmpPrj->GetCompilerID()); } if (!comp) comp = CompilerFactory::GetDefaultCompiler(); comp->GetCommandGenerator(proj)->GenerateCommandLine(compileCommand, target, pf, ed->GetFilename(), g_InvalidStr, g_InvalidStr, g_InvalidStr ); wxStringTokenizer tokenizer(compileCommand); compileCommand.Empty(); wxString pathStr; while (tokenizer.HasMoreTokens()) { wxString flag = tokenizer.GetNextToken(); // make all include paths absolute, so clang does not choke if Code::Blocks switches directories if (flag.StartsWith(wxT("-I"), &pathStr)) { wxFileName path(pathStr); if (path.Normalize(wxPATH_NORM_ALL & ~wxPATH_NORM_CASE)) flag = wxT("-I") + path.GetFullPath(); } compileCommand += flag + wxT(" "); } compileCommand += GetCompilerInclDirs(comp->GetID()); if (FileTypeOf(ed->GetFilename()) == ftHeader) // try to find the associated source { const wxString& source = GetSourceOf(ed); if (!source.IsEmpty()) { m_Proxy.CreateTranslationUnit(source, compileCommand); if (m_Proxy.GetTranslationUnitId(ed->GetFilename()) != wxNOT_FOUND) return; // got it } } m_Proxy.CreateTranslationUnit(ed->GetFilename(), compileCommand); m_DiagnosticTimer.Start(DIAGNOSTIC_DELAY, wxTIMER_ONE_SHOT); } else if (evId == idReparseTimer) { EditorManager* edMgr = Manager::Get()->GetEditorManager(); cbEditor* ed = edMgr->GetBuiltinActiveEditor(); if (!ed) return; if (ed != m_pLastEditor) { m_TranslUnitId = m_Proxy.GetTranslationUnitId(ed->GetFilename()); m_pLastEditor = ed; } if (m_TranslUnitId == wxNOT_FOUND) return; std::map<wxString, wxString> unsavedFiles; for (int i = 0; i < edMgr->GetEditorsCount(); ++i) { ed = edMgr->GetBuiltinEditor(i); if (ed && ed->GetModified()) unsavedFiles.insert(std::make_pair(ed->GetFilename(), ed->GetControl()->GetText())); } m_Proxy.Reparse(m_TranslUnitId, unsavedFiles); DiagnoseEd(m_pLastEditor, dlMinimal); } else if (evId == idDiagnosticTimer) { cbEditor* ed = Manager::Get()->GetEditorManager()->GetBuiltinActiveEditor(); if (!ed) return; if (ed != m_pLastEditor) { m_TranslUnitId = m_Proxy.GetTranslationUnitId(ed->GetFilename()); m_pLastEditor = ed; } if (m_TranslUnitId == wxNOT_FOUND) return; DiagnoseEd(ed, dlFull); } else event.Skip(); }