diff --git a/kdbg/dbgmainwnd.cpp b/kdbg/dbgmainwnd.cpp
index ea92ef5..35e4ceb 100644
--- a/kdbg/dbgmainwnd.cpp
+++ b/kdbg/dbgmainwnd.cpp
@@ -276,6 +276,13 @@ void DebuggerMainWnd::initKAction()
m_findAction = KStandardAction::find(m_filesWindow, SLOT(slotViewFind()), actionCollection());
KStandardAction::findNext(m_filesWindow, SLOT(slotFindForward()), actionCollection());
KStandardAction::findPrev(m_filesWindow, SLOT(slotFindBackward()), actionCollection());
+ m_gotoLineAction = KStandardAction::gotoLine(m_filesWindow, &WinStack::slotViewGotoLine, actionCollection());
+ /*
+ * Change KStandardAction::gotoLine's internal name to prevent
+ * auto-generation of the "Go to Line..." action under the "Go" menu
+ * despite specifying the position of "go_goto_line" in the '.rc' file.
+ */
+ actionCollection()->addAction(QStringLiteral("view_goto_line"), m_gotoLineAction);
struct { QWidget* w; const char* id; QAction** act; } dw[] = {
{ m_btWindow, "view_stack", &m_btWindowAction },
@@ -518,6 +525,8 @@ void DebuggerMainWnd::updateUI()
{
m_findAction->setChecked(m_filesWindow->m_findDlg.isVisible());
m_findAction->setEnabled(m_filesWindow->hasWindows());
+ m_gotoLineAction->setChecked(m_filesWindow->m_gotoLineDlg.isVisible());
+ m_gotoLineAction->setEnabled(m_filesWindow->hasWindows());
m_bpSetAction->setEnabled(m_debugger->canChangeBreakpoints());
m_bpSetTempAction->setEnabled(m_debugger->canChangeBreakpoints());
m_bpEnableAction->setEnabled(m_debugger->canChangeBreakpoints());
diff --git a/kdbg/dbgmainwnd.h b/kdbg/dbgmainwnd.h
index 1616dfe..ba0cac0 100644
--- a/kdbg/dbgmainwnd.h
+++ b/kdbg/dbgmainwnd.h
@@ -93,6 +93,7 @@ class DebuggerMainWnd : public KXmlGuiWindow
QAction* m_coreDumpAction;
QAction* m_settingsAction;
QAction* m_findAction;
+ QAction* m_gotoLineAction;
QAction* m_btWindowAction;
QAction* m_localVariablesAction;
QAction* m_watchesAction;
diff --git a/kdbg/kdbgui.rc b/kdbg/kdbgui.rc
index 2f2dd4b..f015d0a 100644
--- a/kdbg/kdbgui.rc
+++ b/kdbg/kdbgui.rc
@@ -13,6 +13,8 @@
+
+
diff --git a/kdbg/sourcewnd.cpp b/kdbg/sourcewnd.cpp
index 1dd422a..0e6ba4f 100644
--- a/kdbg/sourcewnd.cpp
+++ b/kdbg/sourcewnd.cpp
@@ -349,6 +349,19 @@ void SourceWindow::find(const QString& text, bool caseSensitive, FindDirection d
setTextCursor(cursor);
}
+bool SourceWindow::gotoLine(int lineNo)
+{
+ // line is zero-based
+ lineNo--;
+
+ if (lineNo < 0 || lineNo >= int(m_sourceCode.size()))
+ return false;
+
+ scrollToRow(lineToRow(lineNo));
+
+ return true;
+}
+
void SourceWindow::infoMousePress(QMouseEvent* ev)
{
// we handle left and middle button
diff --git a/kdbg/sourcewnd.h b/kdbg/sourcewnd.h
index 78c0521..7a2e448 100644
--- a/kdbg/sourcewnd.h
+++ b/kdbg/sourcewnd.h
@@ -35,6 +35,7 @@ class SourceWindow : public QPlainTextEdit
void setPC(bool set, int lineNo, const DbgAddr& address, int frameNo);
enum FindDirection { findForward = 1, findBackward = -1 };
void find(const QString& text, bool caseSensitive, FindDirection dir);
+ bool gotoLine(int lineNo);
bool wordAtPoint(const QPoint& p, QString& word, QRect& r);
/**
* Translates row number (zero-based) to zero-based source line number.
diff --git a/kdbg/winstack.cpp b/kdbg/winstack.cpp
index 10b1dc3..1bb1a54 100644
--- a/kdbg/winstack.cpp
+++ b/kdbg/winstack.cpp
@@ -8,6 +8,7 @@
#include "sourcewnd.h"
#include "dbgdriver.h"
#include
+#include
#include
#include
#include
@@ -31,6 +32,9 @@ WinStack::WinStack(QWidget* parent) :
connect(&m_findDlg.m_buttonBackward,
SIGNAL(clicked()), SLOT(slotFindBackward()));
+ connect(&m_gotoLineDlg.m_buttonOk,
+ &QPushButton::clicked, this, &WinStack::slotGotoLine);
+
connect(this, SIGNAL(setTabWidth(int)), this, SLOT(slotSetTabWidth(int)));
connect(this, SIGNAL(tabCloseRequested(int)),
this, SLOT(slotCloseTab(int)));
@@ -245,6 +249,15 @@ void WinStack::slotFindBackward()
SourceWindow::findBackward);
}
+void WinStack::slotGotoLine()
+{
+ if (activeWindow()) {
+ if (activeWindow()->gotoLine(m_gotoLineDlg.lineNumber())) {
+ m_gotoLineDlg.done(0);
+ }
+ }
+}
+
bool WinStack::event(QEvent* evt)
{
if (evt->type() != QEvent::ToolTip)
@@ -335,6 +348,17 @@ void WinStack::slotViewFind()
}
}
+void WinStack::slotViewGotoLine()
+{
+ if (m_gotoLineDlg.isVisible()) {
+ m_gotoLineDlg.done(0);
+ } else {
+ m_gotoLineDlg.show();
+ m_gotoLineDlg.m_lineText.setFocus();
+ m_gotoLineDlg.m_lineText.selectAll();
+ }
+}
+
void WinStack::slotBrkptSet()
{
QString file;
@@ -437,3 +461,51 @@ void FindDialog::done(int result)
QDialog::done(result);
Q_EMIT closed();
}
+
+GotoLineDialog::GotoLineDialog() :
+ QDialog(),
+ m_lineText(this),
+ m_buttonOk(this),
+ m_buttonClose(this)
+{
+ setWindowTitle(i18n("Go to Line"));
+
+ m_lineText.setMinimumSize(330, 24);
+ m_lineText.setMaxLength(10000);
+ m_lineText.setFrame(true);
+ m_lineText.setFocus();
+
+ QIntValidator *validator = new QIntValidator(this);
+ validator->setBottom(1);
+ m_lineText.setValidator(validator);
+
+ m_buttonOk.setText(i18n("OK"));
+ m_buttonOk.setDefault(true);
+ m_buttonClose.setText(i18n("Close"));
+
+ connect(&m_buttonClose, &QPushButton::clicked, this, &QDialog::reject);
+
+ m_layout.addWidget(&m_lineText);
+ m_layout.addLayout(&m_buttons);
+
+ m_buttons.addWidget(&m_buttonOk);
+ m_buttons.addWidget(&m_buttonClose);
+
+ setLayout(&m_layout);
+}
+
+GotoLineDialog::~GotoLineDialog()
+{
+}
+
+void GotoLineDialog::closeEvent(QCloseEvent* ev)
+{
+ QDialog::closeEvent(ev);
+ Q_EMIT closed();
+}
+
+void GotoLineDialog::done(int result)
+{
+ QDialog::done(result);
+ Q_EMIT closed();
+}
diff --git a/kdbg/winstack.h b/kdbg/winstack.h
index 5c80c38..528e291 100644
--- a/kdbg/winstack.h
+++ b/kdbg/winstack.h
@@ -49,6 +49,29 @@ class FindDialog : public QDialog
QHBoxLayout m_buttons;
};
+class GotoLineDialog : public QDialog
+{
+ Q_OBJECT
+public:
+ GotoLineDialog();
+ ~GotoLineDialog();
+
+ int lineNumber() const { return m_lineText.text().toInt(); }
+ void done(int result) override;
+
+ QLineEdit m_lineText;
+ QPushButton m_buttonOk;
+ QPushButton m_buttonClose;
+
+Q_SIGNALS:
+ void closed();
+
+protected:
+ void closeEvent(QCloseEvent* ev) override;
+ QVBoxLayout m_layout;
+ QHBoxLayout m_buttons;
+};
+
class WinStack : public QTabWidget
{
@@ -84,6 +107,7 @@ class WinStack : public QTabWidget
public Q_SLOTS:
virtual void slotFindForward();
virtual void slotFindBackward();
+ virtual void slotGotoLine();
virtual void activate(const QString& filename, int lineNo, const DbgAddr& address);
void updatePC(const QString& filename, int lineNo, const DbgAddr& address, int frameNo);
void reloadAllFiles();
@@ -92,6 +116,7 @@ public Q_SLOTS:
void slotFileReload();
void slotViewFind();
+ void slotViewGotoLine();
void slotBrkptSet();
void slotBrkptSetTemp();
void slotBrkptEnable();
@@ -137,6 +162,7 @@ public Q_SLOTS:
public:
// find dialog
FindDialog m_findDlg;
+ GotoLineDialog m_gotoLineDlg;
};
#endif // WINSTACK_H