You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
125 lines
4.4 KiB
125 lines
4.4 KiB
/*
|
|
* Copyright Johannes Sixt
|
|
* This file is licensed under the GNU General Public License Version 2.
|
|
* See the file COPYING in the toplevel directory of the source directory.
|
|
*/
|
|
|
|
#ifndef SOURCEWND_H
|
|
#define SOURCEWND_H
|
|
|
|
#include <tqpixmap.h>
|
|
#include <tqtextedit.h>
|
|
#include <tqsyntaxhighlighter.h>
|
|
#include <vector>
|
|
#include "dbgdriver.h"
|
|
|
|
// forward declarations
|
|
class KDebugger;
|
|
struct DbgAddr;
|
|
|
|
class SourceWindow : public TQTextEdit
|
|
{
|
|
TQ_OBJECT
|
|
public:
|
|
SourceWindow(const TQString& fileName, TQWidget* parent, const char* name);
|
|
~SourceWindow();
|
|
|
|
bool loadFile();
|
|
void reloadFile();
|
|
bool fileNameMatches(const TQString& other);
|
|
void scrollTo(int lineNo, const DbgAddr& address);
|
|
const TQString& fileName() const { return m_fileName; }
|
|
void updateLineItems(const KDebugger* dbg);
|
|
void setPC(bool set, int lineNo, const DbgAddr& address, int frameNo);
|
|
enum FindDirection { findForward = 1, findBackward = -1 };
|
|
void find(const TQString& text, bool caseSensitive, FindDirection dir);
|
|
bool wordAtPoint(const TQPoint& p, TQString& word, TQRect& r);
|
|
/**
|
|
* Translates row number (zero-based) to zero-based source line number.
|
|
* If sourceRow is non-zero, it is filled with the source code row
|
|
* belonging to the line number.
|
|
*/
|
|
int rowToLine(int row, int* sourceRow = 0);
|
|
/** Translates zero-based source line number to row number (zero-based) */
|
|
int lineToRow(int line);
|
|
/** Is the row disassembled? */
|
|
bool isRowExpanded(int row);
|
|
/** Does the row show disassembled code? */
|
|
bool isRowDisassCode(int row);
|
|
|
|
/** lineNo is zero-based */
|
|
void disassembled(int lineNo, const std::list<DisassembledCode>& disass);
|
|
|
|
void activeLine(int& lineNo, DbgAddr& address);
|
|
|
|
protected:
|
|
virtual void drawFrame(TQPainter* p);
|
|
virtual bool eventFilter(TQObject* watched, TQEvent* e);
|
|
virtual void contextMenuEvent(TQContextMenuEvent* e);
|
|
virtual void mousePressEvent(TQMouseEvent* ev);
|
|
virtual void keyPressEvent(TQKeyEvent* ev);
|
|
virtual void paletteChange(const TQPalette&);
|
|
void expandRow(int row);
|
|
void collapseRow(int row);
|
|
void scrollToRow(int row);
|
|
/** translates (0-based) line number plus a code address into a row number */
|
|
int lineToRow(int row, const DbgAddr& address);
|
|
|
|
void actionExpandRow(int row);
|
|
void actionCollapseRow(int row);
|
|
|
|
signals:
|
|
void clickedLeft(const TQString&, int, const DbgAddr& address, bool);
|
|
void clickedMid(const TQString&, int, const DbgAddr& address);
|
|
void disassemble(const TQString&, int);
|
|
void expanded(int lineNo); /* source lineNo has been expanded */
|
|
void collapsed(int lineNo); /* source lineNo has been collapsed */
|
|
public slots:
|
|
void setTabWidth(int numChars);
|
|
void cursorChanged(int row);
|
|
|
|
protected:
|
|
TQString m_fileName;
|
|
enum LineItem { liPC = 1, liPCup = 2,
|
|
liBP = 4, liBPdisabled = 8, liBPtemporary = 16,
|
|
liBPconditional = 32, liBPorphan = 64,
|
|
liBPany = liBP|liBPdisabled|liBPtemporary|liBPconditional|liBPorphan
|
|
};
|
|
|
|
struct SourceLine {
|
|
TQString code; /* a line of text */
|
|
std::vector<TQString> disass; /* its disassembled code */
|
|
std::vector<DbgAddr> disassAddr; /* the addresses thereof */
|
|
bool canDisass; /* if line can be disassembled */
|
|
SourceLine() : canDisass(true) { }
|
|
int findAddressRowOffset(const DbgAddr& address) const;
|
|
};
|
|
std::vector<SourceLine> m_sourceCode;
|
|
|
|
std::vector<int> m_rowToLine; //!< The source line number for each row
|
|
std::vector<uchar> m_lineItems; //!< Icons displayed on the line
|
|
TQPixmap m_pcinner; /* PC at innermost frame */
|
|
TQPixmap m_pcup; /* PC at frame up the stack */
|
|
TQPixmap m_brkena; /* enabled breakpoint */
|
|
TQPixmap m_brkdis; /* disabled breakpoint */
|
|
TQPixmap m_brktmp; /* temporary breakpoint marker */
|
|
TQPixmap m_brkcond; /* conditional breakpoint marker */
|
|
TQPixmap m_brkorph; /* orphaned breakpoint marker */
|
|
TQFont m_lineNoFont; //!< The font used to draw line numbers
|
|
int m_curRow; //!< The highlighted row
|
|
int m_widthItems; //!< The width of the item column
|
|
int m_widthPlus; //!< The width of the expander column
|
|
int m_widthLineNo; //!< The width of the line number columns
|
|
};
|
|
|
|
class HighlightCpp : public TQSyntaxHighlighter
|
|
{
|
|
SourceWindow* m_srcWnd;
|
|
|
|
public:
|
|
HighlightCpp(SourceWindow* srcWnd);
|
|
virtual int highlightParagraph(const TQString& text, int state);
|
|
};
|
|
|
|
#endif // SOURCEWND_H
|