khtml Library API Documentation

kjs_debugwin.h

00001 /*
00002  *  This file is part of the KDE libraries
00003  *  Copyright (C) 2000-2001 Harri Porten (porten@kde.org)
00004  *  Copyright (C) 2001,2003 Peter Kelly (pmk@post.com)
00005  *
00006  *  This library is free software; you can redistribute it and/or
00007  *  modify it under the terms of the GNU Library General Public
00008  *  License as published by the Free Software Foundation; either
00009  *  version 2 of the License, or (at your option) any later version.
00010  *
00011  *  This library is distributed in the hope that it will be useful,
00012  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014  *  Library General Public License for more details.
00015  *
00016  *  You should have received a copy of the GNU Library General Public
00017  *  License along with this library; if not, write to the Free Software
00018  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
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, // No break on any statements
00170         Next     = 1, // Will break on next statement in current context
00171         Step     = 2, // Will break on next statement in current or deeper context
00172         Continue = 3, // Will continue until next breakpoint
00173         Stop     = 4  // The script will stop execution completely,
00174                   // as soon as possible
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     // functions overridden from KJS:Debugger
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; /* maps url->SourceFile */
00256     QMap<int,SourceFragment*> m_sourceFragments; /* maps SourceId->SourceFragment */
00257     QPtrList<SourceFile> m_sourceSelFiles; /* maps combobox index->SourceFile */
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 } // namespace
00279 
00280 #endif // KJS_DEBUGGER
00281 
00282 #endif // _KJS_DEBUGGER_H_
KDE Logo
This file is part of the documentation for khtml Library Version 3.4.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Mon Jun 12 11:46:17 2006 by doxygen 1.4.4 written by Dimitri van Heesch, © 1997-2003