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.
8 #include <kfiledialog.h>
9 #include <klocale.h> /* i18n */
12 PgmArgs::PgmArgs(QWidget
* parent
, const QString
& pgm
,
13 const std::map
<QString
,QString
>& envVars
,
14 const QStringList
& allOptions
) :
21 QString newText
= labelArgs
->text().arg(fi
.fileName());
22 labelArgs
->setText(newText
);
25 // add options only if the option list is non-empty
26 if (!allOptions
.isEmpty())
28 xsldbgOptions
->addItems(allOptions
);
32 delete xsldbgOptionsPage
;
33 xsldbgOptionsPage
= 0;
37 val
.status
= EnvVar::EVclean
;
38 for (std::map
<QString
,QString
>::const_iterator i
= envVars
.begin(); i
!= envVars
.end(); ++i
)
40 val
.value
= i
->second
;
41 val
.item
= new QTreeWidgetItem(envList
, QStringList() << i
->first
<< i
->second
);
42 m_envVars
[i
->first
] = val
;
45 envList
->setAllColumnsShowFocus(true);
46 buttonDelete
->setEnabled(envList
->currentItem() != 0);
53 // initializes the selected options
54 void PgmArgs::setOptions(const QSet
<QString
>& selectedOptions
)
56 if (xsldbgOptionsPage
== 0)
59 for (int i
= 0; i
< xsldbgOptions
->count(); i
++) {
60 if (selectedOptions
.contains(xsldbgOptions
->item(i
)->text()))
62 xsldbgOptions
->item(i
)->setSelected(true);
67 // returns the selected options
68 QSet
<QString
> PgmArgs::options() const
71 if (xsldbgOptionsPage
!= 0)
73 for (int i
= 0; i
< xsldbgOptions
->count(); i
++) {
74 if (xsldbgOptions
->item(i
)->isSelected())
75 sel
.insert(xsldbgOptions
->item(i
)->text());
82 void PgmArgs::on_buttonModify_clicked()
84 modifyVar(true); // re-add deleted entries
87 void PgmArgs::modifyVar(bool resurrect
)
90 parseEnvInput(name
, value
);
91 if (name
.isEmpty() || name
.indexOf(' ') >= 0) // disallow spaces in names
94 // lookup the value in the dictionary
96 std::map
<QString
,EnvVar
>::iterator i
= m_envVars
.find(name
);
97 if (i
!= m_envVars
.end()) {
99 // see if this is a zombie
100 if (val
->status
== EnvVar::EVdeleted
) {
105 val
->status
= EnvVar::EVdirty
;
106 val
->item
= new QTreeWidgetItem(envList
, QStringList() << name
<< value
);
108 } else if (value
!= val
->value
) {
111 val
->status
= EnvVar::EVdirty
;
112 val
->item
->setText(1, value
);
116 val
= &m_envVars
[name
];
118 val
->status
= EnvVar::EVnew
;
119 val
->item
= new QTreeWidgetItem(envList
, QStringList() << name
<< value
);
121 envList
->setCurrentItem(val
->item
);
122 buttonDelete
->setEnabled(true);
125 // delete the selected item
126 void PgmArgs::on_buttonDelete_clicked()
128 QTreeWidgetItem
* item
= envList
->currentItem();
131 QString name
= item
->text(0);
133 // lookup the value in the dictionary
134 std::map
<QString
,EnvVar
>::iterator i
= m_envVars
.find(name
);
135 if (i
!= m_envVars
.end())
137 EnvVar
* val
= &i
->second
;
140 // if this is a new item, delete it completely, otherwise zombie-ize it
141 if (val
->status
== EnvVar::EVnew
) {
144 // mark value deleted
145 val
->status
= EnvVar::EVdeleted
;
149 // there is no selected item anymore
150 buttonDelete
->setEnabled(false);
153 void PgmArgs::parseEnvInput(QString
& name
, QString
& value
)
155 // parse input from edit field
156 QString input
= envVar
->text();
157 int equalSign
= input
.indexOf('=');
158 if (equalSign
>= 0) {
159 name
= input
.left(equalSign
).trimmed();
160 value
= input
.mid(equalSign
+1);
162 name
= input
.trimmed();
163 value
= QString(); /* value is empty */
167 void PgmArgs::on_envList_currentItemChanged()
169 QTreeWidgetItem
* item
= envList
->currentItem();
170 buttonDelete
->setEnabled(item
!= 0);
174 // must get name from list box
175 QString name
= item
->text(0);
176 envVar
->setText(name
+ "=" + m_envVars
[name
].value
);
179 void PgmArgs::accept()
181 // simulate that the Modify button was pressed, but don't revive
182 // dead entries even if the user changed the edit box
187 void PgmArgs::on_wdBrowse_clicked()
189 // browse for the working directory
190 QString newDir
= KFileDialog::getExistingDirectory(wd(), this);
191 if (!newDir
.isEmpty()) {
196 void PgmArgs::on_insertFile_clicked()
198 QString caption
= i18n("Select a file name to insert as program argument");
200 // use the selection as default
201 QString f
= programArgs
->selectedText();
202 f
= KFileDialog::getSaveFileName(f
, QString::null
,
204 // don't clear the selection if no file was selected
206 programArgs
->insert(f
);
210 void PgmArgs::on_insertDir_clicked()
212 QString caption
= i18n("Select a directory to insert as program argument");
214 // use the selection as default
215 QString f
= programArgs
->selectedText();
216 f
= KFileDialog::getExistingDirectory(f
, this, caption
);
217 // don't clear the selection if no file was selected
219 programArgs
->insert(f
);
223 #include "pgmargs.moc"