📄 compileroptionsdlg.cpp
字号:
}
cmb->SetSelection(0);
}
void CompilerOptionsDlg::DoFillOptions()
{
Disconnect(XRCID("lstCompilerOptions"), -1,
wxEVT_COMMAND_CHECKLISTBOX_TOGGLED,
(wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction)
&CompilerOptionsDlg::OnOptionToggled);
wxComboBox* cmb = XRCCTRL(*this, "cmbCategory", wxComboBox);
wxString cat = cmb->GetValue();
bool isAll = cmb->GetSelection() == 0;
wxCheckListBox* list = XRCCTRL(*this, "lstCompilerOptions", wxCheckListBox);
list->Clear();
for (unsigned int i = 0; i < m_Options.GetCount(); ++i)
{
CompOption* copt = m_Options.GetOption(i);
if (isAll || copt->category.Matches(cat))
{
list->Append(copt->name);
list->Check(list->GetCount() - 1, copt->enabled);
// Manager::Get()->GetMessageManager()->DebugLog("(FILL) option %s (0x%8.8x) %s", copt->option.c_str(), copt, copt->enabled ? "enabled" : "disabled");
}
}
Connect(XRCID("lstCompilerOptions"), -1,
wxEVT_COMMAND_CHECKLISTBOX_TOGGLED,
(wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction)
&CompilerOptionsDlg::OnOptionToggled);
}
void CompilerOptionsDlg::TextToOptions()
{
// disable all options
for (unsigned int n = 0; n < m_Options.GetCount(); ++n)
{
CompOption* copt = m_Options.GetOption(n);
if (copt)
copt->enabled = false;
}
wxString rest;
int compilerIdx = XRCCTRL(*this, "cmbCompiler", wxComboBox)->GetSelection();
Compiler* compiler = CompilerFactory::Compilers[compilerIdx];
XRCCTRL(*this, "txtCompilerDefines", wxTextCtrl)->Clear();
unsigned int i = 0;
while (i < m_CompilerOptions.GetCount())
{
wxString opt = m_CompilerOptions.Item(i);
opt.Trim(wxString::both);
CompOption* copt = m_Options.GetOptionByOption(opt);
if (copt)
{
// Manager::Get()->GetMessageManager()->DebugLog("Enabling option %s", copt->option.c_str());
copt->enabled = true;
m_CompilerOptions.RemoveAt(i, 1);
}
else if (opt.StartsWith(compiler->GetSwitches().defines, &rest))
{
// definition
XRCCTRL(*this, "txtCompilerDefines", wxTextCtrl)->AppendText(rest);
XRCCTRL(*this, "txtCompilerDefines", wxTextCtrl)->AppendText(_T("\n"));
m_CompilerOptions.RemoveAt(i, 1);
}
else
++i;
}
i = 0;
while (i < m_LinkerOptions.GetCount())
{
wxString opt = m_LinkerOptions.Item(i);
opt.Trim(wxString::both);
CompOption* copt = m_Options.GetOptionByAdditionalLibs(opt);
if (copt)
{
// Manager::Get()->GetMessageManager()->DebugLog("Enabling option %s", copt->option.c_str());
copt->enabled = true;
m_LinkerOptions.RemoveAt(i, 1);
}
else
++i;
}
XRCCTRL(*this, "lstLibs", wxListBox)->Clear();
for (i = 0; i < m_LinkLibs.GetCount(); ++i)
{
XRCCTRL(*this, "lstLibs", wxListBox)->Append(m_LinkLibs[i]);
}
m_LinkLibs.Clear();
}
void CompilerOptionsDlg::OptionsToText()
{
wxArrayString array;
DoGetCompileOptions(array, XRCCTRL(*this, "txtCompilerDefines", wxTextCtrl));
int compilerIdx = XRCCTRL(*this, "cmbCompiler", wxComboBox)->GetSelection();
Compiler* compiler = CompilerFactory::Compilers[compilerIdx];
for (unsigned int i = 0; i < array.GetCount(); ++i)
{
if (!array[i].IsEmpty())
{
if (array[i].StartsWith(_T("-")))
{
if (m_CompilerOptions.Index(array[i]) == wxNOT_FOUND)
m_CompilerOptions.Add(array[i]);
}
else
{
if (m_CompilerOptions.Index(compiler->GetSwitches().defines + array[i]) == wxNOT_FOUND)
m_CompilerOptions.Add(compiler->GetSwitches().defines + array[i]);
}
}
}
for (unsigned int i = 0; i < m_Options.GetCount(); ++i)
{
CompOption* copt = m_Options.GetOption(i);
if (copt->enabled)
{
m_CompilerOptions.Insert(copt->option, 0);
if (!copt->additionalLibs.IsEmpty())
{
if (m_LinkerOptions.Index(copt->additionalLibs) == wxNOT_FOUND)
m_LinkerOptions.Insert(copt->additionalLibs, 0);
}
}
else
{
// for disabled options, remove relative text option *and*
// relative linker option
int idx = m_CompilerOptions.Index(copt->option);
if (idx != wxNOT_FOUND)
m_CompilerOptions.RemoveAt(idx, 1);
idx = m_LinkerOptions.Index(copt->additionalLibs);
if (idx != wxNOT_FOUND)
m_LinkerOptions.RemoveAt(idx, 1);
}
}
// linker options and libs
wxListBox* lstLibs = XRCCTRL(*this, "lstLibs", wxListBox);
for (int i = 0; i < lstLibs->GetCount(); ++i)
m_LinkLibs.Add(lstLibs->GetString(i));
}
void CompilerOptionsDlg::DoFillCompileOptions(const wxArrayString& array, wxTextCtrl* control)
{
control->Clear();
int count = array.GetCount();
for (int i = 0; i < count; ++i)
{
if (!array[i].IsEmpty())
{
control->AppendText(array[i]);
control->AppendText(_T('\n'));
}
}
}
void CompilerOptionsDlg::DoFillCompileDirs(const wxArrayString& array, wxListBox* control)
{
control->Clear();
int count = array.GetCount();
for (int i = 0; i < count; ++i)
{
if (!array[i].IsEmpty())
control->Append(array[i]);
}
}
void CompilerOptionsDlg::DoGetCompileOptions(wxArrayString& array, wxTextCtrl* control)
{
/* NOTE (mandrav#1#): Under Gnome2, wxTextCtrl::GetLineLength() returns always 0,
so wxTextCtrl::GetLineText() is always empty...
Now, we 're breaking up by newlines. */ array.Clear();
#if 1
wxString tmp = control->GetValue();
int nl = tmp.Find(_T('\n'));
wxString line;
if (nl == -1)
{
line = tmp;
tmp = _T("");
}
else
line = tmp.Left(nl);
while (nl != -1 || !line.IsEmpty())
{
// Manager::Get()->GetMessageManager()->DebugLog("%s text=%s", control->GetName().c_str(), line.c_str());
if (!line.IsEmpty())
{
// just to make sure..
line.Replace(_T("\r"), _T(" "), true); // remove CRs
line.Replace(_T("\n"), _T(" "), true); // remove LFs
array.Add(line.Strip(wxString::both));
}
tmp.Remove(0, nl + 1);
nl = tmp.Find(_T('\n'));
if (nl == -1)
{
line = tmp;
tmp = _T("");
}
else
line = tmp.Left(nl);
}
#else
int count = control->GetNumberOfLines();
for (int i = 0; i < count; ++i)
{
wxString tmp = control->GetLineText(i);
if (!tmp.IsEmpty())
{
tmp.Replace(_T("\r"), _T(" "), true); // remove CRs
tmp.Replace(_T("\n"), _T(" "), true); // remove LFs
array.Add(tmp.Strip(wxString::both));
}
}
#endif
}
void CompilerOptionsDlg::DoGetCompileDirs(wxArrayString& array, wxListBox* control)
{
array.Clear();
int count = control->GetCount();
for (int i = 0; i < count; ++i)
{
wxString tmp = control->GetString(i);
if (!tmp.IsEmpty())
array.Add(tmp);
}
}
void CompilerOptionsDlg::DoLoadOptions(int compilerIdx, ScopeTreeData* data)
{
if (!data)
{
// global options
Compiler* compiler = CompilerFactory::Compilers[compilerIdx];
m_IncludeDirs = compiler->GetIncludeDirs();
m_ResDirs = compiler->GetResourceIncludeDirs();
m_LibDirs = compiler->GetLibDirs();
m_CompilerOptions = compiler->GetCompilerOptions();
m_LinkerOptions = compiler->GetLinkerOptions();
m_LinkLibs = compiler->GetLinkLibs();
m_CommandsAfterBuild = compiler->GetCommandsAfterBuild();
m_CommandsBeforeBuild = compiler->GetCommandsBeforeBuild();
m_AlwaysUsePre = compiler->GetAlwaysRunPreBuildSteps();
m_AlwaysUsePost = compiler->GetAlwaysRunPostBuildSteps();
wxComboBox* cmb = XRCCTRL(*this, "cmbLogging", wxComboBox);
if (cmb)
cmb->SetSelection((int)compiler->GetSwitches().logging);
cmb = XRCCTRL(*this, "cmbBuildMethod", wxComboBox);
if (cmb)
cmb->SetSelection((int)compiler->GetSwitches().buildMethod);
}
else
{
if (!data->GetTarget())
{
// project options
m_pTarget = 0;
cbProject* project = data->GetProject();
m_IncludeDirs = project->GetIncludeDirs();
m_ResDirs = project->GetResourceIncludeDirs();
m_LibDirs = project->GetLibDirs();
m_CompilerOptions = project->GetCompilerOptions();
m_LinkerOptions = project->GetLinkerOptions();
m_LinkLibs = project->GetLinkLibs();
m_CommandsAfterBuild = project->GetCommandsAfterBuild();
m_CommandsBeforeBuild = project->GetCommandsBeforeBuild();
m_AlwaysUsePre = project->GetAlwaysRunPreBuildSteps();
m_AlwaysUsePost = project->GetAlwaysRunPostBuildSteps();
}
else
{
// target options
ProjectBuildTarget* target = data->GetTarget();
m_pTarget = target;
m_IncludeDirs = target->GetIncludeDirs();
m_ResDirs = target->GetResourceIncludeDirs();
m_LibDirs = target->GetLibDirs();
m_CompilerOptions = target->GetCompilerOptions();
m_LinkerOptions = target->GetLinkerOptions();
m_LinkLibs = target->GetLinkLibs();
m_CommandsAfterBuild = target->GetCommandsAfterBuild();
m_CommandsBeforeBuild = target->GetCommandsBeforeBuild();
m_AlwaysUsePre = target->GetAlwaysRunPreBuildSteps();
m_AlwaysUsePost = target->GetAlwaysRunPostBuildSteps();
XRCCTRL(*this, "cmbCompilerPolicy", wxComboBox)->SetSelection(target->GetOptionRelation(ortCompilerOptions));
XRCCTRL(*this, "cmbLinkerPolicy", wxComboBox)->SetSelection(target->GetOptionRelation(ortLinkerOptions));
XRCCTRL(*this, "cmbIncludesPolicy", wxComboBox)->SetSelection(target->GetOptionRelation(ortIncludeDirs));
XRCCTRL(*this, "cmbLibDirsPolicy", wxComboBox)->SetSelection(target->GetOptionRelation(ortLibDirs));
XRCCTRL(*this, "cmbResDirsPolicy", wxComboBox)->SetSelection(target->GetOptionRelation(ortResDirs));
}
}
TextToOptions();
DoFillVars();
DoFillOptions();
DoFillCompileDirs(m_IncludeDirs, XRCCTRL(*this, "lstIncludeDirs", wxListBox));
DoFillCompileDirs(m_LibDirs, XRCCTRL(*this, "lstLibDirs", wxListBox));
DoFillCompileDirs(m_ResDirs, XRCCTRL(*this, "lstResDirs", wxListBox));
DoFillCompileOptions(m_CompilerOptions, XRCCTRL(*this, "txtCompilerOptions", wxTextCtrl));
DoFillCompileOptions(m_LinkerOptions, XRCCTRL(*this, "txtLinkerOptions", wxTextCtrl));
// only if "Commands" page exists
if (XRCCTRL(*this, "txtCmdBefore", wxTextCtrl))
{
DoFillCompileOptions(m_CommandsBeforeBuild, XRCCTRL(*this, "txtCmdBefore", wxTextCtrl));
DoFillCompileOptions(m_CommandsAfterBuild, XRCCTRL(*this, "txtCmdAfter", wxTextCtrl));
XRCCTRL(*this, "chkAlwaysRunPre", wxCheckBox)->SetValue(m_AlwaysUsePre);
XRCCTRL(*this, "chkAlwaysRunPost", wxCheckBox)->SetValue(m_AlwaysUsePost);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -