3 // Copyright by Johannes Sixt
4 // This file is under GPL, the GNU General Public Licence
8 #include <kfiledialog.h>
9 #include <klocale.h> /* i18n */
12 PgmArgs::PgmArgs(QWidget
* parent
, const QString
& pgm
, QDict
<EnvVar
>& envVars
) :
13 QDialog(parent
, "pgmargs", true),
15 m_label(this, "label"),
16 m_programArgs(this, "args"),
17 m_fileBrowse(this, "args_browse"),
18 m_wdLabel(this, "wd_label"),
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"),
34 m_envVars
.setAutoDelete(false);
36 QString title
= kapp
->caption();
37 title
+= i18n(": Program arguments");
40 QString lab
= i18n("Run %1 with these arguments:");
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 */
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()));
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
*)));
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
);
133 m_programArgs
.setFocus();
141 void PgmArgs::modifyVar()
144 parseEnvInput(name
, value
);
145 if (name
.isEmpty() || name
.find(' ') >= 0) /* disallow spaces in names */
148 // lookup the value in the dictionary
149 EnvVar
* val
= m_envVars
[name
];
151 // see if this is a zombie
152 if (val
->status
== EnvVar::EVdeleted
) {
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
) {
161 val
->status
= EnvVar::EVdirty
;
162 val
->item
->setText(1, 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()
177 parseEnvInput(name
, value
);
179 // lookup the value in the dictionary
180 EnvVar
* val
= m_envVars
[name
];
185 QListViewItem
* item
= val
->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
);
193 // mark value deleted
194 val
->status
= EnvVar::EVdeleted
;
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);
209 name
= input
.stripWhiteSpace();
210 value
= QString(); /* value is empty */
214 void PgmArgs::initEnvList()
216 QDictIterator
<EnvVar
> it
= m_envVars
;
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
)
231 // must get name from list box
232 QString name
= item
->text(0);
233 EnvVar
* val
= m_envVars
[name
];
236 m_envVar
.setText(name
+ "=" + val
->value
);
238 m_envVar
.setText(name
);
242 void PgmArgs::accept()
248 void PgmArgs::browseWd()
250 // browse for the working directory
251 QString newDir
= KFileDialog::getExistingDirectory(wd(), this);
252 if (!newDir
.isEmpty()) {
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
,
265 // don't clear the selection of no file was selected
267 m_programArgs
.insert(f
);
271 #include "pgmargs.moc"