summaryrefslogtreecommitdiffstats
path: root/kdbg/pgmargs.cpp
diff options
context:
space:
mode:
authorSlávek Banko <slavek.banko@axis.cz>2013-07-03 01:47:30 +0200
committerSlávek Banko <slavek.banko@axis.cz>2013-07-03 01:47:30 +0200
commit239e873a38fa91a3fbd27e134bda015922abbabd (patch)
treed7c79f740bce93768ee78b6b787c83a2115b047f /kdbg/pgmargs.cpp
downloadkdbg-239e873a38fa91a3fbd27e134bda015922abbabd.tar.gz
kdbg-239e873a38fa91a3fbd27e134bda015922abbabd.zip
Initial import
Diffstat (limited to 'kdbg/pgmargs.cpp')
-rw-r--r--kdbg/pgmargs.cpp246
1 files changed, 246 insertions, 0 deletions
diff --git a/kdbg/pgmargs.cpp b/kdbg/pgmargs.cpp
new file mode 100644
index 0000000..d51cf79
--- /dev/null
+++ b/kdbg/pgmargs.cpp
@@ -0,0 +1,246 @@
+/*
+ * Copyright Johannes Sixt
+ * This file is licensed under the GNU General Public License Version 2.
+ * See the file COPYING in the toplevel directory of the source directory.
+ */
+
+#include "pgmargs.h"
+#include <qlabel.h>
+#include <qpushbutton.h>
+#include <qlistview.h>
+#include <qlistbox.h>
+#include <qtabwidget.h>
+#include <kapplication.h>
+#include <kfiledialog.h>
+#include <klocale.h> /* i18n */
+#include "config.h"
+#include "mydebug.h"
+
+PgmArgs::PgmArgs(QWidget* parent, const QString& pgm, QDict<EnvVar>& envVars,
+ const QStringList& allOptions) :
+ PgmArgsBase(parent, "pgmargs", true),
+ m_envVars(envVars)
+{
+ m_envVars.setAutoDelete(false);
+
+ {
+ QFileInfo fi = pgm;
+ QString newText = labelArgs->text().arg(fi.fileName());
+ labelArgs->setText(newText);
+ }
+
+ // add options only if the option list is non-empty
+ if (!allOptions.isEmpty())
+ {
+ xsldbgOptions->insertStringList(allOptions);
+ }
+ else
+ {
+ delete xsldbgOptionsPage;
+ xsldbgOptionsPage = 0;
+ }
+
+ initEnvList();
+}
+
+PgmArgs::~PgmArgs()
+{
+}
+
+// initializes the selected options
+void PgmArgs::setOptions(const QStringList& selectedOptions)
+{
+ QStringList::ConstIterator it;
+ for (it = selectedOptions.begin(); it != selectedOptions.end(); ++it) {
+ for (uint i = 0; i < xsldbgOptions->count(); i++) {
+ if (xsldbgOptions->text(i) == *it) {
+ xsldbgOptions->setSelected(i, true);
+ break;
+ }
+ }
+ }
+}
+
+// returns the selected options
+QStringList PgmArgs::options() const
+{
+ QStringList sel;
+ if (xsldbgOptionsPage != 0)
+ {
+ for (uint i = 0; i < xsldbgOptions->count(); i++) {
+ if (xsldbgOptions->isSelected(i))
+ sel.append(xsldbgOptions->text(i));
+ }
+ }
+ return sel;
+}
+
+// this is a slot
+void PgmArgs::modifyVar()
+{
+ modifyVar(true); // re-add deleted entries
+}
+
+void PgmArgs::modifyVar(bool resurrect)
+{
+ QString name, value;
+ parseEnvInput(name, value);
+ if (name.isEmpty() || name.find(' ') >= 0) /* disallow spaces in names */
+ return;
+
+ // lookup the value in the dictionary
+ EnvVar* val = m_envVars[name];
+ if (val != 0) {
+ // see if this is a zombie
+ if (val->status == EnvVar::EVdeleted) {
+ // resurrect
+ if (resurrect)
+ {
+ val->value = value;
+ val->status = EnvVar::EVdirty;
+ val->item = new QListViewItem(envList, name, value); // inserts itself
+ m_envVars.insert(name, val);
+ }
+ } else if (value != val->value) {
+ // change the value
+ val->value = value;
+ val->status = EnvVar::EVdirty;
+ val->item->setText(1, value);
+ }
+ } else {
+ // add the value
+ val = new EnvVar;
+ val->value = value;
+ val->status = EnvVar::EVnew;
+ val->item = new QListViewItem(envList, name, value); // inserts itself
+ m_envVars.insert(name, val);
+ }
+ envList->setSelected(val->item, true);
+ buttonDelete->setEnabled(true);
+}
+
+// delete the selected item
+void PgmArgs::deleteVar()
+{
+ QListViewItem* item = envList->selectedItem();
+ if (item == 0)
+ return;
+ QString name = item->text(0);
+
+ // lookup the value in the dictionary
+ EnvVar* val = m_envVars[name];
+ if (val != 0)
+ {
+ // delete from list
+ val->item = 0;
+ // if this is a new item, delete it completely, otherwise zombie-ize it
+ if (val->status == EnvVar::EVnew) {
+ m_envVars.remove(name);
+ delete val;
+ } else {
+ // mark value deleted
+ val->status = EnvVar::EVdeleted;
+ }
+ }
+ delete item;
+ // there is no selected item anymore
+ buttonDelete->setEnabled(false);
+}
+
+void PgmArgs::parseEnvInput(QString& name, QString& value)
+{
+ // parse input from edit field
+ QString input = envVar->text();
+ int equalSign = input.find('=');
+ if (equalSign >= 0) {
+ name = input.left(equalSign).stripWhiteSpace();
+ value = input.mid(equalSign+1);
+ } else {
+ name = input.stripWhiteSpace();
+ value = QString(); /* value is empty */
+ }
+}
+
+void PgmArgs::initEnvList()
+{
+ QDictIterator<EnvVar> it = m_envVars;
+ EnvVar* val;
+ QString name;
+ for (; (val = it) != 0; ++it) {
+ val->status = EnvVar::EVclean;
+ name = it.currentKey();
+ val->item = new QListViewItem(envList, name, val->value); // inserts itself
+ }
+
+ envList->setAllColumnsShowFocus(true);
+ buttonDelete->setEnabled(envList->selectedItem() != 0);
+}
+
+void PgmArgs::envListCurrentChanged()
+{
+ QListViewItem* item = envList->selectedItem();
+ buttonDelete->setEnabled(item != 0);
+ if (item == 0)
+ return;
+
+ // must get name from list box
+ QString name = item->text(0);
+ EnvVar* val = m_envVars[name];
+ ASSERT(val != 0);
+ if (val != 0) {
+ envVar->setText(name + "=" + val->value);
+ } else {
+ envVar->setText(name);
+ }
+}
+
+void PgmArgs::accept()
+{
+ // simulate that the Modify button was pressed, but don't revive
+ // dead entries even if the user changed the edit box
+ modifyVar(false);
+ QDialog::accept();
+}
+
+void PgmArgs::browseWd()
+{
+ // browse for the working directory
+ QString newDir = KFileDialog::getExistingDirectory(wd(), this);
+ if (!newDir.isEmpty()) {
+ setWd(newDir);
+ }
+}
+
+void PgmArgs::browseArgFile()
+{
+ QString caption = i18n("Select a file name to insert as program argument");
+
+ // use the selection as default
+ QString f = programArgs->markedText();
+ f = KFileDialog::getSaveFileName(f, QString::null,
+ this, caption);
+ // don't clear the selection if no file was selected
+ if (!f.isEmpty()) {
+ programArgs->insert(f);
+ }
+}
+
+void PgmArgs::browseArgDir()
+{
+ QString caption = i18n("Select a directory to insert as program argument");
+
+ // use the selection as default
+ QString f = programArgs->markedText();
+ f = KFileDialog::getExistingDirectory(f, this, caption);
+ // don't clear the selection if no file was selected
+ if (!f.isEmpty()) {
+ programArgs->insert(f);
+ }
+}
+
+void PgmArgs::invokeHelp()
+{
+ kapp->invokeHTMLHelp("kdbg/argspwdenv.html");
+}
+
+#include "pgmargs.moc"