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.
405 lines
13 KiB
405 lines
13 KiB
/***************************************************************************
|
|
* 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"
|