Fixed missing header file in make dist.
[kdbg.git] / kdbg / pgmargs.cpp
blobd4ca68b7bede9d98420bcc8fe4a70216f1c2a25b
1 // $Id$
3 // Copyright by Johannes Sixt
4 // This file is under GPL, the GNU General Public Licence
6 #include "pgmargs.h"
7 #include <kapp.h>
8 #include <kfiledialog.h>
9 #include <klocale.h> /* i18n */
10 #include "config.h"
11 #include "mydebug.h"
13 PgmArgs::PgmArgs(QWidget* parent, const QString& pgm, QDict<EnvVar>& envVars,
14 const QStringList& allOptions) :
15 QDialog(parent, "pgmargs", true),
16 m_envVars(envVars),
17 m_label(this, "label"),
18 m_programArgs(this, "args"),
19 m_fileBrowse(this, "args_browse"),
20 m_optionsLabel(this, "options_label"),
21 m_options(this, "options"),
22 m_wdLabel(this, "wd_label"),
23 m_wd(this, "wd"),
24 m_wdBrowse(this, "wd_browse"),
25 m_envLabel(this, "env_label"),
26 m_envVar(this, "env_var"),
27 m_envList(this, "env_list"),
28 m_buttonOK(this, "ok"),
29 m_buttonCancel(this, "cancel"),
30 m_buttonModify(this, "modify"),
31 m_buttonDelete(this, "delete"),
32 m_layout(this, 8),
33 m_edits(8),
34 m_buttons(8),
35 m_pgmArgsEdit(0),
36 m_wdEdit(0)
38 m_envVars.setAutoDelete(false);
40 QString title = kapp->caption();
41 title += i18n(": Program arguments");
42 setCaption(title);
44 QString lab = i18n("Run %1 with these arguments:");
46 QFileInfo fi = pgm;
47 m_label.setText(lab.arg(fi.fileName()));
49 QSize s = m_label.sizeHint();
50 /* don't make the label too wide if pgm name is very long */
51 if (s.width() > 450)
52 s.setWidth(450);
53 m_label.setMinimumSize(s);
55 s = m_programArgs.sizeHint();
56 m_programArgs.setMinimumSize(s);
57 m_programArgs.setMaxLength(10000);
59 m_fileBrowse.setText("...");
60 s = m_fileBrowse.sizeHint();
61 m_fileBrowse.setMinimumSize(s);
62 connect(&m_fileBrowse, SIGNAL(clicked()), SLOT(browseArgs()));
64 int btnSpace = 0, numSpace = 0; /* used to shift env buttons down */
66 // add options only if the option list is non-empty
67 if (!allOptions.isEmpty())
69 m_optionsLabel.setText(i18n("Options:"));
70 s = m_optionsLabel.sizeHint();
71 m_optionsLabel.setMinimumSize(s);
72 btnSpace += s.height();
74 m_options.setSelectionMode(QListBox::Multi);
76 // add 5 entries, then get size hint, then add the rest
77 QStringList rest = allOptions;
78 for (int i = 0; i < 5 && !rest.isEmpty(); i++) {
79 m_options.insertItem(rest.first());
80 rest.remove(rest.begin());
82 s = m_options.sizeHint();
83 m_options.insertStringList(rest);
85 m_options.setMinimumSize(s);
86 m_options.setMaximumHeight(s.height());
87 btnSpace += s.height();
88 numSpace += 2;
91 m_wdLabel.setText(i18n("Working directory:"));
92 s = m_wdLabel.sizeHint();
93 m_wdLabel.setMinimumSize(s);
94 btnSpace += s.height();
96 m_wdBrowse.setText("...");
97 s = m_wdBrowse.sizeHint();
98 m_wdBrowse.setMinimumSize(s);
99 connect(&m_wdBrowse, SIGNAL(clicked()), SLOT(browseWd()));
101 s = m_wd.sizeHint();
102 m_wd.setMinimumSize(s);
103 m_wd.setMaxLength(10000);
104 btnSpace += s.height();
106 m_envLabel.setText(i18n("Environment variables (NAME=value):"));
107 s = m_envLabel.sizeHint();
108 m_envLabel.setMinimumSize(s);
110 s = m_envVar.sizeHint();
111 m_envVar.setMinimumSize(s);
112 m_envVar.setMaxLength(10000);
114 m_envList.setMinimumSize(330, 40);
115 m_envList.addColumn(i18n("Name"), 100);
116 m_envList.addColumn(i18n("Value"), 260);
117 connect(&m_envList, SIGNAL(currentChanged(QListViewItem*)),
118 SLOT(envListCurrentChanged(QListViewItem*)));
119 initEnvList();
121 m_buttonOK.setText(i18n("OK"));
122 m_buttonOK.setDefault(true);
123 s = m_buttonOK.sizeHint();
124 m_buttonOK.setMinimumSize(s);
125 connect(&m_buttonOK, SIGNAL(clicked()), SLOT(accept()));
127 m_buttonCancel.setText(i18n("Cancel"));
128 s = m_buttonCancel.sizeHint();
129 m_buttonCancel.setMinimumSize(s);
130 connect(&m_buttonCancel, SIGNAL(clicked()), SLOT(reject()));
132 m_buttonModify.setText(i18n("&Modify"));
133 s = m_buttonModify.sizeHint();
134 m_buttonModify.setMinimumSize(s);
135 connect(&m_buttonModify, SIGNAL(clicked()), SLOT(modifyVar()));
137 m_buttonDelete.setText(i18n("&Delete"));
138 s = m_buttonDelete.sizeHint();
139 m_buttonDelete.setMinimumSize(s);
140 connect(&m_buttonDelete, SIGNAL(clicked()), SLOT(deleteVar()));
142 m_layout.addLayout(&m_edits, 10);
143 m_layout.addLayout(&m_buttons);
144 m_edits.addWidget(&m_label);
145 m_edits.addLayout(&m_pgmArgsEdit);
146 if (!allOptions.isEmpty()) {
147 m_edits.addWidget(&m_optionsLabel);
148 m_edits.addWidget(&m_options);
149 } else {
150 m_optionsLabel.hide();
151 m_options.hide();
152 m_options.setEnabled(false);
154 m_edits.addWidget(&m_wdLabel);
155 m_edits.addLayout(&m_wdEdit);
156 m_edits.addWidget(&m_envLabel);
157 m_edits.addWidget(&m_envVar);
158 m_edits.addWidget(&m_envList, 10);
159 m_buttons.addWidget(&m_buttonOK);
160 m_buttons.addWidget(&m_buttonCancel);
161 m_buttons.addSpacing(btnSpace + numSpace*m_edits.defaultBorder());
162 m_buttons.addWidget(&m_buttonModify);
163 m_buttons.addWidget(&m_buttonDelete);
164 m_buttons.addStretch(10);
165 m_pgmArgsEdit.addWidget(&m_programArgs, 10);
166 m_pgmArgsEdit.addWidget(&m_fileBrowse);
167 m_wdEdit.addWidget(&m_wd, 10);
168 m_wdEdit.addWidget(&m_wdBrowse);
170 m_programArgs.setFocus();
173 PgmArgs::~PgmArgs()
177 // initializes the selected options
178 void PgmArgs::setOptions(const QStringList& selectedOptions)
180 QStringList::ConstIterator it;
181 for (it = selectedOptions.begin(); it != selectedOptions.end(); ++it) {
182 for (uint i = 0; i < m_options.count(); i++) {
183 if (m_options.text(i) == *it) {
184 m_options.setSelected(i, true);
185 break;
191 // returns the selected options
192 QStringList PgmArgs::options() const
194 QStringList sel;
195 for (uint i = 0; i < m_options.count(); i++) {
196 if (m_options.isSelected(i))
197 sel.append(m_options.text(i));
199 return sel;
202 void PgmArgs::modifyVar()
204 QString name, value;
205 parseEnvInput(name, value);
206 if (name.isEmpty() || name.find(' ') >= 0) /* disallow spaces in names */
207 return;
209 // lookup the value in the dictionary
210 EnvVar* val = m_envVars[name];
211 if (val != 0) {
212 // see if this is a zombie
213 if (val->status == EnvVar::EVdeleted) {
214 // resurrect
215 val->value = value;
216 val->status = EnvVar::EVdirty;
217 val->item = new QListViewItem(&m_envList, name, value); // inserts itself
218 m_envVars.insert(name, val);
219 } else if (value != val->value) {
220 // change the value
221 val->value = value;
222 val->status = EnvVar::EVdirty;
223 val->item->setText(1, value);
225 } else {
226 // add the value
227 val = new EnvVar;
228 val->value = value;
229 val->status = EnvVar::EVnew;
230 val->item = new QListViewItem(&m_envList, name, value); // inserts itself
231 m_envVars.insert(name, val);
235 void PgmArgs::deleteVar()
237 QString name, value;
238 parseEnvInput(name, value);
240 // lookup the value in the dictionary
241 EnvVar* val = m_envVars[name];
242 if (val == 0)
243 return;
245 // delete from list
246 QListViewItem* item = val->item;
247 val->item = 0;
248 delete item;
249 // if this is a new item, delete it completely, otherwise zombie-ize it
250 if (val->status == EnvVar::EVnew) {
251 m_envVars.remove(name);
252 delete val;
253 } else {
254 // mark value deleted
255 val->status = EnvVar::EVdeleted;
257 // clear the input
258 m_envVar.setText("");
261 void PgmArgs::parseEnvInput(QString& name, QString& value)
263 // parse input from edit field
264 QString input = m_envVar.text();
265 int equalSign = input.find('=');
266 if (equalSign >= 0) {
267 name = input.left(equalSign).stripWhiteSpace();
268 value = input.mid(equalSign+1);
269 } else {
270 name = input.stripWhiteSpace();
271 value = QString(); /* value is empty */
275 void PgmArgs::initEnvList()
277 QDictIterator<EnvVar> it = m_envVars;
278 EnvVar* val;
279 QString name;
280 for (; (val = it) != 0; ++it) {
281 val->status = EnvVar::EVclean;
282 name = it.currentKey();
283 val->item = new QListViewItem(&m_envList, name, val->value); // inserts itself
287 void PgmArgs::envListCurrentChanged(QListViewItem* item)
289 if (item == 0)
290 return;
292 // must get name from list box
293 QString name = item->text(0);
294 EnvVar* val = m_envVars[name];
295 ASSERT(val != 0);
296 if (val != 0) {
297 m_envVar.setText(name + "=" + val->value);
298 } else {
299 m_envVar.setText(name);
303 void PgmArgs::accept()
305 modifyVar();
306 QDialog::accept();
309 void PgmArgs::browseWd()
311 // browse for the working directory
312 QString newDir = KFileDialog::getExistingDirectory(wd(), this);
313 if (!newDir.isEmpty()) {
314 setWd(newDir);
318 void PgmArgs::browseArgs()
320 QString caption = i18n("Select a file name to insert as program argument");
322 // use the selection as default
323 QString f = m_programArgs.markedText();
324 f = KFileDialog::getSaveFileName(f, QString::null,
325 this, caption);
326 // don't clear the selection of no file was selected
327 if (!f.isEmpty()) {
328 m_programArgs.insert(f);
332 #include "pgmargs.moc"