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:
hjk
2008-12-11 14:04:45 +01:00
30 changed files with 314 additions and 95 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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 &macro) void Document::appendMacro(const Macro &macro)

View File

@@ -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 &macro); void appendMacro(const Macro &macro);
void addMacroUse(const Macro &macro, unsigned offset, unsigned length); void addMacroUse(const Macro &macro, 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;

View File

@@ -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 &macro, 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);
}

View File

@@ -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;

View File

@@ -63,7 +63,8 @@ public:
{ } { }
virtual void macroAdded(const Macro &macro) = 0; virtual void macroAdded(const Macro &macro) = 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 &macro, const Macro &macro,

View File

@@ -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);
} }
} }
} }

View File

@@ -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;
} }

View File

@@ -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();
} }

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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();

View File

@@ -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);
} }

View File

@@ -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 &macro = use.macro(); const Macro &macro = 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());
} }

View File

@@ -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;

View File

@@ -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 ||

View File

@@ -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;

View File

@@ -138,7 +138,8 @@ protected:
virtual void stopExpandingMacro(unsigned offset, const Macro &macro); virtual void stopExpandingMacro(unsigned offset, const Macro &macro);
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;

View File

@@ -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);

View File

@@ -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())

View File

@@ -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();
} }

View File

@@ -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
}; };
/*! /*!

View File

@@ -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 {

View File

@@ -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);

View File

@@ -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);

View File

@@ -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)
{ {

View File

@@ -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;

View File

@@ -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";