00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
#ifndef _KJS_DEBUGGER_H_
00022
#define _KJS_DEBUGGER_H_
00023
00024
#include <qglobal.h>
00025
00026
#define KJS_DEBUGGER
00027
00028
#ifdef KJS_DEBUGGER
00029
00030
#include <qwidget.h>
00031
#include <qmultilineedit.h>
00032
#include <qpixmap.h>
00033
#include <qptrlist.h>
00034
#include <qptrstack.h>
00035
#include <qcheckbox.h>
00036
#include <kdialogbase.h>
00037
#include <kmainwindow.h>
00038
#include <qscrollview.h>
00039
00040
#include <kjs/debugger.h>
00041
00042
#include "dom/dom_misc.h"
00043
00044
class QListBox;
00045
class QComboBox;
00046
class KActionCollection;
00047
class KAction;
00048
00049
namespace KJS {
00050
class FunctionImp;
00051
class List;
00052
class Interpreter;
00053
class KJSDebugWin;
00054
00055
class SourceFile :
public DOM::DomShared
00056 {
00057
public:
00058 SourceFile(
QString u,
QString c, Interpreter *interp)
00059 : url(u), code(c), interpreter(interp) {}
00060
QString getCode();
00061
QString url;
00062
QString code;
00063 Interpreter *interpreter;
00064 };
00065
00081
class SourceFragment
00082 {
00083
public:
00084 SourceFragment(
int sid,
int bl,
int el, SourceFile *sf);
00085 ~SourceFragment();
00086
00087
int sourceId;
00088
int baseLine;
00089
int errorLine;
00090 SourceFile *sourceFile;
00091 };
00092
00093
class KJSErrorDialog :
public KDialogBase {
00094 Q_OBJECT
00095
public:
00096 KJSErrorDialog(
QWidget *parent,
const QString& errorMessage,
bool showDebug);
00097
virtual ~KJSErrorDialog();
00098
00099
bool debugSelected()
const {
return m_debugSelected; }
00100
bool dontShowAgain()
const {
return m_dontShowAgainCb->isChecked(); }
00101
00102
protected slots:
00103
virtual void slotUser1();
00104
00105
private:
00106
QCheckBox *m_dontShowAgainCb;
00107
bool m_debugSelected;
00108 };
00109
00110
class EvalMultiLineEdit :
public QMultiLineEdit {
00111 Q_OBJECT
00112
public:
00113 EvalMultiLineEdit(
QWidget *parent);
00114
const QString & code()
const {
return m_code; }
00115
protected:
00116
void keyPressEvent(
QKeyEvent * e);
00117
private:
00118
QString m_code;
00119 };
00120
00121
class SourceDisplay :
public QScrollView {
00122 Q_OBJECT
00123
public:
00124 SourceDisplay(KJSDebugWin *debugWin,
QWidget *parent,
const char *name = 0);
00125 ~SourceDisplay();
00126
00127
void setSource(SourceFile *sourceFile);
00128
void setCurrentLine(
int lineno,
bool doCenter =
true);
00129
00130 signals:
00131
void lineDoubleClicked(
int lineno);
00132
00133
protected:
00134
virtual void contentsMousePressEvent(
QMouseEvent *e);
00135
virtual void showEvent(
QShowEvent *);
00136
virtual void drawContents(
QPainter *p,
int clipx,
int clipy,
int clipw,
int cliph);
00137
00138
QString m_source;
00139
int m_currentLine;
00140 SourceFile *m_sourceFile;
00141
QStringList m_lines;
00142
00143 KJSDebugWin *m_debugWin;
00144
QFont m_font;
00145
QPixmap m_breakpointIcon;
00146 };
00147
00157
class KJSDebugWin :
public KMainWindow,
public Debugger,
public KInstance
00158 {
00159 Q_OBJECT
00160
friend class SourceDisplay;
00161
public:
00162 KJSDebugWin(
QWidget *parent=0,
const char *name=0);
00163
virtual ~KJSDebugWin();
00164
00165
static KJSDebugWin *createInstance();
00166
static void destroyInstance();
00167
static KJSDebugWin *debugWindow() {
return kjs_html_debugger; }
00168
00169
enum Mode { Disabled = 0,
00170 Next = 1,
00171 Step = 2,
00172 Continue = 3,
00173 Stop = 4
00174
00175 };
00176
00177
void setSourceLine(
int sourceId,
int lineno);
00178
void setNextSourceInfo(
QString url,
int baseLine);
00179
void sourceChanged(Interpreter *interpreter,
QString url);
00180
bool inSession()
const {
return !m_execStates.isEmpty(); }
00181
void setMode(Mode m) { m_mode = m; }
00182
void clearInterpreter(Interpreter *interpreter);
00183 ExecState *getExecState()
const {
return m_execStates.top(); }
00184
00185
00186
bool sourceParsed(ExecState *exec,
int sourceId,
00187
const UString &source,
int errorLine);
00188
bool sourceUnused(ExecState * exec,
int sourceId);
00189
bool exception(ExecState *exec,
const Value &value,
bool inTryCatch);
00190
bool atStatement(ExecState *exec);
00191
bool enterContext(ExecState *exec);
00192
bool exitContext(ExecState *exec,
const Completion &completion);
00193
00194
public slots:
00195
void slotNext();
00196
void slotStep();
00197
void slotContinue();
00198
void slotStop();
00199
void slotBreakNext();
00200
void slotToggleBreakpoint(
int lineno);
00201
void slotShowFrame(
int frameno);
00202
void slotSourceSelected(
int sourceSelIndex);
00203
void slotEval();
00204
00205
protected:
00206
00207
void closeEvent(
QCloseEvent *e);
00208
bool eventFilter(
QObject *obj,
QEvent *evt);
00209
void disableOtherWindows();
00210
void enableOtherWindows();
00211
00212
private:
00213
00214 SourceFile *getSourceFile(Interpreter *interpreter,
QString url);
00215
void setSourceFile(Interpreter *interpreter,
QString url, SourceFile *sourceFile);
00216
void removeSourceFile(Interpreter *interpreter,
QString url);
00217
00218
void checkBreak(ExecState *exec);
00219
void enterSession(ExecState *exec);
00220
void leaveSession();
00221
void displaySourceFile(SourceFile *sourceFile,
bool forceRefresh);
00222
void updateContextList();
00223
00224
QString contextStr(
const Context &ctx);
00225
00226
struct Breakpoint {
00227
int sourceId;
00228
int lineno;
00229 };
00230 Breakpoint *m_breakpoints;
00231
int m_breakpointCount;
00232
bool setBreakpoint(
int sourceId,
int lineno);
00233
bool deleteBreakpoint(
int sourceId,
int lineno);
00234
bool haveBreakpoint(SourceFile *sourceFile,
int line0,
int line1);
00235
bool haveBreakpoint(
int sourceId,
int line0,
int line1)
const {
00236
for (
int i = 0; i < m_breakpointCount; i++) {
00237
if (m_breakpoints[i].sourceId == sourceId &&
00238 m_breakpoints[i].lineno >= line0 &&
00239 m_breakpoints[i].lineno <= line1)
00240
return true;
00241 }
00242
return false;
00243 }
00244
00245 SourceFile *m_curSourceFile;
00246 Mode m_mode;
00247
QString m_nextSourceUrl;
00248
int m_nextSourceBaseLine;
00249
QPtrStack<ExecState> m_execStates;
00250 ExecState **m_execs;
00251
int m_execsCount;
00252
int m_execsAlloc;
00253
int m_steppingDepth;
00254
00255
QMap<QString,SourceFile*> m_sourceFiles;
00256
QMap<int,SourceFragment*> m_sourceFragments;
00257
QPtrList<SourceFile> m_sourceSelFiles;
00258
00259
KActionCollection *m_actionCollection;
00260
QPixmap m_stopIcon;
00261
QPixmap m_emptyIcon;
00262 SourceDisplay *m_sourceDisplay;
00263
QListBox *m_contextList;
00264
00265
KAction *m_stepAction;
00266
KAction *m_nextAction;
00267
KAction *m_continueAction;
00268
KAction *m_stopAction;
00269
KAction *m_breakAction;
00270
00271
QComboBox *m_sourceSel;
00272 EvalMultiLineEdit *m_evalEdit;
00273
int m_evalDepth;
00274
00275
static KJSDebugWin *kjs_html_debugger;
00276 };
00277
00278 }
00279
00280
#endif // KJS_DEBUGGER
00281
00282
#endif // _KJS_DEBUGGER_H_