3 // Copyright by Johannes Sixt
4 // This file is under GPL, the GNU General Public Licence
8 #include <kfiledialog.h>
10 #include <klocale.h> /* i18n */
14 PgmArgs::PgmArgs(QWidget
* parent
, const QString
& pgm
, QDict
<EnvVar
>& envVars
) :
15 QDialog(parent
, "pgmargs", true),
17 m_label(this, "label"),
18 m_programArgs(this, "args"),
19 m_wdLabel(this, "wd_label"),
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"),
34 m_envVars
.setAutoDelete(false);
36 QString title
= kapp
->getCaption();
37 title
+= i18n(": Program arguments");
40 QString fmt
= i18n("Run %s with these arguments:");
42 QString
lab(fmt
.length() + pgm
.length());
46 lab
.sprintf(fmt
, pgm
.data());
48 QSize s
= m_label
.sizeHint();
49 /* don't make the label too wide if pgm name is very long */
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()));
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
*)));
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
);
129 m_programArgs
.setFocus();
137 void PgmArgs::modifyVar()
140 parseEnvInput(name
, value
);
141 if (name
.isEmpty() || name
.find(' ') >= 0) /* disallow spaces in names */
144 // lookup the value in the dictionary
145 EnvVar
* val
= m_envVars
[name
];
147 // see if this is a zombie
148 if (val
->status
== EnvVar::EVdeleted
) {
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
) {
157 val
->status
= EnvVar::EVdirty
;
158 val
->item
->setText(1, 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()
173 parseEnvInput(name
, value
);
175 // lookup the value in the dictionary
176 EnvVar
* val
= m_envVars
[name
];
181 QListViewItem
* item
= val
->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
);
189 // mark value deleted
190 val
->status
= EnvVar::EVdeleted
;
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();
204 value
= input
.mid(equalSign
+1,input
.length());
206 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
252 QString newDir
= KDirDialog::getDirectory(wd(), this);
254 QString newDir
= KFileDialog::getExistingDirectory(wd(), this);
256 if (!newDir
.isEmpty()) {
261 #include "pgmargs.moc"