diff --git a/src/plugins/cpptools/completionsettingspage.cpp b/src/plugins/cpptools/completionsettingspage.cpp index e001313e10a9b6824801bf3b2d61e02e41cadae1..ae1882b0093f0ad117792342d2140a473566a0f1 100644 --- a/src/plugins/cpptools/completionsettingspage.cpp +++ b/src/plugins/cpptools/completionsettingspage.cpp @@ -32,15 +32,15 @@ #include <coreplugin/icore.h> #include <extensionsystem/pluginmanager.h> +#include <texteditor/texteditorsettings.h> #include <QtCore/QTextStream> #include <QtCore/QCoreApplication> using namespace CppTools::Internal; -CompletionSettingsPage::CompletionSettingsPage(CppCodeCompletion *completion) - : m_completion(completion) - , m_page(new Ui_CompletionSettingsPage) +CompletionSettingsPage::CompletionSettingsPage() + : m_page(new Ui_CompletionSettingsPage) { } @@ -64,23 +64,27 @@ QWidget *CompletionSettingsPage::createPage(QWidget *parent) QWidget *w = new QWidget(parent); m_page->setupUi(w); + const TextEditor::CompletionSettings &settings = + TextEditor::TextEditorSettings::instance()->completionSettings(); + int caseSensitivityIndex = 0; - switch (m_completion->caseSensitivity()) { - case CppCodeCompletion::CaseSensitive: + switch (settings.m_caseSensitivity) { + case TextEditor::CaseSensitive: caseSensitivityIndex = 0; break; - case CppCodeCompletion::CaseInsensitive: + case TextEditor::CaseInsensitive: caseSensitivityIndex = 1; break; - case CppCodeCompletion::FirstLetterCaseSensitive: + case TextEditor::FirstLetterCaseSensitive: caseSensitivityIndex = 2; break; } m_page->caseSensitivity->setCurrentIndex(caseSensitivityIndex); - m_page->autoInsertBrackets->setChecked(m_completion->autoInsertBrackets()); - m_page->partiallyComplete->setChecked(m_completion->isPartialCompletionEnabled()); - m_page->spaceAfterFunctionName->setChecked(m_completion->isSpaceAfterFunctionName()); + m_page->autoInsertBrackets->setChecked(settings.m_autoInsertBrackets); + m_page->partiallyComplete->setChecked(settings.m_partiallyComplete); + m_page->spaceAfterFunctionName->setChecked(settings.m_spaceAfterFunctionName); + if (m_searchKeywords.isEmpty()) { QTextStream(&m_searchKeywords) << m_page->caseSensitivityLabel->text() << ' ' << m_page->autoInsertBrackets->text() @@ -88,15 +92,19 @@ QWidget *CompletionSettingsPage::createPage(QWidget *parent) << ' ' << m_page->spaceAfterFunctionName->text(); m_searchKeywords.remove(QLatin1Char('&')); } + return w; } void CompletionSettingsPage::apply() { - m_completion->setCaseSensitivity(caseSensitivity()); - m_completion->setAutoInsertBrackets(m_page->autoInsertBrackets->isChecked()); - m_completion->setPartialCompletionEnabled(m_page->partiallyComplete->isChecked()); - m_completion->setSpaceAfterFunctionName(m_page->spaceAfterFunctionName->isChecked()); + TextEditor::CompletionSettings settings; + settings.m_caseSensitivity = caseSensitivity(); + settings.m_autoInsertBrackets = m_page->autoInsertBrackets->isChecked(); + settings.m_partiallyComplete = m_page->partiallyComplete->isChecked(); + settings.m_spaceAfterFunctionName = m_page->spaceAfterFunctionName->isChecked(); + + TextEditor::TextEditorSettings::instance()->setCompletionSettings(settings); } bool CompletionSettingsPage::matches(const QString &s) const @@ -104,14 +112,14 @@ bool CompletionSettingsPage::matches(const QString &s) const return m_searchKeywords.contains(s, Qt::CaseInsensitive); } -CppCodeCompletion::CaseSensitivity CompletionSettingsPage::caseSensitivity() const +TextEditor::CaseSensitivity CompletionSettingsPage::caseSensitivity() const { switch (m_page->caseSensitivity->currentIndex()) { case 0: // Full - return CppCodeCompletion::CaseSensitive; + return TextEditor::CaseSensitive; case 1: // None - return CppCodeCompletion::CaseInsensitive; + return TextEditor::CaseInsensitive; default: // First letter - return CppCodeCompletion::FirstLetterCaseSensitive; + return TextEditor::FirstLetterCaseSensitive; } } diff --git a/src/plugins/cpptools/completionsettingspage.h b/src/plugins/cpptools/completionsettingspage.h index fe9b8477c39e3f52dbca11bf9f17aab834459d42..4221811ad63077985392eeded0f850c28e40514e 100644 --- a/src/plugins/cpptools/completionsettingspage.h +++ b/src/plugins/cpptools/completionsettingspage.h @@ -30,10 +30,9 @@ #ifndef COMPLETIONSETTINGSPAGE_H #define COMPLETIONSETTINGSPAGE_H +#include <texteditor/completionsettings.h> #include <texteditor/texteditoroptionspage.h> -#include "cppcodecompletion.h" - QT_BEGIN_NAMESPACE class Ui_CompletionSettingsPage; QT_END_NAMESPACE @@ -41,12 +40,14 @@ QT_END_NAMESPACE namespace CppTools { namespace Internal { +// TODO: Move this class to the text editor plugin + class CompletionSettingsPage : public TextEditor::TextEditorOptionsPage { Q_OBJECT public: - CompletionSettingsPage(CppCodeCompletion *completion); + CompletionSettingsPage(); ~CompletionSettingsPage(); QString id() const; @@ -58,9 +59,8 @@ public: virtual bool matches(const QString &) const; private: - CppCodeCompletion::CaseSensitivity caseSensitivity() const; + TextEditor::CaseSensitivity caseSensitivity() const; - CppCodeCompletion *m_completion; Ui_CompletionSettingsPage *m_page; QString m_searchKeywords; }; diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp index a01e63b18dcb1dd44de0e19362235cbc091445b5..19e8e94cdf9166568d0d3eb85b3b8a2e60977932 100644 --- a/src/plugins/cpptools/cppcodecompletion.cpp +++ b/src/plugins/cpptools/cppcodecompletion.cpp @@ -56,6 +56,7 @@ #include <coreplugin/icore.h> #include <coreplugin/mimedatabase.h> #include <coreplugin/editormanager/editormanager.h> +#include <texteditor/completionsettings.h> #include <texteditor/itexteditor.h> #include <texteditor/itexteditable.h> #include <texteditor/basetexteditor.h> @@ -435,10 +436,6 @@ CppCodeCompletion::CppCodeCompletion(CppModelManager *manager) m_manager(manager), m_editor(0), m_startPosition(-1), - m_caseSensitivity(FirstLetterCaseSensitive), - m_autoInsertBrackets(true), - m_partialCompletionEnabled(true), - m_spaceAfterFunctionName(false), m_forcedCompletion(false), m_completionOperator(T_EOF_SYMBOL), m_objcEnabled(true) @@ -450,46 +447,6 @@ QIcon CppCodeCompletion::iconForSymbol(Symbol *symbol) const return m_icons.iconForSymbol(symbol); } -CppCodeCompletion::CaseSensitivity CppCodeCompletion::caseSensitivity() const -{ - return m_caseSensitivity; -} - -void CppCodeCompletion::setCaseSensitivity(CaseSensitivity caseSensitivity) -{ - m_caseSensitivity = caseSensitivity; -} - -bool CppCodeCompletion::autoInsertBrackets() const -{ - return m_autoInsertBrackets; -} - -void CppCodeCompletion::setAutoInsertBrackets(bool autoInsertBrackets) -{ - m_autoInsertBrackets = autoInsertBrackets; -} - -bool CppCodeCompletion::isPartialCompletionEnabled() const -{ - return m_partialCompletionEnabled; -} - -void CppCodeCompletion::setPartialCompletionEnabled(bool partialCompletionEnabled) -{ - m_partialCompletionEnabled = partialCompletionEnabled; -} - -bool CppCodeCompletion::isSpaceAfterFunctionName() const -{ - return m_spaceAfterFunctionName; -} - -void CppCodeCompletion::setSpaceAfterFunctionName(bool spaceAfterFunctionName) -{ - m_spaceAfterFunctionName = spaceAfterFunctionName; -} - /* Searches backwards for an access operator. */ @@ -1459,7 +1416,7 @@ void CppCodeCompletion::completions(QList<TextEditor::CompletionItem> *completio return; if (m_completionOperator != T_LPAREN) { - filter(m_completions, completions, key, m_caseSensitivity); + filter(m_completions, completions, key); } else if (m_completionOperator == T_LPAREN || m_completionOperator == T_SIGNAL || @@ -1537,7 +1494,9 @@ void CppCodeCompletion::complete(const TextEditor::CompletionItem &item) //qDebug() << "current symbol:" << overview.prettyName(symbol->name()) //<< overview.prettyType(symbol->type()); - if (m_autoInsertBrackets && symbol && symbol->type()) { + const bool autoInsertBrackets = completionSettings().m_autoInsertBrackets; + + if (autoInsertBrackets && symbol && symbol->type()) { if (Function *function = symbol->type()->asFunctionType()) { // If the member is a function, automatically place the opening parenthesis, // except when it might take template parameters. @@ -1550,7 +1509,7 @@ void CppCodeCompletion::complete(const TextEditor::CompletionItem &item) extraChars += QLatin1Char('<'); } } else if (! function->isAmbiguous()) { - if (m_spaceAfterFunctionName) + if (completionSettings().m_spaceAfterFunctionName) extraChars += QLatin1Char(' '); extraChars += QLatin1Char('('); @@ -1578,7 +1537,7 @@ void CppCodeCompletion::complete(const TextEditor::CompletionItem &item) } } - if (m_autoInsertBrackets && item.data.canConvert<CompleteFunctionDeclaration>()) { + if (autoInsertBrackets && item.data.canConvert<CompleteFunctionDeclaration>()) { // everything from the closing parenthesis on are extra chars, to // make sure an auto-inserted ")" gets replaced by ") const" if necessary int closingParen = toInsert.lastIndexOf(QLatin1Char(')')); @@ -1614,7 +1573,7 @@ bool CppCodeCompletion::partiallyComplete(const QList<TextEditor::CompletionItem } else if (completionItems.count() == 1) { complete(completionItems.first()); return true; - } else if (m_partialCompletionEnabled && m_completionOperator != T_LPAREN) { + } else if (m_completionOperator != T_LPAREN) { return TextEditor::ICompletionCollector::partiallyComplete(completionItems); } diff --git a/src/plugins/cpptools/cppcodecompletion.h b/src/plugins/cpptools/cppcodecompletion.h index b3c8402ee27348e2e9837d40486b61d59d0eca01..b4bff01fba807157fc88f5d31b47a20ed8879234 100644 --- a/src/plugins/cpptools/cppcodecompletion.h +++ b/src/plugins/cpptools/cppcodecompletion.h @@ -79,18 +79,6 @@ public: QIcon iconForSymbol(CPlusPlus::Symbol *symbol) const; - CaseSensitivity caseSensitivity() const; - void setCaseSensitivity(CaseSensitivity caseSensitivity); - - bool autoInsertBrackets() const; - void setAutoInsertBrackets(bool autoInsertBrackets); - - bool isPartialCompletionEnabled() const; - void setPartialCompletionEnabled(bool partialCompletionEnabled); - - bool isSpaceAfterFunctionName() const; - void setSpaceAfterFunctionName(bool spaceAfterFunctionName); - private: void addKeywords(); void addMacros(const QString &fileName, const CPlusPlus::Snapshot &snapshot); @@ -152,10 +140,6 @@ private: TextEditor::ITextEditable *m_editor; int m_startPosition; // Position of the cursor from which completion started - CaseSensitivity m_caseSensitivity; - bool m_autoInsertBrackets; - bool m_partialCompletionEnabled; - bool m_spaceAfterFunctionName; bool m_forcedCompletion; unsigned m_completionOperator; bool m_objcEnabled; diff --git a/src/plugins/cpptools/cpptoolsplugin.cpp b/src/plugins/cpptools/cpptoolsplugin.cpp index 19f986a8b98b0c17de2758eb2f8a46b5e57d627f..61173c8e5f6297834d064d71acf346da7014edf6 100644 --- a/src/plugins/cpptools/cpptoolsplugin.cpp +++ b/src/plugins/cpptools/cpptoolsplugin.cpp @@ -51,6 +51,7 @@ #include <coreplugin/progressmanager/progressmanager.h> #include <coreplugin/vcsmanager.h> #include <coreplugin/filemanager.h> +#include <texteditor/texteditorsettings.h> #include <cppeditor/cppeditorconstants.h> #include <QtCore/QtConcurrentRun> @@ -109,8 +110,8 @@ bool CppToolsPlugin::initialize(const QStringList &arguments, QString *error) m_modelManager, SLOT(updateSourceFiles(QStringList))); addAutoReleasedObject(m_modelManager); - m_completion = new CppCodeCompletion(m_modelManager); - addAutoReleasedObject(m_completion); + CppCodeCompletion *completion = new CppCodeCompletion(m_modelManager); + addAutoReleasedObject(completion); CppLocatorFilter *locatorFilter = new CppLocatorFilter(m_modelManager, core->editorManager()); @@ -118,7 +119,7 @@ bool CppToolsPlugin::initialize(const QStringList &arguments, QString *error) addAutoReleasedObject(new CppClassesFilter(m_modelManager, core->editorManager())); addAutoReleasedObject(new CppFunctionsFilter(m_modelManager, core->editorManager())); addAutoReleasedObject(new CppCurrentDocumentFilter(m_modelManager, core->editorManager())); - addAutoReleasedObject(new CompletionSettingsPage(m_completion)); + addAutoReleasedObject(new CompletionSettingsPage); addAutoReleasedObject(new CppFileSettingsPage(m_fileSettings)); // Menus @@ -139,17 +140,11 @@ bool CppToolsPlugin::initialize(const QStringList &arguments, QString *error) mcpptools->addAction(command); connect(switchAction, SIGNAL(triggered()), this, SLOT(switchHeaderSource())); - // Restore settings - QSettings *settings = Core::ICore::instance()->settings(); - settings->beginGroup(QLatin1String("CppTools")); - settings->beginGroup(QLatin1String("Completion")); - const int caseSensitivity = settings->value(QLatin1String("CaseSensitivity"), m_completion->caseSensitivity()).toInt(); - m_completion->setCaseSensitivity((CppCodeCompletion::CaseSensitivity) caseSensitivity); - m_completion->setAutoInsertBrackets(settings->value(QLatin1String("AutoInsertBraces"), true).toBool()); - m_completion->setPartialCompletionEnabled(settings->value(QLatin1String("PartiallyComplete"), true).toBool()); - m_completion->setSpaceAfterFunctionName(settings->value(QLatin1String("SpaceAfterFunctionName"), false).toBool()); - settings->endGroup(); - settings->endGroup(); + // Set completion settings and keep them up to date + TextEditor::TextEditorSettings *textEditorSettings = TextEditor::TextEditorSettings::instance(); + completion->setCompletionSettings(textEditorSettings->completionSettings()); + connect(textEditorSettings, SIGNAL(completionSettingsChanged(TextEditor::CompletionSettings)), + completion, SLOT(setCompletionSettings(TextEditor::CompletionSettings))); return true; } @@ -170,16 +165,6 @@ void CppToolsPlugin::extensionsInitialized() void CppToolsPlugin::aboutToShutdown() { - // Save settings - QSettings *settings = Core::ICore::instance()->settings(); - settings->beginGroup(QLatin1String("CppTools")); - settings->beginGroup(QLatin1String("Completion")); - settings->setValue(QLatin1String("CaseSensitivity"), (int) m_completion->caseSensitivity()); - settings->setValue(QLatin1String("AutoInsertBraces"), m_completion->autoInsertBrackets()); - settings->setValue(QLatin1String("PartiallyComplete"), m_completion->isPartialCompletionEnabled()); - settings->setValue(QLatin1String("SpaceAfterFunctionName"), m_completion->isSpaceAfterFunctionName()); - settings->endGroup(); - settings->endGroup(); } void CppToolsPlugin::switchHeaderSource() diff --git a/src/plugins/cpptools/cpptoolsplugin.h b/src/plugins/cpptools/cpptoolsplugin.h index c5b82982ca3ab1417dc4722453672213ffe57d6e..ff4aa9ce81f88070086e048c8b66556dffb260c9 100644 --- a/src/plugins/cpptools/cpptoolsplugin.h +++ b/src/plugins/cpptools/cpptoolsplugin.h @@ -50,7 +50,6 @@ QT_END_NAMESPACE namespace CppTools { namespace Internal { -class CppCodeCompletion; class CppModelManager; struct CppFileSettings; @@ -79,7 +78,6 @@ private: int m_context; CppModelManager *m_modelManager; - CppCodeCompletion *m_completion; QSharedPointer<CppFileSettings> m_fileSettings; static CppToolsPlugin *m_instance; diff --git a/src/plugins/qmljseditor/qmljscodecompletion.cpp b/src/plugins/qmljseditor/qmljscodecompletion.cpp index aae8b16863bacd34d8b44cdcc7ad806761683285..9daad528c0d92cfcb2cf211d37c7bc0f7ba0cc5c 100644 --- a/src/plugins/qmljseditor/qmljscodecompletion.cpp +++ b/src/plugins/qmljseditor/qmljscodecompletion.cpp @@ -477,8 +477,7 @@ CodeCompletion::CodeCompletion(ModelManagerInterface *modelManager, QObject *par : TextEditor::ICompletionCollector(parent), m_modelManager(modelManager), m_editor(0), - m_startPosition(0), - m_caseSensitivity(Qt::CaseSensitive) + m_startPosition(0) { Q_ASSERT(modelManager); } @@ -486,12 +485,6 @@ CodeCompletion::CodeCompletion(ModelManagerInterface *modelManager, QObject *par CodeCompletion::~CodeCompletion() { } -Qt::CaseSensitivity CodeCompletion::caseSensitivity() const -{ return m_caseSensitivity; } - -void CodeCompletion::setCaseSensitivity(Qt::CaseSensitivity caseSensitivity) -{ m_caseSensitivity = caseSensitivity; } - TextEditor::ITextEditable *CodeCompletion::editor() const { return m_editor; } @@ -854,7 +847,7 @@ void CodeCompletion::completions(QList<TextEditor::CompletionItem> *completions) else if (length > 0) { const QString key = m_editor->textAt(m_startPosition, length); - filter(m_completions, completions, key, FirstLetterCaseSensitive); + filter(m_completions, completions, key); if (completions->size() == 1) { if (key == completions->first().text) diff --git a/src/plugins/qmljseditor/qmljscodecompletion.h b/src/plugins/qmljseditor/qmljscodecompletion.h index aa5b19044ca1f4aeebdb6a9d7a81e7b1fe795134..7129bce9007d0c114effd61df54e7add5ad48dcb 100644 --- a/src/plugins/qmljseditor/qmljscodecompletion.h +++ b/src/plugins/qmljseditor/qmljscodecompletion.h @@ -55,9 +55,6 @@ public: CodeCompletion(ModelManagerInterface *modelManager, QObject *parent = 0); virtual ~CodeCompletion(); - Qt::CaseSensitivity caseSensitivity() const; - void setCaseSensitivity(Qt::CaseSensitivity caseSensitivity); - virtual TextEditor::ITextEditable *editor() const; virtual int startPosition() const; virtual bool shouldRestartCompletion(); @@ -81,7 +78,6 @@ private: TextEditor::ITextEditable *m_editor; int m_startPosition; QList<TextEditor::CompletionItem> m_completions; - Qt::CaseSensitivity m_caseSensitivity; QList<TextEditor::CompletionItem> m_snippets; QDateTime m_snippetFileLastModified; diff --git a/src/plugins/qmljseditor/qmljseditorplugin.cpp b/src/plugins/qmljseditor/qmljseditorplugin.cpp index a2b005f416ea5b269859362252495bd9d344bd0f..f998309ac172fb3dd971b8039cbaeb6c89599ac7 100644 --- a/src/plugins/qmljseditor/qmljseditorplugin.cpp +++ b/src/plugins/qmljseditor/qmljseditorplugin.cpp @@ -77,8 +77,7 @@ QmlJSEditorPlugin::QmlJSEditorPlugin() : m_modelManager(0), m_wizard(0), m_editor(0), - m_actionHandler(0), - m_completion(0) + m_actionHandler(0) { m_instance = this; } @@ -148,19 +147,16 @@ bool QmlJSEditorPlugin::initialize(const QStringList & /*arguments*/, QString *e cmd = am->command(TextEditor::Constants::UN_COMMENT_SELECTION); contextMenu->addAction(cmd); - m_completion = new CodeCompletion(m_modelManager); - addAutoReleasedObject(m_completion); + CodeCompletion *completion = new CodeCompletion(m_modelManager); + addAutoReleasedObject(completion); - addAutoReleasedObject(new HoverHandler()); + addAutoReleasedObject(new HoverHandler); - // Restore settings - QSettings *settings = Core::ICore::instance()->settings(); - settings->beginGroup(QLatin1String("CppTools")); // ### FIXME: - settings->beginGroup(QLatin1String("Completion")); - const bool caseSensitive = settings->value(QLatin1String("CaseSensitive"), true).toBool(); - m_completion->setCaseSensitivity(caseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive); - settings->endGroup(); - settings->endGroup(); + // Set completion settings and keep them up to date + TextEditor::TextEditorSettings *textEditorSettings = TextEditor::TextEditorSettings::instance(); + completion->setCompletionSettings(textEditorSettings->completionSettings()); + connect(textEditorSettings, SIGNAL(completionSettingsChanged(TextEditor::CompletionSettings)), + completion, SLOT(setCompletionSettings(TextEditor::CompletionSettings))); error_message->clear(); diff --git a/src/plugins/qmljseditor/qmljseditorplugin.h b/src/plugins/qmljseditor/qmljseditorplugin.h index b119e554d0a06a661bddb3f2111cc6e58936e589..db534f0f290faad17c0da689cb871a369c26eed4 100644 --- a/src/plugins/qmljseditor/qmljseditorplugin.h +++ b/src/plugins/qmljseditor/qmljseditorplugin.h @@ -52,7 +52,6 @@ class QmlFileWizard; namespace Internal { class QmlJSEditorFactory; -class CodeCompletion; class QmlJSTextEditor; class QmlJSPreviewRunner; @@ -92,7 +91,6 @@ private: QmlFileWizard *m_wizard; QmlJSEditorFactory *m_editor; TextEditor::TextEditorActionHandler *m_actionHandler; - CodeCompletion *m_completion; }; } // namespace Internal diff --git a/src/plugins/texteditor/completionsettings.cpp b/src/plugins/texteditor/completionsettings.cpp new file mode 100644 index 0000000000000000000000000000000000000000..0d800da3b32dc4f0bafd106061050d9c01ec8d01 --- /dev/null +++ b/src/plugins/texteditor/completionsettings.cpp @@ -0,0 +1,86 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "completionsettings.h" + +#include <QtCore/QSettings> + +static const char * const groupPostfix = "Completion"; +static const char * const caseSensitivityKey = "CaseSensitivity"; +static const char * const autoInsertBracesKey = "AutoInsertBraces"; +static const char * const partiallyCompleteKey = "PartiallyComplete"; +static const char * const spaceAfterFunctionNameKey = "SpaceAfterFunctionName"; + +using namespace TextEditor; + +CompletionSettings::CompletionSettings() + : m_caseSensitivity(FirstLetterCaseSensitive) + , m_autoInsertBrackets(true) + , m_partiallyComplete(true) + , m_spaceAfterFunctionName(false) +{ +} + +void CompletionSettings::toSettings(const QString &category, QSettings *s) const +{ + QString group = QLatin1String(groupPostfix); + if (!category.isEmpty()) + group.insert(0, category); + + s->beginGroup(group); + s->setValue(QLatin1String(caseSensitivityKey), (int) m_caseSensitivity); + s->setValue(QLatin1String(autoInsertBracesKey), m_autoInsertBrackets); + s->setValue(QLatin1String(partiallyCompleteKey), m_partiallyComplete); + s->setValue(QLatin1String(spaceAfterFunctionNameKey), m_spaceAfterFunctionName); + s->endGroup(); +} + +void CompletionSettings::fromSettings(const QString &category, const QSettings *s) +{ + QString group = QLatin1String(groupPostfix); + if (!category.isEmpty()) + group.insert(0, category); + group += QLatin1Char('/'); + + *this = CompletionSettings(); // Assign defaults + + m_caseSensitivity = (CaseSensitivity) s->value(group + QLatin1String(caseSensitivityKey), m_caseSensitivity).toInt(); + m_autoInsertBrackets = s->value(group + QLatin1String(autoInsertBracesKey), m_autoInsertBrackets).toBool(); + m_partiallyComplete = s->value(group + QLatin1String(partiallyCompleteKey), m_partiallyComplete).toBool(); + m_spaceAfterFunctionName = s->value(group + QLatin1String(spaceAfterFunctionNameKey), m_spaceAfterFunctionName).toBool(); +} + +bool CompletionSettings::equals(const CompletionSettings &cs) const +{ + return m_caseSensitivity == cs.m_caseSensitivity + && m_autoInsertBrackets == cs.m_autoInsertBrackets + && m_partiallyComplete == cs.m_partiallyComplete + && m_spaceAfterFunctionName == cs.m_spaceAfterFunctionName + ; +} diff --git a/src/plugins/texteditor/completionsettings.h b/src/plugins/texteditor/completionsettings.h new file mode 100644 index 0000000000000000000000000000000000000000..0d35abf9bb32638e9572b4009e57e12d88eeb83e --- /dev/null +++ b/src/plugins/texteditor/completionsettings.h @@ -0,0 +1,70 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef COMPLETIONSETTINGS_H +#define COMPLETIONSETTINGS_H + +#include "texteditor_global.h" + +QT_BEGIN_NAMESPACE +class QSettings; +QT_END_NAMESPACE + +namespace TextEditor { + +enum CaseSensitivity { + CaseInsensitive, + CaseSensitive, + FirstLetterCaseSensitive +}; + +/** + * Settings that describe how the code completion behaves. + */ +struct TEXTEDITOR_EXPORT CompletionSettings +{ + CompletionSettings(); + + void toSettings(const QString &category, QSettings *s) const; + void fromSettings(const QString &category, const QSettings *s); + + bool equals(const CompletionSettings &bs) const; + + CaseSensitivity m_caseSensitivity; + bool m_autoInsertBrackets; + bool m_partiallyComplete; + bool m_spaceAfterFunctionName; +}; + +inline bool operator==(const CompletionSettings &t1, const CompletionSettings &t2) { return t1.equals(t2); } +inline bool operator!=(const CompletionSettings &t1, const CompletionSettings &t2) { return !t1.equals(t2); } + +} // namespace TextEditor + +#endif // COMPLETIONSETTINGS_H diff --git a/src/plugins/texteditor/icompletioncollector.cpp b/src/plugins/texteditor/icompletioncollector.cpp index 9bf453e1b5a0c671fa1487d3763387805213a712..0d4dd1296673f4c5fc38bd370a083349122097d4 100644 --- a/src/plugins/texteditor/icompletioncollector.cpp +++ b/src/plugins/texteditor/icompletioncollector.cpp @@ -28,11 +28,27 @@ **************************************************************************/ #include "icompletioncollector.h" + +#include "completionsettings.h" #include "itexteditable.h" + #include <QtCore/QRegExp> #include <algorithm> using namespace TextEditor; +using namespace TextEditor::Internal; + +namespace TextEditor { +namespace Internal { + +struct ICompletionCollectorPrivate +{ +public: + CompletionSettings m_completionSettings; +}; + +} // namespace Internal +} // namespace TextEditor bool ICompletionCollector::compareChar(const QChar &l, const QChar &r) { @@ -62,6 +78,27 @@ bool ICompletionCollector::completionItemLessThan(const CompletionItem &i1, cons return lessThan(lower1, lower2); } +ICompletionCollector::ICompletionCollector(QObject *parent) + : QObject(parent) + , m_d(new Internal::ICompletionCollectorPrivate) +{ +} + +ICompletionCollector::~ICompletionCollector() +{ + delete m_d; +} + +void ICompletionCollector::setCompletionSettings(const CompletionSettings &settings) +{ + m_d->m_completionSettings = settings; +} + +const CompletionSettings &ICompletionCollector::completionSettings() const +{ + return m_d->m_completionSettings; +} + QList<CompletionItem> ICompletionCollector::getCompletions() { QList<CompletionItem> completionItems; @@ -88,6 +125,9 @@ QList<CompletionItem> ICompletionCollector::getCompletions() bool ICompletionCollector::partiallyComplete(const QList<TextEditor::CompletionItem> &completionItems) { + if (! m_d->m_completionSettings.m_partiallyComplete) + return false; + // Compute common prefix QString firstKey = completionItems.first().text; QString lastKey = completionItems.last().text; @@ -113,9 +153,10 @@ bool ICompletionCollector::partiallyComplete(const QList<TextEditor::CompletionI void ICompletionCollector::filter(const QList<TextEditor::CompletionItem> &items, QList<TextEditor::CompletionItem> *filteredItems, - const QString &key, - ICompletionCollector::CaseSensitivity caseSensitivity) + const QString &key) { + const TextEditor::CaseSensitivity caseSensitivity = m_d->m_completionSettings.m_caseSensitivity; + /* * This code builds a regular expression in order to more intelligently match * camel-case style. This means upper-case characters will be rewritten as follows: @@ -132,8 +173,8 @@ void ICompletionCollector::filter(const QList<TextEditor::CompletionItem> &items bool first = true; const QLatin1String wordContinuation("[a-z0-9_]*"); foreach (const QChar &c, key) { - if (caseSensitivity == CaseInsensitive || - (caseSensitivity == FirstLetterCaseSensitive && !first)) { + if (caseSensitivity == TextEditor::CaseInsensitive || + (caseSensitivity == TextEditor::FirstLetterCaseSensitive && !first)) { keyRegExp += QLatin1String("(?:"); if (c.isUpper() && !first) @@ -158,7 +199,7 @@ void ICompletionCollector::filter(const QList<TextEditor::CompletionItem> &items if (hasKey) { if (item.text.startsWith(key, Qt::CaseSensitive)) { item.relevance = 2; - } else if (caseSensitivity != CaseSensitive + } else if (caseSensitivity != TextEditor::CaseSensitive && item.text.startsWith(key, Qt::CaseInsensitive)) { item.relevance = 1; } diff --git a/src/plugins/texteditor/icompletioncollector.h b/src/plugins/texteditor/icompletioncollector.h index e2cfdfacd81874f16bb0559e46d75f57c7b6aefe..e78ad83b829fe2cc0bc21ff42de0df2788ae0234 100644 --- a/src/plugins/texteditor/icompletioncollector.h +++ b/src/plugins/texteditor/icompletioncollector.h @@ -38,8 +38,13 @@ namespace TextEditor { +namespace Internal { +class ICompletionCollectorPrivate; +} + class ICompletionCollector; class ITextEditable; +struct CompletionSettings; struct CompletionItem { @@ -73,8 +78,10 @@ class TEXTEDITOR_EXPORT ICompletionCollector : public QObject { Q_OBJECT public: - ICompletionCollector(QObject *parent = 0) : QObject(parent) {} - virtual ~ICompletionCollector() {} + ICompletionCollector(QObject *parent = 0); + virtual ~ICompletionCollector(); + + const CompletionSettings &completionSettings() const; virtual QList<CompletionItem> getCompletions(); virtual bool shouldRestartCompletion(); @@ -120,21 +127,20 @@ public: // helpers - enum CaseSensitivity { - CaseInsensitive, - CaseSensitive, - FirstLetterCaseSensitive - }; - void filter(const QList<TextEditor::CompletionItem> &items, QList<TextEditor::CompletionItem> *filteredItems, - const QString &key, - CaseSensitivity caseSensitivity); + const QString &key); + +public slots: + void setCompletionSettings(const TextEditor::CompletionSettings &); protected: static bool compareChar(const QChar &item, const QChar &other); static bool lessThan(const QString &item, const QString &other); static bool completionItemLessThan(const CompletionItem &item, const CompletionItem &other); + +private: + Internal::ICompletionCollectorPrivate *m_d; }; class TEXTEDITOR_EXPORT IQuickFixCollector : public ICompletionCollector diff --git a/src/plugins/texteditor/texteditor.pro b/src/plugins/texteditor/texteditor.pro index 26429c0858660418673ca84b156108e00e5a9c2a..a27f857809a36a97a7bfcc9810824dea36aaaabe 100644 --- a/src/plugins/texteditor/texteditor.pro +++ b/src/plugins/texteditor/texteditor.pro @@ -34,7 +34,8 @@ SOURCES += texteditorplugin.cpp \ itexteditor.cpp \ texteditoroverlay.cpp \ texteditoroptionspage.cpp \ - basetextdocumentlayout.cpp + basetextdocumentlayout.cpp \ + completionsettings.cpp HEADERS += texteditorplugin.h \ textfilewizard.h \ @@ -71,7 +72,8 @@ HEADERS += texteditorplugin.h \ colorschemeedit.h \ texteditoroverlay.h \ texteditoroptionspage.h \ - basetextdocumentlayout.h + basetextdocumentlayout.h \ + completionsettings.h FORMS += behaviorsettingspage.ui \ diff --git a/src/plugins/texteditor/texteditorsettings.cpp b/src/plugins/texteditor/texteditorsettings.cpp index de018d407fe710b66ef558d0e3299ce38fcfb2bd..52b98abd9d90e5aca807575ce503767cfa16a1e9 100644 --- a/src/plugins/texteditor/texteditorsettings.cpp +++ b/src/plugins/texteditor/texteditorsettings.cpp @@ -33,6 +33,7 @@ #include "basetexteditor.h" #include "behaviorsettings.h" #include "behaviorsettingspage.h" +#include "completionsettings.h" #include "displaysettings.h" #include "displaysettingspage.h" #include "fontsettingspage.h" @@ -41,17 +42,54 @@ #include "texteditorplugin.h" #include <extensionsystem/pluginmanager.h> +#include <coreplugin/icore.h> #include <utils/qtcassert.h> #include <QtGui/QApplication> using namespace TextEditor; using namespace TextEditor::Constants; +using namespace TextEditor::Internal; + +namespace TextEditor { +namespace Internal { + +class TextEditorSettingsPrivate +{ +public: + FontSettingsPage *m_fontSettingsPage; + BehaviorSettingsPage *m_behaviorSettingsPage; + DisplaySettingsPage *m_displaySettingsPage; + + CompletionSettings m_completionSettings; + + void fontZoomRequested(int pointSize); + void zoomResetRequested(); +}; + +void TextEditorSettingsPrivate::fontZoomRequested(int zoom) +{ + FontSettings &fs = const_cast<FontSettings&>(m_fontSettingsPage->fontSettings()); + fs.setFontZoom(qMax(10, fs.fontZoom() + zoom)); + m_fontSettingsPage->saveSettings(); +} + +void TextEditorSettingsPrivate::zoomResetRequested() +{ + FontSettings &fs = const_cast<FontSettings&>(m_fontSettingsPage->fontSettings()); + fs.setFontZoom(100); + m_fontSettingsPage->saveSettings(); +} + +} // namespace Internal +} // namespace TextEditor + TextEditorSettings *TextEditorSettings::m_instance = 0; TextEditorSettings::TextEditorSettings(QObject *parent) : QObject(parent) + , m_d(new Internal::TextEditorSettingsPrivate) { QTC_ASSERT(!m_instance, return); m_instance = this; @@ -102,44 +140,50 @@ TextEditorSettings::TextEditorSettings(QObject *parent) formatDescriptions.append(FormatDescription(QLatin1String(C_DIFF_FILE), tr("Diff File"), Qt::darkBlue)); formatDescriptions.append(FormatDescription(QLatin1String(C_DIFF_LOCATION), tr("Diff Location"), Qt::blue)); - m_fontSettingsPage = new FontSettingsPage(formatDescriptions, - QLatin1String("A.FontSettings"), - this); - pm->addObject(m_fontSettingsPage); + m_d->m_fontSettingsPage = new FontSettingsPage(formatDescriptions, + QLatin1String("A.FontSettings"), + this); + pm->addObject(m_d->m_fontSettingsPage); // Add the GUI used to configure the tab, storage and interaction settings TextEditor::BehaviorSettingsPageParameters behaviorSettingsPageParameters; behaviorSettingsPageParameters.id = QLatin1String("B.BehaviourSettings"); behaviorSettingsPageParameters.displayName = tr("Behavior"); behaviorSettingsPageParameters.settingsPrefix = QLatin1String("text"); - m_behaviorSettingsPage = new BehaviorSettingsPage(behaviorSettingsPageParameters, this); - pm->addObject(m_behaviorSettingsPage); + m_d->m_behaviorSettingsPage = new BehaviorSettingsPage(behaviorSettingsPageParameters, this); + pm->addObject(m_d->m_behaviorSettingsPage); TextEditor::DisplaySettingsPageParameters displaySettingsPageParameters; displaySettingsPageParameters.id = QLatin1String("D.DisplaySettings"), displaySettingsPageParameters.displayName = tr("Display"); displaySettingsPageParameters.settingsPrefix = QLatin1String("text"); - m_displaySettingsPage = new DisplaySettingsPage(displaySettingsPageParameters, this); - pm->addObject(m_displaySettingsPage); + m_d->m_displaySettingsPage = new DisplaySettingsPage(displaySettingsPageParameters, this); + pm->addObject(m_d->m_displaySettingsPage); - connect(m_fontSettingsPage, SIGNAL(changed(TextEditor::FontSettings)), + connect(m_d->m_fontSettingsPage, SIGNAL(changed(TextEditor::FontSettings)), this, SIGNAL(fontSettingsChanged(TextEditor::FontSettings))); - connect(m_behaviorSettingsPage, SIGNAL(tabSettingsChanged(TextEditor::TabSettings)), + connect(m_d->m_behaviorSettingsPage, SIGNAL(tabSettingsChanged(TextEditor::TabSettings)), this, SIGNAL(tabSettingsChanged(TextEditor::TabSettings))); - connect(m_behaviorSettingsPage, SIGNAL(storageSettingsChanged(TextEditor::StorageSettings)), + connect(m_d->m_behaviorSettingsPage, SIGNAL(storageSettingsChanged(TextEditor::StorageSettings)), this, SIGNAL(storageSettingsChanged(TextEditor::StorageSettings))); - connect(m_behaviorSettingsPage, SIGNAL(behaviorSettingsChanged(TextEditor::BehaviorSettings)), + connect(m_d->m_behaviorSettingsPage, SIGNAL(behaviorSettingsChanged(TextEditor::BehaviorSettings)), this, SIGNAL(behaviorSettingsChanged(TextEditor::BehaviorSettings))); - connect(m_displaySettingsPage, SIGNAL(displaySettingsChanged(TextEditor::DisplaySettings)), + connect(m_d->m_displaySettingsPage, SIGNAL(displaySettingsChanged(TextEditor::DisplaySettings)), this, SIGNAL(displaySettingsChanged(TextEditor::DisplaySettings))); + + // TODO: Move these settings to TextEditor category + if (QSettings *s = Core::ICore::instance()->settings()) + m_d->m_completionSettings.fromSettings(QLatin1String("CppTools/"), s); } TextEditorSettings::~TextEditorSettings() { ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); - pm->removeObject(m_fontSettingsPage); - pm->removeObject(m_behaviorSettingsPage); - pm->removeObject(m_displaySettingsPage); + pm->removeObject(m_d->m_fontSettingsPage); + pm->removeObject(m_d->m_behaviorSettingsPage); + pm->removeObject(m_d->m_displaySettingsPage); + + delete m_d; m_instance = 0; } @@ -181,41 +225,46 @@ void TextEditorSettings::initializeEditor(BaseTextEditor *editor) } -void TextEditorSettings::fontZoomRequested(int zoom) +const FontSettings &TextEditorSettings::fontSettings() const { - FontSettings &fs = const_cast<FontSettings&>(fontSettings()); - fs.setFontZoom(qMax(10, fs.fontZoom() + zoom)); - m_fontSettingsPage->saveSettings(); + return m_d->m_fontSettingsPage->fontSettings(); } -void TextEditorSettings::zoomResetRequested() +const TabSettings &TextEditorSettings::tabSettings() const { - FontSettings &fs = const_cast<FontSettings&>(fontSettings()); - fs.setFontZoom(100); - m_fontSettingsPage->saveSettings(); + return m_d->m_behaviorSettingsPage->tabSettings(); } -const FontSettings &TextEditorSettings::fontSettings() const +const StorageSettings &TextEditorSettings::storageSettings() const { - return m_fontSettingsPage->fontSettings(); + return m_d->m_behaviorSettingsPage->storageSettings(); } -const TabSettings &TextEditorSettings::tabSettings() const +const BehaviorSettings &TextEditorSettings::behaviorSettings() const { - return m_behaviorSettingsPage->tabSettings(); + return m_d->m_behaviorSettingsPage->behaviorSettings(); } -const StorageSettings &TextEditorSettings::storageSettings() const +const DisplaySettings &TextEditorSettings::displaySettings() const { - return m_behaviorSettingsPage->storageSettings(); + return m_d->m_displaySettingsPage->displaySettings(); } -const BehaviorSettings &TextEditorSettings::behaviorSettings() const +const CompletionSettings &TextEditorSettings::completionSettings() const { - return m_behaviorSettingsPage->behaviorSettings(); + return m_d->m_completionSettings; } -const DisplaySettings &TextEditorSettings::displaySettings() const +void TextEditorSettings::setCompletionSettings(const TextEditor::CompletionSettings &settings) { - return m_displaySettingsPage->displaySettings(); + if (m_d->m_completionSettings == settings) + return; + + m_d->m_completionSettings = settings; + if (QSettings *s = Core::ICore::instance()->settings()) + m_d->m_completionSettings.toSettings(QLatin1String("CppTools/"), s); + + emit completionSettingsChanged(m_d->m_completionSettings); } + +#include "moc_texteditorsettings.cpp" diff --git a/src/plugins/texteditor/texteditorsettings.h b/src/plugins/texteditor/texteditorsettings.h index a5836304bee1ca853126b3b9da66575997656c61..ff6c9b958628e4aa51cb653191ea7b0d7e73dc07 100644 --- a/src/plugins/texteditor/texteditorsettings.h +++ b/src/plugins/texteditor/texteditorsettings.h @@ -45,11 +45,16 @@ struct TabSettings; struct StorageSettings; struct BehaviorSettings; struct DisplaySettings; +struct CompletionSettings; + +namespace Internal { +class TextEditorSettingsPrivate; +} /** * This class provides a central place for basic text editor settings. These * settings include font settings, tab settings, storage settings, behavior - * settings and display settings. + * settings, display settings and completion settings. */ class TEXTEDITOR_EXPORT TextEditorSettings : public QObject { @@ -68,6 +73,9 @@ public: const StorageSettings &storageSettings() const; const BehaviorSettings &behaviorSettings() const; const DisplaySettings &displaySettings() const; + const CompletionSettings &completionSettings() const; + + void setCompletionSettings(const TextEditor::CompletionSettings &); signals: void fontSettingsChanged(const TextEditor::FontSettings &); @@ -75,15 +83,12 @@ signals: void storageSettingsChanged(const TextEditor::StorageSettings &); void behaviorSettingsChanged(const TextEditor::BehaviorSettings &); void displaySettingsChanged(const TextEditor::DisplaySettings &); - -private slots: - void fontZoomRequested(int pointSize); - void zoomResetRequested(); + void completionSettingsChanged(const TextEditor::CompletionSettings &); private: - FontSettingsPage *m_fontSettingsPage; - BehaviorSettingsPage *m_behaviorSettingsPage; - DisplaySettingsPage *m_displaySettingsPage; + Internal::TextEditorSettingsPrivate *m_d; + Q_PRIVATE_SLOT(m_d, void fontZoomRequested(int pointSize)); + Q_PRIVATE_SLOT(m_d, void zoomResetRequested()); static TextEditorSettings *m_instance; };