📄 compilergcc.cpp
字号:
wxWakeUpIdle();
}
void CompilerGCC::OnRun(wxCommandEvent& event)
{
m_RunAfterCompile = true;
if (Run() == 0)
DoRunQueue();
m_RunAfterCompile = false;
}
void CompilerGCC::OnCompileAndRun(wxCommandEvent& event)
{
m_RunAfterCompile = true;
Compile(DoAskForTarget());
}
void CompilerGCC::OnCompile(wxCommandEvent& event)
{
int bak = m_TargetIndex;
if (event.GetId() == idMenuCompileTargetFromProjectManager)
{
// we 're called from a menu in ProjectManager
int idx = DoGUIAskForTarget();
if (idx == -1)
return;
else
m_TargetIndex = idx;
// let's check the selected project...
DoSwitchProjectTemporarily();
}
else if (event.GetId() == idMenuCompileFromProjectManager)
{
// we 're called from a menu in ProjectManager
// let's check the selected project...
DoSwitchProjectTemporarily();
}
ProjectBuildTarget* target = DoAskForTarget();
Compile(target);
m_TargetIndex = bak;
}
void CompilerGCC::OnCompileFile(wxCommandEvent& event)
{
wxFileName file;
if (event.GetId() == idMenuCompileFileFromProjectManager)
{
// we 're called from a menu in ProjectManager
// let's check the selected project...
FileTreeData* ftd = DoSwitchProjectTemporarily();
ProjectFile* pf = m_Project->GetFile(ftd->GetFileIndex());
if (!pf)
{
// wxLogError("File index=%d", ftd->GetFileIndex());
return;
}
file = pf->file;
}
else
{
cbEditor* ed = Manager::Get()->GetEditorManager()->GetBuiltinActiveEditor();
if (ed)
{
// make sure it is saved
if (ed->Save())
file.Assign(ed->GetFilename());
}
}
if (m_Project)
file.MakeRelativeTo(m_Project->GetBasePath());
#ifdef ALWAYS_USE_MAKEFILE
file.SetExt(OBJECT_EXT);
#endif
wxString fname = file.GetFullPath();
if (!fname.IsEmpty())
CompileFile(UnixFilename(fname));
}
void CompilerGCC::OnRebuild(wxCommandEvent& event)
{
if (wxMessageBox(_("Rebuilding the project will cause the deletion of all "
"object files and building it from scratch.\nThis action "
"might take a while, especially if your project contains "
"more than a few files.\nAnother factor is your CPU "
"and the available system memory.\n\n"
"Are you sure you want to rebuild the entire project?"),
_("Rebuild project"),
wxYES_NO | wxICON_QUESTION) == wxNO)
{
return;
}
int bak = m_TargetIndex;
if (event.GetId() == idMenuRebuildTargetFromProjectManager)
{
// we 're called from a menu in ProjectManager
int idx = DoGUIAskForTarget();
if (idx == -1)
return;
else
m_TargetIndex = idx;
// let's check the selected project...
DoSwitchProjectTemporarily();
}
else if (event.GetId() == idMenuRebuildFromProjectManager)
{
// we 're called from a menu in ProjectManager
// let's check the selected project...
DoSwitchProjectTemporarily();
}
ProjectBuildTarget* target = DoAskForTarget();
Rebuild(target);
m_TargetIndex = bak;
}
void CompilerGCC::OnCompileAll(wxCommandEvent& event)
{
CompileAll();
}
void CompilerGCC::OnRebuildAll(wxCommandEvent& event)
{
if (wxMessageBox(_("Rebuilding ALL the open projects will cause the deletion of all "
"object files and building them from scratch.\nThis action "
"might take a while, especially if your projects contain "
"more than a few files.\nAnother factor is your CPU "
"and the available system memory.\n\n"
"Are you sure you want to rebuild ALL the projects?"),
_("Rebuild projects"),
wxYES_NO | wxICON_QUESTION) == wxNO)
{
return;
}
RebuildAll();
}
void CompilerGCC::OnClean(wxCommandEvent& event)
{
if (wxMessageBox(_("Cleaning the target or project will cause the deletion "
"of all relevant object files.\nThis means that you will "
"have to build your project from scratch next time you "
"'ll want to build it.\nThat action "
"might take a while, especially if your project contains "
"more than a few files.\nAnother factor is your CPU "
"and the available system memory.\n\n"
"Are you sure you want to proceed to cleaning?"),
_("Clean target/project"),
wxYES_NO | wxICON_QUESTION) == wxNO)
{
return;
}
int bak = m_TargetIndex;
if (event.GetId() == idMenuCleanTargetFromProjectManager)
{
// we 're called from a menu in ProjectManager
int idx = DoGUIAskForTarget();
if (idx == -1)
return;
else
m_TargetIndex = idx;
// let's check the selected project...
DoSwitchProjectTemporarily();
}
else if (event.GetId() == idMenuCleanFromProjectManager)
{
// we 're called from a menu in ProjectManager
// let's check the selected project...
DoSwitchProjectTemporarily();
}
ProjectBuildTarget* target = DoAskForTarget();
Clean(target);
m_TargetIndex = bak;
}
void CompilerGCC::OnDistClean(wxCommandEvent& event)
{
if (wxMessageBox(_("Dist-cleaning the target or project will cause the deletion "
"of all relevant object files.\nThis means that you will "
"have to build your project from scratch next time you "
"'ll want to build it.\nThat action "
"might take a while, especially if your project contains "
"more than a few files.\nAnother factor is your CPU "
"and the available system memory.\n\n"
"Are you sure you want to proceed to dist-cleaning?"),
_("Dist-clean target/project"),
wxYES_NO | wxICON_QUESTION) == wxNO)
{
return;
}
int bak = m_TargetIndex;
if (event.GetId() == idMenuDistCleanTargetFromProjectManager)
{
// we 're called from a menu in ProjectManager
int idx = DoGUIAskForTarget();
if (idx == -1)
return;
else
m_TargetIndex = idx;
// let's check the selected project...
DoSwitchProjectTemporarily();
}
else if (event.GetId() == idMenuDistCleanFromProjectManager)
{
// we 're called from a menu in ProjectManager
// let's check the selected project...
DoSwitchProjectTemporarily();
}
ProjectBuildTarget* target = DoAskForTarget();
DistClean(target);
m_TargetIndex = bak;
}
void CompilerGCC::OnProjectCompilerOptions(wxCommandEvent& event)
{
wxTreeCtrl* tree = Manager::Get()->GetProjectManager()->GetTree();
wxTreeItemId sel = tree->GetSelection();
FileTreeData* ftd = (FileTreeData*)tree->GetItemData(sel);
if (ftd)
{
// 'configure' selected target, if other than 'All'
ProjectBuildTarget* target = 0;
if (ftd->GetProject() == m_Project)
{
if (!m_HasTargetAll || m_TargetIndex != -1)
target = m_Project->GetBuildTarget(m_TargetIndex);
}
Configure(ftd->GetProject(), target);
}
else
{
cbProject* prj = Manager::Get()->GetProjectManager()->GetActiveProject();
if (prj)
Configure(prj);
}
}
void CompilerGCC::OnTargetCompilerOptions(wxCommandEvent& event)
{
int bak = m_TargetIndex;
// we 're called from a menu in ProjectManager
int idx = DoGUIAskForTarget();
if (idx == -1)
return;
else
m_TargetIndex = idx;
// let's check the selected project...
DoSwitchProjectTemporarily();
ProjectBuildTarget* target = DoAskForTarget();
m_TargetIndex = bak;
Configure(m_Project, target);
}
void CompilerGCC::OnKillProcess(wxCommandEvent& event)
{
KillProcess();
}
void CompilerGCC::OnSelectTarget(wxCommandEvent& event)
{
if (event.GetId() == idMenuSelectTargetAll)
m_TargetIndex = -1;
else if (event.GetId() == idToolTarget)
#if wxCHECK_VERSION(2, 6, 2)
m_TargetIndex = m_ToolTarget->GetCurrentSelection() - (m_HasTargetAll ? 1 : 0);
#else
m_TargetIndex = m_ToolTarget->GetSelection() - (m_HasTargetAll ? 1 : 0);
#endif
else
{
for (int i = 0; i < MAX_TARGETS; ++i)
{
if (event.GetId() == idMenuSelectTargetOther[i])
{
m_TargetIndex = i;
break;
}
}
}
DoUpdateTargetMenu();
}
void CompilerGCC::OnNextError(wxCommandEvent& event)
{
DoGotoNextError();
}
void CompilerGCC::OnPreviousError(wxCommandEvent& event)
{
DoGotoPreviousError();
}
void CompilerGCC::OnClearErrors(wxCommandEvent& event)
{
DoClearErrors();
}
void CompilerGCC::OnCreateDist(wxCommandEvent& event)
{
CreateDist();
}
void CompilerGCC::OnUpdateUI(wxUpdateUIEvent& event)
{
cbProject* prj = Manager::Get()->GetProjectManager()->GetActiveProject();
cbEditor* ed = Manager::Get()->GetEditorManager()->GetBuiltinActiveEditor();
wxMenuBar* mbar = Manager::Get()->GetAppWindow()->GetMenuBar();
if (mbar)
{
mbar->Enable(idMenuCompile, !m_Process && prj);
mbar->Enable(idMenuCompileAll, !m_Process && prj);
mbar->Enable(idMenuCompileFromProjectManager, !m_Process && prj);
mbar->Enable(idMenuCompileTargetFromProjectManager, !m_Process && prj);
mbar->Enable(idMenuCompileFile, !m_Process && ed);
mbar->Enable(idMenuCompileFileFromProjectManager, !m_Process && prj);
mbar->Enable(idMenuRebuild, !m_Process && prj);
mbar->Enable(idMenuRebuildAll, !m_Process && prj);
mbar->Enable(idMenuRebuildFromProjectManager, !m_Process && prj);
mbar->Enable(idMenuRebuildTargetFromProjectManager, !m_Process && prj);
mbar->Enable(idMenuClean, !m_Process && prj);
mbar->Enable(idMenuDistClean, !m_Process && prj);
mbar->Enable(idMenuCleanFromProjectManager, !m_Process && prj);
mbar->Enable(idMenuDistCleanFromProjectManager, !m_Process && prj);
mbar->Enable(idMenuCleanTargetFromProjectManager, !m_Process && prj);
mbar->Enable(idMenuDistCleanTargetFromProjectManager, !m_Process && prj);
mbar->Enable(idMenuCompileAndRun, !m_Process && prj);
mbar->Enable(idMenuRun, !m_Process && prj);
mbar->Enable(idMenuKillProcess, m_Process);
mbar->Enable(idMenuSelectTarget, !m_Process && prj);
mbar->Enable(idMenuNextError, !m_Process && prj && m_Errors.HasNextError());
mbar->Enable(idMenuPreviousError, !m_Process && prj && m_Errors.HasPreviousError());
// mbar->Enable(idMenuClearErrors, cnt);
mbar->Enable(idMenuCreateDist, !m_Process && prj);
mbar->Enable(idMenuExportMakefile, !m_Process && prj);
// Project menu
mbar->Enable(idMenuProjectCompilerOptions, !m_Process && prj);
}
// enable/disable compiler toolbar buttons
wxToolBar* tbar = m_pTbar;//Manager::Get()->GetAppWindow()->GetToolBar();
if (tbar)
{
tbar->EnableTool(idMenuCompile, !m_Process && prj);
tbar->EnableTool(idMenuRun, !m_Process && prj);
tbar->EnableTool(idMenuCompileAndRun, !m_Process && prj);
tbar->EnableTool(idMenuRebuild, !m_Process && prj);
tbar->EnableTool(idMenuKillProcess, m_Process && prj);
m_ToolTarget = XRCCTRL(*tbar, "idToolTarget", wxComboBox);
if (m_ToolTarget)
m_ToolTarget->Enable(!m_Process && prj);
}
// allow other UpdateUI handlers to process this event
// *very* important! don't forget it...
event.Skip();
}
void CompilerGCC::OnProjectActivated(CodeBlocksEvent& event)
{
//Manager::Get()->GetMessageManager()->Log(mltDevDebug, "OnProjectActivated()");
DoRecreateTargetMenu();
event.Skip(); // *very* important! don't forget it...
}
/*void CompilerGCC::OnProjectPopupMenu(wxNotifyEvent& event)
{
BuildModuleMenu(mtProjectManager, (wxMenu*)event.GetClientData(), event.GetString());
event.Skip();
}*/
void CompilerGCC::OnGCCOutput(CodeBlocksEvent& event)
{
wxString msg = event.GetString();
if (!msg.IsEmpty() &&
!msg.Matches(_T("# ??*"))) // gcc 3.4 started displaying a line like this filter
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -