📄 codecompletion.cpp
字号:
if (pf && FileTypeOf(pf->relativeFilename) == ftHeader)
{
wxFileName fname(pf->relativeFilename);
files.Add(pf->relativeFilename);
files.Add(fname.GetFullName());
}
}
if (files.GetCount() != 0)
{
files.Sort();
ed->GetControl()->AutoCompSetIgnoreCase(caseSens);
ed->GetControl()->AutoCompShow(pos - lineStartPos - found, GetStringFromArray(files, _T(" ")));
}
}
wxArrayString CodeCompletion::GetCallTips()
{
if (!m_IsAttached)
{
wxArrayString items;
return items;
}
return m_NativeParsers.GetCallTips();
}
void CodeCompletion::ShowCallTip()
{
if (!m_IsAttached)
return;
if (!Manager::Get()->GetEditorManager())
return;
cbEditor* ed = Manager::Get()->GetEditorManager()->GetBuiltinActiveEditor();
if (!ed)
return;
wxArrayString items = GetCallTips();
wxString definition;
for (unsigned int i = 0; i < items.GetCount(); ++i)
{
if (!items[i].IsEmpty())
{
if (i != 0)
definition << _T('\n'); // add new-line, except for the first line
definition << items[i];
}
}
if (!definition.IsEmpty())
ed->GetControl()->CallTipShow(ed->GetControl()->GetCurrentPos(), definition);
}
int CodeCompletion::DoClassMethodDeclImpl()
{
if (!m_IsAttached)
return -1;
EditorManager* edMan = Manager::Get()->GetEditorManager();
if (!edMan)
return -2;
cbEditor* ed = edMan->GetBuiltinActiveEditor();
if (!ed)
return -3;
FileType ft = FileTypeOf(ed->GetShortName());
if ( ft != ftHeader && ft != ftSource) // only parse source/header files
return -4;
Parser* parser = m_NativeParsers.FindParserFromActiveEditor();
if (!parser)
{
Manager::Get()->GetMessageManager()->DebugLog(_("Active editor has no associated parser ?!?"));
return -4;
}
wxString filename = ed->GetFilename();
InsertClassMethodDlg dlg(Manager::Get()->GetAppWindow(), parser, filename);
if (dlg.ShowModal() == wxID_OK)
{
int pos = ed->GetControl()->GetCurrentPos();
int line = ed->GetControl()->LineFromPosition(pos);
ed->GetControl()->GotoPos(ed->GetControl()->PositionFromLine(line));
wxArrayString result = dlg.GetCode();
for (unsigned int i = 0; i < result.GetCount(); ++i)
{
pos = ed->GetControl()->GetCurrentPos();
line = ed->GetControl()->LineFromPosition(pos);
wxString str = ed->GetLineIndentString(line - 1) + result[i];
ed->GetControl()->SetTargetStart(pos);
ed->GetControl()->SetTargetEnd(pos);
ed->GetControl()->ReplaceTarget(str);
ed->GetControl()->GotoPos(pos + str.Length());// - 3);
}
return 0;
}
return -5;
}
void CodeCompletion::DoCodeComplete()
{
EditorManager* edMan = Manager::Get()->GetEditorManager();
if (!edMan)
return;
cbEditor* ed = edMan->GetBuiltinActiveEditor();
if (!ed)
return;
int style = ed->GetControl()->GetStyleAt(ed->GetControl()->GetCurrentPos());
// Manager::Get()->GetMessageManager()->DebugLog(_("Style at %d is %d"), ed->GetControl()->GetCurrentPos(), style);
// Manager::Get()->GetMessageManager()->DebugLog(_("wxSCI_C_PREPROCESSOR is %d"), wxSCI_C_PREPROCESSOR);
if (style == wxSCI_C_PREPROCESSOR)
{
CodeCompleteIncludes();
return;
}
if (style != wxSCI_C_DEFAULT && style != wxSCI_C_OPERATOR && style != wxSCI_C_IDENTIFIER)
return;
CodeComplete();
}
void CodeCompletion::DoInsertCodeCompleteToken(wxString tokName)
{
// remove arguments
int pos = tokName.Find(_T("("));
if (pos != wxNOT_FOUND)
tokName.Remove(pos);
EditorManager* edMan = Manager::Get()->GetEditorManager();
if (!edMan)
return;
cbEditor* ed = edMan->GetBuiltinActiveEditor();
if (!ed)
return;
int end = ed->GetControl()->GetCurrentPos() > m_NativeParsers.GetEditorEndWord() ? ed->GetControl()->GetCurrentPos() : m_NativeParsers.GetEditorEndWord();
ed->GetControl()->SetSelection(m_NativeParsers.GetEditorStartWord(), end);
ed->GetControl()->ReplaceSelection(_T(""));
ed->GetControl()->InsertText(m_NativeParsers.GetEditorStartWord(), tokName);
ed->GetControl()->GotoPos(m_NativeParsers.GetEditorStartWord() + tokName.Length());
}
void CodeCompletion::OnProjectOpened(CodeBlocksEvent& event)
{
if (m_IsAttached)
m_NativeParsers.AddParser(event.GetProject());
event.Skip();
}
void CodeCompletion::OnProjectActivated(CodeBlocksEvent& event)
{
if (m_IsAttached)
m_NativeParsers.SetClassBrowserProject(event.GetProject());
event.Skip();
}
void CodeCompletion::OnProjectClosed(CodeBlocksEvent& event)
{
if (m_IsAttached)
m_NativeParsers.RemoveParser(event.GetProject());
event.Skip();
}
void CodeCompletion::OnProjectFileAdded(CodeBlocksEvent& event)
{
if (m_IsAttached)
m_NativeParsers.AddFileToParser(event.GetProject(), event.GetString());
event.Skip();
}
void CodeCompletion::OnProjectFileRemoved(CodeBlocksEvent& event)
{
if (m_IsAttached)
m_NativeParsers.RemoveFileFromParser(event.GetProject(), event.GetString());
event.Skip();
}
void CodeCompletion::OnUserListSelection(CodeBlocksEvent& event)
{
if (m_IsAttached)
{
wxString tokName = event.GetString();
DoInsertCodeCompleteToken(event.GetString());
}
event.Skip();
}
void CodeCompletion::OnReparseActiveEditor(CodeBlocksEvent& event)
{
if (m_IsAttached)
{
cbEditor* ed = event.GetEditor();
if (!ed)
return;
Parser* parser = m_NativeParsers.FindParserFromActiveEditor();
if (!parser || !parser->Done())
return;
parser->StartTimer();
parser->Reparse(ed->GetFilename());
}
event.Skip();
}
// events
void CodeCompletion::OnUpdateUI(wxUpdateUIEvent& event)
{
bool hasEd = Manager::Get()->GetEditorManager()->GetActiveEditor() != 0;
if (m_EditMenu)
{
m_EditMenu->Enable(idMenuCodeComplete, hasEd);
m_EditMenu->Enable(idMenuShowCallTip, hasEd);
}
if (m_SearchMenu)
{
m_SearchMenu->Enable(idMenuGotoFunction, hasEd);
}
// must do...
event.Skip();
}
void CodeCompletion::OnCodeComplete(wxCommandEvent& event)
{
if (ConfigManager::Get()->Read(_T("/code_completion/use_code_completion"), 1L) == 0)
return;
if (m_IsAttached)
DoCodeComplete();
event.Skip();
}
void CodeCompletion::OnShowCallTip(wxCommandEvent& event)
{
if (m_IsAttached)
ShowCallTip();
event.Skip();
}
void CodeCompletion::OnGotoFunction(wxCommandEvent& event)
{
EditorManager* edMan = Manager::Get()->GetEditorManager();
if (!edMan)
return;
cbEditor* ed = edMan->GetBuiltinActiveEditor();
if (!ed)
return;
Parser parser(this);
parser.ParseBufferForFunctions(ed->GetControl()->GetText());
wxArrayString funcs;
const TokensArray& tokens = parser.GetTokens();
for (unsigned int i = 0; i < tokens.GetCount(); ++i)
{
funcs.Add(tokens[i]->m_DisplayName);// token->m_Name);
}
if (!funcs.GetCount())
{
wxMessageBox(_("No functions parsed in this file..."));
return;
}
IncrementalSelectListDlg dlg(Manager::Get()->GetAppWindow(), funcs, _("Select function..."), _("Please select function to go to:"));
if (dlg.ShowModal() == wxID_OK)
{
wxString sel = dlg.GetStringSelection();
for (unsigned int i = 0; i < tokens.GetCount(); ++i)
{
Token* token = tokens[i];
if (token && token->m_DisplayName.Matches(sel))
{
Manager::Get()->GetMessageManager()->DebugLog(_("Token found at line %d"), token->m_Line);
ed->GetControl()->GotoLine(token->m_Line - 1);
}
}
}
}
void CodeCompletion::OnClassMethod(wxCommandEvent& event)
{
DoClassMethodDeclImpl();
}
void CodeCompletion::OnGotoDeclaration(wxCommandEvent& event)
{
EditorManager* edMan = Manager::Get()->GetEditorManager();
if (!edMan)
return;
wxString txt = m_LastKeyword;
// Manager::Get()->GetMessageManager()->DebugLog(_("Go to decl for '%s'"), txt.c_str());
Parser* parser = m_NativeParsers.FindParserFromActiveEditor();
if (!parser)
parser = m_NativeParsers.FindParserFromActiveProject(); // get parser of active project, then
if (!parser)
return;
Token* token = parser->FindTokenByName(txt, false);
if (token)
{
cbEditor* ed = edMan->Open(token->m_Filename);
if (ed)
{
ed->GetControl()->GotoLine(token->m_Line - 1);
return;
}
}
wxMessageBox(wxString::Format(_("Not found: %s"), txt.c_str()), _("Warning"), wxICON_WARNING);
}
void CodeCompletion::OnOpenIncludeFile(wxCommandEvent& event)
{
Parser* parser = m_NativeParsers.FindParserFromActiveEditor();
if (!parser)
parser = m_NativeParsers.FindParserFromActiveProject(); // get parser of active project, then
if (!parser)
return;
wxString inc = m_LastIncludeFile;
// Manager::Get()->GetMessageManager()->DebugLog(_("Looking for #include '%s' (%d dirs)"), inc.c_str(), parser->IncludeDirs().GetCount());
for (unsigned int i = 0; i < parser->IncludeDirs().GetCount(); ++i)
{
wxString base = parser->IncludeDirs()[i];
wxFileName tmp = inc;
tmp.Normalize(wxPATH_NORM_ALL & ~wxPATH_NORM_CASE, base);
// Manager::Get()->GetMessageManager()->DebugLog(_("Searching '%s'"), tmp.GetFullPath().c_str());
if (wxFileExists(tmp.GetFullPath()))
{
EditorManager* edMan = Manager::Get()->GetEditorManager();
edMan->Open(tmp.GetFullPath());
return;
}
}
wxMessageBox(wxString::Format(_("Not found: %s"), inc.c_str()), _("Warning"), wxICON_WARNING);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -