You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
432 lines
15 KiB
432 lines
15 KiB
/***************************************************************************
|
|
* Copyright (C) 2001-2002 by Bernd Gehrmann *
|
|
* bernd@kdevelop.org *
|
|
* *
|
|
* 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. *
|
|
* *
|
|
***************************************************************************/
|
|
|
|
#include "configureoptionswidget.h"
|
|
|
|
#include <tqcombobox.h>
|
|
#include <tqdir.h>
|
|
#include <tqfile.h>
|
|
#include <tqfileinfo.h>
|
|
#include <tqgroupbox.h>
|
|
#include <tqlabel.h>
|
|
#include <tqpushbutton.h>
|
|
#include <tqtimer.h>
|
|
#include <tqvalidator.h>
|
|
#include <klineedit.h>
|
|
#include <kdebug.h>
|
|
#include <kfiledialog.h>
|
|
#include <klibloader.h>
|
|
#include <klocale.h>
|
|
#include <kmessagebox.h>
|
|
#include <kservice.h>
|
|
#include <ktrader.h>
|
|
|
|
#include "kdevcompileroptions.h"
|
|
#include "autoprojectpart.h"
|
|
#include "environmentvariableswidget.h"
|
|
|
|
|
|
class ServiceComboBox
|
|
{
|
|
public:
|
|
static void insertStringList(TQComboBox *combo, const TQValueList<KService::Ptr> &list,
|
|
TQStringList *names, TQStringList *execs)
|
|
{
|
|
TQValueList<KService::Ptr>::ConstIterator it;
|
|
for (it = list.begin(); it != list.end(); ++it) {
|
|
combo->insertItem((*it)->comment());
|
|
(*names) << (*it)->desktopEntryName();
|
|
(*execs) << (*it)->exec();
|
|
kdDebug(9020) << "insertStringList item " << (*it)->name() << "," << (*it)->exec() << endl;
|
|
}
|
|
}
|
|
static TQString currentText(TQComboBox *combo, const TQStringList &names)
|
|
{
|
|
if (combo->currentItem() == -1)
|
|
return TQString::null;
|
|
return names[combo->currentItem()];
|
|
}
|
|
static void setCurrentText(TQComboBox *combo, const TQString &str, const TQStringList &names)
|
|
{
|
|
TQStringList::ConstIterator it;
|
|
int i = 0;
|
|
for (it = names.begin(); it != names.end(); ++it) {
|
|
if (*it == str) {
|
|
combo->setCurrentItem(i);
|
|
break;
|
|
}
|
|
++i;
|
|
}
|
|
}
|
|
};
|
|
|
|
|
|
ConfigureOptionsWidget::ConfigureOptionsWidget(AutoProjectPart *part, TQWidget *parent, const char *name)
|
|
: ConfigureOptionsWidgetBase(parent, name)
|
|
{
|
|
config_combo->setValidator(new TQRegExpValidator(TQRegExp("^\\D.*"), this));
|
|
|
|
m_part = part;
|
|
env_groupBox->setColumnLayout( 1, Qt::Vertical );
|
|
TQDomDocument &dom = *part->projectDom();
|
|
m_environmentVariablesWidget = new EnvironmentVariablesWidget(dom, "/kdevautoproject/general/envvars", env_groupBox);
|
|
|
|
coffers = KTrader::self()->query("KDevelop/CompilerOptions", "[X-KDevelop-Language] == 'C'");
|
|
cxxoffers = KTrader::self()->query("KDevelop/CompilerOptions", "[X-KDevelop-Language] == 'C++'");
|
|
f77offers = KTrader::self()->query("KDevelop/CompilerOptions", "[X-KDevelop-Language] == 'Fortran'");
|
|
|
|
ServiceComboBox::insertStringList(cservice_combo, coffers, &cservice_names, &cservice_execs);
|
|
ServiceComboBox::insertStringList(cxxservice_combo, cxxoffers, &cxxservice_names, &cxxservice_execs);
|
|
ServiceComboBox::insertStringList(f77service_combo, f77offers, &f77service_names, &f77service_execs);
|
|
|
|
if (coffers.isEmpty())
|
|
cflags_button->setEnabled(false);
|
|
if (cxxoffers.isEmpty())
|
|
cxxflags_button->setEnabled(false);
|
|
if (f77offers.isEmpty())
|
|
f77flags_button->setEnabled(false);
|
|
|
|
allConfigs = part->allBuildConfigs();
|
|
config_combo->insertStringList(allConfigs);
|
|
|
|
dirty = false;
|
|
currentConfig = TQString::null;
|
|
configChanged(part->currentBuildConfig());
|
|
|
|
fixLayout();
|
|
}
|
|
|
|
|
|
ConfigureOptionsWidget::~ConfigureOptionsWidget()
|
|
{}
|
|
|
|
|
|
void ConfigureOptionsWidget::fixLayout()
|
|
{
|
|
int w1 = ccompiler_label->sizeHint().width();
|
|
int w2 = cbinary_label->sizeHint().width();
|
|
int w3 = cflags_label->sizeHint().width();
|
|
int w4 = cxxcompiler_label->sizeHint().width();
|
|
int w5 = cxxbinary_label->sizeHint().width();
|
|
int w6 = cxxflags_label->sizeHint().width();
|
|
int w7 = f77compiler_label->sizeHint().width();
|
|
int w8 = f77binary_label->sizeHint().width();
|
|
int w9 = f77flags_label->sizeHint().width();
|
|
|
|
int w = QMAX(w1, QMAX(w2, w3));
|
|
w = QMAX(w, QMAX(w4, w5));
|
|
w = QMAX(w, QMAX(w6, w7));
|
|
w = QMAX(w, QMAX(w8, w9));
|
|
|
|
ccompiler_label->setMinimumWidth(w);
|
|
cxxcompiler_label->setMinimumWidth(w);
|
|
f77compiler_label->setMinimumWidth(w);
|
|
}
|
|
|
|
|
|
void ConfigureOptionsWidget::readSettings(const TQString &config)
|
|
{
|
|
TQDomDocument dom = *m_part->projectDom();
|
|
TQString prefix = "/kdevautoproject/configurations/" + config + "/";
|
|
kdDebug(9020) << "Reading config from " << prefix << endl;
|
|
|
|
configargs_edit->setText(DomUtil::readEntry(dom, prefix + "configargs"));
|
|
TQString builddir = DomUtil::readEntry(dom, prefix + "builddir");
|
|
if (builddir.isEmpty() && config != "default")
|
|
builddir = config;
|
|
builddir_edit->setText(builddir);
|
|
|
|
topsourcedir_edit->setText(DomUtil::readEntry(dom, prefix + "topsourcedir"));
|
|
|
|
cppflags_edit->setText(DomUtil::readEntry(dom, prefix + "cppflags"));
|
|
ldflags_edit->setText(DomUtil::readEntry(dom, prefix + "ldflags"));
|
|
|
|
TQString ccompiler = DomUtil::readEntry(dom, prefix + "ccompiler");
|
|
TQString cxxcompiler = DomUtil::readEntry(dom, prefix + "cxxcompiler");
|
|
TQString f77compiler = DomUtil::readEntry(dom, prefix + "f77compiler");
|
|
|
|
if (ccompiler.isEmpty()) {
|
|
kdDebug(9020) << "No c compiler set" << endl;
|
|
TQValueList<KService::Ptr>::ConstIterator it;
|
|
for (it = coffers.begin(); it != coffers.end(); ++it) {
|
|
if ((*it)->property("X-KDevelop-Default").toBool()) {
|
|
kdDebug(9020) << "Found default " << (*it)->name() << endl;
|
|
ccompiler = (*it)->name();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (cxxcompiler.isEmpty()) {
|
|
kdDebug(9020) << "No cxx compiler set" << endl;
|
|
TQValueList<KService::Ptr>::ConstIterator it;
|
|
for (it = cxxoffers.begin(); it != cxxoffers.end(); ++it) {
|
|
if ((*it)->property("X-KDevelop-Default").toBool()) {
|
|
kdDebug(9020) << "Found default " << (*it)->name() << endl;
|
|
cxxcompiler = (*it)->name();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (f77compiler.isEmpty()) {
|
|
kdDebug(9020) << "No c compiler set" << endl;
|
|
TQValueList<KService::Ptr>::ConstIterator it;
|
|
for (it = f77offers.begin(); it != f77offers.end(); ++it) {
|
|
if ((*it)->property("X-KDevelop-Default").toBool()) {
|
|
kdDebug(9020) << "Found default " << (*it)->name() << endl;
|
|
f77compiler = (*it)->name();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
ServiceComboBox::setCurrentText(cservice_combo, ccompiler, cservice_names);
|
|
ServiceComboBox::setCurrentText(cxxservice_combo, cxxcompiler, cxxservice_names);
|
|
ServiceComboBox::setCurrentText(f77service_combo, f77compiler, f77service_names);
|
|
|
|
cbinary_edit->setText(DomUtil::readEntry(dom, prefix + "ccompilerbinary"));
|
|
cxxbinary_edit->setText(DomUtil::readEntry(dom, prefix + "cxxcompilerbinary"));
|
|
f77binary_edit->setText(DomUtil::readEntry(dom, prefix + "f77compilerbinary"));
|
|
|
|
cflags_edit->setText(DomUtil::readEntry(dom, prefix + "cflags"));
|
|
cxxflags_edit->setText(DomUtil::readEntry(dom, prefix + "cxxflags"));
|
|
f77flags_edit->setText(DomUtil::readEntry(dom, prefix + "f77flags"));
|
|
|
|
m_environmentVariablesWidget->readEnvironment(dom, prefix + "envvars");
|
|
}
|
|
|
|
|
|
void ConfigureOptionsWidget::saveSettings(const TQString &config)
|
|
{
|
|
m_environmentVariablesWidget->accept();
|
|
TQDomDocument dom = *m_part->projectDom();
|
|
TQString prefix = "/kdevautoproject/configurations/" + config + "/";
|
|
kdDebug(9020) << "Saving config under " << prefix << endl;
|
|
|
|
DomUtil::writeEntry(dom, prefix + "configargs", configargs_edit->text());
|
|
DomUtil::writeEntry(dom, prefix + "builddir", builddir_edit->text());
|
|
DomUtil::writeEntry(dom, prefix + "topsourcedir", topsourcedir_edit->text());
|
|
|
|
DomUtil::writeEntry(dom, prefix + "cppflags", cppflags_edit->text());
|
|
DomUtil::writeEntry(dom, prefix + "ldflags", ldflags_edit->text());
|
|
|
|
TQFileInfo fi(m_part->buildDirectory());
|
|
TQDir dir(fi.dir());
|
|
dir.mkdir(fi.fileName());
|
|
|
|
DomUtil::writeEntry(dom, prefix + "ccompiler",
|
|
ServiceComboBox::currentText(cservice_combo, cservice_names));
|
|
DomUtil::writeEntry(dom, prefix + "cxxcompiler",
|
|
ServiceComboBox::currentText(cxxservice_combo, cxxservice_names));
|
|
DomUtil::writeEntry(dom, prefix + "f77compiler",
|
|
ServiceComboBox::currentText(f77service_combo, f77service_names));
|
|
|
|
DomUtil::writeEntry(dom, prefix + "ccompilerbinary", cbinary_edit->text());
|
|
DomUtil::writeEntry(dom, prefix + "cxxcompilerbinary", cxxbinary_edit->text());
|
|
DomUtil::writeEntry(dom, prefix + "f77compilerbinary", f77binary_edit->text());
|
|
|
|
DomUtil::writeEntry(dom, prefix + "cflags", cflags_edit->text());
|
|
DomUtil::writeEntry(dom, prefix + "cxxflags", cxxflags_edit->text());
|
|
DomUtil::writeEntry(dom, prefix + "f77flags", f77flags_edit->text());
|
|
|
|
if (KMessageBox::questionYesNo(this, i18n("Re-run configure for %1 now?").arg(config), TQString::null, i18n("Rerun"), i18n("Do Not Run")) == KMessageBox::Yes)
|
|
TQTimer::singleShot(0, m_part, TQT_SLOT(slotConfigure()));
|
|
|
|
}
|
|
|
|
|
|
void ConfigureOptionsWidget::setDirty()
|
|
{
|
|
kdDebug(9020) << "config dirty" << endl;
|
|
dirty = true;
|
|
}
|
|
|
|
|
|
void ConfigureOptionsWidget::builddirClicked()
|
|
{
|
|
TQString dir = builddir_edit->text();
|
|
dir = KFileDialog::getExistingDirectory(dir, this);
|
|
if (!dir.isNull())
|
|
builddir_edit->setText(dir);
|
|
}
|
|
|
|
void ConfigureOptionsWidget::topsourcedirClicked()
|
|
{
|
|
TQString dir = topsourcedir_edit->text();
|
|
dir = KFileDialog::getExistingDirectory(dir, this);
|
|
if (!dir.isNull())
|
|
topsourcedir_edit->setText(dir);
|
|
}
|
|
|
|
void ConfigureOptionsWidget::configComboTextChanged(const TQString &config)
|
|
{
|
|
bool canAdd = !allConfigs.contains(config) && !config.contains("/") && !config.isEmpty();
|
|
bool canRemove = allConfigs.contains(config) && config != "default";
|
|
addconfig_button->setEnabled(canAdd);
|
|
removeconfig_button->setEnabled(canRemove);
|
|
}
|
|
|
|
|
|
void ConfigureOptionsWidget::configChanged(const TQString &config)
|
|
{
|
|
if (config == currentConfig || !allConfigs.contains(config))
|
|
return;
|
|
|
|
if (!currentConfig.isNull() && dirty)
|
|
saveSettings(currentConfig);
|
|
|
|
currentConfig = config;
|
|
readSettings(config);
|
|
dirty = false;
|
|
|
|
config_combo->blockSignals(true);
|
|
config_combo->setEditText(config);
|
|
config_combo->blockSignals(false);
|
|
}
|
|
|
|
|
|
void ConfigureOptionsWidget::configAdded()
|
|
{
|
|
TQString config = config_combo->currentText();
|
|
|
|
allConfigs.append(config);
|
|
|
|
config_combo->clear();
|
|
config_combo->insertStringList(allConfigs);
|
|
configChanged(config);
|
|
setDirty(); // force saving
|
|
}
|
|
|
|
|
|
void ConfigureOptionsWidget::configRemoved()
|
|
{
|
|
TQString config = config_combo->currentText();
|
|
|
|
TQDomDocument dom = *m_part->projectDom();
|
|
TQDomNode node = dom.documentElement().namedItem("kdevautoproject").namedItem("configurations");
|
|
node.removeChild(node.namedItem(config));
|
|
allConfigs.remove(config);
|
|
|
|
config_combo->clear();
|
|
config_combo->insertStringList(allConfigs);
|
|
|
|
currentConfig = TQString::null;
|
|
configChanged("default");
|
|
}
|
|
|
|
|
|
void ConfigureOptionsWidget::cserviceChanged()
|
|
{
|
|
TQString exec = ServiceComboBox::currentText(cservice_combo, cservice_execs);
|
|
cbinary_edit->setText(exec);
|
|
kdDebug(9020) << "exec: " << exec << endl;
|
|
}
|
|
|
|
|
|
void ConfigureOptionsWidget::cxxserviceChanged()
|
|
{
|
|
TQString exec = ServiceComboBox::currentText(cxxservice_combo, cxxservice_execs);
|
|
cxxbinary_edit->setText(exec);
|
|
}
|
|
|
|
|
|
void ConfigureOptionsWidget::f77serviceChanged()
|
|
{
|
|
TQString exec = ServiceComboBox::currentText(f77service_combo, f77service_execs);
|
|
f77binary_edit->setText(exec);
|
|
kdDebug(9020) << "exec: " << exec << endl;
|
|
}
|
|
|
|
|
|
void ConfigureOptionsWidget::cflagsClicked()
|
|
{
|
|
TQString name = ServiceComboBox::currentText(cservice_combo, cservice_names);
|
|
KDevCompilerOptions *plugin = createCompilerOptions(name);
|
|
|
|
if (plugin) {
|
|
TQString flags = plugin->exec(this, cflags_edit->text());
|
|
cflags_edit->setText(flags);
|
|
delete plugin;
|
|
}
|
|
}
|
|
|
|
|
|
void ConfigureOptionsWidget::cxxflagsClicked()
|
|
{
|
|
TQString name = ServiceComboBox::currentText(cxxservice_combo, cxxservice_names);
|
|
KDevCompilerOptions *plugin = createCompilerOptions(name);
|
|
|
|
if (plugin) {
|
|
TQString flags = plugin->exec(this, cxxflags_edit->text());
|
|
cxxflags_edit->setText(flags);
|
|
delete plugin;
|
|
}
|
|
}
|
|
|
|
|
|
void ConfigureOptionsWidget::f77flagsClicked()
|
|
{
|
|
TQString name = ServiceComboBox::currentText(f77service_combo, f77service_names);
|
|
KDevCompilerOptions *plugin = createCompilerOptions(name);
|
|
|
|
if (plugin) {
|
|
TQString flags = plugin->exec(this, f77flags_edit->text());
|
|
f77flags_edit->setText(flags);
|
|
delete plugin;
|
|
}
|
|
}
|
|
|
|
|
|
KDevCompilerOptions *ConfigureOptionsWidget::createCompilerOptions(const TQString &name)
|
|
{
|
|
KService::Ptr service = KService::serviceByDesktopName(name);
|
|
if (!service) {
|
|
kdDebug(9020) << "Can't find service " << name;
|
|
return 0;
|
|
}
|
|
|
|
KLibFactory *factory = KLibLoader::self()->factory(TQFile::encodeName(service->library()));
|
|
if (!factory) {
|
|
TQString errorMessage = KLibLoader::self()->lastErrorMessage();
|
|
KMessageBox::error(0, i18n("There was an error loading the module %1.\n"
|
|
"The diagnostics is:\n%2").arg(service->name()).arg(errorMessage));
|
|
exit(1);
|
|
}
|
|
|
|
TQStringList args;
|
|
TQVariant prop = service->property("X-KDevelop-Args");
|
|
if (prop.isValid())
|
|
args = TQStringList::split(" ", prop.toString());
|
|
|
|
TQObject *obj = factory->create(this, service->name().latin1(),
|
|
"KDevCompilerOptions", args);
|
|
|
|
if (!obj->inherits("KDevCompilerOptions")) {
|
|
kdDebug(9020) << "Component does not inherit KDevCompilerOptions" << endl;
|
|
return 0;
|
|
}
|
|
KDevCompilerOptions *dlg = (KDevCompilerOptions*) obj;
|
|
|
|
return dlg;
|
|
}
|
|
|
|
|
|
void ConfigureOptionsWidget::accept()
|
|
{
|
|
DomUtil::writeEntry(*m_part->projectDom(), "/kdevautoproject/general/useconfiguration", currentConfig);
|
|
m_environmentVariablesWidget->accept();
|
|
if (dirty)
|
|
{
|
|
saveSettings(currentConfig);
|
|
}
|
|
}
|
|
|
|
#include "configureoptionswidget.moc"
|