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_