📄 compileroptionsdlg.cpp
字号:
/*
* This file is part of Code::Blocks Studio, an open-source cross-platform IDE
* Copyright (C) 2003 Yiannis An. Mandravellos
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Contact e-mail: Yiannis An. Mandravellos <mandrav@codeblocks.org>
* Program URL : http://www.codeblocks.org
*
* $Id: compileroptionsdlg.cpp,v 1.43.2.1 2005/10/25 07:59:01 mandrav Exp $
* $Date: 2005/10/25 07:59:01 $
*/
#include <sdk.h>
#include "compileroptionsdlg.h"
#include "compilergcc.h"
#include "advancedcompileroptionsdlg.h"
#include <wx/xrc/xmlres.h>
#include <manager.h>
#include <configmanager.h>
#include <messagemanager.h>
#include <projectmanager.h>
#include <customvars.h>
#include "editpathdlg.h"
BEGIN_EVENT_TABLE(CompilerOptionsDlg, wxDialog)
EVT_UPDATE_UI( XRCID("btnEditDir"), CompilerOptionsDlg::OnUpdateUI)
EVT_UPDATE_UI( XRCID("btnDelDir"), CompilerOptionsDlg::OnUpdateUI)
EVT_UPDATE_UI( XRCID("spnDirs"), CompilerOptionsDlg::OnUpdateUI)
EVT_UPDATE_UI( XRCID("btnEditVar"), CompilerOptionsDlg::OnUpdateUI)
EVT_UPDATE_UI( XRCID("btnDeleteVar"), CompilerOptionsDlg::OnUpdateUI)
EVT_UPDATE_UI( XRCID("cmbCompilerPolicy"), CompilerOptionsDlg::OnUpdateUI)
EVT_UPDATE_UI( XRCID("cmbLinkerPolicy"), CompilerOptionsDlg::OnUpdateUI)
EVT_UPDATE_UI( XRCID("cmbIncludesPolicy"), CompilerOptionsDlg::OnUpdateUI)
EVT_UPDATE_UI( XRCID("cmbLibDirsPolicy"), CompilerOptionsDlg::OnUpdateUI)
EVT_UPDATE_UI( XRCID("btnSetDefaultCompiler"), CompilerOptionsDlg::OnUpdateUI)
EVT_UPDATE_UI( XRCID("btnAddCompiler"), CompilerOptionsDlg::OnUpdateUI)
EVT_UPDATE_UI( XRCID("btnRenameCompiler"), CompilerOptionsDlg::OnUpdateUI)
EVT_UPDATE_UI( XRCID("btnDelCompiler"), CompilerOptionsDlg::OnUpdateUI)
EVT_UPDATE_UI( XRCID("btnResetCompiler"), CompilerOptionsDlg::OnUpdateUI)
EVT_UPDATE_UI( XRCID("btnAddLib"), CompilerOptionsDlg::OnUpdateUI)
EVT_UPDATE_UI( XRCID("btnEditLib"), CompilerOptionsDlg::OnUpdateUI)
EVT_UPDATE_UI( XRCID("btnDelLib"), CompilerOptionsDlg::OnUpdateUI)
EVT_UPDATE_UI( XRCID("spnLibs"), CompilerOptionsDlg::OnUpdateUI)
EVT_UPDATE_UI( XRCID("txtMasterPath"), CompilerOptionsDlg::OnUpdateUI)
EVT_UPDATE_UI( XRCID("btnMasterPath"), CompilerOptionsDlg::OnUpdateUI)
EVT_UPDATE_UI( XRCID("btnExtraAdd"), CompilerOptionsDlg::OnUpdateUI)
EVT_UPDATE_UI( XRCID("btnExtraEdit"), CompilerOptionsDlg::OnUpdateUI)
EVT_UPDATE_UI( XRCID("btnExtraDelete"), CompilerOptionsDlg::OnUpdateUI)
EVT_UPDATE_UI( XRCID("txtCcompiler"), CompilerOptionsDlg::OnUpdateUI)
EVT_UPDATE_UI( XRCID("btnCcompiler"), CompilerOptionsDlg::OnUpdateUI)
EVT_UPDATE_UI( XRCID("txtCPPcompiler"), CompilerOptionsDlg::OnUpdateUI)
EVT_UPDATE_UI( XRCID("btnCPPcompiler"), CompilerOptionsDlg::OnUpdateUI)
EVT_UPDATE_UI( XRCID("txtLinker"), CompilerOptionsDlg::OnUpdateUI)
EVT_UPDATE_UI( XRCID("btnLinker"), CompilerOptionsDlg::OnUpdateUI)
EVT_UPDATE_UI( XRCID("txtLibLinker"), CompilerOptionsDlg::OnUpdateUI)
EVT_UPDATE_UI( XRCID("btnLibLinker"), CompilerOptionsDlg::OnUpdateUI)
EVT_UPDATE_UI( XRCID("txtDebugger"), CompilerOptionsDlg::OnUpdateUI)
EVT_UPDATE_UI( XRCID("btnDebugger"), CompilerOptionsDlg::OnUpdateUI)
EVT_UPDATE_UI( XRCID("txtResComp"), CompilerOptionsDlg::OnUpdateUI)
EVT_UPDATE_UI( XRCID("btnResComp"), CompilerOptionsDlg::OnUpdateUI)
EVT_UPDATE_UI( XRCID("txtMake"), CompilerOptionsDlg::OnUpdateUI)
EVT_UPDATE_UI( XRCID("btnMake"), CompilerOptionsDlg::OnUpdateUI)
EVT_UPDATE_UI( XRCID("cmbCompiler"), CompilerOptionsDlg::OnUpdateUI)
//
EVT_TREE_SEL_CHANGED( XRCID("tcScope"), CompilerOptionsDlg::OnTreeSelectionChange)
EVT_TREE_SEL_CHANGING( XRCID("tcScope"), CompilerOptionsDlg::OnTreeSelectionChanging)
EVT_COMBOBOX( XRCID("cmbCategory"), CompilerOptionsDlg::OnCategoryChanged)
EVT_COMBOBOX( XRCID("cmbCompiler"), CompilerOptionsDlg::OnCompilerChanged)
EVT_LISTBOX_DCLICK( XRCID("lstVars"), CompilerOptionsDlg::OnEditVarClick)
EVT_BUTTON( XRCID("btnSetDefaultCompiler"), CompilerOptionsDlg::OnSetDefaultCompilerClick)
EVT_BUTTON( XRCID("btnAddCompiler"), CompilerOptionsDlg::OnAddCompilerClick)
EVT_BUTTON( XRCID("btnRenameCompiler"), CompilerOptionsDlg::OnEditCompilerClick)
EVT_BUTTON( XRCID("btnDelCompiler"), CompilerOptionsDlg::OnRemoveCompilerClick)
EVT_BUTTON( XRCID("btnResetCompiler"), CompilerOptionsDlg::OnResetCompilerClick)
EVT_BUTTON( XRCID("btnAddDir"), CompilerOptionsDlg::OnAddDirClick)
EVT_BUTTON( XRCID("btnEditDir"), CompilerOptionsDlg::OnEditDirClick)
EVT_BUTTON( XRCID("btnDelDir"), CompilerOptionsDlg::OnRemoveDirClick)
EVT_BUTTON( XRCID("btnAddLib"), CompilerOptionsDlg::OnAddLibClick)
EVT_BUTTON( XRCID("btnEditLib"), CompilerOptionsDlg::OnEditLibClick)
EVT_BUTTON( XRCID("btnDelLib"), CompilerOptionsDlg::OnRemoveLibClick)
EVT_BUTTON( XRCID("btnExtraAdd"), CompilerOptionsDlg::OnAddExtraPathClick)
EVT_BUTTON( XRCID("btnExtraEdit"), CompilerOptionsDlg::OnEditExtraPathClick)
EVT_BUTTON( XRCID("btnExtraDelete"), CompilerOptionsDlg::OnRemoveExtraPathClick)
EVT_SPIN_UP( XRCID("spnLibs"), CompilerOptionsDlg::OnMoveLibUpClick)
EVT_SPIN_DOWN( XRCID("spnLibs"), CompilerOptionsDlg::OnMoveLibDownClick)
EVT_SPIN_UP( XRCID("spnDirs"), CompilerOptionsDlg::OnMoveDirUpClick)
EVT_SPIN_DOWN( XRCID("spnDirs"), CompilerOptionsDlg::OnMoveDirDownClick)
EVT_BUTTON( XRCID("btnAddVar"), CompilerOptionsDlg::OnAddVarClick)
EVT_BUTTON( XRCID("btnEditVar"), CompilerOptionsDlg::OnEditVarClick)
EVT_BUTTON( XRCID("btnDeleteVar"), CompilerOptionsDlg::OnRemoveVarClick)
EVT_BUTTON( XRCID("btnMasterPath"), CompilerOptionsDlg::OnMasterPathClick)
EVT_BUTTON( XRCID("btnAutoDetect"), CompilerOptionsDlg::OnAutoDetectClick)
EVT_BUTTON( XRCID("btnCcompiler"), CompilerOptionsDlg::OnSelectProgramClick)
EVT_BUTTON( XRCID("btnCPPcompiler"), CompilerOptionsDlg::OnSelectProgramClick)
EVT_BUTTON( XRCID("btnLinker"), CompilerOptionsDlg::OnSelectProgramClick)
EVT_BUTTON( XRCID("btnLibLinker"), CompilerOptionsDlg::OnSelectProgramClick)
EVT_BUTTON( XRCID("btnDebugger"), CompilerOptionsDlg::OnSelectProgramClick)
EVT_BUTTON( XRCID("btnResComp"), CompilerOptionsDlg::OnSelectProgramClick)
EVT_BUTTON( XRCID("btnMake"), CompilerOptionsDlg::OnSelectProgramClick)
EVT_BUTTON( XRCID("btnAdvanced"), CompilerOptionsDlg::OnAdvancedClick)
EVT_CHAR_HOOK(CompilerOptionsDlg::OnMyCharHook)
END_EVENT_TABLE()
CompilerOptionsDlg::CompilerOptionsDlg(wxWindow* parent, CompilerGCC* compiler, cbProject* project, ProjectBuildTarget* target)
: m_Compiler(compiler),
m_InitialCompilerIdx(0),
m_pProject(project),
m_pTarget(target),
m_BuildingTree(false)
{
wxXmlResource::Get()->LoadDialog(this, parent, _T("dlgCompilerOptions"));
DoFillCompilerSets();
DoFillCompilerPrograms();
DoFillOthers();
DoFillCategories();
DoFillTree(project, target);
DoFillVars();
wxTreeCtrl* tree = XRCCTRL(*this, "tcScope", wxTreeCtrl);
wxSizer* sizer = tree->GetContainingSizer();
if (!project)
{
// global settings
SetTitle(_("Compiler Settings"));
sizer->Show(tree,false);
sizer->Remove(tree);
wxNotebook* nb = XRCCTRL(*this, "nbMain", wxNotebook);
nb->DeletePage(3); // remove "Commands" page
}
else
{
m_InitialCompilerIdx = project->GetCompilerIndex();
// project settings
SetTitle(_("Project's Build options"));
wxNotebook* nb = XRCCTRL(*this, "nbMain", wxNotebook);
nb->DeletePage(6); // remove "Other" page
nb->DeletePage(4); // remove "Programs" page
// remove "Compiler" buttons
wxWindow* win = XRCCTRL(*this, "btnAddCompiler", wxButton);
wxSizer* sizer2 = win->GetContainingSizer();
sizer2->Clear(true);
sizer2->RecalcSizes();
sizer2->Layout();
}
sizer->Layout();
Layout();
GetSizer()->Layout();
GetSizer()->SetSizeHints(this);
this->SetSize(-1, -1, 0, 0);
this->CenterOnScreen();
}
CompilerOptionsDlg::~CompilerOptionsDlg()
{
//dtor
}
void CompilerOptionsDlg::DoFillCompilerSets()
{
wxComboBox* cmb = XRCCTRL(*this, "cmbCompiler", wxComboBox);
cmb->Clear();
for (unsigned int i = 0; i < CompilerFactory::Compilers.GetCount(); ++i)
{
cmb->Append(CompilerFactory::Compilers[i]->GetName());
}
int compilerIdx = CompilerFactory::GetDefaultCompilerIndex();
if (m_pTarget)
compilerIdx = m_pTarget->GetCompilerIndex();
else if (m_pProject)
compilerIdx = m_pProject->GetCompilerIndex();
if (!CompilerFactory::CompilerIndexOK(compilerIdx))
compilerIdx = 0;
m_Options = CompilerFactory::Compilers[compilerIdx]->GetOptions();
cmb->SetSelection(compilerIdx);
m_LastCompilerIdx = compilerIdx;
}
void CompilerOptionsDlg::DoFillCompilerPrograms()
{
if (m_pProject)
return; // no "Programs" page
int compilerIdx = XRCCTRL(*this, "cmbCompiler", wxComboBox)->GetSelection();
/*
// Manager::Get()->GetMessageManager()->DebugLog("compilerIdx=%d, m_LastCompilerIdx=%d", compilerIdx, m_LastCompilerIdx);
if (compilerIdx != m_LastCompilerIdx)
{
// compiler changed; check for changes and update as needed
DoSaveCompilerPrograms();
}
m_LastCompilerIdx = compilerIdx;
*/
const CompilerPrograms& progs = CompilerFactory::Compilers[compilerIdx]->GetPrograms();
XRCCTRL(*this, "txtMasterPath", wxTextCtrl)->SetValue(CompilerFactory::Compilers[compilerIdx]->GetMasterPath());
XRCCTRL(*this, "txtCcompiler", wxTextCtrl)->SetValue(progs.C);
XRCCTRL(*this, "txtCPPcompiler", wxTextCtrl)->SetValue(progs.CPP);
XRCCTRL(*this, "txtLinker", wxTextCtrl)->SetValue(progs.LD);
XRCCTRL(*this, "txtLibLinker", wxTextCtrl)->SetValue(progs.LIB);
XRCCTRL(*this, "txtDebugger", wxTextCtrl)->SetValue(progs.DBG);
XRCCTRL(*this, "txtResComp", wxTextCtrl)->SetValue(progs.WINDRES);
XRCCTRL(*this, "txtMake", wxTextCtrl)->SetValue(progs.MAKE);
XRCCTRL(*this, "lstExtraPaths", wxListBox)->Clear();
const wxArrayString& extraPaths = CompilerFactory::Compilers[compilerIdx]->GetExtraPaths();
for (unsigned int i = 0; i < extraPaths.GetCount(); ++i)
{
XRCCTRL(*this, "lstExtraPaths", wxListBox)->Append(extraPaths[i]);
}
}
void CompilerOptionsDlg::DoFillVars(CustomVars* vars)
{
wxListBox* lst = XRCCTRL(*this, "lstVars", wxListBox);
if (!lst)
return;
lst->Clear();
if (!vars)
vars = GetCustomVars();
if (!vars)
return;
const VarsArray& varsarr = vars->GetVars();
//Manager::Get()->GetMessageManager()->DebugLog("[0x%8.8x] Current var count is %d (0x%8.8x)", m_Compiler, vars.GetCount(), &vars);
for (unsigned int i = 0; i < varsarr.GetCount(); ++i)
{
Var* v = &varsarr[i];
if (!v->builtin)
{
wxString text = v->name + _T(" = ") + v->value;
lst->Append(text, static_cast<void*>(v));
}
}
}
void CompilerOptionsDlg::DoFillOthers()
{
wxTextCtrl* txt = XRCCTRL(*this, "txtConsoleShell", wxTextCtrl);
if (txt)
{
txt->SetValue(ConfigManager::Get()->Read(_T("/compiler_gcc/console_shell"), DEFAULT_CONSOLE_SHELL));
#ifdef __WXMSW__
// under win32, this option is not needed, so disable it
txt->Enable(false);
#endif
}
wxSpinCtrl* spn = XRCCTRL(*this, "spnMaxErrors", wxSpinCtrl);
if (spn)
{
spn->SetRange(0, 1000);
spn->SetValue(ConfigManager::Get()->Read(_T("/compiler_gcc/max_reported_errors"), 50));
}
}
void CompilerOptionsDlg::DoFillTree(cbProject* focusProject, ProjectBuildTarget* focusTarget)
{
m_BuildingTree = true;
wxTreeCtrl* tc = XRCCTRL(*this, "tcScope", wxTreeCtrl);
tc->DeleteAllItems();
wxTreeItemId root;
ScopeTreeData* selected = 0L;
wxTreeItemId selectedItem;
if (!focusProject)
{
// global settings
root = tc->AddRoot(_("Global options"), -1, -1);
selectedItem = root;
}
else
{
// project settings
ScopeTreeData* data = new ScopeTreeData(focusProject, 0L);
root = tc->AddRoot(focusProject->GetTitle(), -1, -1, data);
selectedItem = root;
selected = data;
for (int x = 0; x < focusProject->GetBuildTargetsCount(); ++x)
{
ProjectBuildTarget* target = focusProject->GetBuildTarget(x);
data = new ScopeTreeData(focusProject, target);
wxTreeItemId targetItem = tc->AppendItem(root, target->GetTitle(), -1, -1, data);
if (target == focusTarget)
{
selected = data;
selectedItem = targetItem;
}
}
}
tc->Expand(root);
int compilerIdx = XRCCTRL(*this, "cmbCompiler", wxComboBox)->GetSelection();
DoLoadOptions(compilerIdx, selected);
tc->SelectItem(selectedItem);
m_BuildingTree = false;
}
void CompilerOptionsDlg::DoFillCategories()
{
wxComboBox* cmb = XRCCTRL(*this, "cmbCategory", wxComboBox);
cmb->Clear();
cmb->Append(_("<All categories>"));
for (unsigned int i = 0; i < m_Options.GetCount(); ++i)
{
CompOption* copt = m_Options.GetOption(i);
if (cmb->FindString(copt->category) == -1)
cmb->Append(copt->category);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -