Convert Program Arguments dialog from Q3ListView to QTreeWidget.
[kdbg.git] / kdbg / pgmargs.cpp
blob835010d707e29e4fefe5c5430bbd5cf0a7bee5e9
1 /*
2 * Copyright Johannes Sixt
3 * This file is licensed under the GNU General Public License Version 2.
4 * See the file COPYING in the toplevel directory of the source directory.
5 */
7 #include "pgmargs.h"
8 #include <kfiledialog.h>
9 #include <klocale.h> /* i18n */
10 #include "mydebug.h"
12 PgmArgs::PgmArgs(QWidget* parent, const QString& pgm, Q3Dict<EnvVar>& envVars,
13 const QStringList& allOptions) :
14 QDialog(parent),
15 m_envVars(envVars)
17 setupUi(this);
19 m_envVars.setAutoDelete(false);
22 QFileInfo fi = pgm;
23 QString newText = labelArgs->text().arg(fi.fileName());
24 labelArgs->setText(newText);
27 // add options only if the option list is non-empty
28 if (!allOptions.isEmpty())
30 xsldbgOptions->addItems(allOptions);
32 else
34 delete xsldbgOptionsPage;
35 xsldbgOptionsPage = 0;
38 initEnvList();
41 PgmArgs::~PgmArgs()
45 // initializes the selected options
46 void PgmArgs::setOptions(const QStringList& selectedOptions)
48 QStringList::ConstIterator it;
49 for (it = selectedOptions.begin(); it != selectedOptions.end(); ++it) {
50 for (int i = 0; i < xsldbgOptions->count(); i++) {
51 if (xsldbgOptions->item(i)->text() == *it) {
52 xsldbgOptions->item(i)->setSelected(true);
53 break;
59 // returns the selected options
60 QStringList PgmArgs::options() const
62 QStringList sel;
63 if (xsldbgOptionsPage != 0)
65 for (int i = 0; i < xsldbgOptions->count(); i++) {
66 if (xsldbgOptions->item(i)->isSelected())
67 sel.append(xsldbgOptions->item(i)->text());
70 return sel;
73 // this is a slot
74 void PgmArgs::on_buttonModify_clicked()
76 modifyVar(true); // re-add deleted entries
79 void PgmArgs::modifyVar(bool resurrect)
81 QString name, value;
82 parseEnvInput(name, value);
83 if (name.isEmpty() || name.find(' ') >= 0) /* disallow spaces in names */
84 return;
86 // lookup the value in the dictionary
87 EnvVar* val = m_envVars[name];
88 if (val != 0) {
89 // see if this is a zombie
90 if (val->status == EnvVar::EVdeleted) {
91 // resurrect
92 if (resurrect)
94 val->value = value;
95 val->status = EnvVar::EVdirty;
96 val->item = new QTreeWidgetItem(envList, QStringList() << name << value);
97 m_envVars.insert(name, val);
99 } else if (value != val->value) {
100 // change the value
101 val->value = value;
102 val->status = EnvVar::EVdirty;
103 val->item->setText(1, value);
105 } else {
106 // add the value
107 val = new EnvVar;
108 val->value = value;
109 val->status = EnvVar::EVnew;
110 val->item = new QTreeWidgetItem(envList, QStringList() << name << value);
111 m_envVars.insert(name, val);
113 envList->setCurrentItem(val->item);
114 buttonDelete->setEnabled(true);
117 // delete the selected item
118 void PgmArgs::on_buttonDelete_clicked()
120 QTreeWidgetItem* item = envList->currentItem();
121 if (item == 0)
122 return;
123 QString name = item->text(0);
125 // lookup the value in the dictionary
126 EnvVar* val = m_envVars[name];
127 if (val != 0)
129 // delete from list
130 val->item = 0;
131 // if this is a new item, delete it completely, otherwise zombie-ize it
132 if (val->status == EnvVar::EVnew) {
133 m_envVars.remove(name);
134 delete val;
135 } else {
136 // mark value deleted
137 val->status = EnvVar::EVdeleted;
140 delete item;
141 // there is no selected item anymore
142 buttonDelete->setEnabled(false);
145 void PgmArgs::parseEnvInput(QString& name, QString& value)
147 // parse input from edit field
148 QString input = envVar->text();
149 int equalSign = input.find('=');
150 if (equalSign >= 0) {
151 name = input.left(equalSign).stripWhiteSpace();
152 value = input.mid(equalSign+1);
153 } else {
154 name = input.stripWhiteSpace();
155 value = QString(); /* value is empty */
159 void PgmArgs::initEnvList()
161 Q3DictIterator<EnvVar> it = m_envVars;
162 EnvVar* val;
163 QString name;
164 for (; (val = it) != 0; ++it) {
165 val->status = EnvVar::EVclean;
166 name = it.currentKey();
167 val->item = new QTreeWidgetItem(envList, QStringList() << name << val->value);
170 envList->setAllColumnsShowFocus(true);
171 buttonDelete->setEnabled(envList->currentItem() != 0);
174 void PgmArgs::on_envList_currentItemChanged()
176 QTreeWidgetItem* item = envList->currentItem();
177 buttonDelete->setEnabled(item != 0);
178 if (item == 0)
179 return;
181 // must get name from list box
182 QString name = item->text(0);
183 EnvVar* val = m_envVars[name];
184 ASSERT(val != 0);
185 if (val != 0) {
186 envVar->setText(name + "=" + val->value);
187 } else {
188 envVar->setText(name);
192 void PgmArgs::accept()
194 // simulate that the Modify button was pressed, but don't revive
195 // dead entries even if the user changed the edit box
196 modifyVar(false);
197 QDialog::accept();
200 void PgmArgs::on_wdBrowse_clicked()
202 // browse for the working directory
203 QString newDir = KFileDialog::getExistingDirectory(wd(), this);
204 if (!newDir.isEmpty()) {
205 setWd(newDir);
209 void PgmArgs::on_insertFile_clicked()
211 QString caption = i18n("Select a file name to insert as program argument");
213 // use the selection as default
214 QString f = programArgs->markedText();
215 f = KFileDialog::getSaveFileName(f, QString::null,
216 this, caption);
217 // don't clear the selection if no file was selected
218 if (!f.isEmpty()) {
219 programArgs->insert(f);
223 void PgmArgs::on_insertDir_clicked()
225 QString caption = i18n("Select a directory to insert as program argument");
227 // use the selection as default
228 QString f = programArgs->markedText();
229 f = KFileDialog::getExistingDirectory(f, this, caption);
230 // don't clear the selection if no file was selected
231 if (!f.isEmpty()) {
232 programArgs->insert(f);
236 #include "pgmargs.moc"