diff options
Diffstat (limited to 'buildtools/autotools/configureoptionswidget.cpp')
-rw-r--r-- | buildtools/autotools/configureoptionswidget.cpp | 431 |
1 files changed, 431 insertions, 0 deletions
diff --git a/buildtools/autotools/configureoptionswidget.cpp b/buildtools/autotools/configureoptionswidget.cpp new file mode 100644 index 00000000..7e2db214 --- /dev/null +++ b/buildtools/autotools/configureoptionswidget.cpp @@ -0,0 +1,431 @@ +/*************************************************************************** + * 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 <qcombobox.h> +#include <qdir.h> +#include <qfile.h> +#include <qfileinfo.h> +#include <qgroupbox.h> +#include <qlabel.h> +#include <qpushbutton.h> +#include <qtimer.h> +#include <qvalidator.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(QComboBox *combo, const QValueList<KService::Ptr> &list, + QStringList *names, QStringList *execs) + { + QValueList<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 QString currentText(QComboBox *combo, const QStringList &names) + { + if (combo->currentItem() == -1) + return QString::null; + return names[combo->currentItem()]; + } + static void setCurrentText(QComboBox *combo, const QString &str, const QStringList &names) + { + QStringList::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, QWidget *parent, const char *name) + : ConfigureOptionsWidgetBase(parent, name) +{ + config_combo->setValidator(new QRegExpValidator(QRegExp("^\\D.*"), this)); + + m_part = part; + env_groupBox->setColumnLayout( 1, Qt::Vertical ); + QDomDocument &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 = QString::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 QString &config) +{ + QDomDocument dom = *m_part->projectDom(); + QString prefix = "/kdevautoproject/configurations/" + config + "/"; + kdDebug(9020) << "Reading config from " << prefix << endl; + + configargs_edit->setText(DomUtil::readEntry(dom, prefix + "configargs")); + QString 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")); + + QString ccompiler = DomUtil::readEntry(dom, prefix + "ccompiler"); + QString cxxcompiler = DomUtil::readEntry(dom, prefix + "cxxcompiler"); + QString f77compiler = DomUtil::readEntry(dom, prefix + "f77compiler"); + + if (ccompiler.isEmpty()) { + kdDebug(9020) << "No c compiler set" << endl; + QValueList<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; + QValueList<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; + QValueList<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 QString &config) +{ + m_environmentVariablesWidget->accept(); + QDomDocument dom = *m_part->projectDom(); + QString 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()); + + QFileInfo fi(m_part->buildDirectory()); + QDir 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), QString::null, i18n("Rerun"), i18n("Do Not Run")) == KMessageBox::Yes) + QTimer::singleShot(0, m_part, SLOT(slotConfigure())); + +} + + +void ConfigureOptionsWidget::setDirty() +{ + kdDebug(9020) << "config dirty" << endl; + dirty = true; +} + + +void ConfigureOptionsWidget::builddirClicked() +{ + QString dir = builddir_edit->text(); + dir = KFileDialog::getExistingDirectory(dir, this); + if (!dir.isNull()) + builddir_edit->setText(dir); +} + +void ConfigureOptionsWidget::topsourcedirClicked() +{ + QString dir = topsourcedir_edit->text(); + dir = KFileDialog::getExistingDirectory(dir, this); + if (!dir.isNull()) + topsourcedir_edit->setText(dir); +} + +void ConfigureOptionsWidget::configComboTextChanged(const QString &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 QString &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() +{ + QString config = config_combo->currentText(); + + allConfigs.append(config); + + config_combo->clear(); + config_combo->insertStringList(allConfigs); + configChanged(config); + setDirty(); // force saving +} + + +void ConfigureOptionsWidget::configRemoved() +{ + QString config = config_combo->currentText(); + + QDomDocument dom = *m_part->projectDom(); + QDomNode node = dom.documentElement().namedItem("kdevautoproject").namedItem("configurations"); + node.removeChild(node.namedItem(config)); + allConfigs.remove(config); + + config_combo->clear(); + config_combo->insertStringList(allConfigs); + + currentConfig = QString::null; + configChanged("default"); +} + + +void ConfigureOptionsWidget::cserviceChanged() +{ + QString exec = ServiceComboBox::currentText(cservice_combo, cservice_execs); + cbinary_edit->setText(exec); + kdDebug(9020) << "exec: " << exec << endl; +} + + +void ConfigureOptionsWidget::cxxserviceChanged() +{ + QString exec = ServiceComboBox::currentText(cxxservice_combo, cxxservice_execs); + cxxbinary_edit->setText(exec); +} + + +void ConfigureOptionsWidget::f77serviceChanged() +{ + QString exec = ServiceComboBox::currentText(f77service_combo, f77service_execs); + f77binary_edit->setText(exec); + kdDebug(9020) << "exec: " << exec << endl; +} + + +void ConfigureOptionsWidget::cflagsClicked() +{ + QString name = ServiceComboBox::currentText(cservice_combo, cservice_names); + KDevCompilerOptions *plugin = createCompilerOptions(name); + + if (plugin) { + QString flags = plugin->exec(this, cflags_edit->text()); + cflags_edit->setText(flags); + delete plugin; + } +} + + +void ConfigureOptionsWidget::cxxflagsClicked() +{ + QString name = ServiceComboBox::currentText(cxxservice_combo, cxxservice_names); + KDevCompilerOptions *plugin = createCompilerOptions(name); + + if (plugin) { + QString flags = plugin->exec(this, cxxflags_edit->text()); + cxxflags_edit->setText(flags); + delete plugin; + } +} + + +void ConfigureOptionsWidget::f77flagsClicked() +{ + QString name = ServiceComboBox::currentText(f77service_combo, f77service_names); + KDevCompilerOptions *plugin = createCompilerOptions(name); + + if (plugin) { + QString flags = plugin->exec(this, f77flags_edit->text()); + f77flags_edit->setText(flags); + delete plugin; + } +} + + +KDevCompilerOptions *ConfigureOptionsWidget::createCompilerOptions(const QString &name) +{ + KService::Ptr service = KService::serviceByDesktopName(name); + if (!service) { + kdDebug(9020) << "Can't find service " << name; + return 0; + } + + KLibFactory *factory = KLibLoader::self()->factory(QFile::encodeName(service->library())); + if (!factory) { + QString 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); + } + + QStringList args; + QVariant prop = service->property("X-KDevelop-Args"); + if (prop.isValid()) + args = QStringList::split(" ", prop.toString()); + + QObject *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" |