Added a primitive guess of the executable's language.
[kdbg.git] / kdbg / pgmargs.cpp
blob4147e5be59a86267e4e5e20c232b451c60745360
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 "mydebug.h"
12 PgmArgs::PgmArgs(QWidget* parent, const QString& pgm, QDict<EnvVar>& envVars) :
13 QDialog(parent, "pgmargs", true),
14 m_envVars(envVars),
15 m_label(this, "label"),
16 m_programArgs(this, "args"),
17 m_fileBrowse(this, "args_browse"),
18 m_wdLabel(this, "wd_label"),
19 m_wd(this, "wd"),
20 m_wdBrowse(this, "wd_browse"),
21 m_envLabel(this, "env_label"),
22 m_envVar(this, "env_var"),
23 m_envList(this, "env_list"),
24 m_buttonOK(this, "ok"),
25 m_buttonCancel(this, "cancel"),
26 m_buttonModify(this, "modify"),
27 m_buttonDelete(this, "delete"),
28 m_layout(this, 8),
29 m_edits(8),
30 m_buttons(8),
31 m_pgmArgsEdit(0),
32 m_wdEdit(0)
34 m_envVars.setAutoDelete(false);
36 QString title = kapp->caption();
37 title += i18n(": Program arguments");
38 setCaption(title);
40 QString lab = i18n("Run %1 with these arguments:");
42 QFileInfo fi = pgm;
43 m_label.setText(lab.arg(fi.fileName()));
45 QSize s = m_label.sizeHint();
46 /* don't make the label too wide if pgm name is very long */
47 if (s.width() > 450)
48 s.setWidth(450);
49 m_label.setMinimumSize(s);
51 s = m_programArgs.sizeHint();
52 m_programArgs.setMinimumSize(s);
53 m_programArgs.setMaxLength(10000);
55 m_fileBrowse.setText("...");
56 s = m_fileBrowse.sizeHint();
57 m_fileBrowse.setMinimumSize(s);
58 connect(&m_fileBrowse, SIGNAL(clicked()), SLOT(browseArgs()));
60 m_wdLabel.setText(i18n("Working directory:"));
61 s = m_wdLabel.sizeHint();
62 m_wdLabel.setMinimumSize(s);
63 int btnSpace = s.height();
65 m_wdBrowse.setText("...");
66 s = m_wdBrowse.sizeHint();
67 m_wdBrowse.setMinimumSize(s);
68 connect(&m_wdBrowse, SIGNAL(clicked()), SLOT(browseWd()));
70 s = m_wd.sizeHint();
71 m_wd.setMinimumSize(s);
72 m_wd.setMaxLength(10000);
73 btnSpace += s.height();
75 m_envLabel.setText(i18n("Environment variables (NAME=value):"));
76 s = m_envLabel.sizeHint();
77 m_envLabel.setMinimumSize(s);
79 s = m_envVar.sizeHint();
80 m_envVar.setMinimumSize(s);
81 m_envVar.setMaxLength(10000);
83 m_envList.setMinimumSize(330, 40);
84 m_envList.addColumn(i18n("Name"), 100);
85 m_envList.addColumn(i18n("Value"), 260);
86 connect(&m_envList, SIGNAL(currentChanged(QListViewItem*)),
87 SLOT(envListCurrentChanged(QListViewItem*)));
88 initEnvList();
90 m_buttonOK.setText(i18n("OK"));
91 m_buttonOK.setDefault(true);
92 s = m_buttonOK.sizeHint();
93 m_buttonOK.setMinimumSize(s);
94 connect(&m_buttonOK, SIGNAL(clicked()), SLOT(accept()));
96 m_buttonCancel.setText(i18n("Cancel"));
97 s = m_buttonCancel.sizeHint();
98 m_buttonCancel.setMinimumSize(s);
99 connect(&m_buttonCancel, SIGNAL(clicked()), SLOT(reject()));
101 m_buttonModify.setText(i18n("&Modify"));
102 s = m_buttonModify.sizeHint();
103 m_buttonModify.setMinimumSize(s);
104 connect(&m_buttonModify, SIGNAL(clicked()), SLOT(modifyVar()));
106 m_buttonDelete.setText(i18n("&Delete"));
107 s = m_buttonDelete.sizeHint();
108 m_buttonDelete.setMinimumSize(s);
109 connect(&m_buttonDelete, SIGNAL(clicked()), SLOT(deleteVar()));
111 m_layout.addLayout(&m_edits, 10);
112 m_layout.addLayout(&m_buttons);
113 m_edits.addWidget(&m_label);
114 m_edits.addLayout(&m_pgmArgsEdit);
115 m_edits.addWidget(&m_wdLabel);
116 m_edits.addLayout(&m_wdEdit);
117 m_edits.addWidget(&m_envLabel);
118 m_edits.addWidget(&m_envVar);
119 m_edits.addWidget(&m_envList, 10);
120 m_buttons.addWidget(&m_buttonOK);
121 m_buttons.addWidget(&m_buttonCancel);
122 m_buttons.addSpacing(btnSpace + 2*m_edits.defaultBorder());
123 m_buttons.addWidget(&m_buttonModify);
124 m_buttons.addWidget(&m_buttonDelete);
125 m_buttons.addStretch(10);
126 m_pgmArgsEdit.addWidget(&m_programArgs, 10);
127 m_pgmArgsEdit.addWidget(&m_fileBrowse);
128 m_wdEdit.addWidget(&m_wd, 10);
129 m_wdEdit.addWidget(&m_wdBrowse);
131 m_layout.activate();
133 m_programArgs.setFocus();
134 resize(300, 300);
137 PgmArgs::~PgmArgs()
141 void PgmArgs::modifyVar()
143 QString name, value;
144 parseEnvInput(name, value);
145 if (name.isEmpty() || name.find(' ') >= 0) /* disallow spaces in names */
146 return;
148 // lookup the value in the dictionary
149 EnvVar* val = m_envVars[name];
150 if (val != 0) {
151 // see if this is a zombie
152 if (val->status == EnvVar::EVdeleted) {
153 // resurrect
154 val->value = value;
155 val->status = EnvVar::EVdirty;
156 val->item = new QListViewItem(&m_envList, name, value); // inserts itself
157 m_envVars.insert(name, val);
158 } else if (value != val->value) {
159 // change the value
160 val->value = value;
161 val->status = EnvVar::EVdirty;
162 val->item->setText(1, value);
164 } else {
165 // add the value
166 val = new EnvVar;
167 val->value = value;
168 val->status = EnvVar::EVnew;
169 val->item = new QListViewItem(&m_envList, name, value); // inserts itself
170 m_envVars.insert(name, val);
174 void PgmArgs::deleteVar()
176 QString name, value;
177 parseEnvInput(name, value);
179 // lookup the value in the dictionary
180 EnvVar* val = m_envVars[name];
181 if (val == 0)
182 return;
184 // delete from list
185 QListViewItem* item = val->item;
186 val->item = 0;
187 delete item;
188 // if this is a new item, delete it completely, otherwise zombie-ize it
189 if (val->status == EnvVar::EVnew) {
190 m_envVars.remove(name);
191 delete val;
192 } else {
193 // mark value deleted
194 val->status = EnvVar::EVdeleted;
196 // clear the input
197 m_envVar.setText("");
200 void PgmArgs::parseEnvInput(QString& name, QString& value)
202 // parse input from edit field
203 QString input = m_envVar.text();
204 int equalSign = input.find('=');
205 if (equalSign >= 0) {
206 name = input.left(equalSign).stripWhiteSpace();
207 value = input.mid(equalSign+1);
208 } else {
209 name = input.stripWhiteSpace();
210 value = QString(); /* value is empty */
214 void PgmArgs::initEnvList()
216 QDictIterator<EnvVar> it = m_envVars;
217 EnvVar* val;
218 QString name;
219 for (; (val = it) != 0; ++it) {
220 val->status = EnvVar::EVclean;
221 name = it.currentKey();
222 val->item = new QListViewItem(&m_envList, name, val->value); // inserts itself
226 void PgmArgs::envListCurrentChanged(QListViewItem* item)
228 if (item == 0)
229 return;
231 // must get name from list box
232 QString name = item->text(0);
233 EnvVar* val = m_envVars[name];
234 ASSERT(val != 0);
235 if (val != 0) {
236 m_envVar.setText(name + "=" + val->value);
237 } else {
238 m_envVar.setText(name);
242 void PgmArgs::accept()
244 modifyVar();
245 QDialog::accept();
248 void PgmArgs::browseWd()
250 // browse for the working directory
251 QString newDir = KFileDialog::getExistingDirectory(wd(), this);
252 if (!newDir.isEmpty()) {
253 setWd(newDir);
257 void PgmArgs::browseArgs()
259 QString caption = i18n("Select a file name to insert as program argument");
261 // use the selection as default
262 QString f = m_programArgs.markedText();
263 f = KFileDialog::getSaveFileName(f, QString::null,
264 this, caption);
265 // don't clear the selection of no file was selected
266 if (!f.isEmpty()) {
267 m_programArgs.insert(f);
271 #include "pgmargs.moc"