summaryrefslogtreecommitdiffstats
path: root/languages/ruby/debugger/variablewidget.h
diff options
context:
space:
mode:
Diffstat (limited to 'languages/ruby/debugger/variablewidget.h')
-rw-r--r--languages/ruby/debugger/variablewidget.h348
1 files changed, 348 insertions, 0 deletions
diff --git a/languages/ruby/debugger/variablewidget.h b/languages/ruby/debugger/variablewidget.h
new file mode 100644
index 00000000..c608ec45
--- /dev/null
+++ b/languages/ruby/debugger/variablewidget.h
@@ -0,0 +1,348 @@
+/***************************************************************************
+ begin : Sun Aug 8 1999
+ copyright : (C) 1999 by John Birch
+ email : jbb@kdevelop.org
+
+ Adapted for ruby debugging
+ --------------------------
+ begin : Mon Nov 1 2004
+ copyright : (C) 2004 by Richard Dale
+ email : Richard_Dale@tipitina.demon.co.uk
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _VARIABLEWIDGET_H_
+#define _VARIABLEWIDGET_H_
+
+#include "rdbcontroller.h"
+
+#include <klistview.h>
+#include <kcombobox.h>
+#include <qwidget.h>
+#include <qtooltip.h>
+#include <kdebug.h>
+
+class KLineEdit;
+
+namespace RDBDebugger
+{
+
+class LazyFetchItem;
+class VarFrameRoot;
+class GlobalRoot;
+class WatchRoot;
+class VarItem;
+class VariableTree;
+class DbgController;
+class Breakpoint;
+
+enum {
+ VAR_NAME_COLUMN = 0,
+ VALUE_COLUMN = 1
+};
+
+enum DataType {
+ UNKNOWN_TYPE,
+ VALUE_TYPE,
+ REFERENCE_TYPE,
+ ARRAY_TYPE,
+ HASH_TYPE,
+ STRUCT_TYPE,
+ COLOR_TYPE,
+ STRING_TYPE
+};
+
+class VariableWidget : public QWidget
+{
+ Q_OBJECT
+
+public:
+ VariableWidget( QWidget *parent=0, const char *name=0 );
+
+ VariableTree *varTree() const
+ { return varTree_; }
+
+ virtual void setEnabled(bool b);
+
+ void restorePartialProjectSession(const QDomElement* el);
+ void savePartialProjectSession(QDomElement* el);
+
+protected:
+ virtual void focusInEvent(QFocusEvent *e);
+
+public slots:
+ void slotAddWatchExpression();
+ void slotAddWatchExpression(const QString &expr);
+
+private:
+ VariableTree *varTree_;
+ KHistoryCombo *watchVarEditor_;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+class VariableTree : public KListView, public QToolTip
+{
+ Q_OBJECT
+//we need this to be able to emit expandItem() from within LazyFetchItem
+friend class LazyFetchItem;
+
+public:
+ VariableTree( VariableWidget *parent, const char *name=0 );
+ virtual ~VariableTree();
+
+ // Clear everything but the Watch frame
+ void clear();
+
+ int activationId() const { return activationId_; }
+ void nextActivationId();
+
+ VarFrameRoot *findFrame(int frameNo, int threadNo) const;
+
+ GlobalRoot *globalRoot();
+ WatchRoot *watchRoot();
+
+ void resetWatchVars();
+ void setCurrentThread(int currentThread) { currentThread_ = currentThread; }
+
+ // Remove items that are not active
+ void prune();
+
+ // Look for a frame where 'needsVariables()' is true.
+ // If found, send commands to the debugger to fetch
+ // the variable values.
+ // Return true if a fetch has been scheduled, otherwise
+ // false.
+ bool schedule();
+
+ // Tell the controller whether or not to fetch the
+ // values of the global variables
+ void setFetchGlobals(bool fetch);
+
+ // (from QToolTip) Display a tooltip when the cursor is over an item
+ virtual void maybeTip(const QPoint &);
+
+ virtual void setSelected(QListViewItem * item, bool selected);
+
+signals:
+ void toggleWatchpoint(const QString &varName);
+ void selectFrame(int frame, int thread);
+ void expandItem(VarItem *item, const QCString &request);
+ void fetchGlobals(bool fetch);
+ void addWatchExpression(const QString& expr, bool execute);
+ void removeWatchExpression(int displayId);
+
+public slots:
+ void slotAddWatchExpression(const QString& watchVar);
+ void slotFrameActive(int frameNo, int threadNo, const QString& frameName);
+ void slotPressed(QListViewItem * item);
+
+private slots:
+ void slotContextMenu(KListView *, QListViewItem *item);
+
+private:
+ int activationId_;
+ int currentThread_;
+ VarFrameRoot * selectedFrame_;
+
+ WatchRoot * watchRoot_;
+ GlobalRoot * globalRoot_;
+
+ friend class VarFrameRoot;
+ friend class VarItem;
+ friend class WatchRoot;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+class LazyFetchItem : public KListViewItem
+{
+public:
+ LazyFetchItem(VariableTree *parent);
+ LazyFetchItem(LazyFetchItem *parent);
+
+ virtual ~LazyFetchItem();
+
+ virtual int rtti() const { return RTTI_LAZY_FETCH_ITEM; }
+
+ virtual void prune();
+ virtual VarItem *findItem(const QString& name) const;
+
+ int currentActivationId() const { return ((VariableTree*) listView())->activationId(); }
+ virtual void setActivationId() { activationId_ = currentActivationId(); }
+ bool isActive() const { return activationId_ == currentActivationId(); }
+
+ void startWaitingForData() { waitingForData_ = true; }
+ void stopWaitingForData() { waitingForData_ = false; }
+ bool isWaitingForData() const { return waitingForData_; }
+
+protected:
+ void paintCell( QPainter *p, const QColorGroup &cg,
+ int column, int width, int align );
+
+private:
+ int activationId_;
+ bool waitingForData_;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+class VarItem : public LazyFetchItem
+{
+public:
+ VarItem( LazyFetchItem *parent, const QString &varName, DataType dataType );
+
+ virtual ~VarItem();
+
+ virtual int rtti() const { return RTTI_VAR_ITEM; }
+ virtual QString key(int column, bool ascending) const;
+
+ QString fullName() const;
+
+ DataType dataType() const;
+ void setDataType(DataType dataType);
+
+ void setOpen(bool open);
+ void setText (int column, const QString& text);
+
+ // Returns the text to be displayed as tooltip (the value)
+ QString tipText() const;
+
+ // If the item is open, fetch details via a pp command
+ void update();
+
+ // The details from the pp command have arrived, parse them
+ // and update the UI
+ void expandValue(char *data);
+
+private:
+ void paintCell( QPainter *p, const QColorGroup &cg,
+ int column, int width, int align );
+
+private:
+ QString key_;
+ QCString cache_;
+ DataType dataType_;
+ bool highlight_;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+class WatchVarItem : public VarItem
+{
+public:
+ WatchVarItem( LazyFetchItem *parent, const QString &varName, DataType dataType, int displayId = -1);
+
+ virtual ~WatchVarItem();
+
+ virtual int rtti() const { return RTTI_WATCH_VAR_ITEM; }
+
+ // The id returned by rdb after a display expression is added
+ void setDisplayId(int id);
+ int displayId();
+
+private:
+ int displayId_;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+class VarFrameRoot : public LazyFetchItem
+{
+public:
+ VarFrameRoot(VariableTree *parent, int frame, int thread);
+ virtual ~VarFrameRoot();
+
+ virtual int rtti() const { return RTTI_VAR_FRAME_ROOT; }
+
+ virtual QString key(int column, bool /*ascending*/) const {
+ return QString("%1%2").arg(RTTI_VAR_FRAME_ROOT).arg(text(column));
+ }
+
+ void addLocals(char *variables);
+ void setLocals();
+ void setOpen(bool open);
+
+ void setFrameName(const QString &frameName);
+
+ virtual void setActivationId();
+ bool needsVariables() const;
+
+ int frameNo() { return frameNo_; }
+ int threadNo() { return threadNo_; }
+
+private:
+ bool needsVariables_;
+ int frameNo_;
+ int threadNo_;
+ QCString cache_;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+class WatchRoot : public LazyFetchItem
+{
+public:
+ WatchRoot(VariableTree * parent);
+ virtual ~WatchRoot();
+
+ virtual int rtti() const { return RTTI_WATCH_ROOT; }
+
+ virtual QString key(int column, bool /*ascending*/) const {
+ return QString("%1%2").arg(RTTI_WATCH_ROOT).arg(text(column));
+ }
+
+ void setWatchExpression(char * buf, char * expr);
+ void updateWatchExpression(int id, const QString& expr);
+
+ void restorePartialProjectSession(const QDomElement* el);
+ void savePartialProjectSession(QDomElement* el);
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+class GlobalRoot : public LazyFetchItem
+{
+public:
+ GlobalRoot(VariableTree * parent);
+ virtual ~GlobalRoot();
+
+ virtual int rtti() const { return RTTI_GLOBAL_ROOT; }
+
+ virtual QString key(int column, bool /*ascending*/) const {
+ return QString("%1%2").arg(RTTI_GLOBAL_ROOT).arg(text(column));
+ }
+
+ void setOpen(bool open);
+ void setGlobals(char * globals);
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+}
+
+#endif