summaryrefslogtreecommitdiffstats
path: root/buildtools/autotools/subprojectoptionsdlg.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'buildtools/autotools/subprojectoptionsdlg.cpp')
-rw-r--r--buildtools/autotools/subprojectoptionsdlg.cpp404
1 files changed, 404 insertions, 0 deletions
diff --git a/buildtools/autotools/subprojectoptionsdlg.cpp b/buildtools/autotools/subprojectoptionsdlg.cpp
new file mode 100644
index 00000000..5ad6bf10
--- /dev/null
+++ b/buildtools/autotools/subprojectoptionsdlg.cpp
@@ -0,0 +1,404 @@
+/***************************************************************************
+ * Copyright (C) 2001 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 "subprojectoptionsdlg.h"
+
+#include <qdom.h>
+#include <qheader.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qlineedit.h>
+#include <qpushbutton.h>
+#include <qcheckbox.h>
+#include <qregexp.h>
+#include <kbuttonbox.h>
+#include <kdebug.h>
+#include <kdialog.h>
+#include <keditlistbox.h>
+#include <kinputdialog.h>
+#include <klocale.h>
+#include <knotifyclient.h>
+#include <kservice.h>
+#include <kurlrequesterdlg.h>
+#include <kurlrequester.h>
+#include <kurlcompletion.h>
+#include <kfiledialog.h>
+#include "domutil.h"
+#include "misc.h"
+#include "addprefixdlg.h"
+
+#include "autolistviewitems.h"
+
+#include "autoprojectpart.h"
+#include "autoprojectwidget.h"
+
+
+SubprojectOptionsDialog::SubprojectOptionsDialog(AutoProjectPart *part, AutoProjectWidget *widget,
+ SubprojectItem *item, QWidget *parent, const char *name)
+ : SubprojectOptionsDialogBase(parent, name, true)
+{
+ setCaption(i18n("Subproject Options for '%1'").arg(item->subdir));
+
+ subProject = item;
+ m_part = part;
+
+ QFontMetrics fm(cflags_edit->fontMetrics());
+ int wid = fm.width('X')*35;
+ cflags_edit->setMinimumWidth(wid);
+ cxxflags_edit->setMinimumWidth(wid);
+ fflags_edit->setMinimumWidth(wid);
+
+ QDomDocument &dom = *part->projectDom();
+ QString prefix = "/kdevautoproject/configurations/" + m_part->currentBuildConfig() + "/";
+
+ ccompiler = DomUtil::readEntry(dom, prefix + "ccompiler", "kdevgccoptions");
+ cxxcompiler = DomUtil::readEntry(dom, prefix + "cxxcompiler", "kdevgppoptions");
+ f77compiler = DomUtil::readEntry(dom, prefix + "f77compiler", "kdevg77options");
+
+ if (!KService::serviceByDesktopName(ccompiler))
+ cflags_button->setEnabled(false);
+ if (!KService::serviceByDesktopName(cxxcompiler))
+ cxxflags_button->setEnabled(false);
+ if (!KService::serviceByDesktopName(f77compiler))
+ fflags_button->setEnabled(false);
+
+ insideinc_listview->header()->hide();
+ outsideinc_listview->header()->hide();
+ buildorder_listview->header()->hide();
+
+ insideinc_listview->setSorting(-1);
+ outsideinc_listview->setSorting(-1);
+ prefix_listview->setSorting(-1);
+ buildorder_listview->setSorting(-1);
+
+ connect( prefix_listview, SIGNAL( doubleClicked ( QListViewItem *, const QPoint &, int ) ), this, SLOT( editPrefixClicked() ) );
+
+ // Insert all subdirectories as possible include directories
+ QStringList l = widget->allSubprojects();
+ QCheckListItem *lastItem = 0;
+ QStringList::ConstIterator it;
+ for (it = l.begin(); it != l.end(); ++it) {
+ kdDebug(9020) << "----------> subproject = " << (*it) << endl;
+ QString subProjectName = *it;
+
+ if( subProjectName.isEmpty() ){
+ subProjectName = QString::fromLatin1( "." );
+ }
+ QCheckListItem *clitem = new QCheckListItem(insideinc_listview, subProjectName, QCheckListItem::CheckBox);
+ if (lastItem)
+ clitem->moveItem(lastItem);
+ lastItem = clitem;
+ }
+
+ setIcon ( SmallIcon ( "configure" ) );
+
+ readConfig();
+}
+
+
+SubprojectOptionsDialog::~SubprojectOptionsDialog()
+{}
+
+
+void SubprojectOptionsDialog::readConfig()
+{
+
+ cflags_edit->setText(subProject->variables["AM_CFLAGS"]);
+ cxxflags_edit->setText(subProject->variables["AM_CXXFLAGS"]);
+ fflags_edit->setText(subProject->variables["AM_FFLAGS"]);
+
+ metasources_checkbox->setChecked(subProject->variables["METASOURCES"].stripWhiteSpace() == "AUTO");
+
+ QString includes = subProject->variables["INCLUDES"];
+ QStringList includeslist = QStringList::split(QRegExp("[ \t]"), QString(includes));
+
+ QListViewItem *lastItem = 0;
+ QStringList::Iterator it;
+ for (it = includeslist.begin(); it != includeslist.end(); ++it) {
+ QCheckListItem *clitem = static_cast<QCheckListItem*>(insideinc_listview->firstChild());
+ while (clitem) {
+ if (*it == ("-I$(top_srcdir)/" + clitem->text())) {
+ clitem->setOn(true);
+ break;
+ }
+ clitem = static_cast<QCheckListItem*>(clitem->nextSibling());
+ }
+ if (!clitem) {
+ QListViewItem *item = new QListViewItem(outsideinc_listview, *it);
+ if (lastItem)
+ item->moveItem(lastItem);
+ lastItem = item;
+ }
+ }
+
+ QMap<QString, QString>::ConstIterator it2;
+ for (it2 = subProject->prefixes.begin(); it2 != subProject->prefixes.end(); ++it2)
+ new QListViewItem(prefix_listview, it2.key(), it2.data());
+
+ QString subdirs = subProject->variables["SUBDIRS"];
+ kdDebug(9020) << "Subdirs variable: " << subdirs << endl;
+ QStringList subdirslist = QStringList::split(QRegExp("[ \t]"), QString(subdirs));
+ lastItem = 0;
+ for (it = subdirslist.begin(); it != subdirslist.end(); ++it) {
+ QListViewItem *item = new QListViewItem(buildorder_listview, *it);
+ if (lastItem)
+ item->moveItem(lastItem);
+ lastItem = item;
+ }
+}
+
+
+void SubprojectOptionsDialog::storeConfig()
+{
+ QMap<QString, QString> replaceMap;
+
+ QString old_cflags = subProject->variables["AM_CFLAGS"];
+ QString new_cflags = cflags_edit->text();
+ if (new_cflags != old_cflags) {
+ subProject->variables["AM_CFLAGS"] = new_cflags;
+ replaceMap.insert("AM_CFLAGS", new_cflags);
+ }
+
+ QString old_cxxflags = subProject->variables["AM_CXXFLAGS"];
+ QString new_cxxflags = cxxflags_edit->text();
+ if (new_cxxflags != old_cxxflags) {
+ subProject->variables["AM_CXXFLAGS"] = new_cxxflags;
+ replaceMap.insert("AM_CXXFLAGS", new_cxxflags);
+ }
+
+ QString old_fflags = subProject->variables["AM_FFLAGS"];
+ QString new_fflags = fflags_edit->text();
+ if (new_fflags != old_fflags) {
+ subProject->variables["AM_FFLAGS"] = new_fflags;
+ replaceMap.insert("AM_FFLAGS", new_fflags);
+ }
+
+ QString old_metasources = subProject->variables["METASOURCES"];
+ QString new_metasources = metasources_checkbox->isChecked() ? QString::fromLatin1("AUTO") : QString::null;
+ if (new_metasources != old_metasources) {
+ subProject->variables["METASOURCES"] = new_metasources;
+ replaceMap.insert("METASOURCES", new_metasources);
+ }
+
+ QStringList includeslist;
+ QCheckListItem *clitem = static_cast<QCheckListItem*>(insideinc_listview->firstChild());
+ while (clitem) {
+ if (clitem->isOn())
+ includeslist.append("-I$(top_srcdir)/" + clitem->text());
+ clitem = static_cast<QCheckListItem*>(clitem->nextSibling());
+ }
+ clitem = static_cast<QCheckListItem*>(outsideinc_listview->firstChild());
+ while (clitem) {
+ includeslist.append(clitem->text());
+ clitem = static_cast<QCheckListItem*>(clitem->nextSibling());
+ }
+ QString includes = includeslist.join(" ");
+ subProject->variables["INCLUDES"] = includes;
+ replaceMap.insert("INCLUDES", includes);
+
+ subProject->prefixes.clear();
+ for (QListViewItem *item = prefix_listview->firstChild();
+ item; item = item->nextSibling()) {
+ QString key = item->text(0);
+ QString data = item->text(1);
+ subProject->prefixes[key] = data;
+ replaceMap.insert(key + "dir", data);
+ }
+ /// \FIXME take removed prefixes into account
+
+ QStringList subdirslist;
+ for (QListViewItem *item = buildorder_listview->firstChild();
+ item; item = item->nextSibling())
+ subdirslist.append(item->text(0));
+ QString subdirs = subdirslist.join(" ");
+ kdDebug() << "New subdirs variable: " << subdirs << endl;
+ subProject->variables["SUBDIRS"] = subdirs;
+ replaceMap.insert("SUBDIRS", subdirs);
+
+ AutoProjectTool::setMakefileam(subProject->path + "/Makefile.am", replaceMap);
+}
+
+
+void SubprojectOptionsDialog::cflagsClicked()
+{
+ QString new_cflags = AutoProjectTool::execFlagsDialog(ccompiler, cflags_edit->text(), this);
+// if (!new_cflags.isNull())
+ cflags_edit->setText(new_cflags);
+}
+
+
+void SubprojectOptionsDialog::cxxFlagsClicked()
+{
+ QString new_cxxflags = AutoProjectTool::execFlagsDialog(cxxcompiler, cxxflags_edit->text(), this);
+// if (!new_cxxflags.isNull())
+ cxxflags_edit->setText(new_cxxflags);
+}
+
+
+void SubprojectOptionsDialog::fflagsClicked()
+{
+ QString new_fflags = AutoProjectTool::execFlagsDialog(f77compiler, fflags_edit->text(), this);
+// if (!new_fflags.isNull())
+ fflags_edit->setText(new_fflags);
+}
+
+
+void SubprojectOptionsDialog::insideMoveUpClicked()
+{
+ if (insideinc_listview->currentItem() == insideinc_listview->firstChild()) {
+ KNotifyClient::beep();
+ return;
+ }
+
+ QListViewItem *item = insideinc_listview->firstChild();
+ while (item->nextSibling() != insideinc_listview->currentItem())
+ item = item->nextSibling();
+ item->moveItem(insideinc_listview->currentItem());
+}
+
+
+void SubprojectOptionsDialog::insideMoveDownClicked()
+{
+ if (insideinc_listview->currentItem() == 0 || insideinc_listview->currentItem()->nextSibling() == 0) {
+ KNotifyClient::beep();
+ return;
+ }
+
+ insideinc_listview->currentItem()->moveItem(insideinc_listview->currentItem()->nextSibling());
+}
+
+
+void SubprojectOptionsDialog::outsideMoveUpClicked()
+{
+ if (outsideinc_listview->currentItem() == outsideinc_listview->firstChild()) {
+ KNotifyClient::beep();
+ return;
+ }
+
+ QListViewItem *item = outsideinc_listview->firstChild();
+ while (item->nextSibling() != outsideinc_listview->currentItem())
+ item = item->nextSibling();
+ item->moveItem(outsideinc_listview->currentItem());
+}
+
+
+void SubprojectOptionsDialog::outsideMoveDownClicked()
+{
+ if (outsideinc_listview->currentItem() == 0 || outsideinc_listview->currentItem()->nextSibling() == 0) {
+ KNotifyClient::beep();
+ return;
+ }
+
+ outsideinc_listview->currentItem()->moveItem(outsideinc_listview->currentItem()->nextSibling());
+}
+
+void SubprojectOptionsDialog::outsideAddClicked()
+{
+ KURLRequesterDlg dialog( "", i18n( "Add Include directory: Choose directory, give -Idirectory or use a variable with -I$(FOOBAR)" ), 0, 0 );
+ dialog.urlRequester() ->setMode( KFile::Directory | KFile::ExistingOnly | KFile::LocalOnly );
+ dialog.urlRequester() ->setURL( QString::null );
+ if ( dialog.exec() != QDialog::Accepted )
+ return ;
+ QString file = dialog.urlRequester() ->url();
+ if ( !file.isEmpty() )
+ {
+ if ( !file.isEmpty() )
+ {
+ if( file.startsWith("-I") )
+ new QListViewItem( outsideinc_listview, file );
+ else
+ {
+ new QListViewItem( outsideinc_listview, "-I"+file );
+ }
+ }
+ }
+}
+
+
+void SubprojectOptionsDialog::outsideEditClicked()
+{
+ if ( (outsideinc_listview->childCount()==0) || (outsideinc_listview->currentItem() == 0) )
+ return;
+ bool ok;
+ QString dir = KInputDialog::getText(i18n("Edit Include Directory"), i18n("Edit include directory:"),
+ outsideinc_listview->currentItem()-> text(0), &ok, 0);
+ if (ok && !dir.isEmpty())
+ outsideinc_listview->currentItem()-> setText(0, dir);
+}
+
+
+void SubprojectOptionsDialog::outsideRemoveClicked()
+{
+ delete outsideinc_listview->currentItem();
+}
+
+
+void SubprojectOptionsDialog::addPrefixClicked()
+{
+ AddPrefixDialog dlg;
+ if (!dlg.exec() || dlg.name().isEmpty() || dlg.path().isEmpty() )
+ return;
+
+ new QListViewItem(prefix_listview, dlg.name(), dlg.path());
+}
+
+
+void SubprojectOptionsDialog::editPrefixClicked()
+{
+ QListViewItem* lvItem = prefix_listview->currentItem();
+ if ( (prefix_listview->childCount()==0) || (lvItem == 0) )
+ return;
+ AddPrefixDialog dlg(lvItem-> text(0), lvItem-> text(1));
+ dlg.setCaption(i18n("Edit Prefix"));
+ if (!dlg.exec() || dlg.name().isEmpty() || dlg.path().isEmpty() )
+ return;
+ lvItem-> setText(0, dlg.name());
+ lvItem-> setText(1, dlg.path());
+}
+
+void SubprojectOptionsDialog::removePrefixClicked()
+{
+ delete prefix_listview->currentItem();
+}
+
+
+void SubprojectOptionsDialog::buildorderMoveUpClicked()
+{
+ if (buildorder_listview->currentItem() == buildorder_listview->firstChild()) {
+ KNotifyClient::beep();
+ return;
+ }
+
+ QListViewItem *item = buildorder_listview->firstChild();
+ while (item->nextSibling() != buildorder_listview->currentItem())
+ item = item->nextSibling();
+ item->moveItem(buildorder_listview->currentItem());
+}
+
+
+void SubprojectOptionsDialog::buildorderMoveDownClicked()
+{
+ if (buildorder_listview->currentItem() == 0 || buildorder_listview->currentItem()->nextSibling() == 0) {
+ KNotifyClient::beep();
+ return;
+ }
+
+ buildorder_listview->currentItem()->moveItem(buildorder_listview->currentItem()->nextSibling());
+}
+
+
+void SubprojectOptionsDialog::accept()
+{
+ storeConfig();
+ QDialog::accept();
+}
+
+#include "subprojectoptionsdlg.moc"