KDevelop API Documentation

subprojectoptionsdlg.cpp

Go to the documentation of this file.
00001 /***************************************************************************
00002  *   Copyright (C) 2001 by Bernd Gehrmann                                  *
00003  *   bernd@kdevelop.org                                                    *
00004  *                                                                         *
00005  *   This program is free software; you can redistribute it and/or modify  *
00006  *   it under the terms of the GNU General Public License as published by  *
00007  *   the Free Software Foundation; either version 2 of the License, or     *
00008  *   (at your option) any later version.                                   *
00009  *                                                                         *
00010  ***************************************************************************/
00011 
00012 #include "subprojectoptionsdlg.h"
00013 
00014 #include <qdom.h>
00015 #include <qheader.h>
00016 #include <qlabel.h>
00017 #include <qlayout.h>
00018 #include <qlineedit.h>
00019 #include <qpushbutton.h>
00020 #include <qcheckbox.h>
00021 #include <qregexp.h>
00022 #include <kbuttonbox.h>
00023 #include <kdebug.h>
00024 #include <kdialog.h>
00025 #include <keditlistbox.h>
00026 #include <kinputdialog.h>
00027 #include <klocale.h>
00028 #include <knotifyclient.h>
00029 #include <kservice.h>
00030 
00031 #include "domutil.h"
00032 #include "misc.h"
00033 #include "addprefixdlg.h"
00034 
00035 #include "autolistviewitems.h"
00036 
00037 #include "autoprojectpart.h"
00038 #include "autoprojectwidget.h"
00039 
00040 
00041 SubprojectOptionsDialog::SubprojectOptionsDialog(AutoProjectPart *part, AutoProjectWidget *widget,
00042                                                  SubprojectItem *item, QWidget *parent, const char *name)
00043     : SubprojectOptionsDialogBase(parent, name, true)
00044 {
00045     setCaption(i18n("Subproject Options for '%1'").arg(item->subdir));
00046 
00047     subProject = item;
00048     m_part = part;
00049 
00050     QFontMetrics fm(cflags_edit->fontMetrics());
00051     int wid = fm.width('X')*35;
00052     cflags_edit->setMinimumWidth(wid);
00053     cxxflags_edit->setMinimumWidth(wid);
00054     fflags_edit->setMinimumWidth(wid);
00055 
00056     QDomDocument &dom = *part->projectDom();
00057     QString prefix = "/kdevautoproject/configurations/" + m_part->currentBuildConfig() + "/";
00058 
00059     ccompiler = DomUtil::readEntry(dom, prefix + "ccompiler", "kdevgccoptions");
00060     cxxcompiler = DomUtil::readEntry(dom, prefix + "cxxcompiler", "kdevgppoptions");
00061     f77compiler = DomUtil::readEntry(dom, prefix + "f77compiler", "kdevg77options");
00062 
00063     if (!KService::serviceByDesktopName(ccompiler))
00064         cflags_button->setEnabled(false);
00065     if (!KService::serviceByDesktopName(cxxcompiler))
00066         cxxflags_button->setEnabled(false);
00067     if (!KService::serviceByDesktopName(f77compiler))
00068         fflags_button->setEnabled(false);
00069 
00070     insideinc_listview->header()->hide();
00071     outsideinc_listview->header()->hide();
00072     buildorder_listview->header()->hide();
00073 
00074     insideinc_listview->setSorting(-1);
00075     outsideinc_listview->setSorting(-1);
00076     prefix_listview->setSorting(-1);
00077     buildorder_listview->setSorting(-1);
00078 
00079     connect( prefix_listview, SIGNAL( doubleClicked ( QListViewItem *, const QPoint &, int ) ), this, SLOT( editPrefixClicked() ) );
00080 
00081     // Insert all subdirectories as possible include directories
00082     QStringList l = widget->allSubprojects();
00083     QCheckListItem *lastItem = 0;
00084     QStringList::ConstIterator it;
00085     for (it = l.begin(); it != l.end(); ++it) {
00086     kdDebug(9013) << "----------> subproject = " << (*it) << endl;
00087     QString subProjectName = *it;
00088 
00089     if( subProjectName.isEmpty() ){
00090         subProjectName = QString::fromLatin1( "." );
00091     }
00092         QCheckListItem *clitem = new QCheckListItem(insideinc_listview, subProjectName, QCheckListItem::CheckBox);
00093         if (lastItem)
00094             clitem->moveItem(lastItem);
00095         lastItem = clitem;
00096     }
00097 
00098     setIcon ( SmallIcon ( "configure" ) );
00099 
00100     readConfig();
00101 }
00102 
00103 
00104 SubprojectOptionsDialog::~SubprojectOptionsDialog()
00105 {}
00106 
00107 
00108 void SubprojectOptionsDialog::readConfig()
00109 {
00110 
00111     cflags_edit->setText(subProject->variables["AM_CFLAGS"]);
00112     cxxflags_edit->setText(subProject->variables["AM_CXXFLAGS"]);
00113     fflags_edit->setText(subProject->variables["AM_FFLAGS"]);
00114 
00115     metasources_checkbox->setChecked(subProject->variables["METASOURCES"].stripWhiteSpace() == "AUTO");
00116 
00117     QString includes = subProject->variables["INCLUDES"];
00118     QStringList includeslist = QStringList::split(QRegExp("[ \t]"), QString(includes));
00119 
00120     QListViewItem *lastItem = 0;
00121     QStringList::Iterator it;
00122     for (it = includeslist.begin(); it != includeslist.end(); ++it) {
00123         QCheckListItem *clitem = static_cast<QCheckListItem*>(insideinc_listview->firstChild());
00124         while (clitem) {
00125             if (*it == ("-I$(top_srcdir)/" + clitem->text())) {
00126                 clitem->setOn(true);
00127                 break;
00128             }
00129             clitem = static_cast<QCheckListItem*>(clitem->nextSibling());
00130         }
00131         if (!clitem) {
00132             QListViewItem *item = new QListViewItem(outsideinc_listview, *it);
00133             if (lastItem)
00134                 item->moveItem(lastItem);
00135             lastItem = item;
00136         }
00137     }
00138 
00139     QMap<QString, QString>::ConstIterator it2;
00140     for (it2 = subProject->prefixes.begin(); it2 != subProject->prefixes.end(); ++it2)
00141         new QListViewItem(prefix_listview, it2.key(), it2.data());
00142 
00143     QString subdirs = subProject->variables["SUBDIRS"];
00144     kdDebug(9020) << "Subdirs variable: " << subdirs << endl;
00145     QStringList subdirslist = QStringList::split(QRegExp("[ \t]"), QString(subdirs));
00146     lastItem = 0;
00147     for (it = subdirslist.begin(); it != subdirslist.end(); ++it) {
00148         QListViewItem *item = new QListViewItem(buildorder_listview, *it);
00149         if (lastItem)
00150             item->moveItem(lastItem);
00151         lastItem = item;
00152     }
00153 }
00154 
00155 
00156 void SubprojectOptionsDialog::storeConfig()
00157 {
00158     QMap<QString, QString> replaceMap;
00159 
00160     QString old_cflags = subProject->variables["AM_CFLAGS"];
00161     QString new_cflags = cflags_edit->text();
00162     if (new_cflags != old_cflags) {
00163         subProject->variables["AM_CFLAGS"] = new_cflags;
00164         replaceMap.insert("AM_CFLAGS", new_cflags);
00165     }
00166 
00167     QString old_cxxflags = subProject->variables["AM_CXXFLAGS"];
00168     QString new_cxxflags = cxxflags_edit->text();
00169     if (new_cxxflags != old_cxxflags) {
00170         subProject->variables["AM_CXXFLAGS"] = new_cxxflags;
00171         replaceMap.insert("AM_CXXFLAGS", new_cxxflags);
00172     }
00173 
00174     QString old_fflags = subProject->variables["AM_FFLAGS"];
00175     QString new_fflags = fflags_edit->text();
00176     if (new_fflags != old_fflags) {
00177         subProject->variables["AM_FFLAGS"] = new_fflags;
00178         replaceMap.insert("AM_FFLAGS", new_fflags);
00179     }
00180 
00181     QString old_metasources = subProject->variables["METASOURCES"];
00182     QString new_metasources = metasources_checkbox->isChecked() ? QString::fromLatin1("AUTO") : QString::null;
00183     if (new_metasources != old_metasources) {
00184         subProject->variables["METASOURCES"] = new_metasources;
00185         replaceMap.insert("METASOURCES", new_metasources);
00186     }
00187 
00188     QStringList includeslist;
00189     QCheckListItem *clitem = static_cast<QCheckListItem*>(insideinc_listview->firstChild());
00190     while (clitem) {
00191         if (clitem->isOn())
00192             includeslist.append("-I$(top_srcdir)/" + clitem->text());
00193         clitem = static_cast<QCheckListItem*>(clitem->nextSibling());
00194     }
00195     clitem = static_cast<QCheckListItem*>(outsideinc_listview->firstChild());
00196     while (clitem) {
00197         includeslist.append(clitem->text());
00198         clitem = static_cast<QCheckListItem*>(clitem->nextSibling());
00199     }
00200     QString includes = includeslist.join(" ");
00201     subProject->variables["INCLUDES"] = includes;
00202     replaceMap.insert("INCLUDES", includes);
00203 
00204     subProject->prefixes.clear();
00205     for (QListViewItem *item = prefix_listview->firstChild();
00206          item; item = item->nextSibling()) {
00207         QString key = item->text(0);
00208         QString data = item->text(1);
00209         subProject->prefixes[key] = data;
00210         replaceMap.insert(key + "dir", data);
00211     }
00213 
00214     QStringList subdirslist;
00215     for (QListViewItem *item = buildorder_listview->firstChild();
00216          item; item = item->nextSibling())
00217         subdirslist.append(item->text(0));
00218     QString subdirs = subdirslist.join(" ");
00219     kdDebug() << "New subdirs variable: " << subdirs << endl;
00220     subProject->variables["SUBDIRS"] = subdirs;
00221     replaceMap.insert("SUBDIRS", subdirs);
00222 
00223     AutoProjectTool::modifyMakefileam(subProject->path + "/Makefile.am", replaceMap);
00224 }
00225 
00226 
00227 void SubprojectOptionsDialog::cflagsClicked()
00228 {
00229     QString new_cflags = AutoProjectTool::execFlagsDialog(ccompiler, cflags_edit->text(), this);
00230     if (!new_cflags.isNull())
00231         cflags_edit->setText(new_cflags);
00232 }
00233 
00234 
00235 void SubprojectOptionsDialog::cxxFlagsClicked()
00236 {
00237     QString new_cxxflags = AutoProjectTool::execFlagsDialog(cxxcompiler, cxxflags_edit->text(), this);
00238     if (!new_cxxflags.isNull())
00239         cxxflags_edit->setText(new_cxxflags);
00240 }
00241 
00242 
00243 void SubprojectOptionsDialog::fflagsClicked()
00244 {
00245     QString new_fflags = AutoProjectTool::execFlagsDialog(f77compiler, fflags_edit->text(), this);
00246     if (!new_fflags.isNull())
00247         fflags_edit->setText(new_fflags);
00248 }
00249 
00250 
00251 void SubprojectOptionsDialog::insideMoveUpClicked()
00252 {
00253     if (insideinc_listview->currentItem() == insideinc_listview->firstChild()) {
00254         KNotifyClient::beep();
00255         return;
00256     }
00257 
00258     QListViewItem *item = insideinc_listview->firstChild();
00259     while (item->nextSibling() != insideinc_listview->currentItem())
00260         item = item->nextSibling();
00261     item->moveItem(insideinc_listview->currentItem());
00262 }
00263 
00264 
00265 void SubprojectOptionsDialog::insideMoveDownClicked()
00266 {
00267    if (insideinc_listview->currentItem() == 0 || insideinc_listview->currentItem()->nextSibling() == 0) {
00268         KNotifyClient::beep();
00269         return;
00270    }
00271 
00272    insideinc_listview->currentItem()->moveItem(insideinc_listview->currentItem()->nextSibling());
00273 }
00274 
00275 
00276 void SubprojectOptionsDialog::outsideMoveUpClicked()
00277 {
00278     if (outsideinc_listview->currentItem() == outsideinc_listview->firstChild()) {
00279         KNotifyClient::beep();
00280         return;
00281     }
00282 
00283     QListViewItem *item = outsideinc_listview->firstChild();
00284     while (item->nextSibling() != outsideinc_listview->currentItem())
00285         item = item->nextSibling();
00286     item->moveItem(outsideinc_listview->currentItem());
00287 }
00288 
00289 
00290 void SubprojectOptionsDialog::outsideMoveDownClicked()
00291 {
00292    if (outsideinc_listview->currentItem() == 0 || outsideinc_listview->currentItem()->nextSibling() == 0) {
00293         KNotifyClient::beep();
00294         return;
00295    }
00296 
00297    outsideinc_listview->currentItem()->moveItem(outsideinc_listview->currentItem()->nextSibling());
00298 }
00299 
00300 
00301 void SubprojectOptionsDialog::outsideAddClicked()
00302 {
00303     bool ok;
00304     QString dir = KInputDialog::getText(i18n("Add Include Directory"), i18n("Add include directory:"), "-I", &ok, 0);
00305     if (ok && !dir.isEmpty() && dir != "-I")
00306         new QListViewItem(outsideinc_listview, dir);
00307 }
00308 
00309 
00310 void SubprojectOptionsDialog::outsideEditClicked()
00311 {
00312     if ( (outsideinc_listview->childCount()==0) || (outsideinc_listview->currentItem() == 0) )
00313         return;
00314     bool ok;
00315     QString dir = KInputDialog::getText(i18n("Edit Include Directory"), i18n("Edit include directory:"),
00316             outsideinc_listview->currentItem()-> text(0), &ok, 0);
00317     if (ok && !dir.isEmpty())
00318         outsideinc_listview->currentItem()-> setText(0, dir);
00319 }
00320 
00321 
00322 void SubprojectOptionsDialog::outsideRemoveClicked()
00323 {
00324     delete outsideinc_listview->currentItem();
00325 }
00326 
00327 
00328 void SubprojectOptionsDialog::addPrefixClicked()
00329 {
00330     AddPrefixDialog dlg;
00331     if (!dlg.exec() || dlg.name().isEmpty() || dlg.path().isEmpty() )
00332         return;
00333 
00334     new QListViewItem(prefix_listview, dlg.name(), dlg.path());
00335 }
00336 
00337 
00338 void SubprojectOptionsDialog::editPrefixClicked()
00339 {
00340     QListViewItem* lvItem = prefix_listview->currentItem();
00341     if ( (prefix_listview->childCount()==0) || (lvItem == 0) )
00342         return;
00343     AddPrefixDialog dlg(lvItem-> text(0), lvItem-> text(1));
00344     dlg.setCaption(i18n("Edit Prefix"));
00345     if (!dlg.exec() || dlg.name().isEmpty() || dlg.path().isEmpty() )
00346         return;
00347    lvItem-> setText(0, dlg.name());
00348    lvItem-> setText(1, dlg.path());
00349 }
00350 
00351 void SubprojectOptionsDialog::removePrefixClicked()
00352 {
00353     delete prefix_listview->currentItem();
00354 }
00355 
00356 
00357 void SubprojectOptionsDialog::buildorderMoveUpClicked()
00358 {
00359     if (buildorder_listview->currentItem() == buildorder_listview->firstChild()) {
00360         KNotifyClient::beep();
00361         return;
00362     }
00363 
00364     QListViewItem *item = buildorder_listview->firstChild();
00365     while (item->nextSibling() != buildorder_listview->currentItem())
00366         item = item->nextSibling();
00367     item->moveItem(buildorder_listview->currentItem());
00368 }
00369 
00370 
00371 void SubprojectOptionsDialog::buildorderMoveDownClicked()
00372 {
00373    if (buildorder_listview->currentItem() == 0 || buildorder_listview->currentItem()->nextSibling() == 0) {
00374         KNotifyClient::beep();
00375         return;
00376    }
00377 
00378    buildorder_listview->currentItem()->moveItem(buildorder_listview->currentItem()->nextSibling());
00379 }
00380 
00381 
00382 void SubprojectOptionsDialog::accept()
00383 {
00384     storeConfig();
00385     QDialog::accept();
00386 }
00387 
00388 #include "subprojectoptionsdlg.moc"
KDE Logo
This file is part of the documentation for KDevelop Version 3.1.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Tue Feb 22 09:22:22 2005 by doxygen 1.3.9.1 written by Dimitri van Heesch, © 1997-2003