diff --git a/doc/coding-style.qdoc b/doc/coding-style.qdoc new file mode 100644 index 0000000000000000000000000000000000000000..f028e56fe743e4ea78e3f683b649084856a2aca4 --- /dev/null +++ b/doc/coding-style.qdoc @@ -0,0 +1,246 @@ +/*! + +\contentpage{index.html}{Qt Creator} +\page coding-style.html + +\title Qt Creator Coding Rules + +THIS IS PRELIMINARY. + +\section1 Introduction + +The aim of this section is to serve as a guide for the developers, to aid us +to build understandable and maintainable code, to create less confusion and +surprises when working on Qt Creator. + +As usual: Rules are not set in stone. If there's a good reason to break one, +do it, preferably after making sure that there are others agreeing. + +This document is incomplete. + +In general, if you want to contribute to the main source, we expect at least +that you: + +\list 1 +\o The most important rule first: KISS (keep it simple ...): always + use a simple implementation in favor of a more complicated one. + This eases maintenance a lot. +\o Write good C++ code: Readable, well commented when necessary, + and taking advantage of the OO model. Follow the \l{Formatting} guidelines. + There are also certain \l{Code Constructs} that we try to follow. +\o Adapt the code to the structures already existing in Qt Creator, or in + the case that you have better ideas, discuss them with other developers + before writing the code. +\o Take advantage of Qt. Don't re-invent the wheel. Think about what parts + of your code are generic enough that they might be incorporated into + Qt proper. +\o Document interfaces. Right now we use qdoc, but changing to doxygen + is being considered. +\endlist + + + +\section1 Submitting Code + +It is implicitly understood that all patches contributed to The Qt Creator +Project are made under under the Gnu General Public License, version 2 or later +and + +If you have a problem with that, don't contribute code. + +Also please don't just pop up out of the blue with a huge patch (or +small) that changes something substantial in Qt Creator. Always discuss your +ideas with the other developers on mailing list first. + +When you create the patch, please use git or use "diff -up" since we find +that a lot easier to read than the other diff formats. Also please do not +send patches that implements or fixes several different things; several +patches is a much better option. + +We also require you to provide a commit message entry with every patch, +this describes in detail what the patch is doing. + + + +\section1 Code Constructs + +We have several guidelines on code constructs, some of these exist to +make the code faster, others to make the code clearer. Yet others +exist to allow us to take advantage of the strong type checking +in C++. + +\list 1 +\o Declaration of variables should wait as long as possible. The rule + is: "Don't declare it until you need it." In C++ there are a lot of + user defined types, and these can very often be expensive to + initialize. This rule connects to the next rule too. + +\o Make the scope of a variable as small as possible. + +\o Prefer preincrement to postincrement whenever possible. + Preincrement has potential of being faster than postincrement. Just + think about the obvious implementations of pre/post-increment. This + rule applies to decrement too. + +\code + ++T; + --U; + -NOT- + T++; // not used in Qt Creator + U--; // not used in Qt Creator +\endcode + +\o Try to minimize evaluation of the same code over and over. This is + aimed especially at loops. + +\code + + Container::iterator end = large.end(); + for (Container::iterator it = large.begin(); it != end; ++it) { + ...; + } + -NOT- + for (Container::iterator it = large.begin(); + it != large.end(); ++it) { + ...; + } +\endcode + + + +\section1 Formatting + +\section2 Declarations + +Only one declaration on each line. +\code + int a; + int b; + -NOT- + int a, b; // not used in Qt Creator +\endcode + + This is especially important when initialization is done at the same + time. +\code + QString a = "Joe"; + QString b = "Foo"; + -NOT- + QString a = "Joe", b = "Foo"; // not used in Qt Creator +\endcode + [Note that 'QString a = "Joe"' is formally calling a copy constructor + on a temporary constructed from a string literal and therefore has the + potential of being more expensive then direct construction by + 'QString a("joe")'. However the compiler is allowed to elide the copy + (even if it had side effects), and modern compilers typically do so. + Given these equal costs, Qt Creator code favours the '=' idiom as it is in + line with the traditional C-style initialization, _and_ cannot be + mistaken as function declaration, _and_ reduces the level of nested + parantheses in more initializations.] + + +\section2 Pointers and references + +\code + char *p = "flop"; + char &c = *p; + -NOT- + char* p = "flop"; // not used in Qt Creator + char & c = *p; // not used in Qt Creator +\endcode + + This is simply in line with the official Qt guide lines. + + Also note that we will have: +\code + const char *p; + -NOT- + char const * p; // not used in Qt Creator +\endcode + + + Using a plain 0 for Null pointer constants is always correct and least effort + to type. So: +\code + void *p = 0; + -NOT- + void *p = NULL; // not used in Qt Creator + -NOT- + void *p = '\0'; // not used in Qt Creator + -NOT- + void *p = 42 - 7 * 6; // also not used in Qt Creator +\endcode + Note: As an exception, imported third party code as well as code + interfacing the "native" APIs (src/support/os_*) can use NULL. + + +\section2 Operator names and parentheses +\code + operator==(type) + -NOT- + operator == (type) // not used in Qt Creator +\endcode + + The == is part of the function name, separating it makes the + declaration look like an expression. + + +\section2 Function names and parentheses +\code + void mangle() + -NOT- + void mangle () // not used in Qt Creator +\endcode + + + +\section2 Naming rules + + Simply follow the style of Qt proper. As examples: + \list + \o Use descriptive but simple and short names. Do not abbreviate. + + \o Class names are capitalized, and function names lowercased. + Enums are named like Classes, values are in lower-case. +\endlist + + + +\section2 Formatting + + Adapt the formatting of your code to the one used in the + other parts of Qt Creator. In case there is different formatting for + the same construct, use the one used more often. + + +\section2 Declarations + + - Use this order for the access sections of your class: public, + protected, private. The public section is interesting for every + user of the class. The private section is only of interest for the + implementors of the class (you). [Obviously not true since this is + for developers, and we do not want one developer only to be able to + read and understand the implementation of class internals. Lgb] + + - Avoid declaring global objects in the declaration file of the class. + If the same variable is used for all objects, use a static member. + + - Avoid global or static variables. + + +\section2 File headers + + If you create a new file, the top of the file should include a + header comment equal to the one found in other source files of Qt Creator. + +\section2 Documentation + + The documentation is generated from source and header files. + You document for the other developers, not for yourself. + In the header you should document interfaces, i.e. what the function does, + not the implementation. + In the .cpp files you document the implementation if the implementation + in non-obvious. + + +*/ diff --git a/doc/qtcreator.qdoc b/doc/qtcreator.qdoc index 0db515fe43467daf0bf37b855c8822eb129519ad..b8d38a60c9ab98bf6dc138c38eb843fbaad1cfd8 100644 --- a/doc/qtcreator.qdoc +++ b/doc/qtcreator.qdoc @@ -23,6 +23,8 @@ \o \inlineimage qtcreator.png \o Qt Creator includes a wide range of useful features. Among them are: \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 to generate a project for a console application, a GUI application, or a C++ library. @@ -48,7 +50,7 @@ \o \l{Creating a Project in Qt Creator} \o \l{Build Settings} \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{Tips and Tricks} \o \l{Glossary} @@ -64,86 +66,85 @@ \title A Quick Tour Around Qt Creator - The labeled screenshot below shows some of the components of Qt Creator, - in \gui Edit mode. + The labeled screenshot below shows some of the components of Qt Creator, in + \gui Edit mode. \image qtcreator-breakdown.png \section1 The Mode Selectors - When working in Qt Creator, you can be in one of five modes: \bold Project, - \bold Edit, \bold Debug, \bold Help, and \bold Output. + When working in Qt Creator, you can be in one of six modes: \bold Welcome, + \bold Edit, \bold Debug, \bold Projects, \bold Help, and \bold Output. - Mode selectors allow you to quickly switch between tasks: Editing, - browsing the Qt manual, setting up the build environment, etc. You can + Mode selectors allow you to quickly switch between tasks: Editing, browsing + 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 \l{keyboard-shortcuts}{corresponding shortcut}. Certain actions also trigger a mode change, e.g., \gui{Debug}/\gui{Start Debugging} will switch to the \gui Debug mode. - \list \o \gui{Welcome Mode} - Displays a welcome screen allowing you to quickly - load recent sessions or individual projects. This is the first mode - displayed if Qt Creator is run without command line switches. + load recent sessions or individual projects. This is the mode you will see + if Qt Creator is run without command line switches. - \o \gui{Edit Mode} - You can edit both project and source files here. An - optional sidebar on the left provides different views to navigate between - files. + \o \gui{Edit Mode} - Lets you edit both project and source files. A sidebar + on the left provides different views to navigate between files. \o \gui{Debug Mode} - Provides various ways to inspect the state of the 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 - and executed. Under the list of projects, there are tabs to configure the - build and run settings. + \o \gui{Projects Mode} - Lets you configure how projects can be built and + executed. Under the list of projects, there are tabs to configure the + build, run, and editor settings. \o \gui{Help Mode} - Shows any documentation registered by Qt Assistant, such as the Qt library and Qt Creator documentation. - \o \gui{Output Mode} - Lets you examine various logs in detail, for example - the task list, the compiler and application output. Some of these logs can - also be viewed in the output panes. + \o \gui{Output Mode} - Lets you examine various data in detail, for example + build issues as well as compile and application output. This information + is also available in the output panes. \endlist \section1 The Output Panes - The task pane in Qt Creator can display one out of four different panes: - Task List, Search Results, Application Output, and Compile Output. These - panes are available in all modes. + The task pane in Qt Creator can display one of four different panes: + \gui{Build Issues}, \gui{Search Results}, \gui{Application Output}, and + \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 - that need to be fixed. It filters out irrelevant output from the compiler - and collects them in the form of tasks. + The {Build Issues} pane provides a list of issues, e.g., error messages or + warnings that need to be fixed. It filters out irrelevant output from the + compiler and collects them in an organized way. - \image qtcreator-task-list.png + \image qtcreator-build-issues.png \section2 Search Results - The Search Results pane displays the results for global searches such as - searching within a current document, files on disk, or all projects. - In the screenshot below, we searched for all occurrences of \c{textfinder} - within the "/TextFinder" folder. + The \gui{Search Results} pane displays the results for global searches such + as searching within a current document, files on disk, or all projects. In + the screenshot below, we searched for all occurrences of \c{textfinder} + within the \c{"/TextFinder"} folder. \image qtcreator-search-pane.png \section2 Application Output - This pane displays the status of the program when it is executed, as - well as debug output, for example, output from qDebug(). + The \gui{Application Output} pane displays the status of the program when + it is executed and debug output, e.g., output from qDebug(). \image qtcreator-application-output.png - \section2 Compile Output + \section2 Compile - The Compile Output provides all the output from the compiler. In other - words, it is a more verbose version of the Task List. + The \gui{Compile} pane provides all the output from the compiler. In other + words, it is a more verbose version of information displayed in the + \gui{Build Issues} \image qtcreator-compile-pane.png @@ -521,7 +522,7 @@ \page creator-navigation.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 your disk, such as files, classes and methods, is trivial using the input diff --git a/src/app/main.cpp b/src/app/main.cpp index ad61ab0c7505e59127400ca060a44929c1c2960a..eedc9e1365370a07d2e60933568a3e1dbb1aaadf 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -69,7 +69,7 @@ static const char *HELP_OPTION4 = "--help"; static const char *VERSION_OPTION = "-version"; 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. #ifdef Q_WS_WIN diff --git a/src/libs/cplusplus/TypeOfExpression.cpp b/src/libs/cplusplus/TypeOfExpression.cpp index 487c9f8a46969d1c28b2b6c1fe84cb2020f7ce7c..53fa7e78396551314ddedc84607676946cf73e9d 100644 --- a/src/libs/cplusplus/TypeOfExpression.cpp +++ b/src/libs/cplusplus/TypeOfExpression.cpp @@ -37,6 +37,7 @@ #include <TranslationUnit.h> #include <cplusplus/LookupContext.h> #include <cplusplus/ResolveExpression.h> +#include <cplusplus/pp.h> using namespace CPlusPlus; @@ -53,9 +54,13 @@ void TypeOfExpression::setDocuments(const QMap<QString, Document::Ptr> &document QList<TypeOfExpression::Result> TypeOfExpression::operator()(const QString &expression, 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_lookupContext = LookupContext(lastVisibleSymbol, expressionDoc, @@ -97,3 +102,34 @@ Document::Ptr TypeOfExpression::documentForExpression(const QString &expression) doc->parse(Document::ParseExpression); 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); +} diff --git a/src/libs/cplusplus/TypeOfExpression.h b/src/libs/cplusplus/TypeOfExpression.h index cd7a23441fde133111e5f987951d0bcbb2bc51e2..e6a9a7f4b666c8a8b1494aea273e0b1196aee6fe 100644 --- a/src/libs/cplusplus/TypeOfExpression.h +++ b/src/libs/cplusplus/TypeOfExpression.h @@ -43,6 +43,9 @@ namespace CPlusPlus { +class Environment; +class Macro; + class CPLUSPLUS_EXPORT TypeOfExpression { public: @@ -60,6 +63,11 @@ public: */ void setDocuments(const QMap<QString, Document::Ptr> &documents); + enum PreprocessMode { + NoPreprocess, + Preprocess + }; + /** * Returns a list of possible fully specified types associated with the * given expression. @@ -73,7 +81,8 @@ public: * @param lastVisibleSymbol The last visible symbol in the 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. @@ -91,6 +100,14 @@ private: ExpressionAST *extractExpressionAST(Document::Ptr doc) 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; ExpressionAST *m_ast; LookupContext m_lookupContext; diff --git a/src/libs/extensionsystem/optionsparser.cpp b/src/libs/extensionsystem/optionsparser.cpp index 8884cb378ceb02b002f52b63c1f6aefbfef3f1f5..09dbaa59b7241648efc47e7cb8b30ae963b6ca93 100644 --- a/src/libs/extensionsystem/optionsparser.cpp +++ b/src/libs/extensionsystem/optionsparser.cpp @@ -129,7 +129,7 @@ bool OptionsParser::checkForNoLoadOption() "The plugin '%1' does not exist.").arg(m_currentArg); m_hasError = true; } else { - m_pmPrivate->pluginSpecs.remove(spec); + m_pmPrivate->pluginSpecs.removeAll(spec); delete spec; m_isDependencyRefreshNeeded = true; } diff --git a/src/libs/extensionsystem/pluginmanager.cpp b/src/libs/extensionsystem/pluginmanager.cpp index 3f7ba386e4e2d096d247cced281e457c26398d69..90e6e4bb0049c613ab92c30485939a093475bc90 100644 --- a/src/libs/extensionsystem/pluginmanager.cpp +++ b/src/libs/extensionsystem/pluginmanager.cpp @@ -48,7 +48,7 @@ #include <QTest> #endif -typedef QSet<ExtensionSystem::PluginSpec *> PluginSpecSet; +typedef QList<ExtensionSystem::PluginSpec *> PluginSpecSet; enum { debugLeaks = 0 }; @@ -162,6 +162,11 @@ enum { debugLeaks = 0 }; using namespace ExtensionSystem; using namespace ExtensionSystem::Internal; +static bool lessThanByPluginName(const PluginSpec *one, const PluginSpec *two) +{ + return one->name() < two->name(); +} + 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. This list is valid directly after the setPluginPaths() call. The plugin specifications contain the information from the plugins' xml description files @@ -315,7 +320,7 @@ QStringList PluginManager::arguments() const \sa setPluginPaths() */ -QSet<PluginSpec *> PluginManager::plugins() const +QList<PluginSpec *> PluginManager::plugins() const { return d->pluginSpecs; } @@ -703,9 +708,11 @@ void PluginManagerPrivate::readPluginPaths() foreach (const QString &specFile, specFiles) { PluginSpec *spec = new PluginSpec; spec->d->read(specFile); - pluginSpecs.insert(spec); + pluginSpecs.append(spec); } resolveDependencies(); + // ensure deterministic plugin load order by sorting + qSort(pluginSpecs.begin(), pluginSpecs.end(), lessThanByPluginName); emit q->pluginsChanged(); } diff --git a/src/libs/extensionsystem/pluginmanager.h b/src/libs/extensionsystem/pluginmanager.h index e46451901e925cd4881b088bd05cafa7671d791a..e621fbea17fe9927d61f96d03de9e0c60a9d973b 100644 --- a/src/libs/extensionsystem/pluginmanager.h +++ b/src/libs/extensionsystem/pluginmanager.h @@ -101,7 +101,7 @@ public: void loadPlugins(); QStringList pluginPaths() const; void setPluginPaths(const QStringList &paths); - QSet<PluginSpec *> plugins() const; + QList<PluginSpec *> plugins() const; void setFileExtension(const QString &extension); QString fileExtension() const; diff --git a/src/libs/extensionsystem/pluginmanager_p.h b/src/libs/extensionsystem/pluginmanager_p.h index 74cb84c8678d8cdad09d413b11b15ff943b59d85..b286fdf2b1d83432e91faef5a4e95f4dda04c4b7 100644 --- a/src/libs/extensionsystem/pluginmanager_p.h +++ b/src/libs/extensionsystem/pluginmanager_p.h @@ -66,7 +66,7 @@ public: void loadPlugin(PluginSpec *spec, PluginSpec::State destState); void resolveDependencies(); - QSet<PluginSpec *> pluginSpecs; + QList<PluginSpec *> pluginSpecs; QList<PluginSpec *> testSpecs; QStringList pluginPaths; QString extension; diff --git a/src/libs/extensionsystem/pluginspec.cpp b/src/libs/extensionsystem/pluginspec.cpp index 170cd72ba0b978894be1609e6f766d4b98ec6512..a8694e29677a433579b8f752a68a77cb3b96899f 100644 --- a/src/libs/extensionsystem/pluginspec.cpp +++ b/src/libs/extensionsystem/pluginspec.cpp @@ -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 */ -bool PluginSpecPrivate::resolveDependencies(const QSet<PluginSpec *> &specs) +bool PluginSpecPrivate::resolveDependencies(const QList<PluginSpec *> &specs) { if (hasError) return false; diff --git a/src/libs/extensionsystem/pluginspec_p.h b/src/libs/extensionsystem/pluginspec_p.h index 922fe36d05d65c03fdaf02bd8abaad8ed795d84f..b4fefc59b32a81092963ad49d4349a84e2c3a33d 100644 --- a/src/libs/extensionsystem/pluginspec_p.h +++ b/src/libs/extensionsystem/pluginspec_p.h @@ -56,7 +56,7 @@ public: bool read(const QString &fileName); bool provides(const QString &pluginName, const QString &version) const; - bool resolveDependencies(const QSet<PluginSpec *> &specs); + bool resolveDependencies(const QList<PluginSpec *> &specs); bool loadLibrary(); bool initializePlugin(); bool initializeExtensions(); diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp index 8aec6e392035e959d9caf4c0055e9105cdf208ef..acf55f6d93fb78d36be21f9c3f9ac2372b43b8a0 100644 --- a/src/plugins/cppeditor/cppeditor.cpp +++ b/src/plugins/cppeditor/cppeditor.cpp @@ -485,7 +485,7 @@ void CPPEditor::jumpToDefinition() unsigned lineno = tc.blockNumber() + 1; foreach (const Document::Include &incl, doc->includes()) { if (incl.line() == lineno) { - if (TextEditor::BaseTextEditor::openEditorAt(incl.fileName(), 0, 0)) + if (openCppEditorAt(incl.fileName(), 0, 0)) return; // done break; } @@ -525,7 +525,7 @@ void CPPEditor::jumpToDefinition() QList<Symbol *> candidates = context.resolve(namedType->name()); if (!candidates.isEmpty()) { Symbol *s = candidates.takeFirst(); - openEditorAt(s->fileName(), s->line(), s->column()); + openCppEditorAt(s->fileName(), s->line(), s->column()); } #endif } @@ -534,7 +534,7 @@ void CPPEditor::jumpToDefinition() if (use.contains(endOfName - 1)) { const Macro ¯o = use.macro(); const QString fileName = QString::fromUtf8(macro.fileName); - if (TextEditor::BaseTextEditor::openEditorAt(fileName, macro.line, 0)) + if (openCppEditorAt(fileName, macro.line, 0)) return; // done } } @@ -837,8 +837,15 @@ int CPPEditor::endOfNameUnderCursor() 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) { 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()); } diff --git a/src/plugins/cppeditor/cppeditor.h b/src/plugins/cppeditor/cppeditor.h index 05f2c5d9c74098d9e6dbd0518bd85bef8271d7fb..2dd88d349934332947796d2bfc9fc69c17009d35 100644 --- a/src/plugins/cppeditor/cppeditor.h +++ b/src/plugins/cppeditor/cppeditor.h @@ -123,6 +123,9 @@ private: CPlusPlus::Symbol *findDefinition(CPlusPlus::Symbol *symbol); 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; QTextCursor moveToPreviousToken(QTextCursor::MoveMode mode) const; QTextCursor moveToNextToken(QTextCursor::MoveMode mode) const; diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp index 35206c2633b2b057df58f8e1b41c22315d4b9b51..4606bd948f346d332155e4ffc939c62a3490ba31 100644 --- a/src/plugins/cpptools/cppcodecompletion.cpp +++ b/src/plugins/cpptools/cppcodecompletion.cpp @@ -439,7 +439,8 @@ int CppCodeCompletion::startCompletion(TextEditor::ITextEditable *editor) 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(); if (!typeOfExpression.expressionAST() && (! m_completionOperator || diff --git a/src/plugins/debugger/debugger.pro b/src/plugins/debugger/debugger.pro index 3d67e19c6aae2337f008e5416c5d18d99ba5c729..7308fb441c2da8c38ec4cd3d69599896bd44843e 100644 --- a/src/plugins/debugger/debugger.pro +++ b/src/plugins/debugger/debugger.pro @@ -58,7 +58,6 @@ SOURCES += attachexternaldialog.cpp \ gdbengine.cpp \ gdbmi.cpp \ gdboptionpage.cpp \ - gdbtypemacros.cpp \ gdbengine.h \ moduleshandler.cpp \ moduleswindow.cpp \ @@ -79,7 +78,6 @@ FORMS += attachexternaldialog.ui \ breakcondition.ui \ mode.ui \ gdboptionpage.ui \ - gdbtypemacros.ui \ startexternaldialog.ui \ RESOURCES += debugger.qrc diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index 37406f70cc1a6678e9506c75d320adea5711d544..d9217069c6849858e9737a54d2f20a7f6b3394df 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -183,7 +183,6 @@ DebuggerPlugin::DebuggerPlugin() { m_pm = 0; m_generalOptionPage = 0; - m_typeMacroPage = 0; m_locationMark = 0; m_manager = 0; } @@ -202,7 +201,6 @@ void DebuggerPlugin::shutdown() //qDebug() << "DebuggerPlugin::~DebuggerPlugin"; removeObject(m_debugMode); removeObject(m_generalOptionPage); - removeObject(m_typeMacroPage); // FIXME: when using the line below, BreakWindow etc gets deleted twice. // so better leak for now... @@ -212,9 +210,6 @@ void DebuggerPlugin::shutdown() delete m_generalOptionPage; m_generalOptionPage = 0; - delete m_typeMacroPage; - m_typeMacroPage = 0; - delete m_locationMark; m_locationMark = 0; @@ -409,13 +404,10 @@ bool DebuggerPlugin::initialize(const QStringList &arguments, QString *error_mes mdebug->addAction(cmd); m_generalOptionPage = 0; - m_typeMacroPage = 0; // FIXME: m_generalOptionPage = new GdbOptionPage(&theGdbSettings()); addObject(m_generalOptionPage); - m_typeMacroPage = new TypeMacroPage(&theGdbSettings()); - addObject(m_typeMacroPage); m_locationMark = 0; diff --git a/src/plugins/debugger/debuggerplugin.h b/src/plugins/debugger/debuggerplugin.h index 91ffe4dbf770a43fa839f9d27e4c49818c373d2a..ebf12b5e12331b2fdb1827ec3252299b19ffe0e8 100644 --- a/src/plugins/debugger/debuggerplugin.h +++ b/src/plugins/debugger/debuggerplugin.h @@ -54,7 +54,6 @@ namespace Internal { class DebuggerManager; class DebugMode; class GdbOptionPage; -class TypeMacroPage; class LocationMark; class DebuggerPlugin : public ExtensionSystem::IPlugin @@ -103,7 +102,6 @@ private: ExtensionSystem::PluginManager *m_pm; GdbOptionPage *m_generalOptionPage; - TypeMacroPage *m_typeMacroPage; QString m_previousMode; LocationMark *m_locationMark; diff --git a/src/plugins/debugger/gdbengine.h b/src/plugins/debugger/gdbengine.h index 56106a7524468e7270340462f80df9e1a88a02ff..6b3cbb15fee9b0883386513d048939d8d7fe9b7b 100644 --- a/src/plugins/debugger/gdbengine.h +++ b/src/plugins/debugger/gdbengine.h @@ -80,7 +80,7 @@ enum DataDumperState DataDumperUnavailable, }; -// FIXME: Move to extra file? + class GdbSettings { public: diff --git a/src/plugins/debugger/gdboptionpage.cpp b/src/plugins/debugger/gdboptionpage.cpp index e05b811889abf12094d267a823b45f70716a9ed9..8bf1b22a0fc8dceee15ff5d4ec099fd65d7b7b9a 100644 --- a/src/plugins/debugger/gdboptionpage.cpp +++ b/src/plugins/debugger/gdboptionpage.cpp @@ -58,7 +58,11 @@ GdbOptionPage::GdbOptionPage(GdbSettings *settings) #if defined(Q_OS_WIN32) defaultCommand.append(".exe"); #endif + QString defaultScript = coreIFace->resourcePath() + + QLatin1String("/gdb/qt4macros"); + m_settings->m_gdbCmd = s->value("Location", defaultCommand).toString(); + m_settings->m_scriptFile= s->value("ScriptFile", defaultScript).toString(); m_settings->m_gdbEnv = s->value("Environment", "").toString(); m_settings->m_autoRun = s->value("AutoRun", true).toBool(); m_settings->m_autoQuit = s->value("AutoQuit", true).toBool(); @@ -72,36 +76,56 @@ QString GdbOptionPage::name() const QString GdbOptionPage::category() const { - return "Debugger|Gdb"; + return "Debugger"; } QString GdbOptionPage::trCategory() const { - return tr("Debugger|Gdb"); + return tr("Debugger"); } QWidget *GdbOptionPage::createPage(QWidget *parent) { QWidget *w = new QWidget(parent); m_ui.setupUi(w); - m_ui.gdbEdit->setText(m_settings->m_gdbCmd); - m_ui.envEdit->setText(m_settings->m_gdbEnv); + m_ui.gdbLocationEdit->setText(m_settings->m_gdbCmd); + m_ui.environmentEdit->setText(m_settings->m_gdbEnv); m_ui.autoStartBox->setChecked(m_settings->m_autoRun); m_ui.autoQuitBox->setChecked(m_settings->m_autoQuit); - connect(m_ui.pushButtonBrowse, SIGNAL(clicked()), - this, SLOT(browse())); + m_ui.gdbStartupScriptEdit->setText(m_settings->m_scriptFile); + + // FIXME + m_ui.autoStartBox->hide(); + m_ui.autoQuitBox->hide(); + m_ui.environmentEdit->hide(); + m_ui.labelEnvironment->hide(); + + connect(m_ui.browseForGdbButton, SIGNAL(clicked()), + this, SLOT(browseForGdb())); + connect(m_ui.browseForScriptButton, SIGNAL(clicked()), + this, SLOT(browseForScript())); return w; } -void GdbOptionPage::browse() +void GdbOptionPage::browseForGdb() { - QString fileName = QFileDialog::getOpenFileName(m_ui.pushButtonBrowse, + QString fileName = QFileDialog::getOpenFileName(m_ui.browseForGdbButton, "Browse for gdb executable"); if (fileName.isEmpty()) return; m_settings->m_gdbCmd = fileName; - m_ui.gdbEdit->setText(fileName); + m_ui.gdbLocationEdit->setText(fileName); +} + +void GdbOptionPage::browseForScript() +{ + QString fileName = QFileDialog::getOpenFileName(m_ui.browseForGdbButton, + "Browse for gdb startup script"); + if (fileName.isEmpty()) + return; + m_settings->m_scriptFile = fileName; + m_ui.gdbStartupScriptEdit->setText(fileName); } void GdbOptionPage::finished(bool accepted) @@ -109,10 +133,11 @@ void GdbOptionPage::finished(bool accepted) if (!accepted) return; - m_settings->m_gdbCmd = m_ui.gdbEdit->text(); - m_settings->m_gdbEnv = m_ui.envEdit->text(); + m_settings->m_gdbCmd = m_ui.gdbLocationEdit->text(); + m_settings->m_gdbEnv = m_ui.environmentEdit->text(); m_settings->m_autoRun = m_ui.autoStartBox->isChecked(); m_settings->m_autoQuit = m_ui.autoQuitBox->isChecked(); + m_settings->m_scriptFile = m_ui.gdbStartupScriptEdit->text(); Core::ICore *coreIFace = m_pm->getObject<Core::ICore>(); if (!coreIFace || !coreIFace->settings()) diff --git a/src/plugins/debugger/gdboptionpage.h b/src/plugins/debugger/gdboptionpage.h index 1d71024bac1b7ef923b9ce577041c0b0266055b8..b9da4ea0111102e92f3979a05faf33a714431089 100644 --- a/src/plugins/debugger/gdboptionpage.h +++ b/src/plugins/debugger/gdboptionpage.h @@ -35,7 +35,6 @@ #define GDBOPTIONPAGE_H #include "ui_gdboptionpage.h" -#include "ui_gdbtypemacros.h" #include <coreplugin/dialogs/ioptionspage.h> @@ -63,7 +62,8 @@ public: void finished(bool accepted); public slots: - void browse(); + void browseForGdb(); + void browseForScript(); private: ExtensionSystem::PluginManager *m_pm; @@ -72,6 +72,7 @@ private: GdbSettings *m_settings; }; +#if 0 class TypeMacroPage : public Core::IOptionsPage { Q_OBJECT @@ -87,7 +88,6 @@ public: void finished(bool accepted); private slots: - void onScriptButton(); void onAddButton(); void onDelButton(); void currentItemChanged(QTreeWidgetItem *item); @@ -100,6 +100,7 @@ private: GdbSettings *m_settings; QWidget *m_widget; }; +#endif } // namespace Internal } // namespace Debugger diff --git a/src/plugins/debugger/gdboptionpage.ui b/src/plugins/debugger/gdboptionpage.ui index 4b58d5d7140061767fd2ce58a05c3fe1bec6f59c..a7496851188caf2c76a0af3feb5930b508cf731b 100644 --- a/src/plugins/debugger/gdboptionpage.ui +++ b/src/plugins/debugger/gdboptionpage.ui @@ -7,7 +7,7 @@ <x>0</x> <y>0</y> <width>433</width> - <height>216</height> + <height>233</height> </rect> </property> <property name="windowTitle"> @@ -23,7 +23,7 @@ <item> <widget class="QGroupBox" name="groupBox"> <property name="title"> - <string>Gdb Debug Options</string> + <string>Locations</string> </property> <layout class="QGridLayout"> <property name="margin"> @@ -33,33 +33,36 @@ <number>6</number> </property> <item row="0" column="1"> - <widget class="QLineEdit" name="gdbEdit"/> + <widget class="QLineEdit" name="gdbLocationEdit"/> </item> <item row="1" column="1" colspan="2"> - <widget class="QLineEdit" name="envEdit"/> + <widget class="QLineEdit" name="environmentEdit"/> </item> <item row="0" column="0"> - <widget class="QLabel" name="label"> + <widget class="QLabel" name="labelGdbLocaltion"> + <property name="toolTip"> + <string>This is either a full abolute path leading to the gdb binary you intend to use or the name of a gdb binary that wiull be searched in your PATH.</string> + </property> <property name="text"> <string>Gdb Location:</string> </property> <property name="buddy"> - <cstring>gdbEdit</cstring> + <cstring>gdbLocationEdit</cstring> </property> </widget> </item> <item row="1" column="0"> - <widget class="QLabel" name="label_2"> + <widget class="QLabel" name="labelEnvironment"> <property name="text"> <string>Environment:</string> </property> <property name="buddy"> - <cstring>envEdit</cstring> + <cstring>environmentEdit</cstring> </property> </widget> </item> <item row="0" column="2"> - <widget class="QPushButton" name="pushButtonBrowse"> + <widget class="QPushButton" name="browseForGdbButton"> <property name="text"> <string/> </property> @@ -72,6 +75,36 @@ </property> </widget> </item> + <item row="2" column="1"> + <widget class="QLineEdit" name="gdbStartupScriptEdit"/> + </item> + <item row="2" column="2"> + <widget class="QToolButton" name="browseForScriptButton"> + <property name="minimumSize"> + <size> + <width>21</width> + <height>23</height> + </size> + </property> + <property name="text"> + <string>...</string> + </property> + <property name="icon"> + <iconset resource="../coreplugin/core.qrc"> + <normaloff>:/qworkbench/images/fileopen.png</normaloff>:/qworkbench/images/fileopen.png</iconset> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="labelGdbStartupScript"> + <property name="toolTip"> + <string>This is either empty or points to a file containing gdb commands that will be executed immediately after gdb starts up.</string> + </property> + <property name="text"> + <string>Gdb Startup Script:</string> + </property> + </widget> + </item> </layout> </widget> </item> diff --git a/src/plugins/debugger/gdbtypemacros.cpp b/src/plugins/debugger/gdbtypemacros.cpp index 8610d01e39d87c2c9a64ff84cbf1389a74fc11bd..89178af268f09a142239f93ebde64d76ea1c9b1d 100644 --- a/src/plugins/debugger/gdbtypemacros.cpp +++ b/src/plugins/debugger/gdbtypemacros.cpp @@ -109,6 +109,8 @@ QWidget *TypeMacroPage::createPage(QWidget *parent) m_widget = new QWidget(parent); 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()), this, SLOT(onAddButton())); @@ -116,8 +118,8 @@ QWidget *TypeMacroPage::createPage(QWidget *parent) connect(m_ui.delButton, SIGNAL(clicked()), this, SLOT(onDelButton())); - connect(m_ui.scriptButton, SIGNAL(clicked()), - this, SLOT(onScriptButton())); + connect(m_ui.scriptFile, SIGNAL(validChanged()), + this, SLOT(updateButtonState())); connect(m_ui.treeWidget, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(currentItemChanged(QTreeWidgetItem *))); @@ -139,7 +141,7 @@ QWidget *TypeMacroPage::createPage(QWidget *parent) ++i; } - m_ui.scriptEdit->setText(m_settings->m_scriptFile); + m_ui.scriptFile->setPath(m_settings->m_scriptFile); updateButtonState(); @@ -152,7 +154,7 @@ void TypeMacroPage::finished(bool accepted) return; 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) { 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() { if (m_ui.typeEdit->text().isEmpty() || m_ui.macroEdit->text().isEmpty()) diff --git a/src/plugins/debugger/gdbtypemacros.ui b/src/plugins/debugger/gdbtypemacros.ui index aa7215577b4d1728cd34c8ec26257c0f71c5f7cf..f42514e4e499eaae2255cffd59dd74ebfa4b803f 100644 --- a/src/plugins/debugger/gdbtypemacros.ui +++ b/src/plugins/debugger/gdbtypemacros.ui @@ -1,146 +1,115 @@ -<ui version="4.0" > - <author></author> - <comment></comment> - <exportmacro></exportmacro> +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> <class>TypeMacroPage</class> - <widget class="QWidget" name="TypeMacroPage" > - <property name="geometry" > + <widget class="QWidget" name="TypeMacroPage"> + <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>519</width> - <height>238</height> + <height>263</height> </rect> </property> - <property name="windowTitle" > + <property name="windowTitle"> <string>Form</string> </property> - <layout class="QVBoxLayout" > - <property name="margin" > - <number>9</number> - </property> - <property name="spacing" > + <layout class="QVBoxLayout"> + <property name="spacing"> <number>6</number> </property> + <property name="margin"> + <number>9</number> + </property> <item> - <widget class="QGroupBox" name="groupBox" > - <property name="title" > - <string>Script File</string> - </property> - <layout class="QHBoxLayout" > - <property name="margin" > - <number>9</number> - </property> - <property name="spacing" > - <number>6</number> - </property> - <item> - <widget class="QLineEdit" name="scriptEdit" /> - </item> - <item> - <widget class="QToolButton" name="scriptButton" > - <property name="minimumSize" > - <size> - <width>21</width> - <height>23</height> - </size> - </property> - <property name="text" > - <string>...</string> - </property> - </widget> - </item> - </layout> - </widget> - </item> - <item> - <layout class="QGridLayout" > - <property name="margin" > + <layout class="QGridLayout"> + <property name="margin"> <number>0</number> </property> - <property name="spacing" > + <property name="spacing"> <number>6</number> </property> - <item row="0" column="0" colspan="2" > - <widget class="QTreeWidget" name="treeWidget" > - <property name="rootIsDecorated" > + <item row="0" column="0" colspan="2"> + <widget class="QTreeWidget" name="treeWidget"> + <property name="rootIsDecorated"> <bool>false</bool> </property> <column> - <property name="text" > + <property name="text"> <string>Type</string> </property> </column> <column> - <property name="text" > + <property name="text"> <string>Macro</string> </property> </column> </widget> </item> - <item row="1" column="2" > - <widget class="QToolButton" name="addButton" > - <property name="minimumSize" > + <item row="1" column="2"> + <widget class="QToolButton" name="addButton"> + <property name="minimumSize"> <size> <width>21</width> <height>23</height> </size> </property> - <property name="text" > + <property name="text"> <string>+</string> </property> - <property name="icon" > - <iconset resource="gdbdebugger.qrc" >:/gdbdebugger/images/newitem.png</iconset> + <property name="icon"> + <iconset> + <normaloff>:/gdbdebugger/images/newitem.png</normaloff>:/gdbdebugger/images/newitem.png</iconset> </property> </widget> </item> - <item row="2" column="0" > - <widget class="QLabel" name="label_2" > - <property name="text" > + <item row="2" column="0"> + <widget class="QLabel" name="label_2"> + <property name="text"> <string>Macro Name:</string> </property> </widget> </item> - <item row="3" column="0" > - <widget class="QLabel" name="label_3" > - <property name="text" > + <item row="3" column="0"> + <widget class="QLabel" name="label_3"> + <property name="text"> <string>Parse as:</string> </property> </widget> </item> - <item row="2" column="1" > - <widget class="QLineEdit" name="macroEdit" /> + <item row="2" column="1"> + <widget class="QLineEdit" name="macroEdit"/> </item> - <item row="0" column="2" > - <layout class="QVBoxLayout" > - <property name="margin" > + <item row="0" column="2"> + <layout class="QVBoxLayout"> + <property name="spacing"> <number>0</number> </property> - <property name="spacing" > + <property name="margin"> <number>0</number> </property> <item> - <widget class="QToolButton" name="delButton" > - <property name="minimumSize" > + <widget class="QToolButton" name="delButton"> + <property name="minimumSize"> <size> <width>21</width> <height>23</height> </size> </property> - <property name="text" > + <property name="text"> <string>-</string> </property> - <property name="icon" > - <iconset resource="gdbdebugger.qrc" >:/gdbdebugger/images/delete.png</iconset> + <property name="icon"> + <iconset> + <normaloff>:/gdbdebugger/images/delete.png</normaloff>:/gdbdebugger/images/delete.png</iconset> </property> </widget> </item> <item> <spacer> - <property name="orientation" > + <property name="orientation"> <enum>Qt::Vertical</enum> </property> - <property name="sizeHint" > + <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>40</height> @@ -150,25 +119,25 @@ </item> </layout> </item> - <item row="1" column="1" > - <widget class="QLineEdit" name="typeEdit" /> + <item row="1" column="1"> + <widget class="QLineEdit" name="typeEdit"/> </item> - <item row="1" column="0" > - <widget class="QLabel" name="label" > - <property name="text" > + <item row="1" column="0"> + <widget class="QLabel" name="label"> + <property name="text"> <string>Type:</string> </property> </widget> </item> - <item row="3" column="1" > - <widget class="QComboBox" name="parseAsBox" > + <item row="3" column="1"> + <widget class="QComboBox" name="parseAsBox"> <item> - <property name="text" > + <property name="text"> <string>ASCII (char *)</string> </property> </item> <item> - <property name="text" > + <property name="text"> <string>Unicode (short)</string> </property> </item> @@ -178,9 +147,8 @@ </item> </layout> </widget> - <pixmapfunction></pixmapfunction> <resources> - <include location="gdbdebugger.qrc" /> + <include location="gdbdebugger.qrc"/> </resources> <connections/> </ui> diff --git a/src/plugins/git/settingspage.cpp b/src/plugins/git/settingspage.cpp index e1b14cb9ccc627c31fff00065d560f8f7fa7e31e..7f0581fc3c3a976775b4ffc7213de87dbe0cc13e 100644 --- a/src/plugins/git/settingspage.cpp +++ b/src/plugins/git/settingspage.cpp @@ -77,7 +77,7 @@ QString SettingsPage::name() const return tr("General"); } - QString SettingsPage::category() const +QString SettingsPage::category() const { return QLatin1String("Git"); } diff --git a/src/plugins/texteditor/basetexteditor.cpp b/src/plugins/texteditor/basetexteditor.cpp index 9b4e4254f5956e4117d9adf90495a0b79eeba0a9..0772e4f154a99ffe974679cfbcef818387d62ea5 100644 --- a/src/plugins/texteditor/basetexteditor.cpp +++ b/src/plugins/texteditor/basetexteditor.cpp @@ -128,12 +128,13 @@ protected: ITextEditor *BaseTextEditor::openEditorAt(const QString &fileName, int line, - int column) + int column, + const QString &editorKind) { Core::EditorManager *editorManager = ExtensionSystem::PluginManager::instance()->getObject<Core::ICore>()->editorManager(); 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); if (texteditor) { texteditor->gotoLine(line, column); @@ -714,7 +715,7 @@ void BaseTextEditor::moveLineUpDown(bool up) QString text = move.selectedText(); move.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor); move.removeSelectedText(); - + if (up) { move.movePosition(QTextCursor::PreviousBlock); move.insertBlock(); @@ -729,7 +730,7 @@ void BaseTextEditor::moveLineUpDown(bool up) move.insertBlock(); } } - + int start = move.position(); move.clearSelection(); move.insertText(text); @@ -3385,7 +3386,7 @@ void BaseTextEditorPrivate::moveCursorVisible() if (!cursor.block().isVisible()) { cursor.setVisualNavigation(true); cursor.movePosition(QTextCursor::PreviousBlock); - q->setTextCursor(cursor); + q->setTextCursor(cursor); } q->ensureCursorVisible(); } diff --git a/src/plugins/texteditor/basetexteditor.h b/src/plugins/texteditor/basetexteditor.h index 7c2206722bf6f6baa1deeab1423dfc60829067f2..d75e174fea2bdabcd8dfa189417117f4ff60d248 100644 --- a/src/plugins/texteditor/basetexteditor.h +++ b/src/plugins/texteditor/basetexteditor.h @@ -230,7 +230,8 @@ public: BaseTextEditor(QWidget *parent); ~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 Core::IFile * file();