Program Arguments dialog: Make the Help button invoke the help page.
[kdbg.git] / kdbg / pgmargs.cpp
blobd9d964784f97ffa223bba7de04bc83867166882d
1 // $Id$
3 // Copyright by Johannes Sixt
4 // This file is under GPL, the GNU General Public Licence
6 #include "pgmargs.h"
7 #include <qlabel.h>
8 #include <qpushbutton.h>
9 #include <qlistview.h>
10 #include <qlistbox.h>
11 #include <qtabwidget.h>
12 #include <kapp.h>
13 #include <kfiledialog.h>
14 #include <klocale.h> /* i18n */
15 #include "config.h"
16 #include "mydebug.h"
18 PgmArgs::PgmArgs(QWidget* parent, const QString& pgm, QDict<EnvVar>& envVars,
19 const QStringList& allOptions) :
20 PgmArgsBase(parent, "pgmargs", true),
21 m_envVars(envVars)
23 m_envVars.setAutoDelete(false);
26 QFileInfo fi = pgm;
27 QString newText = labelArgs->text().arg(fi.fileName());
28 labelArgs->setText(newText);
31 // add options only if the option list is non-empty
32 if (!allOptions.isEmpty())
34 xsldbgOptions->insertStringList(allOptions);
36 else
38 delete xsldbgOptionsPage;
39 xsldbgOptionsPage = 0;
42 initEnvList();
45 PgmArgs::~PgmArgs()
49 // initializes the selected options
50 void PgmArgs::setOptions(const QStringList& selectedOptions)
52 QStringList::ConstIterator it;
53 for (it = selectedOptions.begin(); it != selectedOptions.end(); ++it) {
54 for (uint i = 0; i < xsldbgOptions->count(); i++) {
55 if (xsldbgOptions->text(i) == *it) {
56 xsldbgOptions->setSelected(i, true);
57 break;
63 // returns the selected options
64 QStringList PgmArgs::options() const
66 QStringList sel;
67 if (xsldbgOptionsPage != 0)
69 for (uint i = 0; i < xsldbgOptions->count(); i++) {
70 if (xsldbgOptions->isSelected(i))
71 sel.append(xsldbgOptions->text(i));
74 return sel;
77 // this is a slot
78 void PgmArgs::modifyVar()
80 modifyVar(true); // re-add deleted entries
83 void PgmArgs::modifyVar(bool resurrect)
85 QString name, value;
86 parseEnvInput(name, value);
87 if (name.isEmpty() || name.find(' ') >= 0) /* disallow spaces in names */
88 return;
90 // lookup the value in the dictionary
91 EnvVar* val = m_envVars[name];
92 if (val != 0) {
93 // see if this is a zombie
94 if (val->status == EnvVar::EVdeleted) {
95 // resurrect
96 if (resurrect)
98 val->value = value;
99 val->status = EnvVar::EVdirty;
100 val->item = new QListViewItem(envList, name, value); // inserts itself
101 m_envVars.insert(name, val);
103 } else if (value != val->value) {
104 // change the value
105 val->value = value;
106 val->status = EnvVar::EVdirty;
107 val->item->setText(1, value);
109 } else {
110 // add the value
111 val = new EnvVar;
112 val->value = value;
113 val->status = EnvVar::EVnew;
114 val->item = new QListViewItem(envList, name, value); // inserts itself
115 m_envVars.insert(name, val);
117 envList->setSelected(val->item, true);
118 buttonDelete->setEnabled(true);
121 // delete the selected item
122 void PgmArgs::deleteVar()
124 QListViewItem* item = envList->selectedItem();
125 if (item == 0)
126 return;
127 QString name = item->text(0);
129 // lookup the value in the dictionary
130 EnvVar* val = m_envVars[name];
131 if (val != 0)
133 // delete from list
134 val->item = 0;
135 // if this is a new item, delete it completely, otherwise zombie-ize it
136 if (val->status == EnvVar::EVnew) {
137 m_envVars.remove(name);
138 delete val;
139 } else {
140 // mark value deleted
141 val->status = EnvVar::EVdeleted;
144 delete item;
145 // there is no selected item anymore
146 buttonDelete->setEnabled(false);
149 void PgmArgs::parseEnvInput(QString& name, QString& value)
151 // parse input from edit field
152 QString input = envVar->text();
153 int equalSign = input.find('=');
154 if (equalSign >= 0) {
155 name = input.left(equalSign).stripWhiteSpace();
156 value = input.mid(equalSign+1);
157 } else {
158 name = input.stripWhiteSpace();
159 value = QString(); /* value is empty */
163 void PgmArgs::initEnvList()
165 QDictIterator<EnvVar> it = m_envVars;
166 EnvVar* val;
167 QString name;
168 for (; (val = it) != 0; ++it) {
169 val->status = EnvVar::EVclean;
170 name = it.currentKey();
171 val->item = new QListViewItem(envList, name, val->value); // inserts itself
174 envList->setAllColumnsShowFocus(true);
175 buttonDelete->setEnabled(envList->selectedItem() != 0);
178 void PgmArgs::envListCurrentChanged()
180 QListViewItem* item = envList->selectedItem();
181 buttonDelete->setEnabled(item != 0);
182 if (item == 0)
183 return;
185 // must get name from list box
186 QString name = item->text(0);
187 EnvVar* val = m_envVars[name];
188 ASSERT(val != 0);
189 if (val != 0) {
190 envVar->setText(name + "=" + val->value);
191 } else {
192 envVar->setText(name);
196 void PgmArgs::accept()
198 // simulate that the Modify button was pressed, but don't revive
199 // dead entries even if the user changed the edit box
200 modifyVar(false);
201 QDialog::accept();
204 void PgmArgs::browseWd()
206 // browse for the working directory
207 QString newDir = KFileDialog::getExistingDirectory(wd(), this);
208 if (!newDir.isEmpty()) {
209 setWd(newDir);
213 void PgmArgs::browseArgs()
215 QString caption = i18n("Select a file name to insert as program argument");
217 // use the selection as default
218 QString f = programArgs->markedText();
219 f = KFileDialog::getSaveFileName(f, QString::null,
220 this, caption);
221 // don't clear the selection of no file was selected
222 if (!f.isEmpty()) {
223 programArgs->insert(f);
227 void PgmArgs::invokeHelp()
229 kapp->invokeHTMLHelp("kdbg/argspwdenv.html");
232 #include "pgmargs.moc"