00001
00002
00003
00004
00005
00006
00007
00008
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
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"