summaryrefslogtreecommitdiffstats
path: root/quanta/components/debugger/variableslistview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'quanta/components/debugger/variableslistview.cpp')
-rw-r--r--quanta/components/debugger/variableslistview.cpp290
1 files changed, 290 insertions, 0 deletions
diff --git a/quanta/components/debugger/variableslistview.cpp b/quanta/components/debugger/variableslistview.cpp
new file mode 100644
index 00000000..c9d77de3
--- /dev/null
+++ b/quanta/components/debugger/variableslistview.cpp
@@ -0,0 +1,290 @@
+/***************************************************************************
+ variableslistview.cpp
+ -----------------------
+ begin : 2004-04-04
+ copyright : (C) 2004 Thiago Silva
+
+ ***************************************************************************/
+
+/****************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+// KDE Includes
+#include <klocale.h>
+#include <kdebug.h>
+#include <kiconloader.h>
+#include <kdeversion.h>
+#include <kinputdialog.h>
+#include <qclipboard.h>
+
+// Quanta includes
+#include "variableslistview.h"
+#include "debuggervariable.h"
+#include "resource.h"
+#include "quanta.h"
+#include "messageoutput.h"
+#include "debuggerclient.h"
+#include "debuggermanager.h"
+
+namespace VariablesListViewColumns
+{
+ // The enums must correspond to the order of the columns
+ // If you change here, change the column adding
+ enum Columns
+ {
+ Name = 0,
+ Status,
+ Value,
+ Type,
+ Size
+
+ };
+}
+
+VariablesListView::VariablesListView(QWidget *parent, const char *name)
+ : KListView(parent, name)
+{
+ // If you change here, change the VariablesListViewColumns enums above
+ addColumn(i18n("Name"));
+ addColumn(QString::null);
+ addColumn(i18n("Value"));
+ addColumn(i18n("Type"));
+ addColumn(i18n("Size"));
+ setRootIsDecorated(true);
+ setSorting(-1); // No sorting
+
+ m_variablePopup = new KPopupMenu(this);
+ m_variablePopup->insertItem(SmallIcon("editdelete"), i18n("&Remove"), this, SLOT(slotRemoveSelected()), 0, removeWatch);
+
+ if(quantaApp->debugger()->client()->supports(DebuggerClientCapabilities::VariableSetValue))
+ m_variablePopup->insertItem(SmallIcon("edit"), i18n("&Set Value"), this, SLOT(slotVariableSetValue()), 0, setValue);
+
+ m_variablePopup->insertItem(SmallIcon("viewmag"), i18n("&Dump in Messages Log"), this, SLOT(slotVariableDump()), 0, dumpValue);
+
+ m_variablePopup->insertItem(SmallIcon("editcopy"), i18n("&Copy to Clipboard"), this, SLOT(slotVariableCopyToClipboard()), 0, copyValue);
+
+ connect(this, SIGNAL( contextMenu( KListView *, QListViewItem *, const QPoint & ) ), this, SLOT(slotVariableContextMenu(KListView *, QListViewItem *, const QPoint &)));
+}
+
+
+VariablesListView::~VariablesListView()
+{}
+
+DebuggerVariable* VariablesListView::selected(bool traverse)
+{
+ if(!selectedItem())
+ return NULL;
+
+ DebuggerVariable* v, *found;
+ for( v = m_variablesList.first(); v; v = m_variablesList.next())
+ {
+ found = v->findItem(selectedItem(), traverse);
+ if(found)
+ return found;
+ }
+
+ return NULL;
+}
+
+void VariablesListView::slotRemoveSelected()
+{
+ DebuggerVariable* v = selected();
+
+ if(!v)
+ return;
+
+ emit removeVariable(v);
+ m_variablesList.remove(v);
+ delete v;
+}
+
+void VariablesListView::keyPressEvent(QKeyEvent *e)
+{
+ if(e->key() != Qt::Key_Delete)
+ {
+ e->ignore();
+ return;
+ }
+
+ DebuggerVariable* v = selected();
+
+ if(!v)
+ return;
+
+ emit removeVariable(v);
+ m_variablesList.remove(v);
+ delete v;
+}
+
+void VariablesListView::addVariable(DebuggerVariable* variable)
+{
+ if(!variable)
+ {
+ kdDebug(24002) << k_funcinfo << " Tried to show NULL variable!" << endl;
+ return;
+ }
+
+ // Find the old variable in the tree if it is there
+ for(DebuggerVariable* v = m_variablesList.first(); v; v = m_variablesList.next())
+ {
+ if(v->name() == variable->name())
+ {
+ replaceVariable(v, variable);
+ return;
+ }
+ }
+
+ // Insert the new variable
+ DebuggerVariable *newvar = new DebuggerVariable(variable);
+ m_variablesList.append(newvar);
+
+ KListViewItem * item = new KListViewItem(this);
+ insertItem(item);
+ newvar->setItem(item);
+ replaceVariable(newvar, variable);
+}
+
+void VariablesListView::clear()
+{
+ KListView::clear();
+ m_variablesList.clear();
+}
+
+void VariablesListView::replaceVariable(DebuggerVariable* oldvar, DebuggerVariable* newvar)
+{
+ KListViewItem * item;
+
+ // Remove children that doesen't exist anymore
+ QPtrList<DebuggerVariable> oldlist = oldvar->values();
+ for(DebuggerVariable* oldchild = oldlist.last(); oldchild; oldchild = oldlist.prev())
+ {
+ bool found = false;
+ QPtrList<DebuggerVariable> newlist = newvar->values();
+ for(DebuggerVariable* newchild = newlist.last(); newchild; newchild = newlist.prev())
+ {
+ if(newchild->name() == oldchild->name())
+ {
+ found = true;
+ break;
+ }
+ }
+ if(!found)
+ oldvar->deleteChild(oldchild);
+ }
+
+ // Update and add children
+ QPtrList<DebuggerVariable> newlist = newvar->values();
+ for(DebuggerVariable* newchild = newlist.last(); newchild; newchild = newlist.prev())
+ {
+ bool found = false;
+ QPtrList<DebuggerVariable> oldlist = oldvar->values();
+ for(DebuggerVariable* oldchild = oldlist.last(); oldchild; oldchild = oldlist.prev())
+ {
+ if(newchild->name() == oldchild->name())
+ {
+ found = true;
+ replaceVariable( oldchild, newchild);
+ break;
+ }
+ }
+ if(!found)
+ {
+ DebuggerVariable* child = new DebuggerVariable();
+ item = new KListViewItem(oldvar->item());
+ child->setItem(item);
+ replaceVariable( child, newchild);
+ oldvar->append(child);
+ }
+ }
+
+ item = oldvar->item();
+
+ if(oldvar->value() != newvar->value())
+ item->setPixmap(VariablesListViewColumns::Status, SmallIcon("ok"));
+ else
+ item->setPixmap(VariablesListViewColumns::Status, KPixmap());
+
+ oldvar->copy(newvar, false);
+
+ item->setText(VariablesListViewColumns::Name, oldvar->name());
+ item->setText(VariablesListViewColumns::Type, oldvar->typeName());
+ item->setText(VariablesListViewColumns::Size, oldvar->sizeName());
+ item->setText(VariablesListViewColumns::Value, (newvar->isScalar() ? oldvar->value() : QString()));
+
+}
+
+void VariablesListView::slotVariableContextMenu(KListView *, QListViewItem *, const QPoint& point)
+{
+ if(!selectedItem())
+ return;
+
+ m_variablePopup->setItemEnabled(removeWatch, selected());
+ if(quantaApp->debugger()->client()->supports(DebuggerClientCapabilities::VariableSetValue))
+ m_variablePopup->setItemEnabled(setValue, selected());
+
+ DebuggerVariable *v = selected(true);
+ m_variablePopup->setItemEnabled(dumpValue, v && v->isScalar());
+ m_variablePopup->setItemEnabled(copyValue, v && v->isScalar());
+
+ m_variablePopup->popup(point);
+}
+
+void VariablesListView::slotVariableSetValue()
+{
+ if(!selected())
+ return;
+
+ DebuggerVariable v(selected());
+
+ QString newvalue;
+ switch(v.type())
+ {
+ case DebuggerVariableTypes::String:
+ newvalue = "\"" + v.value() + "\"";
+ break;
+
+ case DebuggerVariableTypes::Float:
+ case DebuggerVariableTypes::Boolean:
+ case DebuggerVariableTypes::Integer:
+ //case DebuggerVariableTypes::Array:
+ newvalue = v.value();
+ break;
+
+ default:
+ newvalue = "";
+ }
+ newvalue = KInputDialog::getMultiLineText(i18n("Set Variable"), i18n("New value:"), newvalue, 0, this);
+ if(newvalue.isNull())
+ return;
+
+ v.setValue(newvalue);
+ quantaApp->debugger()->client()->variableSetValue(v);
+
+}
+
+void VariablesListView::slotVariableDump( )
+{
+ DebuggerVariable *v = selected(true);
+ if(!v)
+ return;
+
+ quantaApp->messageOutput()->showMessage(i18n("Contents of variable %1:\n>>>\n").arg(v->name()));
+ quantaApp->messageOutput()->showMessage(v->value());
+ quantaApp->messageOutput()->showMessage("<<<\n");
+}
+
+void VariablesListView::slotVariableCopyToClipboard( )
+{
+ DebuggerVariable *v = selected(true);
+ if(!v)
+ return;
+ QApplication::clipboard()->setText(v->value());
+}
+
+#include "variableslistview.moc"