Added support to debug XSLT using xsldbg by Keith Isdale.
[kdbg.git] / kdbg / pgmargs.cpp
blobe788b18c82482bf41864cc359f25ed063b77b36d
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 #if QT_VERSION >= 200
10 #include <klocale.h> /* i18n */
11 #endif
12 #include "mydebug.h"
14 PgmArgs::PgmArgs(QWidget* parent, const QString& pgm, QDict<EnvVar>& envVars) :
15 QDialog(parent, "pgmargs", true),
16 m_envVars(envVars),
17 m_label(this, "label"),
18 m_programArgs(this, "args"),
19 m_wdLabel(this, "wd_label"),
20 m_wd(this, "wd"),
21 m_wdBrowse(this, "wd_browse"),
22 m_envLabel(this, "env_label"),
23 m_envVar(this, "env_var"),
24 m_envList(this, "env_list"),
25 m_buttonOK(this, "ok"),
26 m_buttonCancel(this, "cancel"),
27 m_buttonModify(this, "modify"),
28 m_buttonDelete(this, "delete"),
29 m_layout(this, 8),
30 m_edits(8),
31 m_buttons(8),
32 m_wdEdit(0)
34 m_envVars.setAutoDelete(false);
36 QString title = kapp->getCaption();
37 title += i18n(": Program arguments");
38 setCaption(title);
40 QString fmt = i18n("Run %s with these arguments:");
41 #if QT_VERSION < 200
42 QString lab(fmt.length() + pgm.length());
43 #else
44 QString lab;
45 #endif
46 lab.sprintf(fmt, pgm.data());
47 m_label.setText(lab);
48 QSize s = m_label.sizeHint();
49 /* don't make the label too wide if pgm name is very long */
50 if (s.width() > 450)
51 s.setWidth(450);
52 m_label.setMinimumSize(s);
54 s = m_programArgs.sizeHint();
55 m_programArgs.setMinimumSize(s);
56 m_programArgs.setMaxLength(10000);
58 m_wdLabel.setText(i18n("Working directory:"));
59 s = m_wdLabel.sizeHint();
60 m_wdLabel.setMinimumSize(s);
61 int btnSpace = s.height();
63 m_wdBrowse.setText("...");
64 s = m_wdBrowse.sizeHint();
65 m_wdBrowse.setMinimumSize(s);
66 connect(&m_wdBrowse, SIGNAL(clicked()), SLOT(browseWd()));
68 s = m_wd.sizeHint();
69 m_wd.setMinimumSize(s);
70 m_wd.setMaxLength(10000);
71 btnSpace += s.height();
73 m_envLabel.setText(i18n("Environment variables (NAME=value):"));
74 s = m_envLabel.sizeHint();
75 m_envLabel.setMinimumSize(s);
77 s = m_envVar.sizeHint();
78 m_envVar.setMinimumSize(s);
79 m_envVar.setMaxLength(10000);
81 m_envList.setMinimumSize(330, 40);
82 m_envList.addColumn(i18n("Name"), 100);
83 m_envList.addColumn(i18n("Value"), 260);
84 connect(&m_envList, SIGNAL(currentChanged(QListViewItem*)),
85 SLOT(envListCurrentChanged(QListViewItem*)));
86 initEnvList();
88 m_buttonOK.setText(i18n("OK"));
89 m_buttonOK.setDefault(true);
90 s = m_buttonOK.sizeHint();
91 m_buttonOK.setMinimumSize(s);
92 connect(&m_buttonOK, SIGNAL(clicked()), SLOT(accept()));
94 m_buttonCancel.setText(i18n("Cancel"));
95 s = m_buttonCancel.sizeHint();
96 m_buttonCancel.setMinimumSize(s);
97 connect(&m_buttonCancel, SIGNAL(clicked()), SLOT(reject()));
99 m_buttonModify.setText(i18n("&Modify"));
100 s = m_buttonModify.sizeHint();
101 m_buttonModify.setMinimumSize(s);
102 connect(&m_buttonModify, SIGNAL(clicked()), SLOT(modifyVar()));
104 m_buttonDelete.setText(i18n("&Delete"));
105 s = m_buttonDelete.sizeHint();
106 m_buttonDelete.setMinimumSize(s);
107 connect(&m_buttonDelete, SIGNAL(clicked()), SLOT(deleteVar()));
109 m_layout.addLayout(&m_edits, 10);
110 m_layout.addLayout(&m_buttons);
111 m_edits.addWidget(&m_label);
112 m_edits.addWidget(&m_programArgs);
113 m_edits.addWidget(&m_wdLabel);
114 m_edits.addLayout(&m_wdEdit);
115 m_edits.addWidget(&m_envLabel);
116 m_edits.addWidget(&m_envVar);
117 m_edits.addWidget(&m_envList, 10);
118 m_buttons.addWidget(&m_buttonOK);
119 m_buttons.addWidget(&m_buttonCancel);
120 m_buttons.addSpacing(btnSpace + 2*m_edits.defaultBorder());
121 m_buttons.addWidget(&m_buttonModify);
122 m_buttons.addWidget(&m_buttonDelete);
123 m_buttons.addStretch(10);
124 m_wdEdit.addWidget(&m_wd, 10);
125 m_wdEdit.addWidget(&m_wdBrowse);
127 m_layout.activate();
129 m_programArgs.setFocus();
130 resize(300, 300);
133 PgmArgs::~PgmArgs()
137 void PgmArgs::modifyVar()
139 QString name, value;
140 parseEnvInput(name, value);
141 if (name.isEmpty() || name.find(' ') >= 0) /* disallow spaces in names */
142 return;
144 // lookup the value in the dictionary
145 EnvVar* val = m_envVars[name];
146 if (val != 0) {
147 // see if this is a zombie
148 if (val->status == EnvVar::EVdeleted) {
149 // resurrect
150 val->value = value;
151 val->status = EnvVar::EVdirty;
152 val->item = new QListViewItem(&m_envList, name, value); // inserts itself
153 m_envVars.insert(name, val);
154 } else if (value != val->value) {
155 // change the value
156 val->value = value;
157 val->status = EnvVar::EVdirty;
158 val->item->setText(1, value);
160 } else {
161 // add the value
162 val = new EnvVar;
163 val->value = value;
164 val->status = EnvVar::EVnew;
165 val->item = new QListViewItem(&m_envList, name, value); // inserts itself
166 m_envVars.insert(name, val);
170 void PgmArgs::deleteVar()
172 QString name, value;
173 parseEnvInput(name, value);
175 // lookup the value in the dictionary
176 EnvVar* val = m_envVars[name];
177 if (val == 0)
178 return;
180 // delete from list
181 QListViewItem* item = val->item;
182 val->item = 0;
183 delete item;
184 // if this is a new item, delete it completely, otherwise zombie-ize it
185 if (val->status == EnvVar::EVnew) {
186 m_envVars.remove(name);
187 delete val;
188 } else {
189 // mark value deleted
190 val->status = EnvVar::EVdeleted;
192 // clear the input
193 m_envVar.setText("");
196 void PgmArgs::parseEnvInput(QString& name, QString& value)
198 // parse input from edit field
199 QString input = m_envVar.text();
200 int equalSign = input.find('=');
201 if (equalSign >= 0) {
202 name = input.left(equalSign).stripWhiteSpace();
203 #if QT_VERSION < 200
204 value = input.mid(equalSign+1,input.length());
205 #else
206 value = input.mid(equalSign+1);
207 #endif
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 #if QT_VERSION < 200
252 QString newDir = KDirDialog::getDirectory(wd(), this);
253 #else
254 QString newDir = KFileDialog::getExistingDirectory(wd(), this);
255 #endif
256 if (!newDir.isEmpty()) {
257 setWd(newDir);
261 #include "pgmargs.moc"