Merge remote branch 'origin/2.0'

Conflicts:
	src/plugins/cpptools/cppcodecompletion.cpp
This commit is contained in:
con
2010-05-12 17:25:40 +02:00
65 changed files with 1014 additions and 512 deletions

View File

@@ -574,6 +574,17 @@ QString PluginManager::testDataDirectory() const
return s;
}
/*!
\fn void PluginManager::profilingReport(const char *what, const PluginSpec *spec = 0)
Create a profiling entry showing the elapsed time if profiling is activated.
*/
void PluginManager::profilingReport(const char *what, const PluginSpec *spec)
{
d->profilingReport(what, spec);
}
//============PluginManagerPrivate===========
/*!
@@ -601,6 +612,7 @@ PluginSpecPrivate *PluginManagerPrivate::privateSpec(PluginSpec *spec)
PluginManagerPrivate::PluginManagerPrivate(PluginManager *pluginManager) :
extension(QLatin1String("xml")),
m_profileElapsedMS(0),
m_profilingVerbosity(0),
q(pluginManager)
{
}
@@ -679,6 +691,13 @@ void PluginManagerPrivate::addObject(QObject *obj)
if (debugLeaks)
qDebug() << "PluginManagerPrivate::addObject" << obj << obj->objectName();
if (m_profilingVerbosity && !m_profileTimer.isNull()) {
// Report a timestamp when adding an object. Useful for profiling
// its initialization time.
const int absoluteElapsedMS = m_profileTimer->elapsed();
qDebug(" %-43s %8dms", obj->metaObject()->className(), absoluteElapsedMS);
}
allObjects.append(obj);
}
emit q->objectAdded(obj);
@@ -954,6 +973,8 @@ void PluginManagerPrivate::initProfiling()
m_profileTimer->start();
m_profileElapsedMS = 0;
qDebug("Profiling started");
} else {
m_profilingVerbosity++;
}
}
@@ -966,7 +987,7 @@ void PluginManagerPrivate::profilingReport(const char *what, const PluginSpec *s
if (spec) {
qDebug("%-22s %-22s %8dms (%8dms)", what, qPrintable(spec->name()), absoluteElapsedMS, elapsedMS);
} else {
qDebug("%-22s %8dms (%8dms)", what, absoluteElapsedMS, elapsedMS);
qDebug("%-45s %8dms (%8dms)", what, absoluteElapsedMS, elapsedMS);
}
}
}

View File

@@ -118,6 +118,8 @@ public:
bool runningTests() const;
QString testDataDirectory() const;
void profilingReport(const char *what, const PluginSpec *spec = 0);
signals:
void objectAdded(QObject *obj);
void aboutToRemoveObject(QObject *obj);

View File

@@ -85,6 +85,7 @@ public:
QStringList arguments;
QScopedPointer<QTime> m_profileTimer;
int m_profileElapsedMS;
unsigned m_profilingVerbosity;
// Look in argument descriptions of the specs for the option.
PluginSpec *pluginForOption(const QString &option, bool *requiresArgument) const;

View File

@@ -106,6 +106,11 @@ Interpreter::ObjectValue *Bind::findFunctionScope(AST::FunctionDeclaration *node
return _functionScopes.value(node);
}
bool Bind::isGroupedPropertyBinding(AST::Node *node) const
{
return _groupedPropertyBindings.contains(node);
}
ObjectValue *Bind::switchObjectValue(ObjectValue *newObjectValue)
{
ObjectValue *oldObjectValue = _currentObjectValue;
@@ -139,7 +144,6 @@ ExpressionNode *Bind::expression(UiScriptBinding *ast) const
ObjectValue *Bind::bindObject(UiQualifiedId *qualifiedTypeNameId, UiObjectInitializer *initializer)
{
ObjectValue *parentObjectValue = 0;
const QString typeName = toString(qualifiedTypeNameId);
// normal component instance
ASTObjectValue *objectValue = new ASTObjectValue(qualifiedTypeNameId, initializer, _doc, &_engine);
@@ -204,8 +208,20 @@ bool Bind::visit(UiPublicMember *)
bool Bind::visit(UiObjectDefinition *ast)
{
ObjectValue *value = bindObject(ast->qualifiedTypeNameId, ast->initializer);
_qmlObjects.insert(ast, value);
// an UiObjectDefinition may be used to group property bindings
// think anchors { ... }
bool isGroupedBinding = false;
for (UiQualifiedId *it = ast->qualifiedTypeNameId; it; it = it->next) {
if (!it->next)
isGroupedBinding = it->name->asString().at(0).isLower();
}
if (!isGroupedBinding) {
ObjectValue *value = bindObject(ast->qualifiedTypeNameId, ast->initializer);
_qmlObjects.insert(ast, value);
} else {
_groupedPropertyBindings.insert(ast);
}
return false;
}

View File

@@ -63,6 +63,7 @@ public:
Interpreter::Context *context) const;
Interpreter::ObjectValue *findFunctionScope(AST::FunctionDeclaration *node) const;
bool isGroupedPropertyBinding(AST::Node *node) const;
static QString toString(AST::UiQualifiedId *qualifiedId, QChar delimiter = QChar('.'));
@@ -100,6 +101,7 @@ private:
Interpreter::ObjectValue *_rootObjectValue;
QHash<AST::Node *, Interpreter::ObjectValue *> _qmlObjects;
QSet<AST::Node *> _groupedPropertyBindings;
QHash<AST::FunctionDeclaration *, Interpreter::ObjectValue *> _functionScopes;
QStringList _includedScripts;

View File

@@ -1472,6 +1472,8 @@ const Value *Context::lookup(const QString &name)
const ObjectValue *Context::lookupType(const QmlJS::Document *doc, UiQualifiedId *qmlTypeName)
{
const ObjectValue *objectValue = typeEnvironment(doc);
if (!objectValue)
return 0;
for (UiQualifiedId *iter = qmlTypeName; objectValue && iter; iter = iter->next) {
if (! iter->name)
@@ -1490,6 +1492,8 @@ const ObjectValue *Context::lookupType(const QmlJS::Document *doc, UiQualifiedId
const ObjectValue *Context::lookupType(const QmlJS::Document *doc, const QStringList &qmlTypeName)
{
const ObjectValue *objectValue = typeEnvironment(doc);
if (!objectValue)
return 0;
foreach (const QString &name, qmlTypeName) {
const Value *value = objectValue->property(name, this);

View File

@@ -66,10 +66,24 @@ void ScopeBuilder::setQmlScopeObject(Node *node)
{
ScopeChain &scopeChain = _context->scopeChain();
scopeChain.qmlScopeObjects.clear();
if (_doc->bind()->isGroupedPropertyBinding(node)) {
UiObjectDefinition *definition = cast<UiObjectDefinition *>(node);
if (!definition)
return;
const Value *v = scopeObjectLookup(definition->qualifiedTypeNameId);
if (!v)
return;
const ObjectValue *object = v->asObjectValue();
if (!object)
return;
scopeChain.qmlScopeObjects.clear();
scopeChain.qmlScopeObjects += object;
}
const ObjectValue *scopeObject = _doc->bind()->findQmlObject(node);
if (scopeObject) {
scopeChain.qmlScopeObjects.clear();
scopeChain.qmlScopeObjects += scopeObject;
} else {
return; // Probably syntax errors, where we're working with a "recovered" AST.
@@ -130,3 +144,28 @@ void ScopeBuilder::setQmlScopeObject(Node *node)
}
}
}
const Value *ScopeBuilder::scopeObjectLookup(AST::UiQualifiedId *id)
{
// do a name lookup on the scope objects
const Value *result = 0;
foreach (const ObjectValue *scopeObject, _context->scopeChain().qmlScopeObjects) {
const ObjectValue *object = scopeObject;
for (UiQualifiedId *it = id; it; it = it->next) {
result = object->property(it->name->asString(), _context);
if (!result)
break;
if (it->next) {
object = result->asObjectValue();
if (!object) {
result = 0;
break;
}
}
}
if (result)
break;
}
return result;
}

View File

@@ -13,6 +13,7 @@ namespace AST {
namespace Interpreter {
class Context;
class Value;
}
class QMLJS_EXPORT ScopeBuilder
@@ -27,6 +28,7 @@ public:
private:
void setQmlScopeObject(AST::Node *node);
const Interpreter::Value *scopeObjectLookup(AST::UiQualifiedId *id);
Document::Ptr _doc;
Interpreter::Context *_context;

View File

@@ -50,6 +50,12 @@ const char * const IDE_VERSION_LONG = IDE_VERSION;
const char * const IDE_AUTHOR = "Nokia Corporation";
const char * const IDE_YEAR = "2010";
#ifdef IDE_VERSION_DESCRIPTION
const char * const IDE_VERSION_DESCRIPTION_STR = STRINGIFY(IDE_VERSION_DESCRIPTION);
#else
const char * const IDE_VERSION_DESCRIPTION_STR = "";
#endif
#ifdef IDE_REVISION
const char * const IDE_REVISION_STR = STRINGIFY(IDE_REVISION);
#else

View File

@@ -61,7 +61,11 @@ VersionDialog::VersionDialog(QWidget *parent)
layout->setSizeConstraint(QLayout::SetFixedSize);
QString version = QLatin1String(IDE_VERSION_LONG);
version += QDate(2007, 25, 10).toString(Qt::SystemLocaleDate);
QString ideVersionDescription;
#ifdef IDE_VERSION_DESCRIPTION
ideVersionDescription = tr("(%1)").arg(QLatin1String(IDE_VERSION_DESCRIPTION_STR));
#endif
QString ideRev;
#ifdef IDE_REVISION
@@ -70,21 +74,23 @@ VersionDialog::VersionDialog(QWidget *parent)
#endif
const QString description = tr(
"<h3>Qt Creator %1</h3>"
"<h3>Qt Creator %1 %8</h3>"
"Based on Qt %2 (%3 bit)<br/>"
"<br/>"
"Built on %4 at %5<br />"
"<br/>"
"%8"
"%9"
"<br/>"
"Copyright 2008-%6 %7. All rights reserved.<br/>"
"<br/>"
"The program is provided AS IS with NO WARRANTY OF ANY KIND, "
"INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A "
"PARTICULAR PURPOSE.<br/>")
.arg(version, QLatin1String(QT_VERSION_STR), QString::number(QSysInfo::WordSize),
.arg(version,
QLatin1String(QT_VERSION_STR), QString::number(QSysInfo::WordSize),
QLatin1String(__DATE__), QLatin1String(__TIME__), QLatin1String(IDE_YEAR),
(QLatin1String(IDE_AUTHOR)), ideRev);
(QLatin1String(IDE_AUTHOR)), ideVersionDescription,
ideRev);
QLabel *copyRightLabel = new QLabel(description);
copyRightLabel->setWordWrap(true);

View File

@@ -215,16 +215,16 @@ bool CppPlugin::initialize(const QStringList & /*arguments*/, QString *errorMess
wizardParameters.setDisplayName(tr("C++ Class"));
wizardParameters.setId(QLatin1String("A.Class"));
wizardParameters.setKind(Core::IWizard::ClassWizard);
wizardParameters.setDescription(tr("Creates a header and a source file for a new class."));
wizardParameters.setDescription(tr("Creates a C++ header and a source file for a new class that you can add to a C++ project."));
addAutoReleasedObject(new CppClassWizard(wizardParameters, core));
wizardParameters.setKind(Core::IWizard::FileWizard);
wizardParameters.setDescription(tr("Creates a C++ source file."));
wizardParameters.setDescription(tr("Creates a C++ source file that you can add to a C++ project."));
wizardParameters.setDisplayName(tr("C++ Source File"));
wizardParameters.setId(QLatin1String("B.Source"));
addAutoReleasedObject(new CppFileWizard(wizardParameters, Source, core));
wizardParameters.setDescription(tr("Creates a C++ header file."));
wizardParameters.setDescription(tr("Creates a C++ header file that you can add to a C++ project."));
wizardParameters.setDisplayName(tr("C++ Header File"));
wizardParameters.setId(QLatin1String("C.Header"));
addAutoReleasedObject(new CppFileWizard(wizardParameters, Header, core));

View File

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

View File

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

View File

@@ -57,6 +57,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>
@@ -436,10 +437,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)
@@ -451,46 +448,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.
*/
@@ -1512,7 +1469,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 ||
@@ -1590,7 +1547,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.
@@ -1603,8 +1562,8 @@ void CppCodeCompletion::complete(const TextEditor::CompletionItem &item)
extraChars += QLatin1Char('<');
}
} else if (! function->isAmbiguous()) {
if (m_spaceAfterFunctionName)
extraChars += QLatin1Char(' ');
if (completionSettings().m_spaceAfterFunctionName)
extraChars += QLatin1Char(' ');
extraChars += QLatin1Char('(');
// If the function doesn't return anything, automatically place the semicolon,
@@ -1631,7 +1590,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(')'));
@@ -1667,7 +1626,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);
}

View File

@@ -86,18 +86,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);
@@ -159,10 +147,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;

View File

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

View File

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

View File

@@ -53,7 +53,7 @@ QIcon CheckoutWizard::icon() const
QString CheckoutWizard::description() const
{
return tr("Checks out a project from a CVS repository.");
return tr("Checks out a project from a CVS repository and tries to load the contained project.");
}
QString CheckoutWizard::displayName() const

View File

@@ -1584,11 +1584,12 @@ IDebuggerEngine *createCdbEngine(DebuggerManager *parent,
// Create engine
QString errorMessage;
IDebuggerEngine *engine = CdbDebugEngine::create(parent, options, &errorMessage);
if (!engine) {
if (engine) {
QObject::connect(optionsPage, SIGNAL(debuggerPathsChanged()), engine, SLOT(syncDebuggerPaths()));
} else {
optionsPage->setFailureMessage(errorMessage);
qWarning("%s\n" ,qPrintable(errorMessage));
}
QObject::connect(optionsPage, SIGNAL(debuggerPathsChanged()), engine, SLOT(syncDebuggerPaths()));
return engine;
}

View File

@@ -129,14 +129,16 @@ void FormEditorPlugin::initializeTemplates()
const QString formFileType = QLatin1String(Constants::FORM_FILE_TYPE);
wizardParameters.setDisplayName(tr("Qt Designer Form"));
wizardParameters.setId(QLatin1String("D.Form"));
wizardParameters.setDescription(tr("Creates a Qt Designer form file (.ui)."));
wizardParameters.setDescription(tr("Creates a Qt Designer form along with a matching class (C++ header and source file) "
"for implementation purposes. You can add the form and class to an existing Qt C++ Project."));
addAutoReleasedObject(new FormWizard(wizardParameters, this));
#ifdef CPP_ENABLED
wizardParameters.setKind(Core::IWizard::ClassWizard);
wizardParameters.setDisplayName(tr("Qt Designer Form Class"));
wizardParameters.setId(QLatin1String("C.FormClass"));
wizardParameters.setDescription(tr("Creates a Qt Designer form file (.ui) with a matching class."));
wizardParameters.setDescription(tr("Creates a Qt Designer form that you can add to a Qt C++ project. "
"This is useful if you already have an existing class for the UI business logic."));
addAutoReleasedObject(new FormClassWizard(wizardParameters, this));
addAutoReleasedObject(new CppSettingsPage);
#endif

View File

@@ -96,7 +96,8 @@ Core::BaseFileWizardParameters GenericProjectWizard::parameters()
parameters.setIcon(QIcon(QLatin1String(":/wizards/images/console.png")));
parameters.setDisplayName(tr("Import Existing Project"));
parameters.setId(QLatin1String("Z.Makefile"));
parameters.setDescription(tr("Creates a generic project, supporting any build system."));
parameters.setDescription(tr("Imports existing projects that do not use qmake or CMake. "
"This allows you to use Qt Creator as a code editor."));
parameters.setCategory(QLatin1String(ProjectExplorer::Constants::PROJECT_WIZARD_CATEGORY));
parameters.setDisplayCategory(QCoreApplication::translate("ProjectExplorer", ProjectExplorer::Constants::PROJECT_WIZARD_TR_CATEGORY));
return parameters;

View File

@@ -52,7 +52,7 @@ QIcon CloneWizard::icon() const
QString CloneWizard::description() const
{
return tr("Clones a project from a git repository.");
return tr("Clones a project from a Git repository and tries to load the contained project.");
}
QString CloneWizard::displayName() const

View File

@@ -80,7 +80,7 @@ QIcon GitoriousCloneWizard::icon() const
QString GitoriousCloneWizard::description() const
{
return tr("Clones a project from a Gitorious repository.");
return tr("Clones a project from a Gitorious repository and tries to load the contained project.");
}
QString GitoriousCloneWizard::displayName() const

View File

@@ -53,7 +53,7 @@ QIcon CloneWizard::icon() const
QString CloneWizard::description() const
{
return tr("Clone a Mercurial repository");
return tr("Clones a Mercurial repository and tries to load the contained project.");
}
QString CloneWizard::displayName() const

View File

@@ -389,7 +389,7 @@ void ColorBox::mouseMoveEvent(QMouseEvent *e)
void GradientLine::setItemNode(const QVariant &itemNode)
{
if (!itemNode.value<ModelNode>().isValid() || !QmlItemNode(itemNode.value<ModelNode>()).hasNodeParent())
if (!itemNode.value<ModelNode>().isValid())
return;
m_itemNode = itemNode.value<ModelNode>();
setup();
@@ -442,6 +442,8 @@ void GradientLine::setActiveColor(const QColor &newColor)
void GradientLine::setupGradient()
{
ModelNode modelNode = m_itemNode.modelNode();
if (!modelNode.isValid())
return;
m_colorList.clear();
m_stops.clear();

View File

@@ -74,7 +74,7 @@ void QmlAnchorBindingProxy::setup(const QmlItemNode &fxItemNode)
if (horizontalCentered())
m_horizontalTarget = m_fxItemNode.anchors().instanceAnchor(AnchorLine::HorizontalCenter).qmlItemNode();
emit itemNodeChanged();
emit parentChanged();
emit topAnchorChanged();
emit bottomAnchorChanged();

View File

@@ -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; }
@@ -637,7 +630,7 @@ int CodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
// Set up the current scope chain.
QList<AST::Node *> astPath = semanticInfo.astPath(editor->position());
context.build(astPath , document, snapshot, m_modelManager->importPaths());
context.build(astPath, document, snapshot, m_modelManager->importPaths());
// Search for the operator that triggered the completion.
QChar completionOperator;
@@ -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)

View File

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

View File

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

View File

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

View File

@@ -61,7 +61,8 @@ Core::BaseFileWizardParameters QmlProjectApplicationWizard::parameters()
parameters.setIcon(QIcon(QLatin1String(":/wizards/images/console.png")));
parameters.setDisplayName(tr("Qt QML Application"));
parameters.setId(QLatin1String("QA.QML Application"));
parameters.setDescription(tr("Creates a Qt QML application."));
parameters.setDescription(tr("Creates a Qt QML application project with a single QML file containing the main view.\n\n"
"QML application projects are executed through the QML runtime and do not need to be built."));
parameters.setCategory(QLatin1String(Constants::QML_WIZARD_CATEGORY));
parameters.setDisplayCategory(QCoreApplication::translate(Constants::QML_WIZARD_TR_SCOPE,
Constants::QML_WIZARD_TR_CATEGORY));

View File

@@ -627,16 +627,6 @@ bool QtVersion::supportsShadowBuilds() const
// We can not support shadow building with the ABLD system
return false;
}
if (targets.contains(Constants::MAEMO_DEVICE_TARGET_ID)) {
#if defined(Q_OS_WIN)
// qmake -unix fails with shadow building on windows
return false;
#else
// ... but works fine anywhere else
return true;
#endif
}
return true;
}

View File

@@ -57,7 +57,8 @@ ConsoleAppWizard::ConsoleAppWizard()
QLatin1String(Constants::QT_APP_WIZARD_TR_SCOPE),
QLatin1String(Constants::QT_APP_WIZARD_TR_CATEGORY),
tr("Qt Console Application"),
tr("Creates a Qt console application."),
tr("Creates a project containing a single main.cpp file with a stub implementation.\n\n"
"Preselects a desktop Qt for building the application if available."),
QIcon(QLatin1String(":/wizards/images/console.png")))
{
}

View File

@@ -44,7 +44,8 @@ EmptyProjectWizard::EmptyProjectWizard()
QLatin1String(ProjectExplorer::Constants::PROJECT_WIZARD_TR_SCOPE),
QLatin1String(ProjectExplorer::Constants::PROJECT_WIZARD_TR_CATEGORY),
tr("Empty Qt Project"),
tr("Creates an empty Qt project."),
tr("Creates a qmake-based project without any files. This allows you to create "
"an application without any default classes."),
QIcon(QLatin1String(":/wizards/images/gui.png")))
{
}

View File

@@ -81,7 +81,9 @@ GuiAppWizard::GuiAppWizard()
QLatin1String(Constants::QT_APP_WIZARD_TR_SCOPE),
QLatin1String(Constants::QT_APP_WIZARD_TR_CATEGORY),
tr("Qt Gui Application"),
tr("Creates a Qt Gui Application with one form."),
tr("Creates a Qt application for the desktop. "
"Includes a Qt Designer-based main window.\n\n"
"Preselects a desktop Qt for building the application if available."),
QIcon(QLatin1String(":/wizards/images/gui.png"))),
m_createMobileProject(false)
{

View File

@@ -53,7 +53,9 @@ LibraryWizard::LibraryWizard()
QLatin1String(ProjectExplorer::Constants::PROJECT_WIZARD_TR_SCOPE),
QLatin1String(ProjectExplorer::Constants::PROJECT_WIZARD_TR_CATEGORY),
tr("C++ Library"),
tr("Creates a Qt based C++ Library."),
tr("Creates a C++ library based on qmake. This can be used to create:<ul>"
"<li>a shared C++ library for use with <tt>QPluginLoader</tt> and runtime (Plugins)</li>"
"<li>a shared or static C++ library for use with another project at linktime</li></ul>."),
QIcon(QLatin1String(":/wizards/images/lib.png")))
{
}

View File

@@ -42,7 +42,9 @@ MobileGuiAppWizard::MobileGuiAppWizard() :
QLatin1String(Constants::QT_APP_WIZARD_TR_SCOPE),
QLatin1String(Constants::QT_APP_WIZARD_TR_CATEGORY),
tr("Mobile Qt Application"),
tr("Creates a mobile Qt Gui Application with one form."),
tr("Creates a Qt application optimized for mobile devices "
"with a Qt Designer-based main window.\n\n"
"Preselects Qt for Simulator and mobile targets if available"),
QIcon(QLatin1String(":/projectexplorer/images/SymbianDevice.png")),
true)
{

View File

@@ -49,7 +49,9 @@ TestWizard::TestWizard() :
QLatin1String(ProjectExplorer::Constants::PROJECT_WIZARD_TR_SCOPE),
QLatin1String(ProjectExplorer::Constants::PROJECT_WIZARD_TR_CATEGORY),
tr("Qt Unit Test"),
tr("Creates a Qt Unit Test."),
tr("Creates a QTestLib-based unit test for a feature or a class. "
"Unit tests allow you to verify that the code is fit for use "
"and that there are no regressions."),
QIcon(QLatin1String(":/wizards/images/console.png")))
{
}

View File

@@ -75,7 +75,7 @@ bool ResourceEditorPlugin::initialize(const QStringList &arguments, QString *err
addObject(m_editor);
Core::BaseFileWizardParameters wizardParameters(Core::IWizard::FileWizard);
wizardParameters.setDescription(tr("Creates a Qt Resource file (.qrc)."));
wizardParameters.setDescription(tr("Creates a Qt Resource file (.qrc) that you can add to a Qt C++ project."));
wizardParameters.setDisplayName(tr("Qt Resource file"));
wizardParameters.setId(QLatin1String("F.Resource"));
wizardParameters.setCategory(QLatin1String(Core::Constants::WIZARD_CATEGORY_QT));

View File

@@ -53,7 +53,7 @@ QIcon CheckoutWizard::icon() const
QString CheckoutWizard::description() const
{
return tr("Checks out a project from a Subversion repository.");
return tr("Checks out a project from a Subversion repository and tries to load the contained project.");
}
QString CheckoutWizard::displayName() const

View File

@@ -34,6 +34,7 @@
#include "basetexteditor_p.h"
#include "behaviorsettings.h"
#include "codecselector.h"
#include "completionsettings.h"
#include "completionsupport.h"
#include "tabsettings.h"
#include "texteditorconstants.h"
@@ -179,7 +180,7 @@ static void convertToPlainText(QString &txt)
BaseTextEditor::BaseTextEditor(QWidget *parent)
: QPlainTextEdit(parent)
{
d = new BaseTextEditorPrivate();
d = new BaseTextEditorPrivate;
d->q = this;
d->m_extraArea = new TextEditExtraArea(this);
d->m_extraArea->setMouseTracking(true);
@@ -195,8 +196,6 @@ BaseTextEditor::BaseTextEditor(QWidget *parent)
d->m_lastScrollPos = -1;
setCursorWidth(2);
d->m_allowSkippingOfBlockEnd = false;
// from RESEARCH
setLayoutDirection(Qt::LeftToRight);
@@ -221,7 +220,6 @@ BaseTextEditor::BaseTextEditor(QWidget *parent)
// parentheses matcher
d->m_parenthesesMatchingEnabled = false;
d->m_formatRange = true;
d->m_matchFormat.setForeground(Qt::red);
d->m_rangeFormat.setBackground(QColor(0xb4, 0xee, 0xb4));
@@ -1709,6 +1707,16 @@ bool BaseTextEditor::isParenthesesMatchingEnabled() const
return d->m_parenthesesMatchingEnabled;
}
void BaseTextEditor::setAutoParenthesesEnabled(bool b)
{
d->m_autoParenthesesEnabled = b;
}
bool BaseTextEditor::isAutoParenthesesEnabled() const
{
return d->m_autoParenthesesEnabled;
}
void BaseTextEditor::setHighlightCurrentLine(bool b)
{
d->m_highlightCurrentLine = b;
@@ -1837,8 +1845,10 @@ BaseTextEditorPrivate::BaseTextEditorPrivate()
:
m_contentsChanged(false),
m_lastCursorChangeWasInteresting(false),
m_document(new BaseTextDocument()),
m_allowSkippingOfBlockEnd(false),
m_document(new BaseTextDocument),
m_parenthesesMatchingEnabled(false),
m_autoParenthesesEnabled(true),
m_extraArea(0),
m_mouseOnCollapsedMarker(false),
m_marksVisible(false),
@@ -3889,13 +3899,16 @@ QString BaseTextEditor::autoComplete(QTextCursor &cursor, const QString &textToI
const bool checkBlockEnd = d->m_allowSkippingOfBlockEnd;
d->m_allowSkippingOfBlockEnd = false; // consume blockEnd.
if (!d->m_autoParenthesesEnabled)
return QString();
if (!contextAllowsAutoParentheses(cursor, textToInsert))
return QString();
const QString text = textToInsert;
const QChar lookAhead = characterAt(cursor.selectionEnd());
QChar character = textToInsert.at(0);
const QChar character = textToInsert.at(0);
const QString parentheses = QLatin1String("()");
const QString brackets = QLatin1String("[]");
if (parentheses.contains(character) || brackets.contains(character)) {
@@ -3950,17 +3963,20 @@ bool BaseTextEditor::autoBackspace(QTextCursor &cursor)
{
d->m_allowSkippingOfBlockEnd = false;
if (!d->m_autoParenthesesEnabled)
return false;
int pos = cursor.position();
if (pos == 0)
return false;
QTextCursor c = cursor;
c.setPosition(pos - 1);
QChar lookAhead = characterAt(pos);
QChar lookBehind = characterAt(pos-1);
QChar lookFurtherBehind = characterAt(pos-2);
const QChar lookAhead = characterAt(pos);
const QChar lookBehind = characterAt(pos - 1);
const QChar lookFurtherBehind = characterAt(pos - 2);
QChar character = lookBehind;
const QChar character = lookBehind;
if (character == QLatin1Char('(') || character == QLatin1Char('[')) {
QTextCursor tmp = cursor;
TextEditor::TextBlockUserData::findPreviousBlockOpenParenthesis(&tmp);
@@ -4005,7 +4021,10 @@ bool BaseTextEditor::autoBackspace(QTextCursor &cursor)
int BaseTextEditor::paragraphSeparatorAboutToBeInserted(QTextCursor &cursor)
{
if (characterAt(cursor.position()-1) != QLatin1Char('{'))
if (!d->m_autoParenthesesEnabled)
return 0;
if (characterAt(cursor.position() - 1) != QLatin1Char('{'))
return 0;
if (!contextAllowsAutoParentheses(cursor))
@@ -4908,6 +4927,11 @@ void BaseTextEditor::setStorageSettings(const StorageSettings &storageSettings)
d->m_document->setStorageSettings(storageSettings);
}
void BaseTextEditor::setCompletionSettings(const TextEditor::CompletionSettings &completionSettings)
{
setAutoParenthesesEnabled(completionSettings.m_autoInsertBrackets);
}
void BaseTextEditor::collapse()
{
QTextDocument *doc = document();

View File

@@ -59,6 +59,7 @@ class BaseTextDocument;
class BaseTextEditorEditable;
class FontSettings;
struct BehaviorSettings;
struct CompletionSettings;
struct DisplaySettings;
struct StorageSettings;
struct TabSettings;
@@ -160,13 +161,15 @@ public:
void setParenthesesMatchingEnabled(bool b);
bool isParenthesesMatchingEnabled() const;
void setAutoParenthesesEnabled(bool b);
bool isAutoParenthesesEnabled() const;
void setHighlightCurrentLine(bool b);
bool highlightCurrentLine() const;
void setLineNumbersVisible(bool b);
bool lineNumbersVisible() const;
void setMarksVisible(bool b);
bool marksVisible() const;
@@ -366,6 +369,7 @@ public slots:
virtual void setDisplaySettings(const TextEditor::DisplaySettings &);
virtual void setBehaviorSettings(const TextEditor::BehaviorSettings &);
virtual void setStorageSettings(const TextEditor::StorageSettings &);
virtual void setCompletionSettings(const TextEditor::CompletionSettings &);
protected:
bool viewportEvent(QEvent *event);

View File

@@ -265,7 +265,6 @@ public:
int m_cursorBlockNumber;
bool m_inKeyPressEvent;
};
} // namespace Internal

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -91,7 +91,8 @@ bool TextEditorPlugin::initialize(const QStringList &arguments, QString *errorMe
return false;
Core::BaseFileWizardParameters wizardParameters(Core::IWizard::FileWizard);
wizardParameters.setDescription(tr("Creates a text file (.txt)."));
wizardParameters.setDescription(tr("Creates a text file. The default file extension is <tt>.txt</tt>. "
"You can specify a different extension as part of the filename."));
wizardParameters.setDisplayName(tr("Text File"));
wizardParameters.setCategory(QLatin1String("U.General"));
wizardParameters.setDisplayCategory(tr("General"));

View File

@@ -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;
}
@@ -166,6 +210,8 @@ void TextEditorSettings::initializeEditor(BaseTextEditor *editor)
editor, SLOT(setBehaviorSettings(TextEditor::BehaviorSettings)));
connect(this, SIGNAL(displaySettingsChanged(TextEditor::DisplaySettings)),
editor, SLOT(setDisplaySettings(TextEditor::DisplaySettings)));
connect(this, SIGNAL(completionSettingsChanged(TextEditor::CompletionSettings)),
editor, SLOT(setCompletionSettings(TextEditor::CompletionSettings)));
connect(editor, SIGNAL(requestFontZoom(int)),
this, SLOT(fontZoomRequested(int)));
@@ -178,44 +224,50 @@ void TextEditorSettings::initializeEditor(BaseTextEditor *editor)
editor->setStorageSettings(storageSettings());
editor->setBehaviorSettings(behaviorSettings());
editor->setDisplaySettings(displaySettings());
editor->setCompletionSettings(completionSettings());
}
void TextEditorSettings::fontZoomRequested(int zoom)
{
FontSettings &fs = const_cast<FontSettings&>(fontSettings());
fs.setFontZoom(qMax(10, fs.fontZoom() + zoom));
m_fontSettingsPage->saveSettings();
}
void TextEditorSettings::zoomResetRequested()
{
FontSettings &fs = const_cast<FontSettings&>(fontSettings());
fs.setFontZoom(100);
m_fontSettingsPage->saveSettings();
}
const FontSettings &TextEditorSettings::fontSettings() const
{
return m_fontSettingsPage->fontSettings();
return m_d->m_fontSettingsPage->fontSettings();
}
const TabSettings &TextEditorSettings::tabSettings() const
{
return m_behaviorSettingsPage->tabSettings();
return m_d->m_behaviorSettingsPage->tabSettings();
}
const StorageSettings &TextEditorSettings::storageSettings() const
{
return m_behaviorSettingsPage->storageSettings();
return m_d->m_behaviorSettingsPage->storageSettings();
}
const BehaviorSettings &TextEditorSettings::behaviorSettings() const
{
return m_behaviorSettingsPage->behaviorSettings();
return m_d->m_behaviorSettingsPage->behaviorSettings();
}
const DisplaySettings &TextEditorSettings::displaySettings() const
{
return m_displaySettingsPage->displaySettings();
return m_d->m_displaySettingsPage->displaySettings();
}
const CompletionSettings &TextEditorSettings::completionSettings() const
{
return m_d->m_completionSettings;
}
void TextEditorSettings::setCompletionSettings(const TextEditor::CompletionSettings &settings)
{
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"

View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

After

Width:  |  Height:  |  Size: 21 KiB

View File

@@ -76,12 +76,7 @@ QToolButton:pressed, QPushButton:pressed{
<item>
<widget class="QWidget" name="gradientWidget" native="true">
<property name="styleSheet">
<string notr="true">/*
#gradientWidget {
background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:1.0, y2:1, stop:0 rgba(240, 240, 240, 255), stop:1 rgba(200, 200, 200, 255));
}
*/
#gradientWidget {
<string notr="true">#gradientWidget {
border-image: url(:/welcome/images/welcomebg.png) 0;
}
</string>

View File

@@ -33,6 +33,9 @@
#include "helpmanager.h"
#include "openpagesmanager.h"
#include <utils/filterlineedit.h>
#include <utils/styledbar.h>
#include <QtGui/QMenu>
#include <QtGui/QIcon>
#include <QtGui/QStyle>
@@ -423,19 +426,27 @@ void BookmarkWidget::setup(bool showButtons)
regExp.setCaseSensitivity(Qt::CaseInsensitive);
QLayout *vlayout = new QVBoxLayout(this);
vlayout->setMargin(4);
vlayout->setMargin(0);
vlayout->setSpacing(0);
QLabel *label = new QLabel(tr("Filter:"), this);
vlayout->addWidget(label);
searchField = new QLineEdit(this);
searchField = new Utils::FilterLineEdit(this);
setFocusProxy(searchField);
Utils::StyledBar *toolbar = new Utils::StyledBar(this);
toolbar->setSingleRow(false);
QLayout *tbLayout = new QHBoxLayout();
tbLayout->setMargin(4);
tbLayout->addWidget(searchField);
toolbar->setLayout(tbLayout);
vlayout->addWidget(toolbar);
searchField->installEventFilter(this);
vlayout->addWidget(searchField);
connect(searchField, SIGNAL(textChanged(const QString &)), this,
SLOT(filterChanged()));
treeView = new TreeView(this);
treeView->setFrameStyle(QFrame::NoFrame);
vlayout->addWidget(treeView);
#ifdef Q_OS_MAC

View File

@@ -52,7 +52,7 @@ ContentWindow::ContentWindow()
setFocusProxy(m_contentWidget);
QVBoxLayout *layout = new QVBoxLayout(this);
layout->setMargin(4);
layout->setMargin(0);
layout->addWidget(m_contentWidget);
connect(m_contentWidget, SIGNAL(customContextMenuRequested(QPoint)), this,
@@ -63,6 +63,8 @@ ContentWindow::ContentWindow()
QHelpContentModel *contentModel =
qobject_cast<QHelpContentModel*>(m_contentWidget->model());
connect(contentModel, SIGNAL(contentsCreated()), this, SLOT(expandTOC()));
m_contentWidget->setFrameStyle(QFrame::NoFrame);
}
ContentWindow::~ContentWindow()

View File

@@ -34,6 +34,9 @@
#include "openpagesmanager.h"
#include "topicchooser.h"
#include <utils/filterlineedit.h>
#include <utils/styledbar.h>
#include <QtGui/QLayout>
#include <QtGui/QLabel>
#include <QtGui/QLineEdit>
@@ -41,6 +44,7 @@
#include <QtGui/QMenu>
#include <QtGui/QContextMenuEvent>
#include <QtGui/QListWidgetItem>
#include <QtGui/QToolBar>
#include <QtHelp/QHelpEngine>
#include <QtHelp/QHelpIndexWidget>
@@ -52,17 +56,29 @@ IndexWindow::IndexWindow()
, m_indexWidget(0)
{
QVBoxLayout *layout = new QVBoxLayout(this);
QLabel *l = new QLabel(tr("&Look for:"));
layout->addWidget(l);
m_searchLineEdit = new QLineEdit();
l->setBuddy(m_searchLineEdit);
m_searchLineEdit = new Utils::FilterLineEdit();
m_searchLineEdit->setPlaceholderText(QString());
setFocusProxy(m_searchLineEdit);
connect(m_searchLineEdit, SIGNAL(textChanged(QString)), this,
SLOT(filterIndices(QString)));
m_searchLineEdit->installEventFilter(this);
layout->setMargin(4);
layout->addWidget(m_searchLineEdit);
QLabel *l = new QLabel(tr("&Look for:"));
l->setBuddy(m_searchLineEdit);
layout->addWidget(l);
layout->setMargin(0);
layout->setSpacing(0);
Utils::StyledBar *toolbar = new Utils::StyledBar(this);
toolbar->setSingleRow(false);
QLayout *tbLayout = new QHBoxLayout();
tbLayout->setSpacing(6);
tbLayout->setMargin(4);
tbLayout->addWidget(l);
tbLayout->addWidget(m_searchLineEdit);
toolbar->setLayout(tbLayout);
layout->addWidget(toolbar);
QHelpEngine *engine = &Help::HelpManager::helpEngine();
m_indexWidget = engine->indexWidget();
@@ -77,6 +93,7 @@ IndexWindow::IndexWindow()
this, SIGNAL(linksActivated(QMap<QString, QUrl>, QString)));
connect(m_searchLineEdit, SIGNAL(returnPressed()), m_indexWidget,
SLOT(activateCurrentItem()));
m_indexWidget->setFrameStyle(QFrame::NoFrame);
layout->addWidget(m_indexWidget);
m_indexWidget->viewport()->installEventFilter(this);

View File

@@ -61,7 +61,8 @@ QrcEditor::QrcEditor(QWidget *parent)
connect(m_treeview, SIGNAL(addPrefixTriggered()), this, SLOT(onAddPrefix()));
connect(m_treeview, SIGNAL(addFilesTriggered(QString)), this, SLOT(onAddFiles()));
connect(m_treeview, SIGNAL(removeItem()), this, SLOT(onRemove()));
connect(m_treeview, SIGNAL(currentIndexChanged()), this, SLOT(updateCurrent()));
connect(m_treeview->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)),
this, SLOT(updateCurrent()));
connect(m_treeview, SIGNAL(dirtyChanged(bool)), this, SIGNAL(dirtyChanged(bool)));
m_treeview->setFocus();

View File

@@ -203,13 +203,6 @@ ResourceView::~ResourceView()
{
}
void ResourceView::currentChanged(const QModelIndex &current, const QModelIndex &previous)
{
Q_UNUSED(current)
Q_UNUSED(previous)
emit currentIndexChanged();
}
bool ResourceView::isDirty() const
{
return m_qrcModel->dirty();

View File

@@ -139,14 +139,10 @@ protected:
signals:
void removeItem();
void dirtyChanged(bool b);
void currentIndexChanged();
void addFilesTriggered(const QString &prefix);
void addPrefixTriggered();
protected slots:
void currentChanged(const QModelIndex &current, const QModelIndex &previous);
private slots:
void onEditAlias();
void onEditPrefix();

View File

@@ -353,8 +353,22 @@ void Launcher::handleResult(const TrkResult &result)
QByteArray prefix = "READ BUF: ";
QByteArray str = result.toString().toUtf8();
if (result.isDebugOutput) { // handle application output
logMessage("APPLICATION OUTPUT: " + result.data);
emit applicationOutputReceived(result.data);
QString msg;
if (result.multiplex == MuxTextTrace) {
if (result.data.length() > 8) {
quint64 timestamp = extractInt64(result.data) & 0x0FFFFFFFFFFFFFFFULL;
quint64 secs = timestamp / 1000000000;
quint64 ns = timestamp % 1000000000;
msg = QString("[%1.%2] %3").arg(secs).arg(ns).arg(QString(result.data.mid(8)));
logMessage("TEXT TRACE: " + msg);
}
} else {
logMessage("APPLICATION OUTPUT: " + result.data);
msg = result.data;
}
msg.replace("\r\n", "\n");
if(!msg.endsWith('\n')) msg.append('\n');
emit applicationOutputReceived(msg);
return;
}
switch (result.code) {

View File

@@ -264,14 +264,13 @@ QByteArray frameMessage(byte command, byte token, const QByteArray &data, bool s
/* returns 0 if array doesn't represent a result,
otherwise returns the length of the result data */
ushort isValidTrkResult(const QByteArray &buffer, bool serialFrame)
ushort isValidTrkResult(const QByteArray &buffer, bool serialFrame, ushort& mux)
{
if (serialFrame) {
// Serial protocol with length info
if (buffer.length() < 4)
return 0;
if (buffer.at(0) != 0x01 || byte(buffer.at(1)) != 0x90)
return 0;
mux = extractShort(buffer.data());
const ushort len = extractShort(buffer.data() + 2);
return (buffer.size() >= len + 4) ? len : ushort(0);
}
@@ -280,6 +279,7 @@ ushort isValidTrkResult(const QByteArray &buffer, bool serialFrame)
const int firstDelimiterPos = buffer.indexOf(delimiter);
// Regular message delimited by 0x7e..0x7e
if (firstDelimiterPos == 0) {
mux = MuxTrk;
const int endPos = buffer.indexOf(delimiter, firstDelimiterPos + 1);
return endPos != -1 ? endPos + 1 - firstDelimiterPos : 0;
}
@@ -292,7 +292,7 @@ bool extractResult(QByteArray *buffer, bool serialFrame, TrkResult *result, QByt
result->clear();
if(rawData)
rawData->clear();
const ushort len = isValidTrkResult(*buffer, serialFrame);
const ushort len = isValidTrkResult(*buffer, serialFrame, result->multiplex);
if (!len)
return false;
// handle receiving application output, which is not a regular command
@@ -300,7 +300,6 @@ bool extractResult(QByteArray *buffer, bool serialFrame, TrkResult *result, QByt
if (buffer->at(delimiterPos) != 0x7e) {
result->isDebugOutput = true;
result->data = buffer->mid(delimiterPos, len);
result->data.replace("\r\n", "\n");
*buffer->remove(0, delimiterPos + len);
return true;
}
@@ -341,6 +340,19 @@ SYMBIANUTILS_EXPORT uint extractInt(const char *data)
return res;
}
SYMBIANUTILS_EXPORT quint64 extractInt64(const char *data)
{
quint64 res = byte(data[0]);
res <<= 8; res += byte(data[1]);
res <<= 8; res += byte(data[2]);
res <<= 8; res += byte(data[3]);
res <<= 8; res += byte(data[4]);
res <<= 8; res += byte(data[5]);
res <<= 8; res += byte(data[6]);
res <<= 8; res += byte(data[7]);
return res;
}
SYMBIANUTILS_EXPORT QString quoteUnprintableLatin1(const QByteArray &ba)
{
QString res;

View File

@@ -123,9 +123,16 @@ enum Command {
TrkDSPositionFile = 0xd4
};
enum SerialMultiplexor {
MuxRaw = 0,
MuxTextTrace = 0x0102,
MuxTrk = 0x0190
};
inline byte extractByte(const char *data) { return *data; }
SYMBIANUTILS_EXPORT ushort extractShort(const char *data);
SYMBIANUTILS_EXPORT uint extractInt(const char *data);
SYMBIANUTILS_EXPORT quint64 extractInt64(const char *data);
SYMBIANUTILS_EXPORT QString quoteUnprintableLatin1(const QByteArray &ba);
@@ -205,6 +212,7 @@ struct SYMBIANUTILS_EXPORT TrkResult
int errorCode() const;
QString errorString() const;
ushort multiplex;
byte code;
byte token;
QByteArray data;