1
/***************************************************************************
2
* Copyright (C) 2001 by Bernd Gehrmann *
5
* This program is free software; you can redistribute it and/or modify *
6
* it under the terms of the GNU General Public License as published by *
7
* the Free Software Foundation; either version 2 of the License, or *
8
* (at your option) any later version. *
10
***************************************************************************/
12
#include "targetoptionsdlg.h"
14
#include <qcheckbox.h>
19
#include <klineedit.h>
20
#include <kbuttonbox.h>
22
#include <kinputdialog.h>
23
#include <kurlrequesterdlg.h>
24
#include <kurlrequester.h>
25
#include <kurlcompletion.h>
27
#include <knotifyclient.h>
28
#include <kfiledialog.h>
29
#include "autolistviewitems.h"
32
#include "autoprojectpart.h"
33
#include "autoprojectwidget.h"
36
TargetOptionsDialog::TargetOptionsDialog(AutoProjectWidget *widget, TargetItem *item,
37
QWidget *parent, const char *name)
38
: TargetOptionsDialogBase(parent, name, true)
40
setCaption( i18n("Target Options for '%1'").arg(item->name) );
41
setIcon( SmallIcon("configure") );
46
if (item->primary == "PROGRAMS") {
47
insidelib_label->setText(i18n("Link convenience libraries inside project (LDADD)"));
48
outsidelib_label->setText(i18n("Link libraries outside project (LDADD)"));
51
argumentBox->setEnabled( false );
52
// run_arguments_edit->setEnabled(false);
54
insidelib_listview->header()->hide();
55
outsidelib_listview->header()->hide();
56
insidelib_listview->setSorting(-1);
57
outsidelib_listview->setSorting(-1);
60
m_cwdEdit->completionObject()->setMode(KURLCompletion::DirCompletion);
61
m_cwdEdit->setMode( KFile::Directory | KFile::ExistingOnly | KFile::LocalOnly );
63
// Insert all convenience libraries as possible linked libraries
64
QStringList l = widget->allLibraries();
65
QStringList::ConstIterator it;
66
QString fulltargetname = m_widget->subprojectDirectory() + "/" + item->name;
67
for (it = l.begin(); it != l.end(); ++it)
68
// Do not list the target itself (a target can not link with itself)
69
if ( !fulltargetname.endsWith(*it) )
70
(void) new QCheckListItem(insidelib_listview, *it, QCheckListItem::CheckBox);
75
TargetOptionsDialog::~TargetOptionsDialog()
79
void TargetOptionsDialog::readConfig()
81
QString flagsstr = target->ldflags;
82
flagsstr.replace(QRegExp("$(KDE_PLUGIN)"), "-avoid-version -module -no-undefined $(KDE_RPATH)");
83
QStringList l1 = QStringList::split(QRegExp("[ \t]"), flagsstr);
84
QStringList::Iterator l1it;
86
l1it = l1.find("-all-static");
87
if (l1it != l1.end()) {
88
allstatic_box->setChecked(true);
91
l1it = l1.find("-avoid-version");
92
if (l1it != l1.end()) {
93
avoidversion_box->setChecked(true);
96
l1it = l1.find("-module");
97
if (l1it != l1.end()) {
98
module_box->setChecked(true);
101
l1it = l1.find("-no-undefined");
102
if (l1it != l1.end()) {
103
noundefined_box->setChecked(true);
106
ldflagsother_edit->setText(l1.join(" "));
107
dependencies_edit->setText(target->dependencies);
109
QString addstr = (target->primary == "PROGRAMS")? target->ldadd : target->libadd;
110
QStringList l2 = QStringList::split(QRegExp("[ \t]"), addstr);
112
kdDebug(9020) << "ls=: " << addstr << endl;
115
QListViewItem *lastItem = 0;
116
QStringList::Iterator l2it;
117
QCheckListItem *flitem = static_cast<QCheckListItem*>(insidelib_listview->firstChild());
118
for (l2it = l2.begin(); l2it != l2.end(); ++l2it) {
120
QCheckListItem *clitem = static_cast<QCheckListItem*>(insidelib_listview->firstChild());
123
if (*l2it == ("$(top_builddir)/" + clitem->text())) {
125
// move this item to the "top of the list"
126
if (flitem != clitem)
127
clitem->moveItem(flitem);
128
// move the "top of the list" one item down
129
flitem = static_cast<QCheckListItem*>(flitem->nextSibling());
133
clitem = static_cast<QCheckListItem*>(clitem->nextSibling());
136
if ( inlistItem == false ) {
137
QListViewItem *item = new QListViewItem(outsidelib_listview, *l2it);
139
item->moveItem(lastItem);
144
if (target->primary == "PROGRAMS")
146
run_arguments_edit->setText(DomUtil::readEntry(*m_widget->m_part->projectDom(), "/kdevautoproject/run/runarguments/" + target->name));
147
if( DomUtil::readEntry(*m_widget->m_part->projectDom(), "/kdevautoproject/run/cwd/" + target->name).isEmpty() )
149
m_cwdEdit->setURL( m_widget->m_part->buildDirectory()+"/"+URLUtil::getRelativePath(m_widget->m_part->topsourceDirectory(), m_widget->m_part->projectDirectory())+"/"+m_widget->activeDirectory() );
150
m_cwdEdit->fileDialog()->setURL( KURL::fromPathOrURL( m_widget->m_part->buildDirectory()+"/"+URLUtil::getRelativePath(m_widget->m_part->topsourceDirectory(), m_widget->m_part->projectDirectory())+"/"+m_widget->activeDirectory() ) );
153
m_cwdEdit->setURL( DomUtil::readEntry(*m_widget->m_part->projectDom(), "/kdevautoproject/run/cwd/" + target->name) );
154
m_cwdEdit->fileDialog()->setURL( KURL::fromPathOrURL( DomUtil::readEntry(*m_widget->m_part->projectDom(), "/kdevautoproject/run/cwd/" + target->name) ) );
156
debug_arguments_edit->setText(DomUtil::readEntry(*m_widget->m_part->projectDom(), "/kdevautoproject/run/debugarguments/" + target->name));
161
void TargetOptionsDialog::storeConfig()
163
QStringList flagslist;
164
if (allstatic_box->isChecked())
165
flagslist.append("-all-static");
166
if (avoidversion_box->isChecked())
167
flagslist.append("-avoid-version");
168
if (module_box->isChecked())
169
flagslist.append("-module");
170
if (noundefined_box->isChecked())
171
flagslist.append("-no-undefined");
172
flagslist.append(ldflagsother_edit->text());
173
QString new_ldflags = flagslist.join(" ");
176
QCheckListItem *clitem = static_cast<QCheckListItem*>(insidelib_listview->firstChild());
179
liblist.append("$(top_builddir)/" + clitem->text());
180
clitem = static_cast<QCheckListItem*>(clitem->nextSibling());
182
clitem = static_cast<QCheckListItem*>(outsidelib_listview->firstChild());
184
liblist.append(clitem->text());
185
clitem = static_cast<QCheckListItem*>(clitem->nextSibling());
187
QString new_addstr = liblist.join(" ");
189
QString canonname = AutoProjectTool::canonicalize(target->name);
190
QMap<QString, QString> replaceMap;
192
if (target->primary == "PROGRAMS") {
193
QString old_ldadd = target->ldadd;
194
if (new_addstr != old_ldadd) {
195
target->ldadd = new_addstr;
196
replaceMap.insert(canonname + "_LDADD", new_addstr);
200
if (target->primary == "LIBRARIES" || target->primary == "LTLIBRARIES") {
201
QString old_libadd = target->libadd;
202
if (new_addstr != old_libadd) {
203
target->libadd = new_addstr;
204
replaceMap.insert(canonname + "_LIBADD", new_addstr);
208
QString old_ldflags = target->ldflags;
209
if (new_ldflags != old_ldflags) {
210
target->ldflags = new_ldflags;
211
replaceMap.insert(canonname + "_LDFLAGS", new_ldflags);
214
QString new_dependencies = dependencies_edit->text();
215
QString old_dependencies = target->dependencies;
216
if (new_dependencies != old_dependencies) {
217
target->dependencies = new_dependencies;
218
if (!new_dependencies.isEmpty())
219
replaceMap.insert(canonname + "_DEPENDENCIES", new_dependencies);
222
// We can safely assume that this target is in the active sub project
223
AutoProjectTool::setMakefileam(m_widget->subprojectDirectory() + "/Makefile.am", replaceMap);
225
if (target->primary == "PROGRAMS")
227
DomUtil::writeEntry(*m_widget->m_part->projectDom(), "/kdevautoproject/run/runarguments/" + target->name, run_arguments_edit->text());
228
DomUtil::writeEntry(*m_widget->m_part->projectDom(), "/kdevautoproject/run/debugarguments/" + target->name, debug_arguments_edit->text());
229
DomUtil::writeEntry(*m_widget->m_part->projectDom(), "/kdevautoproject/run/cwd/" + target->name, m_cwdEdit->url());
234
void TargetOptionsDialog::insideMoveUpClicked()
236
if (!insidelib_listview->currentItem())
238
if (insidelib_listview->currentItem() == insidelib_listview->firstChild()) {
239
KNotifyClient::beep();
243
QListViewItem *item = insidelib_listview->firstChild();
244
while (item->nextSibling() != insidelib_listview->currentItem())
245
item = item->nextSibling();
246
item->moveItem(insidelib_listview->currentItem());
250
void TargetOptionsDialog::insideMoveDownClicked()
252
if (!insidelib_listview->currentItem())
255
if (insidelib_listview->currentItem()->nextSibling() == 0) {
256
KNotifyClient::beep();
260
insidelib_listview->currentItem()->moveItem(insidelib_listview->currentItem()->nextSibling());
264
void TargetOptionsDialog::outsideMoveUpClicked()
266
if (!outsidelib_listview->currentItem())
268
if (outsidelib_listview->currentItem() == outsidelib_listview->firstChild()) {
269
KNotifyClient::beep();
273
QListViewItem *item = outsidelib_listview->firstChild();
274
while (item->nextSibling() != outsidelib_listview->currentItem())
275
item = item->nextSibling();
276
item->moveItem(outsidelib_listview->currentItem());
280
void TargetOptionsDialog::outsideMoveDownClicked()
282
if (!outsidelib_listview->currentItem())
284
if (outsidelib_listview->currentItem()->nextSibling() == 0) {
285
KNotifyClient::beep();
289
outsidelib_listview->currentItem()->moveItem(outsidelib_listview->currentItem()->nextSibling());
293
void TargetOptionsDialog::outsideAddClicked()
295
KURLRequesterDlg dialog( "", i18n( "Add Library: Choose the .a/.so file, give -l<libname> or use a variable with $(FOOBAR)" ), 0, 0 );
296
dialog.urlRequester() ->setMode( KFile::File | KFile::ExistingOnly | KFile::LocalOnly );
297
dialog.urlRequester() ->setFilter( "*.so|"+i18n("Shared Library (*.so)")+"\n*.a|"+i18n("Static Library (*.a)") );
298
dialog.urlRequester() ->setURL( QString::null );
299
dialog.urlRequester() ->completionObject() ->setDir( m_widget->selectedSubproject()->path );
300
dialog.urlRequester() ->fileDialog() ->setURL( KURL::fromPathOrURL( m_widget->selectedSubproject()->path ) );
301
if ( dialog.exec() != QDialog::Accepted )
303
QString file = dialog.urlRequester() ->url();
304
if ( !file.isEmpty() )
306
if ( !file.isEmpty() )
308
if( file.startsWith("-l") )
309
new QListViewItem( outsidelib_listview, file );
314
new QListViewItem( outsidelib_listview, file );
315
if( fi.extension(false) == "a" )
317
new QListViewItem( outsidelib_listview, file );
318
}else if ( fi.extension(false) == "so" )
320
QString name = fi.fileName();
321
if( name.startsWith( "lib" ) )
323
name = "-l"+name.left( name.length() - 3 );
324
new QListViewItem( outsidelib_listview, name );
332
void TargetOptionsDialog::outsideEditClicked()
334
if ( (outsidelib_listview->childCount()==0) || (outsidelib_listview->currentItem() == 0) )
337
QString dir = KInputDialog::getText(i18n("Edit External Library"), i18n("Edit external library:"),
338
outsidelib_listview->currentItem()-> text(0), &ok, 0);
339
if (ok && !dir.isEmpty())
340
outsidelib_listview->currentItem()-> setText(0, dir);
344
void TargetOptionsDialog::outsideRemoveClicked()
346
delete outsidelib_listview->currentItem();
350
void TargetOptionsDialog::accept()
356
#include "targetoptionsdlg.moc"
357
// kate: indent-mode csands; space-indent on; indent-width 4; replace-tabs on;