2008-12-02 12:01:29 +01:00
|
|
|
/***************************************************************************
|
|
|
|
|
**
|
|
|
|
|
** This file is part of Qt Creator
|
|
|
|
|
**
|
2009-01-13 19:21:51 +01:00
|
|
|
** Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
|
2008-12-02 12:01:29 +01:00
|
|
|
**
|
|
|
|
|
** Contact: Qt Software Information (qt-info@nokia.com)
|
|
|
|
|
**
|
2008-12-02 14:17:16 +01:00
|
|
|
**
|
|
|
|
|
** Non-Open Source Usage
|
|
|
|
|
**
|
2008-12-02 12:01:29 +01:00
|
|
|
** Licensees may use this file in accordance with the Qt Beta Version
|
|
|
|
|
** License Agreement, Agreement version 2.2 provided with the Software or,
|
|
|
|
|
** alternatively, in accordance with the terms contained in a written
|
2008-12-02 14:17:16 +01:00
|
|
|
** agreement between you and Nokia.
|
|
|
|
|
**
|
|
|
|
|
** GNU General Public License Usage
|
|
|
|
|
**
|
2008-12-02 12:01:29 +01:00
|
|
|
** Alternatively, this file may be used under the terms of the GNU General
|
|
|
|
|
** Public License versions 2.0 or 3.0 as published by the Free Software
|
|
|
|
|
** Foundation and appearing in the file LICENSE.GPL included in the packaging
|
|
|
|
|
** of this file. Please review the following information to ensure GNU
|
|
|
|
|
** General Public Licensing requirements will be met:
|
|
|
|
|
**
|
|
|
|
|
** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
|
|
|
|
|
** http://www.gnu.org/copyleft/gpl.html.
|
|
|
|
|
**
|
|
|
|
|
** In addition, as a special exception, Nokia gives you certain additional
|
2008-12-02 14:17:16 +01:00
|
|
|
** rights. These rights are described in the Nokia Qt GPL Exception
|
2008-12-16 17:20:00 +01:00
|
|
|
** version 1.3, included in the file GPL_EXCEPTION.txt in this package.
|
2008-12-02 14:17:16 +01:00
|
|
|
**
|
|
|
|
|
***************************************************************************/
|
2008-12-02 15:08:31 +01:00
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
#include "debuggerplugin.h"
|
|
|
|
|
|
|
|
|
|
#include "debuggerconstants.h"
|
|
|
|
|
#include "debuggermanager.h"
|
|
|
|
|
#include "debuggerrunner.h"
|
|
|
|
|
#include "gdboptionpage.h"
|
|
|
|
|
#include "gdbengine.h"
|
|
|
|
|
|
2009-01-13 13:39:31 +01:00
|
|
|
#include <coreplugin/actionmanager/actionmanager.h>
|
2009-01-13 18:15:24 +01:00
|
|
|
#include <coreplugin/basemode.h>
|
2008-12-02 12:01:29 +01:00
|
|
|
#include <coreplugin/coreconstants.h>
|
|
|
|
|
#include <coreplugin/editormanager/editormanager.h>
|
2009-01-13 18:15:24 +01:00
|
|
|
#include <coreplugin/findplaceholder.h>
|
2008-12-02 12:01:29 +01:00
|
|
|
#include <coreplugin/icore.h>
|
|
|
|
|
#include <coreplugin/messagemanager.h>
|
2009-01-13 18:15:24 +01:00
|
|
|
#include <coreplugin/minisplitter.h>
|
2008-12-02 12:01:29 +01:00
|
|
|
#include <coreplugin/modemanager.h>
|
2009-01-13 18:15:24 +01:00
|
|
|
#include <coreplugin/navigationwidget.h>
|
|
|
|
|
#include <coreplugin/outputpane.h>
|
|
|
|
|
#include <coreplugin/rightpane.h>
|
2008-12-02 12:01:29 +01:00
|
|
|
#include <coreplugin/uniqueidmanager.h>
|
2008-12-09 16:18:28 +01:00
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
#include <cplusplus/ExpressionUnderCursor.h>
|
2008-12-09 16:18:28 +01:00
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
#include <cppeditor/cppeditorconstants.h>
|
2008-12-09 16:18:28 +01:00
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
#include <projectexplorer/projectexplorerconstants.h>
|
|
|
|
|
#include <projectexplorer/session.h>
|
2008-12-09 16:18:28 +01:00
|
|
|
|
|
|
|
|
#include <texteditor/basetexteditor.h>
|
2008-12-02 12:01:29 +01:00
|
|
|
#include <texteditor/basetextmark.h>
|
|
|
|
|
#include <texteditor/itexteditor.h>
|
|
|
|
|
#include <texteditor/texteditorconstants.h>
|
2008-12-09 16:18:28 +01:00
|
|
|
|
|
|
|
|
#include <utils/qtcassert.h>
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
|
#include <QtCore/QDebug>
|
|
|
|
|
#include <QtCore/QObject>
|
|
|
|
|
#include <QtCore/QPoint>
|
|
|
|
|
#include <QtCore/QSettings>
|
2009-01-05 12:54:52 +01:00
|
|
|
#include <QtCore/QtPlugin>
|
2008-12-09 16:18:28 +01:00
|
|
|
|
2009-01-13 17:41:23 +01:00
|
|
|
#include <QtGui/QDockWidget>
|
2009-01-13 18:15:24 +01:00
|
|
|
#include <QtGui/QMainWindow>
|
2008-12-02 12:01:29 +01:00
|
|
|
#include <QtGui/QPlainTextEdit>
|
|
|
|
|
#include <QtGui/QTextBlock>
|
|
|
|
|
#include <QtGui/QTextCursor>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
using namespace Core;
|
2009-01-13 18:15:24 +01:00
|
|
|
using namespace Debugger::Constants;
|
|
|
|
|
using namespace Debugger::Internal;
|
2008-12-02 12:01:29 +01:00
|
|
|
using namespace ProjectExplorer;
|
2009-01-13 18:15:24 +01:00
|
|
|
using namespace TextEditor;
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace Debugger {
|
|
|
|
|
namespace Constants {
|
|
|
|
|
|
|
|
|
|
const char * const STARTEXTERNAL = "Debugger.StartExternal";
|
|
|
|
|
const char * const ATTACHEXTERNAL = "Debugger.AttachExternal";
|
|
|
|
|
|
|
|
|
|
const char * const RUN_TO_LINE = "Debugger.RunToLine";
|
|
|
|
|
const char * const RUN_TO_FUNCTION = "Debugger.RunToFunction";
|
|
|
|
|
const char * const JUMP_TO_LINE = "Debugger.JumpToLine";
|
|
|
|
|
const char * const TOGGLE_BREAK = "Debugger.ToggleBreak";
|
|
|
|
|
const char * const BREAK_BY_FUNCTION = "Debugger.BreakByFunction";
|
|
|
|
|
const char * const BREAK_AT_MAIN = "Debugger.BreakAtMain";
|
|
|
|
|
const char * const DEBUG_DUMPERS = "Debugger.DebugDumpers";
|
|
|
|
|
const char * const ADD_TO_WATCH = "Debugger.AddToWatch";
|
|
|
|
|
const char * const USE_CUSTOM_DUMPERS = "Debugger.UseCustomDumpers";
|
|
|
|
|
const char * const USE_FAST_START = "Debugger.UseFastStart";
|
2008-12-08 19:26:00 +01:00
|
|
|
const char * const USE_TOOL_TIPS = "Debugger.UseToolTips";
|
2008-12-02 12:01:29 +01:00
|
|
|
const char * const SKIP_KNOWN_FRAMES = "Debugger.SkipKnownFrames";
|
|
|
|
|
const char * const DUMP_LOG = "Debugger.DumpLog";
|
|
|
|
|
|
|
|
|
|
#ifdef Q_OS_MAC
|
|
|
|
|
const char * const INTERRUPT_KEY = "Shift+F5";
|
|
|
|
|
const char * const RESET_KEY = "Ctrl+Shift+F5";
|
|
|
|
|
const char * const STEP_KEY = "F7";
|
|
|
|
|
const char * const STEPOUT_KEY = "Shift+F7";
|
|
|
|
|
const char * const NEXT_KEY = "F6";
|
|
|
|
|
const char * const STEPI_KEY = "Shift+F9";
|
|
|
|
|
const char * const NEXTI_KEY = "Shift+F6";
|
|
|
|
|
const char * const RUN_TO_LINE_KEY = "Shift+F8";
|
|
|
|
|
const char * const RUN_TO_FUNCTION_KEY = "Ctrl+F6";
|
|
|
|
|
const char * const JUMP_TO_LINE_KEY = "Alt+D,Alt+L";
|
|
|
|
|
const char * const TOGGLE_BREAK_KEY = "F8";
|
|
|
|
|
const char * const BREAK_BY_FUNCTION_KEY = "Alt+D,Alt+F";
|
|
|
|
|
const char * const BREAK_AT_MAIN_KEY = "Alt+D,Alt+M";
|
|
|
|
|
const char * const ADD_TO_WATCH_KEY = "Alt+D,Alt+W";
|
|
|
|
|
#else
|
|
|
|
|
const char * const INTERRUPT_KEY = "Shift+F5";
|
|
|
|
|
const char * const RESET_KEY = "Ctrl+Shift+F5";
|
|
|
|
|
const char * const STEP_KEY = "F11";
|
|
|
|
|
const char * const STEPOUT_KEY = "Shift+F11";
|
|
|
|
|
const char * const NEXT_KEY = "F10";
|
|
|
|
|
const char * const STEPI_KEY = "";
|
|
|
|
|
const char * const NEXTI_KEY = "";
|
|
|
|
|
const char * const RUN_TO_LINE_KEY = "";
|
|
|
|
|
const char * const RUN_TO_FUNCTION_KEY = "";
|
|
|
|
|
const char * const JUMP_TO_LINE_KEY = "";
|
|
|
|
|
const char * const TOGGLE_BREAK_KEY = "F9";
|
|
|
|
|
const char * const BREAK_BY_FUNCTION_KEY = "";
|
|
|
|
|
const char * const BREAK_AT_MAIN_KEY = "";
|
|
|
|
|
const char * const ADD_TO_WATCH_KEY = "Ctrl+Alt+Q";
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
} // namespace Constants
|
|
|
|
|
} // namespace Debugger
|
|
|
|
|
|
|
|
|
|
|
2009-01-13 18:15:24 +01:00
|
|
|
namespace Debugger {
|
|
|
|
|
namespace Internal {
|
|
|
|
|
|
|
|
|
|
class DebugMode : public Core::BaseMode
|
|
|
|
|
{
|
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
DebugMode(QObject *parent = 0);
|
|
|
|
|
~DebugMode();
|
|
|
|
|
|
|
|
|
|
// IMode
|
|
|
|
|
void activated() {}
|
|
|
|
|
void shutdown() {}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
} // namespace Internal
|
|
|
|
|
} // namespace Debugger
|
|
|
|
|
|
|
|
|
|
DebugMode::DebugMode(QObject *parent)
|
2009-01-14 12:00:22 +01:00
|
|
|
: BaseMode(parent)
|
2009-01-13 18:15:24 +01:00
|
|
|
{
|
2009-01-14 12:00:22 +01:00
|
|
|
setName(tr("Debug"));
|
|
|
|
|
setUniqueModeName(Constants::MODE_DEBUG);
|
|
|
|
|
setIcon(QIcon(":/fancyactionbar/images/mode_Debug.png"));
|
|
|
|
|
setPriority(Constants::P_MODE_DEBUG);
|
2009-01-13 18:15:24 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DebugMode::~DebugMode()
|
|
|
|
|
{
|
|
|
|
|
// Make sure the editor manager does not get deleted
|
|
|
|
|
EditorManager::instance()->setParent(0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
|
|
|
//
|
|
|
|
|
// LocationMark
|
|
|
|
|
//
|
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
class Debugger::Internal::LocationMark
|
|
|
|
|
: public TextEditor::BaseTextMark
|
|
|
|
|
{
|
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
LocationMark(const QString &fileName, int linenumber)
|
|
|
|
|
: BaseTextMark(fileName, linenumber)
|
2008-12-12 17:49:52 +01:00
|
|
|
{}
|
2008-12-02 12:01:29 +01:00
|
|
|
~LocationMark();
|
|
|
|
|
|
|
|
|
|
QIcon icon() const;
|
|
|
|
|
void updateLineNumber(int /*lineNumber*/) {}
|
|
|
|
|
void updateBlock(const QTextBlock & /*block*/) {}
|
2008-12-12 17:49:52 +01:00
|
|
|
void removedFromEditor() {}
|
2008-12-02 12:01:29 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
LocationMark::~LocationMark()
|
|
|
|
|
{
|
2008-12-12 17:49:52 +01:00
|
|
|
//qDebug() << "LOCATIONMARK DESTRUCTOR";
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QIcon LocationMark::icon() const
|
|
|
|
|
{
|
|
|
|
|
static const QIcon icon(":/gdbdebugger/images/location.svg");
|
|
|
|
|
return icon;
|
|
|
|
|
}
|
|
|
|
|
|
2009-01-13 18:15:24 +01:00
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
|
|
|
//
|
|
|
|
|
// DebuggerPlugin
|
|
|
|
|
//
|
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
DebuggerPlugin::DebuggerPlugin()
|
|
|
|
|
{
|
|
|
|
|
m_pm = 0;
|
|
|
|
|
m_generalOptionPage = 0;
|
|
|
|
|
m_locationMark = 0;
|
|
|
|
|
m_manager = 0;
|
2009-01-13 18:15:24 +01:00
|
|
|
m_debugMode = 0;
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DebuggerPlugin::~DebuggerPlugin()
|
|
|
|
|
{}
|
|
|
|
|
|
2009-01-13 18:15:24 +01:00
|
|
|
static QSettings *settings()
|
|
|
|
|
{
|
|
|
|
|
return ExtensionSystem::PluginManager::instance()->getObject<ICore>()->settings();
|
|
|
|
|
}
|
|
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
void DebuggerPlugin::shutdown()
|
|
|
|
|
{
|
|
|
|
|
if (m_debugMode)
|
|
|
|
|
m_debugMode->shutdown(); // saves state including manager information
|
2008-12-09 12:08:56 +01:00
|
|
|
QTC_ASSERT(m_manager, /**/);
|
2008-12-02 12:01:29 +01:00
|
|
|
if (m_manager)
|
|
|
|
|
m_manager->shutdown();
|
|
|
|
|
|
2009-01-13 18:15:24 +01:00
|
|
|
writeSettings();
|
|
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
//qDebug() << "DebuggerPlugin::~DebuggerPlugin";
|
|
|
|
|
removeObject(m_debugMode);
|
|
|
|
|
removeObject(m_generalOptionPage);
|
|
|
|
|
|
|
|
|
|
// FIXME: when using the line below, BreakWindow etc gets deleted twice.
|
|
|
|
|
// so better leak for now...
|
|
|
|
|
delete m_debugMode;
|
|
|
|
|
m_debugMode = 0;
|
|
|
|
|
|
|
|
|
|
delete m_generalOptionPage;
|
|
|
|
|
m_generalOptionPage = 0;
|
|
|
|
|
|
|
|
|
|
delete m_locationMark;
|
|
|
|
|
m_locationMark = 0;
|
|
|
|
|
|
|
|
|
|
delete m_manager;
|
|
|
|
|
m_manager = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool DebuggerPlugin::initialize(const QStringList &arguments, QString *error_message)
|
|
|
|
|
{
|
|
|
|
|
Q_UNUSED(arguments);
|
|
|
|
|
Q_UNUSED(error_message);
|
|
|
|
|
|
|
|
|
|
m_manager = new DebuggerManager;
|
|
|
|
|
|
|
|
|
|
m_pm = ExtensionSystem::PluginManager::instance();
|
|
|
|
|
|
|
|
|
|
ICore *core = m_pm->getObject<Core::ICore>();
|
2008-12-09 12:08:56 +01:00
|
|
|
QTC_ASSERT(core, return false);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-01-13 17:41:23 +01:00
|
|
|
Core::ActionManager *am = core->actionManager();
|
|
|
|
|
QTC_ASSERT(am, return false);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
|
Core::UniqueIDManager *uidm = core->uniqueIDManager();
|
2008-12-09 12:08:56 +01:00
|
|
|
QTC_ASSERT(uidm, return false);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
|
QList<int> globalcontext;
|
|
|
|
|
globalcontext << Core::Constants::C_GLOBAL_ID;
|
|
|
|
|
|
|
|
|
|
QList<int> cppcontext;
|
|
|
|
|
cppcontext << uidm->uniqueIdentifier(ProjectExplorer::Constants::LANG_CXX);
|
|
|
|
|
|
|
|
|
|
QList<int> debuggercontext;
|
|
|
|
|
debuggercontext << uidm->uniqueIdentifier(C_GDBDEBUGGER);
|
|
|
|
|
|
|
|
|
|
QList<int> cppeditorcontext;
|
|
|
|
|
cppeditorcontext << uidm->uniqueIdentifier(CppEditor::Constants::C_CPPEDITOR);
|
|
|
|
|
|
|
|
|
|
QList<int> texteditorcontext;
|
|
|
|
|
texteditorcontext << uidm->uniqueIdentifier(TextEditor::Constants::C_TEXTEDITOR);
|
|
|
|
|
|
|
|
|
|
m_gdbRunningContext = uidm->uniqueIdentifier(Constants::GDBRUNNING);
|
|
|
|
|
|
2008-12-05 16:39:33 +01:00
|
|
|
m_breakpointMarginAction = new QAction(this);
|
|
|
|
|
m_breakpointMarginAction->setText("Toggle Breakpoint");
|
|
|
|
|
//m_breakpointMarginAction->setIcon(QIcon(":/gdbdebugger/images/breakpoint.svg"));
|
|
|
|
|
connect(m_breakpointMarginAction, SIGNAL(triggered()),
|
|
|
|
|
this, SLOT(breakpointMarginActionTriggered()));
|
|
|
|
|
|
2009-01-14 12:39:59 +01:00
|
|
|
//Core::ActionContainer *mcppcontext =
|
2009-01-13 17:41:23 +01:00
|
|
|
// am->actionContainer(CppEditor::Constants::M_CONTEXT);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-01-14 12:39:59 +01:00
|
|
|
Core::ActionContainer *mdebug =
|
2009-01-13 17:41:23 +01:00
|
|
|
am->actionContainer(ProjectExplorer::Constants::M_DEBUG);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-01-14 13:17:53 +01:00
|
|
|
Core::Command *cmd = 0;
|
2009-01-13 17:41:23 +01:00
|
|
|
cmd = am->registerAction(m_manager->m_startExternalAction,
|
2008-12-02 12:01:29 +01:00
|
|
|
Constants::STARTEXTERNAL, globalcontext);
|
|
|
|
|
mdebug->addAction(cmd, Core::Constants::G_DEFAULT_ONE);
|
|
|
|
|
|
|
|
|
|
#ifndef Q_OS_WIN
|
2009-01-13 17:41:23 +01:00
|
|
|
cmd = am->registerAction(m_manager->m_attachExternalAction,
|
2008-12-02 12:01:29 +01:00
|
|
|
Constants::ATTACHEXTERNAL, globalcontext);
|
|
|
|
|
mdebug->addAction(cmd, Core::Constants::G_DEFAULT_ONE);
|
|
|
|
|
#endif
|
|
|
|
|
|
2009-01-13 17:41:23 +01:00
|
|
|
cmd = am->registerAction(m_manager->m_continueAction,
|
2008-12-02 12:01:29 +01:00
|
|
|
ProjectExplorer::Constants::DEBUG, QList<int>()<< m_gdbRunningContext);
|
|
|
|
|
|
2009-01-13 17:41:23 +01:00
|
|
|
cmd = am->registerAction(m_manager->m_stopAction,
|
2008-12-02 12:01:29 +01:00
|
|
|
Constants::INTERRUPT, globalcontext);
|
2009-01-14 13:17:53 +01:00
|
|
|
cmd->setAttribute(Core::Command::CA_UpdateText);
|
|
|
|
|
cmd->setAttribute(Core::Command::CA_UpdateIcon);
|
2008-12-02 12:01:29 +01:00
|
|
|
cmd->setDefaultKeySequence(QKeySequence(Constants::INTERRUPT_KEY));
|
|
|
|
|
cmd->setDefaultText(tr("Stop Debugger/Interrupt Debugger"));
|
|
|
|
|
mdebug->addAction(cmd, Core::Constants::G_DEFAULT_ONE);
|
|
|
|
|
|
2009-01-13 17:41:23 +01:00
|
|
|
cmd = am->registerAction(m_manager->m_resetAction,
|
2008-12-02 12:01:29 +01:00
|
|
|
Constants::RESET, globalcontext);
|
2009-01-14 13:17:53 +01:00
|
|
|
cmd->setAttribute(Core::Command::CA_UpdateText);
|
2008-12-02 12:01:29 +01:00
|
|
|
cmd->setDefaultKeySequence(QKeySequence(Constants::RESET_KEY));
|
|
|
|
|
cmd->setDefaultText(tr("Reset Debugger"));
|
|
|
|
|
//disabled mdebug->addAction(cmd, Core::Constants::G_DEFAULT_ONE);
|
|
|
|
|
|
|
|
|
|
QAction *sep = new QAction(this);
|
|
|
|
|
sep->setSeparator(true);
|
2009-01-13 17:41:23 +01:00
|
|
|
cmd = am->registerAction(sep, QLatin1String("Debugger.Sep1"), globalcontext);
|
2008-12-02 12:01:29 +01:00
|
|
|
mdebug->addAction(cmd);
|
|
|
|
|
|
2009-01-13 17:41:23 +01:00
|
|
|
cmd = am->registerAction(m_manager->m_nextAction,
|
2008-12-02 12:01:29 +01:00
|
|
|
Constants::NEXT, debuggercontext);
|
|
|
|
|
cmd->setDefaultKeySequence(QKeySequence(Constants::NEXT_KEY));
|
|
|
|
|
mdebug->addAction(cmd);
|
|
|
|
|
|
2009-01-13 17:41:23 +01:00
|
|
|
cmd = am->registerAction(m_manager->m_stepAction,
|
2008-12-02 12:01:29 +01:00
|
|
|
Constants::STEP, debuggercontext);
|
|
|
|
|
cmd->setDefaultKeySequence(QKeySequence(Constants::STEP_KEY));
|
|
|
|
|
mdebug->addAction(cmd);
|
|
|
|
|
|
2009-01-13 17:41:23 +01:00
|
|
|
cmd = am->registerAction(m_manager->m_stepOutAction,
|
2008-12-02 12:01:29 +01:00
|
|
|
Constants::STEPOUT, debuggercontext);
|
|
|
|
|
cmd->setDefaultKeySequence(QKeySequence(Constants::STEPOUT_KEY));
|
|
|
|
|
mdebug->addAction(cmd);
|
|
|
|
|
|
2009-01-13 17:41:23 +01:00
|
|
|
cmd = am->registerAction(m_manager->m_nextIAction,
|
2008-12-02 12:01:29 +01:00
|
|
|
Constants::NEXTI, debuggercontext);
|
|
|
|
|
cmd->setDefaultKeySequence(QKeySequence(Constants::NEXTI_KEY));
|
|
|
|
|
mdebug->addAction(cmd);
|
|
|
|
|
|
2009-01-13 17:41:23 +01:00
|
|
|
cmd = am->registerAction(m_manager->m_stepIAction,
|
2008-12-02 12:01:29 +01:00
|
|
|
Constants::STEPI, debuggercontext);
|
|
|
|
|
cmd->setDefaultKeySequence(QKeySequence(Constants::STEPI_KEY));
|
|
|
|
|
mdebug->addAction(cmd);
|
|
|
|
|
|
2009-01-13 17:41:23 +01:00
|
|
|
cmd = am->registerAction(m_manager->m_runToLineAction,
|
2008-12-02 12:01:29 +01:00
|
|
|
Constants::RUN_TO_LINE, debuggercontext);
|
|
|
|
|
cmd->setDefaultKeySequence(QKeySequence(Constants::RUN_TO_LINE_KEY));
|
|
|
|
|
mdebug->addAction(cmd);
|
|
|
|
|
|
2009-01-13 17:41:23 +01:00
|
|
|
cmd = am->registerAction(m_manager->m_runToFunctionAction,
|
2008-12-02 12:01:29 +01:00
|
|
|
Constants::RUN_TO_FUNCTION, debuggercontext);
|
|
|
|
|
cmd->setDefaultKeySequence(QKeySequence(Constants::RUN_TO_FUNCTION_KEY));
|
|
|
|
|
mdebug->addAction(cmd);
|
|
|
|
|
|
2009-01-13 17:41:23 +01:00
|
|
|
cmd = am->registerAction(m_manager->m_jumpToLineAction,
|
2008-12-02 12:01:29 +01:00
|
|
|
Constants::JUMP_TO_LINE, debuggercontext);
|
|
|
|
|
mdebug->addAction(cmd);
|
|
|
|
|
|
|
|
|
|
sep = new QAction(this);
|
|
|
|
|
sep->setSeparator(true);
|
2009-01-13 17:41:23 +01:00
|
|
|
cmd = am->registerAction(sep, QLatin1String("Debugger.Sep3"), globalcontext);
|
2008-12-02 12:01:29 +01:00
|
|
|
mdebug->addAction(cmd);
|
|
|
|
|
|
2009-01-13 17:41:23 +01:00
|
|
|
cmd = am->registerAction(m_manager->m_breakAction,
|
2008-12-02 12:01:29 +01:00
|
|
|
Constants::TOGGLE_BREAK, cppeditorcontext);
|
|
|
|
|
cmd->setDefaultKeySequence(QKeySequence(Constants::TOGGLE_BREAK_KEY));
|
|
|
|
|
mdebug->addAction(cmd);
|
|
|
|
|
//mcppcontext->addAction(cmd);
|
|
|
|
|
|
2009-01-13 17:41:23 +01:00
|
|
|
cmd = am->registerAction(m_manager->m_breakByFunctionAction,
|
2008-12-02 12:01:29 +01:00
|
|
|
Constants::BREAK_BY_FUNCTION, globalcontext);
|
|
|
|
|
mdebug->addAction(cmd);
|
|
|
|
|
|
2009-01-13 17:41:23 +01:00
|
|
|
cmd = am->registerAction(m_manager->m_breakAtMainAction,
|
2008-12-02 12:01:29 +01:00
|
|
|
Constants::BREAK_AT_MAIN, globalcontext);
|
|
|
|
|
mdebug->addAction(cmd);
|
|
|
|
|
|
|
|
|
|
sep = new QAction(this);
|
|
|
|
|
sep->setSeparator(true);
|
2009-01-13 17:41:23 +01:00
|
|
|
cmd = am->registerAction(sep, QLatin1String("Debugger.Sep2"), globalcontext);
|
2008-12-02 12:01:29 +01:00
|
|
|
mdebug->addAction(cmd);
|
|
|
|
|
|
2009-01-13 17:41:23 +01:00
|
|
|
cmd = am->registerAction(m_manager->m_skipKnownFramesAction,
|
2008-12-02 12:01:29 +01:00
|
|
|
Constants::SKIP_KNOWN_FRAMES, globalcontext);
|
|
|
|
|
mdebug->addAction(cmd);
|
|
|
|
|
|
2009-01-13 17:41:23 +01:00
|
|
|
cmd = am->registerAction(m_manager->m_useCustomDumpersAction,
|
2008-12-02 12:01:29 +01:00
|
|
|
Constants::USE_CUSTOM_DUMPERS, globalcontext);
|
|
|
|
|
mdebug->addAction(cmd);
|
|
|
|
|
|
2009-01-13 17:41:23 +01:00
|
|
|
cmd = am->registerAction(m_manager->m_useFastStartAction,
|
2008-12-02 12:01:29 +01:00
|
|
|
Constants::USE_FAST_START, globalcontext);
|
|
|
|
|
mdebug->addAction(cmd);
|
|
|
|
|
|
2009-01-13 17:41:23 +01:00
|
|
|
cmd = am->registerAction(m_manager->m_useToolTipsAction,
|
2008-12-08 19:26:00 +01:00
|
|
|
Constants::USE_TOOL_TIPS, globalcontext);
|
|
|
|
|
mdebug->addAction(cmd);
|
|
|
|
|
|
|
|
|
|
#ifdef QT_DEBUG
|
2009-01-13 17:41:23 +01:00
|
|
|
cmd = am->registerAction(m_manager->m_dumpLogAction,
|
2008-12-02 12:01:29 +01:00
|
|
|
Constants::DUMP_LOG, globalcontext);
|
|
|
|
|
//cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+D,Ctrl+L")));
|
|
|
|
|
cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+Shift+F11")));
|
|
|
|
|
mdebug->addAction(cmd);
|
|
|
|
|
|
2009-01-13 17:41:23 +01:00
|
|
|
cmd = am->registerAction(m_manager->m_debugDumpersAction,
|
2008-12-02 12:01:29 +01:00
|
|
|
Constants::DEBUG_DUMPERS, debuggercontext);
|
|
|
|
|
mdebug->addAction(cmd);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
sep = new QAction(this);
|
|
|
|
|
sep->setSeparator(true);
|
2009-01-13 17:41:23 +01:00
|
|
|
cmd = am->registerAction(sep, QLatin1String("Debugger.Sep4"), globalcontext);
|
2008-12-02 12:01:29 +01:00
|
|
|
mdebug->addAction(cmd);
|
|
|
|
|
|
2009-01-13 17:41:23 +01:00
|
|
|
cmd = am->registerAction(m_manager->m_watchAction,
|
2008-12-02 12:01:29 +01:00
|
|
|
Constants::ADD_TO_WATCH, cppeditorcontext);
|
|
|
|
|
//cmd->setDefaultKeySequence(QKeySequence(tr("ALT+D,ALT+W")));
|
|
|
|
|
mdebug->addAction(cmd);
|
|
|
|
|
|
2009-01-13 17:41:23 +01:00
|
|
|
// Views menu
|
|
|
|
|
cmd = am->registerAction(sep, QLatin1String("Debugger.Sep5"), globalcontext);
|
|
|
|
|
mdebug->addAction(cmd);
|
2009-01-14 12:39:59 +01:00
|
|
|
ActionContainer *viewsMenu = am->createMenu(Constants::M_DEBUG_VIEWS);
|
2009-01-13 17:41:23 +01:00
|
|
|
QMenu *m = viewsMenu->menu();
|
|
|
|
|
m->setEnabled(true);
|
|
|
|
|
m->setTitle(tr("&Views"));
|
|
|
|
|
mdebug->addMenu(viewsMenu, Core::Constants::G_DEFAULT_THREE);
|
|
|
|
|
|
|
|
|
|
m_toggleLockedAction = new QAction(tr("Locked"), this);
|
|
|
|
|
m_toggleLockedAction->setCheckable(true);
|
|
|
|
|
m_toggleLockedAction->setChecked(true);
|
|
|
|
|
connect(m_toggleLockedAction, SIGNAL(toggled(bool)),
|
|
|
|
|
m_manager, SLOT(setLocked(bool)));
|
|
|
|
|
foreach (QDockWidget *dockWidget, m_manager->dockWidgets()) {
|
|
|
|
|
cmd = am->registerAction(dockWidget->toggleViewAction(),
|
|
|
|
|
"Debugger." + dockWidget->objectName(), debuggercontext);
|
|
|
|
|
viewsMenu->addAction(cmd);
|
|
|
|
|
//m->addAction(dockWidget->toggleViewAction());
|
|
|
|
|
}
|
|
|
|
|
m->addSeparator();
|
|
|
|
|
m->addAction(m_toggleLockedAction);
|
|
|
|
|
m->addSeparator();
|
|
|
|
|
|
|
|
|
|
QAction *resetToSimpleAction = viewsMenu->menu()->addAction(tr("Reset to default layout"));
|
|
|
|
|
connect(resetToSimpleAction, SIGNAL(triggered()),
|
|
|
|
|
m_manager, SLOT(setSimpleDockWidgetArrangement()));
|
|
|
|
|
|
|
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
m_generalOptionPage = 0;
|
|
|
|
|
|
|
|
|
|
// FIXME:
|
|
|
|
|
m_generalOptionPage = new GdbOptionPage(&theGdbSettings());
|
|
|
|
|
addObject(m_generalOptionPage);
|
|
|
|
|
|
|
|
|
|
m_locationMark = 0;
|
|
|
|
|
|
2009-01-13 18:15:24 +01:00
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// Debug mode setup
|
|
|
|
|
//
|
|
|
|
|
m_debugMode = new DebugMode(this);
|
2008-12-02 12:01:29 +01:00
|
|
|
//addAutoReleasedObject(m_debugMode);
|
|
|
|
|
|
|
|
|
|
addAutoReleasedObject(new DebuggerRunner(m_manager));
|
|
|
|
|
|
2009-01-13 18:15:24 +01:00
|
|
|
QList<int> context;
|
|
|
|
|
context.append(uidm->uniqueIdentifier(Core::Constants::C_EDITORMANAGER));
|
|
|
|
|
context.append(uidm->uniqueIdentifier(Debugger::Constants::C_GDBDEBUGGER));
|
|
|
|
|
context.append(uidm->uniqueIdentifier(Core::Constants::C_NAVIGATION_PANE));
|
|
|
|
|
m_debugMode->setContext(context);
|
|
|
|
|
|
|
|
|
|
QBoxLayout *editorHolderLayout = new QVBoxLayout;
|
|
|
|
|
editorHolderLayout->setMargin(0);
|
|
|
|
|
editorHolderLayout->setSpacing(0);
|
|
|
|
|
editorHolderLayout->addWidget(new EditorManagerPlaceHolder(m_debugMode));
|
|
|
|
|
editorHolderLayout->addWidget(new FindToolBarPlaceHolder(m_debugMode));
|
|
|
|
|
|
|
|
|
|
QWidget *editorAndFindWidget = new QWidget;
|
|
|
|
|
editorAndFindWidget->setLayout(editorHolderLayout);
|
|
|
|
|
|
|
|
|
|
MiniSplitter *rightPaneSplitter = new MiniSplitter;
|
|
|
|
|
rightPaneSplitter->addWidget(editorAndFindWidget);
|
|
|
|
|
rightPaneSplitter->addWidget(new RightPanePlaceHolder(m_debugMode));
|
|
|
|
|
rightPaneSplitter->setStretchFactor(0, 1);
|
|
|
|
|
rightPaneSplitter->setStretchFactor(1, 0);
|
|
|
|
|
|
|
|
|
|
QWidget *centralWidget = new QWidget;
|
|
|
|
|
|
|
|
|
|
m_manager->mainWindow()->setCentralWidget(centralWidget);
|
|
|
|
|
|
|
|
|
|
MiniSplitter *splitter = new MiniSplitter;
|
|
|
|
|
splitter->addWidget(m_manager->mainWindow());
|
|
|
|
|
splitter->addWidget(new OutputPanePlaceHolder(m_debugMode));
|
|
|
|
|
splitter->setStretchFactor(0, 10);
|
|
|
|
|
splitter->setStretchFactor(1, 0);
|
|
|
|
|
splitter->setOrientation(Qt::Vertical);
|
|
|
|
|
|
|
|
|
|
MiniSplitter *splitter2 = new MiniSplitter;
|
|
|
|
|
splitter2 = new MiniSplitter;
|
|
|
|
|
splitter2->addWidget(new NavigationWidgetPlaceHolder(m_debugMode));
|
|
|
|
|
splitter2->addWidget(splitter);
|
|
|
|
|
splitter2->setStretchFactor(0, 0);
|
|
|
|
|
splitter2->setStretchFactor(1, 1);
|
|
|
|
|
|
|
|
|
|
m_debugMode->setWidget(splitter2);
|
|
|
|
|
|
|
|
|
|
QToolBar *debugToolBar = new QToolBar;
|
|
|
|
|
debugToolBar->addAction(am->command(ProjectExplorer::Constants::DEBUG)->action());
|
|
|
|
|
debugToolBar->addAction(am->command(Constants::INTERRUPT)->action());
|
|
|
|
|
debugToolBar->addAction(am->command(Constants::NEXT)->action());
|
|
|
|
|
debugToolBar->addAction(am->command(Constants::STEP)->action());
|
|
|
|
|
debugToolBar->addAction(am->command(Constants::STEPOUT)->action());
|
|
|
|
|
debugToolBar->addSeparator();
|
|
|
|
|
debugToolBar->addAction(am->command(Constants::STEPI)->action());
|
|
|
|
|
debugToolBar->addAction(am->command(Constants::NEXTI)->action());
|
|
|
|
|
debugToolBar->addSeparator();
|
|
|
|
|
debugToolBar->addWidget(new QLabel(tr("Threads:")));
|
|
|
|
|
|
|
|
|
|
QComboBox *threadBox = new QComboBox;
|
|
|
|
|
threadBox->setModel(m_manager->threadsModel());
|
|
|
|
|
connect(threadBox, SIGNAL(activated(int)),
|
|
|
|
|
m_manager->threadsWindow(), SIGNAL(threadSelected(int)));
|
|
|
|
|
debugToolBar->addWidget(threadBox);
|
|
|
|
|
debugToolBar->addWidget(m_manager->statusLabel());
|
|
|
|
|
|
|
|
|
|
QWidget *stretch = new QWidget;
|
|
|
|
|
stretch->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum);
|
|
|
|
|
debugToolBar->addWidget(stretch);
|
|
|
|
|
|
|
|
|
|
QBoxLayout *toolBarAddingLayout = new QVBoxLayout(centralWidget);
|
|
|
|
|
toolBarAddingLayout->setMargin(0);
|
|
|
|
|
toolBarAddingLayout->setSpacing(0);
|
|
|
|
|
toolBarAddingLayout->addWidget(rightPaneSplitter);
|
|
|
|
|
toolBarAddingLayout->addWidget(debugToolBar);
|
|
|
|
|
|
|
|
|
|
m_manager->createDockWidgets();
|
|
|
|
|
m_manager->setSimpleDockWidgetArrangement();
|
|
|
|
|
readSettings();
|
|
|
|
|
|
|
|
|
|
connect(ModeManager::instance(), SIGNAL(currentModeChanged(Core::IMode*)),
|
|
|
|
|
this, SLOT(focusCurrentEditor(Core::IMode*)));
|
|
|
|
|
m_debugMode->widget()->setFocusProxy(EditorManager::instance());
|
|
|
|
|
addObject(m_debugMode);
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// Connections
|
|
|
|
|
//
|
|
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
// ProjectExplorer
|
|
|
|
|
connect(projectExplorer()->session(), SIGNAL(sessionLoaded()),
|
|
|
|
|
m_manager, SLOT(sessionLoaded()));
|
|
|
|
|
connect(projectExplorer()->session(), SIGNAL(aboutToSaveSession()),
|
|
|
|
|
m_manager, SLOT(aboutToSaveSession()));
|
|
|
|
|
|
|
|
|
|
// EditorManager
|
|
|
|
|
QObject *editorManager = core->editorManager();
|
|
|
|
|
connect(editorManager, SIGNAL(editorAboutToClose(Core::IEditor*)),
|
|
|
|
|
this, SLOT(editorAboutToClose(Core::IEditor*)));
|
|
|
|
|
connect(editorManager, SIGNAL(editorOpened(Core::IEditor*)),
|
|
|
|
|
this, SLOT(editorOpened(Core::IEditor*)));
|
|
|
|
|
|
|
|
|
|
// Application interaction
|
|
|
|
|
connect(m_manager, SIGNAL(currentTextEditorRequested(QString*,int*,QObject**)),
|
|
|
|
|
this, SLOT(queryCurrentTextEditor(QString*,int*,QObject**)));
|
|
|
|
|
|
|
|
|
|
connect(m_manager, SIGNAL(setSessionValueRequested(QString,QVariant)),
|
|
|
|
|
this, SLOT(setSessionValue(QString,QVariant)));
|
|
|
|
|
connect(m_manager, SIGNAL(sessionValueRequested(QString,QVariant*)),
|
|
|
|
|
this, SLOT(querySessionValue(QString,QVariant*)));
|
|
|
|
|
connect(m_manager, SIGNAL(setConfigValueRequested(QString,QVariant)),
|
|
|
|
|
this, SLOT(setConfigValue(QString,QVariant)));
|
|
|
|
|
connect(m_manager, SIGNAL(configValueRequested(QString,QVariant*)),
|
|
|
|
|
this, SLOT(queryConfigValue(QString,QVariant*)));
|
|
|
|
|
|
|
|
|
|
connect(m_manager, SIGNAL(resetLocationRequested()),
|
|
|
|
|
this, SLOT(resetLocation()));
|
|
|
|
|
connect(m_manager, SIGNAL(gotoLocationRequested(QString,int,bool)),
|
|
|
|
|
this, SLOT(gotoLocation(QString,int,bool)));
|
|
|
|
|
connect(m_manager, SIGNAL(statusChanged(int)),
|
|
|
|
|
this, SLOT(changeStatus(int)));
|
|
|
|
|
connect(m_manager, SIGNAL(previousModeRequested()),
|
|
|
|
|
this, SLOT(activatePreviousMode()));
|
|
|
|
|
connect(m_manager, SIGNAL(debugModeRequested()),
|
|
|
|
|
this, SLOT(activateDebugMode()));
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DebuggerPlugin::extensionsInitialized()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ProjectExplorer::ProjectExplorerPlugin *DebuggerPlugin::projectExplorer() const
|
|
|
|
|
{
|
|
|
|
|
return m_pm->getObject<ProjectExplorer::ProjectExplorerPlugin>();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*! Activates the previous mode when the current mode is the debug mode. */
|
|
|
|
|
void DebuggerPlugin::activatePreviousMode()
|
|
|
|
|
{
|
|
|
|
|
ICore *core = m_pm->getObject<Core::ICore>();
|
|
|
|
|
Core::ModeManager *const modeManager = core->modeManager();
|
|
|
|
|
|
|
|
|
|
if (modeManager->currentMode() == modeManager->mode(Constants::MODE_DEBUG)
|
|
|
|
|
&& !m_previousMode.isEmpty()) {
|
|
|
|
|
modeManager->activateMode(m_previousMode);
|
|
|
|
|
m_previousMode.clear();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DebuggerPlugin::activateDebugMode()
|
|
|
|
|
{
|
|
|
|
|
ICore *core = m_pm->getObject<Core::ICore>();
|
|
|
|
|
Core::ModeManager *modeManager = core->modeManager();
|
|
|
|
|
m_previousMode = QLatin1String(modeManager->currentMode()->uniqueModeName());
|
|
|
|
|
modeManager->activateMode(QLatin1String(MODE_DEBUG));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DebuggerPlugin::queryCurrentTextEditor(QString *fileName, int *lineNumber, QObject **object)
|
|
|
|
|
{
|
|
|
|
|
ICore *core = m_pm->getObject<Core::ICore>();
|
|
|
|
|
if (!core || !core->editorManager())
|
|
|
|
|
return;
|
|
|
|
|
Core::IEditor *editor = core->editorManager()->currentEditor();
|
|
|
|
|
ITextEditor *textEditor = qobject_cast<ITextEditor*>(editor);
|
|
|
|
|
if (!textEditor)
|
|
|
|
|
return;
|
|
|
|
|
if (fileName)
|
|
|
|
|
*fileName = textEditor->file()->fileName();
|
|
|
|
|
if (lineNumber)
|
|
|
|
|
*lineNumber = textEditor->currentLine();
|
|
|
|
|
if (object)
|
|
|
|
|
*object = textEditor->widget();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DebuggerPlugin::editorOpened(Core::IEditor *editor)
|
|
|
|
|
{
|
|
|
|
|
if (ITextEditor *textEditor = qobject_cast<ITextEditor *>(editor)) {
|
|
|
|
|
connect(textEditor, SIGNAL(markRequested(TextEditor::ITextEditor*,int)),
|
|
|
|
|
this, SLOT(requestMark(TextEditor::ITextEditor*,int)));
|
|
|
|
|
connect(editor, SIGNAL(tooltipRequested(TextEditor::ITextEditor*,QPoint,int)),
|
|
|
|
|
this, SLOT(showToolTip(TextEditor::ITextEditor*,QPoint,int)));
|
2008-12-05 16:39:33 +01:00
|
|
|
connect(textEditor, SIGNAL(markContextMenuRequested(TextEditor::ITextEditor*,int,QMenu*)),
|
|
|
|
|
this, SLOT(requestContextMenu(TextEditor::ITextEditor*,int,QMenu*)));
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DebuggerPlugin::editorAboutToClose(Core::IEditor *editor)
|
|
|
|
|
{
|
|
|
|
|
if (ITextEditor *textEditor = qobject_cast<ITextEditor *>(editor)) {
|
|
|
|
|
disconnect(textEditor, SIGNAL(markRequested(TextEditor::ITextEditor*,int)),
|
|
|
|
|
this, SLOT(requestMark(TextEditor::ITextEditor*,int)));
|
|
|
|
|
disconnect(editor, SIGNAL(tooltipRequested(TextEditor::ITextEditor*,QPoint,int)),
|
|
|
|
|
this, SLOT(showToolTip(TextEditor::ITextEditor*,QPoint,int)));
|
2008-12-05 16:39:33 +01:00
|
|
|
disconnect(textEditor, SIGNAL(markContextMenuRequested(TextEditor::ITextEditor*,int,QMenu*)),
|
|
|
|
|
this, SLOT(requestContextMenu(TextEditor::ITextEditor*,int,QMenu*)));
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2008-12-05 16:39:33 +01:00
|
|
|
void DebuggerPlugin::requestContextMenu(TextEditor::ITextEditor *editor,
|
|
|
|
|
int lineNumber, QMenu *menu)
|
|
|
|
|
{
|
|
|
|
|
m_breakpointMarginActionLineNumber = lineNumber;
|
|
|
|
|
m_breakpointMarginActionFileName = editor->file()->fileName();
|
|
|
|
|
menu->addAction(m_breakpointMarginAction);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DebuggerPlugin::breakpointMarginActionTriggered()
|
|
|
|
|
{
|
|
|
|
|
m_manager->toggleBreakpoint(
|
|
|
|
|
m_breakpointMarginActionFileName,
|
|
|
|
|
m_breakpointMarginActionLineNumber
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
void DebuggerPlugin::requestMark(TextEditor::ITextEditor *editor, int lineNumber)
|
|
|
|
|
{
|
|
|
|
|
m_manager->toggleBreakpoint(editor->file()->fileName(), lineNumber);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DebuggerPlugin::showToolTip(TextEditor::ITextEditor *editor,
|
|
|
|
|
const QPoint &point, int pos)
|
|
|
|
|
{
|
2008-12-08 19:26:00 +01:00
|
|
|
if (!m_manager->useToolTipsAction()->isChecked())
|
|
|
|
|
return;
|
|
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
QPlainTextEdit *plaintext = qobject_cast<QPlainTextEdit*>(editor->widget());
|
|
|
|
|
if (!plaintext)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
QString expr = plaintext->textCursor().selectedText();
|
|
|
|
|
if (expr.isEmpty()) {
|
|
|
|
|
QTextCursor tc(plaintext->document());
|
|
|
|
|
tc.setPosition(pos);
|
|
|
|
|
|
|
|
|
|
const QChar ch = editor->characterAt(pos);
|
|
|
|
|
if (ch.isLetterOrNumber() || ch == QLatin1Char('_'))
|
|
|
|
|
tc.movePosition(QTextCursor::EndOfWord);
|
|
|
|
|
|
|
|
|
|
// Fetch the expression's code.
|
2009-01-13 18:15:24 +01:00
|
|
|
CPlusPlus::ExpressionUnderCursor expressionUnderCursor;
|
2008-12-02 12:01:29 +01:00
|
|
|
expr = expressionUnderCursor(tc);
|
|
|
|
|
}
|
|
|
|
|
//qDebug() << " TOOLTIP EXPR " << expr;
|
|
|
|
|
m_manager->setToolTipExpression(point, expr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DebuggerPlugin::setSessionValue(const QString &name, const QVariant &value)
|
|
|
|
|
{
|
|
|
|
|
//qDebug() << "SET SESSION VALUE" << name << value;
|
|
|
|
|
ProjectExplorerPlugin *pe = projectExplorer();
|
|
|
|
|
if (pe->session())
|
|
|
|
|
pe->session()->setValue(name, value);
|
|
|
|
|
else
|
|
|
|
|
qDebug() << "FIXME: Session does not exist yet";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DebuggerPlugin::querySessionValue(const QString &name, QVariant *value)
|
|
|
|
|
{
|
|
|
|
|
ProjectExplorerPlugin *pe = projectExplorer();
|
|
|
|
|
*value = pe->session()->value(name);
|
|
|
|
|
//qDebug() << "GET SESSION VALUE: " << name << value;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void DebuggerPlugin::setConfigValue(const QString &name, const QVariant &value)
|
|
|
|
|
{
|
2008-12-09 12:08:56 +01:00
|
|
|
QTC_ASSERT(m_debugMode, return);
|
2009-01-13 18:15:24 +01:00
|
|
|
settings()->setValue(name, value);
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DebuggerPlugin::queryConfigValue(const QString &name, QVariant *value)
|
|
|
|
|
{
|
2008-12-09 12:08:56 +01:00
|
|
|
QTC_ASSERT(m_debugMode, return);
|
2009-01-13 18:15:24 +01:00
|
|
|
*value = settings()->value(name);
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DebuggerPlugin::resetLocation()
|
|
|
|
|
{
|
|
|
|
|
//qDebug() << "RESET_LOCATION: current:" << currentTextEditor();
|
|
|
|
|
//qDebug() << "RESET_LOCATION: locations:" << m_locationMark;
|
|
|
|
|
//qDebug() << "RESET_LOCATION: stored:" << m_locationMark->editor();
|
|
|
|
|
delete m_locationMark;
|
|
|
|
|
m_locationMark = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DebuggerPlugin::gotoLocation(const QString &fileName, int lineNumber,
|
|
|
|
|
bool setMarker)
|
|
|
|
|
{
|
|
|
|
|
TextEditor::BaseTextEditor::openEditorAt(fileName, lineNumber);
|
|
|
|
|
if (setMarker) {
|
|
|
|
|
resetLocation();
|
|
|
|
|
m_locationMark = new LocationMark(fileName, lineNumber);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DebuggerPlugin::changeStatus(int status)
|
|
|
|
|
{
|
|
|
|
|
bool startIsContinue = (status == DebuggerInferiorStopped);
|
|
|
|
|
ICore *core = m_pm->getObject<Core::ICore>();
|
|
|
|
|
if (startIsContinue) {
|
|
|
|
|
core->addAdditionalContext(m_gdbRunningContext);
|
|
|
|
|
core->updateContext();
|
|
|
|
|
} else {
|
|
|
|
|
core->removeAdditionalContext(m_gdbRunningContext);
|
|
|
|
|
core->updateContext();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2009-01-13 18:15:24 +01:00
|
|
|
void DebuggerPlugin::writeSettings() const
|
|
|
|
|
{
|
|
|
|
|
QSettings *s = settings();
|
|
|
|
|
QTC_ASSERT(m_manager, return);
|
|
|
|
|
QTC_ASSERT(m_manager->mainWindow(), return);
|
|
|
|
|
s->beginGroup(QLatin1String("DebugMode"));
|
|
|
|
|
s->setValue(QLatin1String("State"), m_manager->mainWindow()->saveState());
|
|
|
|
|
s->setValue(QLatin1String("Locked"), m_toggleLockedAction->isChecked());
|
|
|
|
|
s->endGroup();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DebuggerPlugin::readSettings()
|
|
|
|
|
{
|
|
|
|
|
QSettings *s = settings();
|
|
|
|
|
s->beginGroup(QLatin1String("DebugMode"));
|
|
|
|
|
m_manager->mainWindow()->restoreState(s->value(QLatin1String("State"), QByteArray()).toByteArray());
|
|
|
|
|
m_toggleLockedAction->setChecked(s->value(QLatin1String("Locked"), true).toBool());
|
|
|
|
|
s->endGroup();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DebuggerPlugin::focusCurrentEditor(IMode *mode)
|
|
|
|
|
{
|
|
|
|
|
if (mode != m_debugMode)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
EditorManager *editorManager = EditorManager::instance();
|
|
|
|
|
|
|
|
|
|
if (editorManager->currentEditor())
|
|
|
|
|
editorManager->currentEditor()->widget()->setFocus();
|
|
|
|
|
}
|
|
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
#include "debuggerplugin.moc"
|
|
|
|
|
|
|
|
|
|
Q_EXPORT_PLUGIN(DebuggerPlugin)
|