forked from qt-creator/qt-creator
Merge branch '0.9.1-beta' of git@scm.dev.nokia.troll.no:creator/mainline into 0.9.1-beta
Conflicts: src/plugins/debugger/gdbtypemacros.ui
This commit is contained in:
@@ -23,6 +23,8 @@
|
|||||||
\o \inlineimage qtcreator.png
|
\o \inlineimage qtcreator.png
|
||||||
\o Qt Creator includes a wide range of useful features. Among them are:
|
\o Qt Creator includes a wide range of useful features. Among them are:
|
||||||
\list 1
|
\list 1
|
||||||
|
\o \bold{Smart Code Editor}: The code editor provides syntax
|
||||||
|
highlighting as well as code completion.
|
||||||
\o \bold{Qt4 Project Generating Wizard}: This wizard allows the user
|
\o \bold{Qt4 Project Generating Wizard}: This wizard allows the user
|
||||||
to generate a project for a console application, a GUI application,
|
to generate a project for a console application, a GUI application,
|
||||||
or a C++ library.
|
or a C++ library.
|
||||||
@@ -48,7 +50,7 @@
|
|||||||
\o \l{Creating a Project in Qt Creator}
|
\o \l{Creating a Project in Qt Creator}
|
||||||
\o \l{Build Settings}
|
\o \l{Build Settings}
|
||||||
\o \l{Writing a Simple Program with Qt Creator}
|
\o \l{Writing a Simple Program with Qt Creator}
|
||||||
\o \l{Quick Navigation}
|
\o \l{Navigating Quickly Around Your Code}
|
||||||
\o \l{Debugging with Qt Creator}
|
\o \l{Debugging with Qt Creator}
|
||||||
\o \l{Tips and Tricks}
|
\o \l{Tips and Tricks}
|
||||||
\o \l{Glossary}
|
\o \l{Glossary}
|
||||||
@@ -64,86 +66,85 @@
|
|||||||
|
|
||||||
\title A Quick Tour Around Qt Creator
|
\title A Quick Tour Around Qt Creator
|
||||||
|
|
||||||
The labeled screenshot below shows some of the components of Qt Creator,
|
The labeled screenshot below shows some of the components of Qt Creator, in
|
||||||
in \gui Edit mode.
|
\gui Edit mode.
|
||||||
|
|
||||||
\image qtcreator-breakdown.png
|
\image qtcreator-breakdown.png
|
||||||
|
|
||||||
\section1 The Mode Selectors
|
\section1 The Mode Selectors
|
||||||
|
|
||||||
When working in Qt Creator, you can be in one of five modes: \bold Project,
|
When working in Qt Creator, you can be in one of six modes: \bold Welcome,
|
||||||
\bold Edit, \bold Debug, \bold Help, and \bold Output.
|
\bold Edit, \bold Debug, \bold Projects, \bold Help, and \bold Output.
|
||||||
|
|
||||||
Mode selectors allow you to quickly switch between tasks: Editing,
|
Mode selectors allow you to quickly switch between tasks: Editing, browsing
|
||||||
browsing the Qt manual, setting up the build environment, etc. You can
|
the Qt Creator manual, setting up the build environment, etc. You can
|
||||||
activate a mode by either clicking on its mode selector, or using the
|
activate a mode by either clicking on its mode selector, or using the
|
||||||
\l{keyboard-shortcuts}{corresponding shortcut}. Certain actions also
|
\l{keyboard-shortcuts}{corresponding shortcut}. Certain actions also
|
||||||
trigger a mode change, e.g., \gui{Debug}/\gui{Start Debugging} will switch
|
trigger a mode change, e.g., \gui{Debug}/\gui{Start Debugging} will switch
|
||||||
to the \gui Debug mode.
|
to the \gui Debug mode.
|
||||||
|
|
||||||
|
|
||||||
\list
|
\list
|
||||||
|
|
||||||
\o \gui{Welcome Mode} - Displays a welcome screen allowing you to quickly
|
\o \gui{Welcome Mode} - Displays a welcome screen allowing you to quickly
|
||||||
load recent sessions or individual projects. This is the first mode
|
load recent sessions or individual projects. This is the mode you will see
|
||||||
displayed if Qt Creator is run without command line switches.
|
if Qt Creator is run without command line switches.
|
||||||
|
|
||||||
\o \gui{Edit Mode} - You can edit both project and source files here. An
|
\o \gui{Edit Mode} - Lets you edit both project and source files. A sidebar
|
||||||
optional sidebar on the left provides different views to navigate between
|
on the left provides different views to navigate between files.
|
||||||
files.
|
|
||||||
|
|
||||||
\o \gui{Debug Mode} - Provides various ways to inspect the state of the
|
\o \gui{Debug Mode} - Provides various ways to inspect the state of the
|
||||||
program while debugging. See \l{qtcreator-debugging}{Debugging With Qt
|
program while debugging. See \l{qtcreator-debugging}{Debugging With Qt
|
||||||
Creator} for a hands-on description of the mode.
|
Creator} for a hands-on description of how to use this mode.
|
||||||
|
|
||||||
\o \gui{Build & Run Mode} - Lets you configure how projects can be built
|
\o \gui{Projects Mode} - Lets you configure how projects can be built and
|
||||||
and executed. Under the list of projects, there are tabs to configure the
|
executed. Under the list of projects, there are tabs to configure the
|
||||||
build and run settings.
|
build, run, and editor settings.
|
||||||
|
|
||||||
\o \gui{Help Mode} - Shows any documentation registered by Qt Assistant,
|
\o \gui{Help Mode} - Shows any documentation registered by Qt Assistant,
|
||||||
such as the Qt library and Qt Creator documentation.
|
such as the Qt library and Qt Creator documentation.
|
||||||
|
|
||||||
\o \gui{Output Mode} - Lets you examine various logs in detail, for example
|
\o \gui{Output Mode} - Lets you examine various data in detail, for example
|
||||||
the task list, the compiler and application output. Some of these logs can
|
build issues as well as compile and application output. This information
|
||||||
also be viewed in the output panes.
|
is also available in the output panes.
|
||||||
|
|
||||||
\endlist
|
\endlist
|
||||||
|
|
||||||
|
|
||||||
\section1 The Output Panes
|
\section1 The Output Panes
|
||||||
|
|
||||||
The task pane in Qt Creator can display one out of four different panes:
|
The task pane in Qt Creator can display one of four different panes:
|
||||||
Task List, Search Results, Application Output, and Compile Output. These
|
\gui{Build Issues}, \gui{Search Results}, \gui{Application Output}, and
|
||||||
panes are available in all modes.
|
\gui{Compile}. These panes are available in all modes.
|
||||||
|
|
||||||
\section2 Task List
|
\section2 Build Issues
|
||||||
|
|
||||||
The Task List provides a list of important tasks such as error messages
|
The {Build Issues} pane provides a list of issues, e.g., error messages or
|
||||||
that need to be fixed. It filters out irrelevant output from the compiler
|
warnings that need to be fixed. It filters out irrelevant output from the
|
||||||
and collects them in the form of tasks.
|
compiler and collects them in an organized way.
|
||||||
|
|
||||||
\image qtcreator-task-list.png
|
\image qtcreator-build-issues.png
|
||||||
|
|
||||||
\section2 Search Results
|
\section2 Search Results
|
||||||
|
|
||||||
The Search Results pane displays the results for global searches such as
|
The \gui{Search Results} pane displays the results for global searches such
|
||||||
searching within a current document, files on disk, or all projects.
|
as searching within a current document, files on disk, or all projects. In
|
||||||
In the screenshot below, we searched for all occurrences of \c{textfinder}
|
the screenshot below, we searched for all occurrences of \c{textfinder}
|
||||||
within the "/TextFinder" folder.
|
within the \c{"/TextFinder"} folder.
|
||||||
|
|
||||||
\image qtcreator-search-pane.png
|
\image qtcreator-search-pane.png
|
||||||
|
|
||||||
\section2 Application Output
|
\section2 Application Output
|
||||||
|
|
||||||
This pane displays the status of the program when it is executed, as
|
The \gui{Application Output} pane displays the status of the program when
|
||||||
well as debug output, for example, output from qDebug().
|
it is executed and debug output, e.g., output from qDebug().
|
||||||
|
|
||||||
\image qtcreator-application-output.png
|
\image qtcreator-application-output.png
|
||||||
|
|
||||||
\section2 Compile Output
|
\section2 Compile
|
||||||
|
|
||||||
The Compile Output provides all the output from the compiler. In other
|
The \gui{Compile} pane provides all the output from the compiler. In other
|
||||||
words, it is a more verbose version of the Task List.
|
words, it is a more verbose version of information displayed in the
|
||||||
|
\gui{Build Issues}
|
||||||
|
|
||||||
\image qtcreator-compile-pane.png
|
\image qtcreator-compile-pane.png
|
||||||
|
|
||||||
@@ -521,7 +522,7 @@
|
|||||||
\page creator-navigation.html
|
\page creator-navigation.html
|
||||||
\nextpage creator-debugging.html
|
\nextpage creator-debugging.html
|
||||||
|
|
||||||
\title Quick Navigation
|
\title Navigating Quickly Around Your Code
|
||||||
|
|
||||||
With Qt Creator, navigating to different locations in your project or on
|
With Qt Creator, navigating to different locations in your project or on
|
||||||
your disk, such as files, classes and methods, is trivial using the input
|
your disk, such as files, classes and methods, is trivial using the input
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ static const char *HELP_OPTION4 = "--help";
|
|||||||
static const char *VERSION_OPTION = "-version";
|
static const char *VERSION_OPTION = "-version";
|
||||||
static const char *CLIENT_OPTION = "-client";
|
static const char *CLIENT_OPTION = "-client";
|
||||||
|
|
||||||
typedef QSet<ExtensionSystem::PluginSpec *> PluginSpecSet;
|
typedef QList<ExtensionSystem::PluginSpec *> PluginSpecSet;
|
||||||
|
|
||||||
// Helpers for displaying messages. Note that there is no console on Windows.
|
// Helpers for displaying messages. Note that there is no console on Windows.
|
||||||
#ifdef Q_WS_WIN
|
#ifdef Q_WS_WIN
|
||||||
|
|||||||
@@ -131,12 +131,16 @@ QString Document::fileName() const
|
|||||||
|
|
||||||
QStringList Document::includedFiles() const
|
QStringList Document::includedFiles() const
|
||||||
{
|
{
|
||||||
return _includedFiles;
|
QStringList files;
|
||||||
|
foreach (const Include &i, _includes)
|
||||||
|
files.append(i.fileName());
|
||||||
|
files.removeDuplicates();
|
||||||
|
return files;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Document::addIncludeFile(const QString &fileName)
|
void Document::addIncludeFile(const QString &fileName, unsigned line)
|
||||||
{
|
{
|
||||||
_includedFiles.append(fileName);
|
_includes.append(Include(fileName, line));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Document::appendMacro(const Macro ¯o)
|
void Document::appendMacro(const Macro ¯o)
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ public:
|
|||||||
QString fileName() const;
|
QString fileName() const;
|
||||||
|
|
||||||
QStringList includedFiles() const;
|
QStringList includedFiles() const;
|
||||||
void addIncludeFile(const QString &fileName);
|
void addIncludeFile(const QString &fileName, unsigned line);
|
||||||
|
|
||||||
void appendMacro(const Macro ¯o);
|
void appendMacro(const Macro ¯o);
|
||||||
void addMacroUse(const Macro ¯o, unsigned offset, unsigned length);
|
void addMacroUse(const Macro ¯o, unsigned offset, unsigned length);
|
||||||
@@ -181,6 +181,22 @@ public:
|
|||||||
{ return pos >= _begin && pos < _end; }
|
{ return pos >= _begin && pos < _end; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class Include {
|
||||||
|
QString _fileName;
|
||||||
|
unsigned _line;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Include(const QString &fileName, unsigned line)
|
||||||
|
: _fileName(fileName), _line(line)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
QString fileName() const
|
||||||
|
{ return _fileName; }
|
||||||
|
|
||||||
|
unsigned line() const
|
||||||
|
{ return _line; }
|
||||||
|
};
|
||||||
|
|
||||||
class MacroUse: public Block {
|
class MacroUse: public Block {
|
||||||
Macro _macro;
|
Macro _macro;
|
||||||
|
|
||||||
@@ -196,6 +212,9 @@ public:
|
|||||||
{ return _macro; }
|
{ return _macro; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
QList<Include> includes() const
|
||||||
|
{ return _includes; }
|
||||||
|
|
||||||
QList<Block> skippedBlocks() const
|
QList<Block> skippedBlocks() const
|
||||||
{ return _skippedBlocks; }
|
{ return _skippedBlocks; }
|
||||||
|
|
||||||
@@ -207,11 +226,11 @@ private:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
QString _fileName;
|
QString _fileName;
|
||||||
QStringList _includedFiles;
|
|
||||||
Control *_control;
|
Control *_control;
|
||||||
TranslationUnit *_translationUnit;
|
TranslationUnit *_translationUnit;
|
||||||
Namespace *_globalNamespace;
|
Namespace *_globalNamespace;
|
||||||
QList<DiagnosticMessage> _diagnosticMessages;
|
QList<DiagnosticMessage> _diagnosticMessages;
|
||||||
|
QList<Include> _includes;
|
||||||
QList<Macro> _definedMacros;
|
QList<Macro> _definedMacros;
|
||||||
QList<Block> _skippedBlocks;
|
QList<Block> _skippedBlocks;
|
||||||
QList<MacroUse> _macroUses;
|
QList<MacroUse> _macroUses;
|
||||||
|
|||||||
@@ -37,6 +37,7 @@
|
|||||||
#include <TranslationUnit.h>
|
#include <TranslationUnit.h>
|
||||||
#include <cplusplus/LookupContext.h>
|
#include <cplusplus/LookupContext.h>
|
||||||
#include <cplusplus/ResolveExpression.h>
|
#include <cplusplus/ResolveExpression.h>
|
||||||
|
#include <cplusplus/pp.h>
|
||||||
|
|
||||||
using namespace CPlusPlus;
|
using namespace CPlusPlus;
|
||||||
|
|
||||||
@@ -53,9 +54,13 @@ void TypeOfExpression::setDocuments(const QMap<QString, Document::Ptr> &document
|
|||||||
|
|
||||||
QList<TypeOfExpression::Result> TypeOfExpression::operator()(const QString &expression,
|
QList<TypeOfExpression::Result> TypeOfExpression::operator()(const QString &expression,
|
||||||
Document::Ptr document,
|
Document::Ptr document,
|
||||||
Symbol *lastVisibleSymbol)
|
Symbol *lastVisibleSymbol,
|
||||||
|
PreprocessMode mode)
|
||||||
{
|
{
|
||||||
Document::Ptr expressionDoc = documentForExpression(expression);
|
QString code = expression;
|
||||||
|
if (mode == Preprocess)
|
||||||
|
code = preprocessedExpression(expression, m_documents, document);
|
||||||
|
Document::Ptr expressionDoc = documentForExpression(code);
|
||||||
m_ast = extractExpressionAST(expressionDoc);
|
m_ast = extractExpressionAST(expressionDoc);
|
||||||
|
|
||||||
m_lookupContext = LookupContext(lastVisibleSymbol, expressionDoc,
|
m_lookupContext = LookupContext(lastVisibleSymbol, expressionDoc,
|
||||||
@@ -97,3 +102,34 @@ Document::Ptr TypeOfExpression::documentForExpression(const QString &expression)
|
|||||||
doc->parse(Document::ParseExpression);
|
doc->parse(Document::ParseExpression);
|
||||||
return doc;
|
return doc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TypeOfExpression::processEnvironment(QMap<QString, Document::Ptr> documents,
|
||||||
|
Document::Ptr doc, Environment *env,
|
||||||
|
QSet<QString> *processed) const
|
||||||
|
{
|
||||||
|
if (processed->contains(doc->fileName()))
|
||||||
|
return;
|
||||||
|
processed->insert(doc->fileName());
|
||||||
|
foreach (const Document::Include &incl, doc->includes()) {
|
||||||
|
processEnvironment(documents,
|
||||||
|
documents.value(incl.fileName()),
|
||||||
|
env, processed);
|
||||||
|
}
|
||||||
|
foreach (const Macro ¯o, doc->definedMacros())
|
||||||
|
env->bind(macro);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString TypeOfExpression::preprocessedExpression(const QString &expression,
|
||||||
|
QMap<QString, Document::Ptr> documents,
|
||||||
|
Document::Ptr thisDocument) const
|
||||||
|
{
|
||||||
|
Environment env;
|
||||||
|
QSet<QString> processed;
|
||||||
|
processEnvironment(documents, thisDocument,
|
||||||
|
&env, &processed);
|
||||||
|
const QByteArray code = expression.toUtf8();
|
||||||
|
pp preproc(0, env);
|
||||||
|
QByteArray preprocessedCode;
|
||||||
|
preproc("<expression>", code, &preprocessedCode);
|
||||||
|
return QString::fromUtf8(preprocessedCode);
|
||||||
|
}
|
||||||
|
|||||||
@@ -43,6 +43,9 @@
|
|||||||
|
|
||||||
namespace CPlusPlus {
|
namespace CPlusPlus {
|
||||||
|
|
||||||
|
class Environment;
|
||||||
|
class Macro;
|
||||||
|
|
||||||
class CPLUSPLUS_EXPORT TypeOfExpression
|
class CPLUSPLUS_EXPORT TypeOfExpression
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -60,6 +63,11 @@ public:
|
|||||||
*/
|
*/
|
||||||
void setDocuments(const QMap<QString, Document::Ptr> &documents);
|
void setDocuments(const QMap<QString, Document::Ptr> &documents);
|
||||||
|
|
||||||
|
enum PreprocessMode {
|
||||||
|
NoPreprocess,
|
||||||
|
Preprocess
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a list of possible fully specified types associated with the
|
* Returns a list of possible fully specified types associated with the
|
||||||
* given expression.
|
* given expression.
|
||||||
@@ -73,7 +81,8 @@ public:
|
|||||||
* @param lastVisibleSymbol The last visible symbol in the document.
|
* @param lastVisibleSymbol The last visible symbol in the document.
|
||||||
*/
|
*/
|
||||||
QList<Result> operator()(const QString &expression, Document::Ptr document,
|
QList<Result> operator()(const QString &expression, Document::Ptr document,
|
||||||
Symbol *lastVisibleSymbol);
|
Symbol *lastVisibleSymbol,
|
||||||
|
PreprocessMode mode = NoPreprocess);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the AST of the last evaluated expression.
|
* Returns the AST of the last evaluated expression.
|
||||||
@@ -91,6 +100,14 @@ private:
|
|||||||
ExpressionAST *extractExpressionAST(Document::Ptr doc) const;
|
ExpressionAST *extractExpressionAST(Document::Ptr doc) const;
|
||||||
Document::Ptr documentForExpression(const QString &expression) const;
|
Document::Ptr documentForExpression(const QString &expression) const;
|
||||||
|
|
||||||
|
void processEnvironment(QMap<QString, CPlusPlus::Document::Ptr> documents,
|
||||||
|
CPlusPlus::Document::Ptr doc, CPlusPlus::Environment *env,
|
||||||
|
QSet<QString> *processed) const;
|
||||||
|
|
||||||
|
QString preprocessedExpression(const QString &expression,
|
||||||
|
QMap<QString, CPlusPlus::Document::Ptr> documents,
|
||||||
|
CPlusPlus::Document::Ptr thisDocument) const;
|
||||||
|
|
||||||
QMap<QString, Document::Ptr> m_documents;
|
QMap<QString, Document::Ptr> m_documents;
|
||||||
ExpressionAST *m_ast;
|
ExpressionAST *m_ast;
|
||||||
LookupContext m_lookupContext;
|
LookupContext m_lookupContext;
|
||||||
|
|||||||
@@ -63,7 +63,8 @@ public:
|
|||||||
{ }
|
{ }
|
||||||
|
|
||||||
virtual void macroAdded(const Macro ¯o) = 0;
|
virtual void macroAdded(const Macro ¯o) = 0;
|
||||||
virtual void sourceNeeded(QString &fileName, IncludeType mode) = 0; // ### FIX the signature.
|
virtual void sourceNeeded(QString &fileName, IncludeType mode,
|
||||||
|
unsigned line) = 0; // ### FIX the signature.
|
||||||
|
|
||||||
virtual void startExpandingMacro(unsigned offset,
|
virtual void startExpandingMacro(unsigned offset,
|
||||||
const Macro ¯o,
|
const Macro ¯o,
|
||||||
|
|||||||
@@ -818,7 +818,7 @@ void pp::processInclude(bool skipCurentPath,
|
|||||||
QString fn = QString::fromUtf8(path.constData(), path.length());
|
QString fn = QString::fromUtf8(path.constData(), path.length());
|
||||||
|
|
||||||
if (client)
|
if (client)
|
||||||
client->sourceNeeded(fn, Client::IncludeGlobal);
|
client->sourceNeeded(fn, Client::IncludeGlobal, firstToken->lineno);
|
||||||
} else if (tk->is(T_ANGLE_STRING_LITERAL) || tk->is(T_STRING_LITERAL)) {
|
} else if (tk->is(T_ANGLE_STRING_LITERAL) || tk->is(T_STRING_LITERAL)) {
|
||||||
const QByteArray spell = tokenSpell(*tk);
|
const QByteArray spell = tokenSpell(*tk);
|
||||||
const char *beginOfPath = spell.constBegin();
|
const char *beginOfPath = spell.constBegin();
|
||||||
@@ -831,7 +831,7 @@ void pp::processInclude(bool skipCurentPath,
|
|||||||
QString fn = QString::fromUtf8(path.constData(), path.length());
|
QString fn = QString::fromUtf8(path.constData(), path.length());
|
||||||
|
|
||||||
if (client)
|
if (client)
|
||||||
client->sourceNeeded(fn, Client::IncludeLocal);
|
client->sourceNeeded(fn, Client::IncludeLocal, firstToken->lineno);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -129,7 +129,7 @@ bool OptionsParser::checkForNoLoadOption()
|
|||||||
"The plugin '%1' does not exist.").arg(m_currentArg);
|
"The plugin '%1' does not exist.").arg(m_currentArg);
|
||||||
m_hasError = true;
|
m_hasError = true;
|
||||||
} else {
|
} else {
|
||||||
m_pmPrivate->pluginSpecs.remove(spec);
|
m_pmPrivate->pluginSpecs.removeAll(spec);
|
||||||
delete spec;
|
delete spec;
|
||||||
m_isDependencyRefreshNeeded = true;
|
m_isDependencyRefreshNeeded = true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,7 +48,7 @@
|
|||||||
#include <QTest>
|
#include <QTest>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef QSet<ExtensionSystem::PluginSpec *> PluginSpecSet;
|
typedef QList<ExtensionSystem::PluginSpec *> PluginSpecSet;
|
||||||
|
|
||||||
enum { debugLeaks = 0 };
|
enum { debugLeaks = 0 };
|
||||||
|
|
||||||
@@ -162,6 +162,11 @@ enum { debugLeaks = 0 };
|
|||||||
using namespace ExtensionSystem;
|
using namespace ExtensionSystem;
|
||||||
using namespace ExtensionSystem::Internal;
|
using namespace ExtensionSystem::Internal;
|
||||||
|
|
||||||
|
static bool lessThanByPluginName(const PluginSpec *one, const PluginSpec *two)
|
||||||
|
{
|
||||||
|
return one->name() < two->name();
|
||||||
|
}
|
||||||
|
|
||||||
PluginManager *PluginManager::m_instance = 0;
|
PluginManager *PluginManager::m_instance = 0;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -306,7 +311,7 @@ QStringList PluginManager::arguments() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\fn QSet<PluginSpec *> PluginManager::plugins() const
|
\fn QList<PluginSpec *> PluginManager::plugins() const
|
||||||
List of all plugin specifications that have been found in the plugin search paths.
|
List of all plugin specifications that have been found in the plugin search paths.
|
||||||
This list is valid directly after the setPluginPaths() call.
|
This list is valid directly after the setPluginPaths() call.
|
||||||
The plugin specifications contain the information from the plugins' xml description files
|
The plugin specifications contain the information from the plugins' xml description files
|
||||||
@@ -315,7 +320,7 @@ QStringList PluginManager::arguments() const
|
|||||||
|
|
||||||
\sa setPluginPaths()
|
\sa setPluginPaths()
|
||||||
*/
|
*/
|
||||||
QSet<PluginSpec *> PluginManager::plugins() const
|
QList<PluginSpec *> PluginManager::plugins() const
|
||||||
{
|
{
|
||||||
return d->pluginSpecs;
|
return d->pluginSpecs;
|
||||||
}
|
}
|
||||||
@@ -703,9 +708,11 @@ void PluginManagerPrivate::readPluginPaths()
|
|||||||
foreach (const QString &specFile, specFiles) {
|
foreach (const QString &specFile, specFiles) {
|
||||||
PluginSpec *spec = new PluginSpec;
|
PluginSpec *spec = new PluginSpec;
|
||||||
spec->d->read(specFile);
|
spec->d->read(specFile);
|
||||||
pluginSpecs.insert(spec);
|
pluginSpecs.append(spec);
|
||||||
}
|
}
|
||||||
resolveDependencies();
|
resolveDependencies();
|
||||||
|
// ensure deterministic plugin load order by sorting
|
||||||
|
qSort(pluginSpecs.begin(), pluginSpecs.end(), lessThanByPluginName);
|
||||||
emit q->pluginsChanged();
|
emit q->pluginsChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -101,7 +101,7 @@ public:
|
|||||||
void loadPlugins();
|
void loadPlugins();
|
||||||
QStringList pluginPaths() const;
|
QStringList pluginPaths() const;
|
||||||
void setPluginPaths(const QStringList &paths);
|
void setPluginPaths(const QStringList &paths);
|
||||||
QSet<PluginSpec *> plugins() const;
|
QList<PluginSpec *> plugins() const;
|
||||||
void setFileExtension(const QString &extension);
|
void setFileExtension(const QString &extension);
|
||||||
QString fileExtension() const;
|
QString fileExtension() const;
|
||||||
|
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ public:
|
|||||||
void loadPlugin(PluginSpec *spec, PluginSpec::State destState);
|
void loadPlugin(PluginSpec *spec, PluginSpec::State destState);
|
||||||
void resolveDependencies();
|
void resolveDependencies();
|
||||||
|
|
||||||
QSet<PluginSpec *> pluginSpecs;
|
QList<PluginSpec *> pluginSpecs;
|
||||||
QList<PluginSpec *> testSpecs;
|
QList<PluginSpec *> testSpecs;
|
||||||
QStringList pluginPaths;
|
QStringList pluginPaths;
|
||||||
QString extension;
|
QString extension;
|
||||||
|
|||||||
@@ -693,10 +693,10 @@ int PluginSpecPrivate::versionCompare(const QString &version1, const QString &ve
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\fn bool PluginSpecPrivate::resolveDependencies(const QSet<PluginSpec *> &specs)
|
\fn bool PluginSpecPrivate::resolveDependencies(const QList<PluginSpec *> &specs)
|
||||||
\internal
|
\internal
|
||||||
*/
|
*/
|
||||||
bool PluginSpecPrivate::resolveDependencies(const QSet<PluginSpec *> &specs)
|
bool PluginSpecPrivate::resolveDependencies(const QList<PluginSpec *> &specs)
|
||||||
{
|
{
|
||||||
if (hasError)
|
if (hasError)
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ public:
|
|||||||
|
|
||||||
bool read(const QString &fileName);
|
bool read(const QString &fileName);
|
||||||
bool provides(const QString &pluginName, const QString &version) const;
|
bool provides(const QString &pluginName, const QString &version) const;
|
||||||
bool resolveDependencies(const QSet<PluginSpec *> &specs);
|
bool resolveDependencies(const QList<PluginSpec *> &specs);
|
||||||
bool loadLibrary();
|
bool loadLibrary();
|
||||||
bool initializePlugin();
|
bool initializePlugin();
|
||||||
bool initializeExtensions();
|
bool initializeExtensions();
|
||||||
|
|||||||
@@ -186,6 +186,15 @@ MainWindow::MainWindow() :
|
|||||||
QCoreApplication::setOrganizationName(QLatin1String("Nokia"));
|
QCoreApplication::setOrganizationName(QLatin1String("Nokia"));
|
||||||
QSettings::setDefaultFormat(QSettings::IniFormat);
|
QSettings::setDefaultFormat(QSettings::IniFormat);
|
||||||
QString baseName = qApp->style()->objectName();
|
QString baseName = qApp->style()->objectName();
|
||||||
|
if (baseName == "windows") {
|
||||||
|
// Sometimes we get the standard windows 95 style as a fallback
|
||||||
|
// e.g. if we are running on a KDE4 desktop
|
||||||
|
QByteArray desktopEnvironment = qgetenv("DESKTOP_SESSION");
|
||||||
|
if (desktopEnvironment == "kde")
|
||||||
|
baseName = "plastique";
|
||||||
|
else
|
||||||
|
baseName = "cleanlooks";
|
||||||
|
}
|
||||||
qApp->setStyle(new ManhattanStyle(baseName));
|
qApp->setStyle(new ManhattanStyle(baseName));
|
||||||
statusBar()->setProperty("p_styled", true);
|
statusBar()->setProperty("p_styled", true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -480,13 +480,23 @@ void CPPEditor::jumpToDefinition()
|
|||||||
Document::Ptr doc = m_modelManager->document(file()->fileName());
|
Document::Ptr doc = m_modelManager->document(file()->fileName());
|
||||||
if (!doc)
|
if (!doc)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
QTextCursor tc = textCursor();
|
||||||
|
unsigned lineno = tc.blockNumber() + 1;
|
||||||
|
foreach (const Document::Include &incl, doc->includes()) {
|
||||||
|
if (incl.line() == lineno) {
|
||||||
|
if (openCppEditorAt(incl.fileName(), 0, 0))
|
||||||
|
return; // done
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Symbol *lastSymbol = doc->findSymbolAt(line, column);
|
Symbol *lastSymbol = doc->findSymbolAt(line, column);
|
||||||
if (!lastSymbol)
|
if (!lastSymbol)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Get the expression under the cursor
|
// Get the expression under the cursor
|
||||||
const int endOfName = endOfNameUnderCursor();
|
const int endOfName = endOfNameUnderCursor();
|
||||||
QTextCursor tc = textCursor();
|
|
||||||
tc.setPosition(endOfName);
|
tc.setPosition(endOfName);
|
||||||
ExpressionUnderCursor expressionUnderCursor;
|
ExpressionUnderCursor expressionUnderCursor;
|
||||||
const QString expression = expressionUnderCursor(tc);
|
const QString expression = expressionUnderCursor(tc);
|
||||||
@@ -515,7 +525,7 @@ void CPPEditor::jumpToDefinition()
|
|||||||
QList<Symbol *> candidates = context.resolve(namedType->name());
|
QList<Symbol *> candidates = context.resolve(namedType->name());
|
||||||
if (!candidates.isEmpty()) {
|
if (!candidates.isEmpty()) {
|
||||||
Symbol *s = candidates.takeFirst();
|
Symbol *s = candidates.takeFirst();
|
||||||
openEditorAt(s->fileName(), s->line(), s->column());
|
openCppEditorAt(s->fileName(), s->line(), s->column());
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -524,7 +534,7 @@ void CPPEditor::jumpToDefinition()
|
|||||||
if (use.contains(endOfName - 1)) {
|
if (use.contains(endOfName - 1)) {
|
||||||
const Macro ¯o = use.macro();
|
const Macro ¯o = use.macro();
|
||||||
const QString fileName = QString::fromUtf8(macro.fileName);
|
const QString fileName = QString::fromUtf8(macro.fileName);
|
||||||
if (TextEditor::BaseTextEditor::openEditorAt(fileName, macro.line, 0))
|
if (openCppEditorAt(fileName, macro.line, 0))
|
||||||
return; // done
|
return; // done
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -826,8 +836,15 @@ int CPPEditor::endOfNameUnderCursor()
|
|||||||
return pos;
|
return pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TextEditor::ITextEditor *CPPEditor::openCppEditorAt(const QString &fileName,
|
||||||
|
int line, int column)
|
||||||
|
{
|
||||||
|
return TextEditor::BaseTextEditor::openEditorAt(fileName, line, column,
|
||||||
|
Constants::C_CPPEDITOR);
|
||||||
|
}
|
||||||
|
|
||||||
bool CPPEditor::openEditorAt(Symbol *s)
|
bool CPPEditor::openEditorAt(Symbol *s)
|
||||||
{
|
{
|
||||||
const QString fileName = QString::fromUtf8(s->fileName(), s->fileNameLength());
|
const QString fileName = QString::fromUtf8(s->fileName(), s->fileNameLength());
|
||||||
return TextEditor::BaseTextEditor::openEditorAt(fileName, s->line(), s->column());
|
return openCppEditorAt(fileName, s->line(), s->column());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -123,6 +123,9 @@ private:
|
|||||||
CPlusPlus::Symbol *findDefinition(CPlusPlus::Symbol *symbol);
|
CPlusPlus::Symbol *findDefinition(CPlusPlus::Symbol *symbol);
|
||||||
virtual void indentBlock(QTextDocument *doc, QTextBlock block, QChar typedChar);
|
virtual void indentBlock(QTextDocument *doc, QTextBlock block, QChar typedChar);
|
||||||
|
|
||||||
|
TextEditor::ITextEditor *openCppEditorAt(const QString &fileName, int line,
|
||||||
|
int column = 0);
|
||||||
|
|
||||||
int previousBlockState(QTextBlock block) const;
|
int previousBlockState(QTextBlock block) const;
|
||||||
QTextCursor moveToPreviousToken(QTextCursor::MoveMode mode) const;
|
QTextCursor moveToPreviousToken(QTextCursor::MoveMode mode) const;
|
||||||
QTextCursor moveToNextToken(QTextCursor::MoveMode mode) const;
|
QTextCursor moveToNextToken(QTextCursor::MoveMode mode) const;
|
||||||
|
|||||||
@@ -439,7 +439,8 @@ int CppCodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
|
|||||||
|
|
||||||
typeOfExpression.setDocuments(m_manager->documents());
|
typeOfExpression.setDocuments(m_manager->documents());
|
||||||
|
|
||||||
QList<TypeOfExpression::Result> resolvedTypes = typeOfExpression(expression, thisDocument, symbol);
|
QList<TypeOfExpression::Result> resolvedTypes = typeOfExpression(expression, thisDocument, symbol,
|
||||||
|
TypeOfExpression::Preprocess);
|
||||||
LookupContext context = typeOfExpression.lookupContext();
|
LookupContext context = typeOfExpression.lookupContext();
|
||||||
|
|
||||||
if (!typeOfExpression.expressionAST() && (! m_completionOperator ||
|
if (!typeOfExpression.expressionAST() && (! m_completionOperator ||
|
||||||
|
|||||||
@@ -177,6 +177,16 @@ void CppHoverHandler::updateHelpIdAndTooltip(TextEditor::ITextEditor *editor, in
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_toolTip.isEmpty()) {
|
||||||
|
unsigned lineno = tc.blockNumber() + 1;
|
||||||
|
foreach (const Document::Include &incl, doc->includes()) {
|
||||||
|
if (lineno == incl.line()) {
|
||||||
|
m_toolTip = incl.fileName();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (m_toolTip.isEmpty()) {
|
if (m_toolTip.isEmpty()) {
|
||||||
// Move to the end of a qualified name
|
// Move to the end of a qualified name
|
||||||
bool stop = false;
|
bool stop = false;
|
||||||
|
|||||||
@@ -138,7 +138,8 @@ protected:
|
|||||||
virtual void stopExpandingMacro(unsigned offset, const Macro ¯o);
|
virtual void stopExpandingMacro(unsigned offset, const Macro ¯o);
|
||||||
virtual void startSkippingBlocks(unsigned offset);
|
virtual void startSkippingBlocks(unsigned offset);
|
||||||
virtual void stopSkippingBlocks(unsigned offset);
|
virtual void stopSkippingBlocks(unsigned offset);
|
||||||
virtual void sourceNeeded(QString &fileName, IncludeType type);
|
virtual void sourceNeeded(QString &fileName, IncludeType type,
|
||||||
|
unsigned line);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QPointer<CppModelManager> m_modelManager;
|
QPointer<CppModelManager> m_modelManager;
|
||||||
@@ -176,7 +177,7 @@ void CppPreprocessor::setProjectFiles(const QStringList &files)
|
|||||||
{ m_projectFiles = files; }
|
{ m_projectFiles = files; }
|
||||||
|
|
||||||
void CppPreprocessor::run(QString &fileName)
|
void CppPreprocessor::run(QString &fileName)
|
||||||
{ sourceNeeded(fileName, IncludeGlobal); }
|
{ sourceNeeded(fileName, IncludeGlobal, /*line = */ 0); }
|
||||||
|
|
||||||
void CppPreprocessor::operator()(QString &fileName)
|
void CppPreprocessor::operator()(QString &fileName)
|
||||||
{ run(fileName); }
|
{ run(fileName); }
|
||||||
@@ -361,7 +362,8 @@ void CppPreprocessor::stopSkippingBlocks(unsigned offset)
|
|||||||
m_currentDoc->stopSkippingBlocks(offset);
|
m_currentDoc->stopSkippingBlocks(offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CppPreprocessor::sourceNeeded(QString &fileName, IncludeType type)
|
void CppPreprocessor::sourceNeeded(QString &fileName, IncludeType type,
|
||||||
|
unsigned line)
|
||||||
{
|
{
|
||||||
if (fileName.isEmpty())
|
if (fileName.isEmpty())
|
||||||
return;
|
return;
|
||||||
@@ -369,7 +371,7 @@ void CppPreprocessor::sourceNeeded(QString &fileName, IncludeType type)
|
|||||||
QByteArray contents = tryIncludeFile(fileName, type);
|
QByteArray contents = tryIncludeFile(fileName, type);
|
||||||
|
|
||||||
if (m_currentDoc) {
|
if (m_currentDoc) {
|
||||||
m_currentDoc->addIncludeFile(fileName);
|
m_currentDoc->addIncludeFile(fileName, line);
|
||||||
if (contents.isEmpty() && ! QFileInfo(fileName).isAbsolute()) {
|
if (contents.isEmpty() && ! QFileInfo(fileName).isAbsolute()) {
|
||||||
QString msg;
|
QString msg;
|
||||||
msg += fileName;
|
msg += fileName;
|
||||||
|
|||||||
@@ -88,7 +88,6 @@ public:
|
|||||||
void finished(bool accepted);
|
void finished(bool accepted);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void onScriptButton();
|
|
||||||
void onAddButton();
|
void onAddButton();
|
||||||
void onDelButton();
|
void onDelButton();
|
||||||
void currentItemChanged(QTreeWidgetItem *item);
|
void currentItemChanged(QTreeWidgetItem *item);
|
||||||
|
|||||||
@@ -109,6 +109,8 @@ QWidget *TypeMacroPage::createPage(QWidget *parent)
|
|||||||
|
|
||||||
m_widget = new QWidget(parent);
|
m_widget = new QWidget(parent);
|
||||||
m_ui.setupUi(m_widget);
|
m_ui.setupUi(m_widget);
|
||||||
|
m_ui.scriptFile->setPromptDialogTitle(tr("Select Gdb Script"));
|
||||||
|
m_ui.scriptFile->setExpectedKind(Core::Utils::PathChooser::File);
|
||||||
|
|
||||||
connect(m_ui.addButton, SIGNAL(clicked()),
|
connect(m_ui.addButton, SIGNAL(clicked()),
|
||||||
this, SLOT(onAddButton()));
|
this, SLOT(onAddButton()));
|
||||||
@@ -116,8 +118,8 @@ QWidget *TypeMacroPage::createPage(QWidget *parent)
|
|||||||
connect(m_ui.delButton, SIGNAL(clicked()),
|
connect(m_ui.delButton, SIGNAL(clicked()),
|
||||||
this, SLOT(onDelButton()));
|
this, SLOT(onDelButton()));
|
||||||
|
|
||||||
connect(m_ui.scriptButton, SIGNAL(clicked()),
|
connect(m_ui.scriptFile, SIGNAL(validChanged()),
|
||||||
this, SLOT(onScriptButton()));
|
this, SLOT(updateButtonState()));
|
||||||
|
|
||||||
connect(m_ui.treeWidget, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)),
|
connect(m_ui.treeWidget, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)),
|
||||||
this, SLOT(currentItemChanged(QTreeWidgetItem *)));
|
this, SLOT(currentItemChanged(QTreeWidgetItem *)));
|
||||||
@@ -139,7 +141,7 @@ QWidget *TypeMacroPage::createPage(QWidget *parent)
|
|||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_ui.scriptEdit->setText(m_settings->m_scriptFile);
|
m_ui.scriptFile->setPath(m_settings->m_scriptFile);
|
||||||
|
|
||||||
updateButtonState();
|
updateButtonState();
|
||||||
|
|
||||||
@@ -152,7 +154,7 @@ void TypeMacroPage::finished(bool accepted)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
m_settings->m_typeMacros.clear();
|
m_settings->m_typeMacros.clear();
|
||||||
m_settings->m_scriptFile = m_ui.scriptEdit->text();
|
m_settings->m_scriptFile = m_ui.scriptFile->path();
|
||||||
|
|
||||||
for (int i = 0; i < m_ui.treeWidget->topLevelItemCount(); ++i) {
|
for (int i = 0; i < m_ui.treeWidget->topLevelItemCount(); ++i) {
|
||||||
QTreeWidgetItem *item = m_ui.treeWidget->topLevelItem(i);
|
QTreeWidgetItem *item = m_ui.treeWidget->topLevelItem(i);
|
||||||
@@ -172,13 +174,6 @@ void TypeMacroPage::finished(bool accepted)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TypeMacroPage::onScriptButton()
|
|
||||||
{
|
|
||||||
QString fileName = QFileDialog::getOpenFileName(m_widget, tr("Select Gdb Script"));
|
|
||||||
m_ui.scriptEdit->setText(fileName);
|
|
||||||
updateButtonState();
|
|
||||||
}
|
|
||||||
|
|
||||||
void TypeMacroPage::onAddButton()
|
void TypeMacroPage::onAddButton()
|
||||||
{
|
{
|
||||||
if (m_ui.typeEdit->text().isEmpty() || m_ui.macroEdit->text().isEmpty())
|
if (m_ui.typeEdit->text().isEmpty() || m_ui.macroEdit->text().isEmpty())
|
||||||
|
|||||||
@@ -626,7 +626,7 @@ QList<FolderNode*> DetailedModel::recursiveSubFolders(FolderNode *parentFolder)
|
|||||||
|
|
||||||
FlatModel::FlatModel(SessionNode *rootNode, QObject *parent)
|
FlatModel::FlatModel(SessionNode *rootNode, QObject *parent)
|
||||||
: QAbstractItemModel(parent),
|
: QAbstractItemModel(parent),
|
||||||
m_filterProjects(true),
|
m_filterProjects(false),
|
||||||
m_filterGeneratedFiles(true),
|
m_filterGeneratedFiles(true),
|
||||||
m_rootNode(rootNode),
|
m_rootNode(rootNode),
|
||||||
m_startupProject(0),
|
m_startupProject(0),
|
||||||
@@ -914,6 +914,8 @@ QModelIndex FlatModel::indexForNode(const Node *node_)
|
|||||||
|
|
||||||
void FlatModel::setProjectFilterEnabled(bool filter)
|
void FlatModel::setProjectFilterEnabled(bool filter)
|
||||||
{
|
{
|
||||||
|
if (filter == m_filterProjects)
|
||||||
|
return;
|
||||||
m_filterProjects = filter;
|
m_filterProjects = filter;
|
||||||
reset();
|
reset();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -90,6 +90,20 @@ protected:
|
|||||||
if (event->reason() != Qt::PopupFocusReason)
|
if (event->reason() != Qt::PopupFocusReason)
|
||||||
QTreeView::focusOutEvent(event);
|
QTreeView::focusOutEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef Q_OS_MAC
|
||||||
|
void keyPressEvent(QKeyEvent *event)
|
||||||
|
{
|
||||||
|
if ((event->key() == Qt::Key_Return
|
||||||
|
|| event->key() == Qt::Key_Enter)
|
||||||
|
&& event->modifiers() == 0
|
||||||
|
&& currentIndex().isValid()) {
|
||||||
|
emit activated(currentIndex());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
QTreeView::keyPressEvent(event);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|||||||
@@ -54,14 +54,7 @@ QList<FilterEntry> FileSystemFilter::matchesFor(const QString &entry)
|
|||||||
QString name = entryInfo.fileName();
|
QString name = entryInfo.fileName();
|
||||||
QString directory = entryInfo.path();
|
QString directory = entryInfo.path();
|
||||||
QString filePath = entryInfo.filePath();
|
QString filePath = entryInfo.filePath();
|
||||||
bool isDrive = false;
|
if (entryInfo.isRelative()) {
|
||||||
foreach (const QFileInfo &drive, QDir::drives()) {
|
|
||||||
if (filePath.startsWith(drive.path())) {
|
|
||||||
isDrive = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!isDrive) {
|
|
||||||
if (filePath.startsWith("~/")) {
|
if (filePath.startsWith("~/")) {
|
||||||
directory.replace(0, 1, QDir::homePath());
|
directory.replace(0, 1, QDir::homePath());
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -128,12 +128,13 @@ protected:
|
|||||||
|
|
||||||
ITextEditor *BaseTextEditor::openEditorAt(const QString &fileName,
|
ITextEditor *BaseTextEditor::openEditorAt(const QString &fileName,
|
||||||
int line,
|
int line,
|
||||||
int column)
|
int column,
|
||||||
|
const QString &editorKind)
|
||||||
{
|
{
|
||||||
Core::EditorManager *editorManager =
|
Core::EditorManager *editorManager =
|
||||||
ExtensionSystem::PluginManager::instance()->getObject<Core::ICore>()->editorManager();
|
ExtensionSystem::PluginManager::instance()->getObject<Core::ICore>()->editorManager();
|
||||||
editorManager->addCurrentPositionToNavigationHistory(true);
|
editorManager->addCurrentPositionToNavigationHistory(true);
|
||||||
Core::IEditor *editor = editorManager->openEditor(fileName, QString(), true);
|
Core::IEditor *editor = editorManager->openEditor(fileName, editorKind, true);
|
||||||
TextEditor::ITextEditor *texteditor = qobject_cast<TextEditor::ITextEditor *>(editor);
|
TextEditor::ITextEditor *texteditor = qobject_cast<TextEditor::ITextEditor *>(editor);
|
||||||
if (texteditor) {
|
if (texteditor) {
|
||||||
texteditor->gotoLine(line, column);
|
texteditor->gotoLine(line, column);
|
||||||
@@ -684,6 +685,64 @@ void BaseTextEditor::selectBlockDown()
|
|||||||
_q_matchParentheses();
|
_q_matchParentheses();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BaseTextEditor::moveLineUp()
|
||||||
|
{
|
||||||
|
moveLineUpDown(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void BaseTextEditor::moveLineDown()
|
||||||
|
{
|
||||||
|
moveLineUpDown(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void BaseTextEditor::moveLineUpDown(bool up)
|
||||||
|
{
|
||||||
|
QTextCursor cursor = textCursor();
|
||||||
|
QTextCursor move = cursor;
|
||||||
|
move.beginEditBlock();
|
||||||
|
|
||||||
|
bool hasSelection = cursor.hasSelection();
|
||||||
|
|
||||||
|
if (cursor.hasSelection()) {
|
||||||
|
move.setPosition(cursor.selectionStart());
|
||||||
|
move.movePosition(QTextCursor::StartOfBlock);
|
||||||
|
move.setPosition(cursor.selectionEnd(), QTextCursor::KeepAnchor);
|
||||||
|
move.movePosition(QTextCursor::EndOfBlock, QTextCursor::KeepAnchor);
|
||||||
|
} else {
|
||||||
|
move.movePosition(QTextCursor::StartOfBlock);
|
||||||
|
move.movePosition(QTextCursor::EndOfBlock, QTextCursor::KeepAnchor);
|
||||||
|
}
|
||||||
|
QString text = move.selectedText();
|
||||||
|
move.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor);
|
||||||
|
move.removeSelectedText();
|
||||||
|
|
||||||
|
if (up) {
|
||||||
|
move.movePosition(QTextCursor::PreviousBlock);
|
||||||
|
move.insertBlock();
|
||||||
|
move.movePosition(QTextCursor::Left);
|
||||||
|
} else {
|
||||||
|
move.movePosition(QTextCursor::EndOfBlock);
|
||||||
|
if (move.atBlockStart()) { // empty block
|
||||||
|
move.movePosition(QTextCursor::NextBlock);
|
||||||
|
move.insertBlock();
|
||||||
|
move.movePosition(QTextCursor::Left);
|
||||||
|
} else {
|
||||||
|
move.insertBlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int start = move.position();
|
||||||
|
move.clearSelection();
|
||||||
|
move.insertText(text);
|
||||||
|
int end = move.position();
|
||||||
|
move.endEditBlock();
|
||||||
|
if (hasSelection) {
|
||||||
|
move.setPosition(start);
|
||||||
|
move.setPosition(end, QTextCursor::KeepAnchor);
|
||||||
|
}
|
||||||
|
|
||||||
|
setTextCursor(move);
|
||||||
|
}
|
||||||
|
|
||||||
void BaseTextEditor::cleanWhitespace()
|
void BaseTextEditor::cleanWhitespace()
|
||||||
{
|
{
|
||||||
@@ -740,9 +799,13 @@ void BaseTextEditor::keyPressEvent(QKeyEvent *e)
|
|||||||
QTextCursor cursor = textCursor();
|
QTextCursor cursor = textCursor();
|
||||||
if (d->m_inBlockSelectionMode)
|
if (d->m_inBlockSelectionMode)
|
||||||
cursor.clearSelection();
|
cursor.clearSelection();
|
||||||
cursor.insertBlock();
|
|
||||||
if (d->m_document->tabSettings().m_autoIndent) {
|
if (d->m_document->tabSettings().m_autoIndent) {
|
||||||
|
cursor.beginEditBlock();
|
||||||
|
cursor.insertBlock();
|
||||||
indent(document(), cursor, QChar::Null);
|
indent(document(), cursor, QChar::Null);
|
||||||
|
cursor.endEditBlock();
|
||||||
|
} else {
|
||||||
|
cursor.insertBlock();
|
||||||
}
|
}
|
||||||
e->accept();
|
e->accept();
|
||||||
setTextCursor(cursor);
|
setTextCursor(cursor);
|
||||||
|
|||||||
@@ -230,7 +230,8 @@ public:
|
|||||||
BaseTextEditor(QWidget *parent);
|
BaseTextEditor(QWidget *parent);
|
||||||
~BaseTextEditor();
|
~BaseTextEditor();
|
||||||
|
|
||||||
static ITextEditor *openEditorAt(const QString &fileName, int line, int column = 0);
|
static ITextEditor *openEditorAt(const QString &fileName, int line, int column = 0,
|
||||||
|
const QString &editorKind = QString());
|
||||||
|
|
||||||
// EditorInterface
|
// EditorInterface
|
||||||
Core::IFile * file();
|
Core::IFile * file();
|
||||||
@@ -329,6 +330,9 @@ public slots:
|
|||||||
void selectBlockUp();
|
void selectBlockUp();
|
||||||
void selectBlockDown();
|
void selectBlockDown();
|
||||||
|
|
||||||
|
void moveLineUp();
|
||||||
|
void moveLineDown();
|
||||||
|
|
||||||
void cleanWhitespace();
|
void cleanWhitespace();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
@@ -447,6 +451,7 @@ private:
|
|||||||
void indentOrUnindent(bool doIndent);
|
void indentOrUnindent(bool doIndent);
|
||||||
void handleHomeKey(bool anchor);
|
void handleHomeKey(bool anchor);
|
||||||
void handleBackspaceKey();
|
void handleBackspaceKey();
|
||||||
|
void moveLineUpDown(bool up);
|
||||||
|
|
||||||
void toggleBlockVisible(const QTextBlock &block);
|
void toggleBlockVisible(const QTextBlock &block);
|
||||||
QRect collapseBox(const QTextBlock &block);
|
QRect collapseBox(const QTextBlock &block);
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ TextEditorActionHandler::TextEditorActionHandler(Core::ICore *core,
|
|||||||
= m_gotoBlockStartAction = m_gotoBlockStartWithSelectionAction
|
= m_gotoBlockStartAction = m_gotoBlockStartWithSelectionAction
|
||||||
= m_gotoBlockEndAction = m_gotoBlockEndWithSelectionAction
|
= m_gotoBlockEndAction = m_gotoBlockEndWithSelectionAction
|
||||||
= m_selectBlockUpAction = m_selectBlockDownAction
|
= m_selectBlockUpAction = m_selectBlockDownAction
|
||||||
|
= m_moveLineUpAction = m_moveLineDownAction
|
||||||
= 0;
|
= 0;
|
||||||
|
|
||||||
m_contextId << m_core->uniqueIDManager()->uniqueIdentifier(context);
|
m_contextId << m_core->uniqueIDManager()->uniqueIdentifier(context);
|
||||||
@@ -223,6 +224,16 @@ void TextEditorActionHandler::createActions()
|
|||||||
command = am->registerAction(m_selectBlockDownAction, Constants::SELECT_BLOCK_DOWN, m_contextId);
|
command = am->registerAction(m_selectBlockDownAction, Constants::SELECT_BLOCK_DOWN, m_contextId);
|
||||||
command->setDefaultKeySequence(QKeySequence(tr("Ctrl+Shift+U")));
|
command->setDefaultKeySequence(QKeySequence(tr("Ctrl+Shift+U")));
|
||||||
connect(m_selectBlockDownAction, SIGNAL(triggered()), this, SLOT(selectBlockDown()));
|
connect(m_selectBlockDownAction, SIGNAL(triggered()), this, SLOT(selectBlockDown()));
|
||||||
|
|
||||||
|
m_moveLineUpAction= new QAction(tr("Move Line Up"), this);
|
||||||
|
command = am->registerAction(m_moveLineUpAction, Constants::MOVE_LINE_UP, m_contextId);
|
||||||
|
command->setDefaultKeySequence(QKeySequence(tr("Ctrl+Shift+Up")));
|
||||||
|
connect(m_moveLineUpAction, SIGNAL(triggered()), this, SLOT(moveLineUp()));
|
||||||
|
|
||||||
|
m_moveLineDownAction= new QAction(tr("Move Line Down"), this);
|
||||||
|
command = am->registerAction(m_moveLineDownAction, Constants::MOVE_LINE_DOWN, m_contextId);
|
||||||
|
command->setDefaultKeySequence(QKeySequence(tr("Ctrl+Shift+Down")));
|
||||||
|
connect(m_moveLineDownAction, SIGNAL(triggered()), this, SLOT(moveLineDown()));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TextEditorActionHandler::supportsAction(const QString & /*id */) const
|
bool TextEditorActionHandler::supportsAction(const QString & /*id */) const
|
||||||
@@ -287,6 +298,8 @@ void TextEditorActionHandler::updateActions(UpdateMode um)
|
|||||||
m_gotoBlockEndWithSelectionAction->setEnabled(um != NoEditor);
|
m_gotoBlockEndWithSelectionAction->setEnabled(um != NoEditor);
|
||||||
m_selectBlockUpAction->setEnabled(um != NoEditor);
|
m_selectBlockUpAction->setEnabled(um != NoEditor);
|
||||||
m_selectBlockDownAction->setEnabled(um != NoEditor);
|
m_selectBlockDownAction->setEnabled(um != NoEditor);
|
||||||
|
m_moveLineUpAction->setEnabled(um != NoEditor);
|
||||||
|
m_moveLineDownAction->setEnabled(um != NoEditor);
|
||||||
|
|
||||||
m_visualizeWhitespaceAction->setEnabled(um != NoEditor);
|
m_visualizeWhitespaceAction->setEnabled(um != NoEditor);
|
||||||
if (m_currentEditor)
|
if (m_currentEditor)
|
||||||
@@ -390,6 +403,8 @@ FUNCTION(gotoBlockStartWithSelection)
|
|||||||
FUNCTION(gotoBlockEndWithSelection)
|
FUNCTION(gotoBlockEndWithSelection)
|
||||||
FUNCTION(selectBlockUp)
|
FUNCTION(selectBlockUp)
|
||||||
FUNCTION(selectBlockDown)
|
FUNCTION(selectBlockDown)
|
||||||
|
FUNCTION(moveLineUp)
|
||||||
|
FUNCTION(moveLineDown)
|
||||||
|
|
||||||
void TextEditorActionHandler::updateCurrentEditor(Core::IContext *object)
|
void TextEditorActionHandler::updateCurrentEditor(Core::IContext *object)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -116,6 +116,8 @@ private slots:
|
|||||||
void gotoBlockEndWithSelection();
|
void gotoBlockEndWithSelection();
|
||||||
void selectBlockUp();
|
void selectBlockUp();
|
||||||
void selectBlockDown();
|
void selectBlockDown();
|
||||||
|
void moveLineUp();
|
||||||
|
void moveLineDown();
|
||||||
void updateCurrentEditor(Core::IContext *object);
|
void updateCurrentEditor(Core::IContext *object);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -145,6 +147,8 @@ private:
|
|||||||
QAction *m_gotoBlockEndWithSelectionAction;
|
QAction *m_gotoBlockEndWithSelectionAction;
|
||||||
QAction *m_selectBlockUpAction;
|
QAction *m_selectBlockUpAction;
|
||||||
QAction *m_selectBlockDownAction;
|
QAction *m_selectBlockDownAction;
|
||||||
|
QAction *m_moveLineUpAction;
|
||||||
|
QAction *m_moveLineDownAction;
|
||||||
|
|
||||||
uint m_optionalActions;
|
uint m_optionalActions;
|
||||||
QPointer<BaseTextEditor> m_currentEditor;
|
QPointer<BaseTextEditor> m_currentEditor;
|
||||||
|
|||||||
@@ -55,6 +55,8 @@ const char * const GOTO_BLOCK_END = "TextEditor.GotoBlockEnd";
|
|||||||
const char * const GOTO_BLOCK_END_WITH_SELECTION = "TextEditor.GotoBlockEndWithSelection";
|
const char * const GOTO_BLOCK_END_WITH_SELECTION = "TextEditor.GotoBlockEndWithSelection";
|
||||||
const char * const SELECT_BLOCK_UP = "TextEditor.SelectBlockUp";
|
const char * const SELECT_BLOCK_UP = "TextEditor.SelectBlockUp";
|
||||||
const char * const SELECT_BLOCK_DOWN = "TextEditor.SelectBlockDown";
|
const char * const SELECT_BLOCK_DOWN = "TextEditor.SelectBlockDown";
|
||||||
|
const char * const MOVE_LINE_UP = "TextEditor.MoveLineUp";
|
||||||
|
const char * const MOVE_LINE_DOWN = "TextEditor.MoveLineDown";
|
||||||
const char * const DELETE_LINE = "TextEditor.DeleteLine";
|
const char * const DELETE_LINE = "TextEditor.DeleteLine";
|
||||||
const char * const DELETE_WORD = "TextEditor.DeleteWord";
|
const char * const DELETE_WORD = "TextEditor.DeleteWord";
|
||||||
const char * const SELECT_ENCODING = "TextEditor.SelectEncoding";
|
const char * const SELECT_ENCODING = "TextEditor.SelectEncoding";
|
||||||
|
|||||||
Reference in New Issue
Block a user