diff --git a/src/libs/cplusplus/Overview.cpp b/src/libs/cplusplus/Overview.cpp index dcb51db98136c983beb68766c85eb7cef3fe59c3..27021a95681061bbe7433e07dc8415e6f6b2a80a 100644 --- a/src/libs/cplusplus/Overview.cpp +++ b/src/libs/cplusplus/Overview.cpp @@ -35,27 +35,18 @@ using namespace CPlusPlus; Overview::Overview() - : _markArgument(0), + : _markedArgument(0), + _markedArgumentBegin(0), + _markedArgumentEnd(0), _showArgumentNames(false), _showReturnTypes(false), _showFunctionSignatures(true), - _showFullyQualifiedNames(false), - _richText(false) + _showFullyQualifiedNames(false) { } Overview::~Overview() { } -bool Overview::richText() const -{ - return _richText; -} - -void Overview::setRichText(bool richText) -{ - _richText = richText; -} - bool Overview::showArgumentNames() const { return _showArgumentNames; @@ -76,14 +67,34 @@ bool Overview::showReturnTypes() const return _showReturnTypes; } -unsigned Overview::markArgument() const +unsigned Overview::markedArgument() const +{ + return _markedArgument; +} + +void Overview::setMarkedArgument(unsigned position) +{ + _markedArgument = position; +} + +int Overview::markedArgumentBegin() const +{ + return _markedArgumentBegin; +} + +void Overview::setMarkedArgumentBegin(int begin) +{ + _markedArgumentBegin = begin; +} + +int Overview::markedArgumentEnd() const { - return _markArgument; + return _markedArgumentEnd; } -void Overview::setMarkArgument(unsigned position) +void Overview::setMarkedArgumentEnd(int end) { - _markArgument = position; + _markedArgumentEnd = end; } bool Overview::showFunctionSignatures() const diff --git a/src/libs/cplusplus/Overview.h b/src/libs/cplusplus/Overview.h index 8d2facac8edf7581be92d92687c2015d22f673af..645b0006737dde10b1bbf1bd28ceec007e6450c2 100644 --- a/src/libs/cplusplus/Overview.h +++ b/src/libs/cplusplus/Overview.h @@ -44,9 +44,6 @@ public: Overview(); ~Overview(); - bool richText() const; - void setRichText(bool richText); - bool showArgumentNames() const; void setShowArgumentNames(bool showArgumentNames); @@ -59,10 +56,15 @@ public: bool showFullyQualifiedNames() const; void setShowFullyQualifiedNamed(bool showFullyQualifiedNames); - // 1-based - // ### rename - unsigned markArgument() const; - void setMarkArgument(unsigned position); + // argument index that you want to mark + unsigned markedArgument() const; + void setMarkedArgument(unsigned position); + + int markedArgumentBegin() const; + void setMarkedArgumentBegin(int begin); + + int markedArgumentEnd() const; + void setMarkedArgumentEnd(int end); QString operator()(Name *name) const { return prettyName(name); } @@ -75,12 +77,13 @@ public: QString prettyType(const FullySpecifiedType &type, const QString &name) const; private: - unsigned _markArgument; + unsigned _markedArgument; + int _markedArgumentBegin; + int _markedArgumentEnd; bool _showArgumentNames: 1; bool _showReturnTypes: 1; bool _showFunctionSignatures: 1; bool _showFullyQualifiedNames: 1; - bool _richText: 1; }; } // end of namespace CPlusPlus diff --git a/src/libs/cplusplus/TypePrettyPrinter.cpp b/src/libs/cplusplus/TypePrettyPrinter.cpp index 0c376dfcccaccdb8703f50283274b729d31a526b..ce1f61756e26c677c370a547b8e20711e1e958a2 100644 --- a/src/libs/cplusplus/TypePrettyPrinter.cpp +++ b/src/libs/cplusplus/TypePrettyPrinter.cpp @@ -35,7 +35,6 @@ #include <Scope.h> #include <QStringList> #include <QtDebug> -#include <QTextDocument> // Qt::escape() using namespace CPlusPlus; @@ -107,10 +106,10 @@ QString TypePrettyPrinter::operator()(const FullySpecifiedType &type, const QStr void TypePrettyPrinter::acceptType(const FullySpecifiedType &ty) { if (ty.isSigned()) - out(QLatin1String("signed ")); + _text += QLatin1String("signed "); else if (ty.isUnsigned()) - out(QLatin1String("unsigned ")); + _text += QLatin1String("unsigned "); const FullySpecifiedType previousFullySpecifiedType = _fullySpecifiedType; _fullySpecifiedType = ty; @@ -148,14 +147,14 @@ void TypePrettyPrinter::applyPtrOperators(bool wantSpace) space(); if (op->isPointerType()) { - out(QLatin1Char('*')); + _text += QLatin1Char('*'); outCV(op); } else if (op->isReferenceType()) { - out(QLatin1Char('&')); + _text += QLatin1Char('&'); } else if (const PointerToMemberType *memPtrTy = op->asPointerToMemberType()) { space(); - out(_overview->prettyName(memPtrTy->memberName())); - out(QLatin1Char('*')); + _text += _overview->prettyName(memPtrTy->memberName()); + _text += QLatin1Char('*'); outCV(op); } } @@ -163,13 +162,13 @@ void TypePrettyPrinter::applyPtrOperators(bool wantSpace) void TypePrettyPrinter::visit(VoidType *) { - out(QLatin1String("void")); + _text += QLatin1String("void"); applyPtrOperators(); } void TypePrettyPrinter::visit(NamedType *type) { - out(overview()->prettyName(type->name())); + _text += overview()->prettyName(type->name()); applyPtrOperators(); } @@ -206,25 +205,25 @@ void TypePrettyPrinter::visit(IntegerType *type) { switch (type->kind()) { case IntegerType::Char: - out(QLatin1String("char")); + _text += QLatin1String("char"); break; case IntegerType::WideChar: - out(QLatin1String("wchar_t")); + _text += QLatin1String("wchar_t"); break; case IntegerType::Bool: - out(QLatin1String("bool")); + _text += QLatin1String("bool"); break; case IntegerType::Short: - out(QLatin1String("short")); + _text += QLatin1String("short"); break; case IntegerType::Int: - out(QLatin1String("int")); + _text += QLatin1String("int"); break; case IntegerType::Long: - out(QLatin1String("long")); + _text += QLatin1String("long"); break; case IntegerType::LongLong: - out(QLatin1String("long long")); + _text += QLatin1String("long long"); break; } @@ -235,13 +234,13 @@ void TypePrettyPrinter::visit(FloatType *type) { switch (type->kind()) { case FloatType::Float: - out(QLatin1String("float")); + _text += QLatin1String("float"); break; case FloatType::Double: - out(QLatin1String("double")); + _text += QLatin1String("double"); break; case FloatType::LongDouble: - out(QLatin1String("long double")); + _text += QLatin1String("long double"); break; } @@ -277,26 +276,26 @@ void TypePrettyPrinter::visit(ReferenceType *type) void TypePrettyPrinter::visit(ArrayType *type) { - out(overview()->prettyType(type->elementType())); + _text += overview()->prettyType(type->elementType()); if (! _ptrOperators.isEmpty()) { - out(QLatin1Char('(')); + _text += QLatin1Char('('); applyPtrOperators(false); if (! _name.isEmpty()) { - out(_name); + _text += _name; _name.clear(); } - out(QLatin1Char(')')); + _text += QLatin1Char(')'); } - out(QLatin1String("[]")); + _text += QLatin1String("[]"); } void TypePrettyPrinter::visit(Function *type) { if (_overview->showReturnTypes()) - out(_overview->prettyType(type->returnType())); + _text += _overview->prettyType(type->returnType()); if (! _ptrOperators.isEmpty()) { - out(QLatin1Char('(')); + _text += QLatin1Char('('); applyPtrOperators(false); if (! _name.isEmpty()) { @@ -304,11 +303,11 @@ void TypePrettyPrinter::visit(Function *type) _name.clear(); } - out(QLatin1Char(')')); + _text += QLatin1Char(')'); } else if (! _name.isEmpty() && _overview->showFunctionSignatures()) { space(); - out(_name); + _text += _name; _name.clear(); } @@ -318,41 +317,41 @@ void TypePrettyPrinter::visit(Function *type) argumentText.setShowArgumentNames(false); argumentText.setShowFunctionSignatures(true); - out(QLatin1Char('(')); + _text += QLatin1Char('('); for (unsigned index = 0; index < type->argumentCount(); ++index) { if (index != 0) - out(QLatin1String(", ")); + _text += QLatin1String(", "); if (Argument *arg = type->argumentAt(index)->asArgument()) { - if (index + 1 == _overview->markArgument()) - outPlain(QLatin1String("<b>")); + if (index + 1 == _overview->markedArgument()) + const_cast<Overview*>(_overview)->setMarkedArgumentBegin(_text.length()); Name *name = 0; if (_overview->showArgumentNames()) name = arg->name(); - out(argumentText(arg->type(), name)); + _text += argumentText(arg->type(), name); - if (index + 1 == _overview->markArgument()) - outPlain(QLatin1String("</b>")); + if (index + 1 == _overview->markedArgument()) + const_cast<Overview*>(_overview)->setMarkedArgumentEnd(_text.length()); } } if (type->isVariadic()) - out(QLatin1String("...")); + _text += QLatin1String("..."); - out(QLatin1Char(')')); + _text += QLatin1Char(')'); if (type->isConst() && type->isVolatile()) { space(); - out("const volatile"); + _text += "const volatile"; } else if (type->isConst()) { space(); - out("const"); + _text += "const"; } else if (type->isVolatile()) { space(); - out("volatile"); + _text += "volatile"; } } } @@ -369,28 +368,14 @@ void TypePrettyPrinter::space() _text += QLatin1Char(' '); } -void TypePrettyPrinter::outPlain(const QString &text) -{ _text += text; } - -void TypePrettyPrinter::out(const QString &text) -{ - if (overview()->richText()) - _text += Qt::escape(text); - else - _text += text; -} - -void TypePrettyPrinter::out(const QChar &ch) -{ _text += ch; } - void TypePrettyPrinter::outCV(const FullySpecifiedType &ty) { if (ty.isConst() && ty.isVolatile()) - out(QLatin1String("const volatile")); + _text += QLatin1String("const volatile"); else if (ty.isConst()) - out(QLatin1String("const")); + _text += QLatin1String("const"); else if (ty.isVolatile()) - out(QLatin1String("volatile")); + _text += QLatin1String("volatile"); } diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp index bc324f9451377d32f7513bca2cc0e4c48da3bde9..384058685b5588ecc7518d75cfa83dcb7269fde1 100644 --- a/src/plugins/cpptools/cppcodecompletion.cpp +++ b/src/plugins/cpptools/cppcodecompletion.cpp @@ -66,6 +66,7 @@ #include <QtGui/QLabel> #include <QtGui/QToolButton> #include <QtGui/QVBoxLayout> +#include <QtGui/QTextDocument> // Qt::escape() using namespace CPlusPlus; @@ -382,13 +383,23 @@ bool FunctionArgumentWidget::eventFilter(QObject *obj, QEvent *e) void FunctionArgumentWidget::updateHintText() { Overview overview; - overview.setRichText(true); overview.setShowReturnTypes(true); overview.setShowArgumentNames(true); - overview.setMarkArgument(m_currentarg + 1); + overview.setMarkedArgument(m_currentarg + 1); Function *f = currentFunction(); - setText(overview(f->type(), f->name())); + const QString prettyMethod = overview(f->type(), f->name()); + const int begin = overview.markedArgumentBegin(); + const int end = overview.markedArgumentEnd(); + + QString hintText; + hintText += Qt::escape(prettyMethod.left(begin)); + hintText += "<b>"; + hintText += Qt::escape(prettyMethod.mid(begin, end - begin)); + hintText += "</b>"; + hintText += Qt::escape(prettyMethod.mid(end)); + setText(hintText); + m_numberLabel->setText(tr("%1 of %2").arg(m_current + 1).arg(m_items.size())); m_popupFrame->setFixedWidth(m_popupFrame->minimumSizeHint().width());