From f00225a0f59b152d61659b33d72c0d1e02204afb Mon Sep 17 00:00:00 2001
From: Kai Koehne <kai.koehne@nokia.com>
Date: Wed, 14 Jul 2010 13:32:42 +0200
Subject: [PATCH] QmlOutline: Also show custom properties

Also show properties defined in the component, e.g. by 'property x',
in the outline.
---
 src/libs/qmljs/qmljs.qrc                    |  1 +
 src/libs/qmljs/qmljsicons.cpp               |  7 ++++
 src/libs/qmljs/qmljsicons.h                 |  1 +
 src/plugins/qmljseditor/qmloutlinemodel.cpp | 46 ++++++++++++++-------
 src/plugins/qmljseditor/qmloutlinemodel.h   |  6 ++-
 5 files changed, 45 insertions(+), 16 deletions(-)

diff --git a/src/libs/qmljs/qmljs.qrc b/src/libs/qmljs/qmljs.qrc
index b5f83399f23..59c7cea4bdb 100644
--- a/src/libs/qmljs/qmljs.qrc
+++ b/src/libs/qmljs/qmljs.qrc
@@ -2,5 +2,6 @@
     <qresource prefix="/qmljs">
         <file>images/element.png</file>
         <file>images/property.png</file>
+	<file>images/publicmember.png</file>
     </qresource>
 </RCC>
diff --git a/src/libs/qmljs/qmljsicons.cpp b/src/libs/qmljs/qmljsicons.cpp
index f423c124466..964b7c9cc82 100644
--- a/src/libs/qmljs/qmljsicons.cpp
+++ b/src/libs/qmljs/qmljsicons.cpp
@@ -49,6 +49,7 @@ class IconsPrivate
 public:
     QIcon elementIcon;
     QIcon propertyIcon;
+    QIcon publicMemberIcon;
     QHash<QPair<QString,QString>,QIcon> iconHash;
     QString resourcePath;
 };
@@ -60,6 +61,7 @@ Icons::Icons()
 {
     m_d->elementIcon = QIcon(QLatin1String(":/qmljs/images/element.png"));
     m_d->propertyIcon = QIcon(QLatin1String(":/qmljs/images/property.png"));
+    m_d->publicMemberIcon = QIcon(QLatin1String(":/qmljs/images/publicmember.png"));
 }
 
 Icons::~Icons()
@@ -134,3 +136,8 @@ QIcon Icons::scriptBindingIcon() const
 {
     return m_d->propertyIcon;
 }
+
+QIcon Icons::publicMemberIcon() const
+{
+    return m_d->publicMemberIcon;
+}
diff --git a/src/libs/qmljs/qmljsicons.h b/src/libs/qmljs/qmljsicons.h
index 47cec83ef16..0382bfe722c 100644
--- a/src/libs/qmljs/qmljsicons.h
+++ b/src/libs/qmljs/qmljsicons.h
@@ -52,6 +52,7 @@ public:
 
     QIcon objectDefinitionIcon() const;
     QIcon scriptBindingIcon() const;
+    QIcon publicMemberIcon() const;
 
 private:
     Icons();
diff --git a/src/plugins/qmljseditor/qmloutlinemodel.cpp b/src/plugins/qmljseditor/qmloutlinemodel.cpp
index 0a56622ba11..4ac0c5323f5 100644
--- a/src/plugins/qmljseditor/qmloutlinemodel.cpp
+++ b/src/plugins/qmljseditor/qmloutlinemodel.cpp
@@ -12,7 +12,7 @@ using namespace QmlJS;
 using namespace QmlJSEditor::Internal;
 
 enum {
-    debug = false
+    debug = true
 };
 
 namespace QmlJSEditor {
@@ -85,11 +85,7 @@ private:
             return true;
         }
 
-        AST::SourceLocation location;
-        location.offset = objDef->firstSourceLocation().offset;
-        location.length = objDef->lastSourceLocation().offset
-                - objDef->firstSourceLocation().offset
-                + objDef->lastSourceLocation().length;
+        AST::SourceLocation location = getLocation(objDef);
 
         const QString typeName = asString(objDef->qualifiedTypeNameId);
 
@@ -114,13 +110,9 @@ private:
 
     bool visit(AST::UiScriptBinding *scriptBinding)
     {
-        AST::SourceLocation location;
-        location.offset = scriptBinding->firstSourceLocation().offset;
-        location.length = scriptBinding->lastSourceLocation().offset
-                - scriptBinding->firstSourceLocation().offset
-                + scriptBinding->lastSourceLocation().length;
+        AST::SourceLocation location = getLocation(scriptBinding);
 
-        QModelIndex index = m_model->enterProperty(asString(scriptBinding->qualifiedId), location);
+        QModelIndex index = m_model->enterProperty(asString(scriptBinding->qualifiedId), false, location);
         m_nodeToIndex.insert(scriptBinding, index);
 
         return true;
@@ -131,6 +123,20 @@ private:
         m_model->leaveProperty();
     }
 
+    bool visit(AST::UiPublicMember *publicMember)
+    {
+        AST::SourceLocation location = getLocation(publicMember);
+        QModelIndex index = m_model->enterProperty(publicMember->name->asString(), true, location);
+        m_nodeToIndex.insert(publicMember, index);
+
+        return true;
+    }
+
+    void endVisit(AST::UiPublicMember * /*publicMember*/)
+    {
+        m_model->leaveProperty();
+    }
+
     bool validElement(AST::UiObjectDefinition *objDef) {
         // For 'Rectangle { id }', id is parsed as UiObjectDefinition ... Filter this out.
         return objDef->qualifiedTypeNameId->name->asString().at(0).isUpper();
@@ -178,6 +184,14 @@ private:
         return id;
     }
 
+    AST::SourceLocation getLocation(AST::UiObjectMember *objMember) {
+        AST::SourceLocation location;
+        location.offset = objMember->firstSourceLocation().offset;
+        location.length = objMember->lastSourceLocation().offset
+                - objMember->firstSourceLocation().offset
+                + objMember->lastSourceLocation().length;
+        return location;
+    }
 
     QmlOutlineModel *m_model;
     LookupContext::Ptr m_context;
@@ -232,11 +246,15 @@ void QmlOutlineModel::leaveElement()
     leaveNode();
 }
 
-QModelIndex QmlOutlineModel::enterProperty(const QString &name, const AST::SourceLocation &sourceLocation)
+QModelIndex QmlOutlineModel::enterProperty(const QString &name, bool isCustomProperty, const AST::SourceLocation &sourceLocation)
 {
     QStandardItem *item = enterNode(sourceLocation);
     item->setText(name);
-    item->setIcon(m_icons->scriptBindingIcon());
+    if (isCustomProperty) {
+        item->setIcon(m_icons->publicMemberIcon());
+    } else {
+        item->setIcon(m_icons->scriptBindingIcon());
+    }
     return item->index();
 }
 
diff --git a/src/plugins/qmljseditor/qmloutlinemodel.h b/src/plugins/qmljseditor/qmloutlinemodel.h
index dbc3e7f217b..6b22538ed80 100644
--- a/src/plugins/qmljseditor/qmloutlinemodel.h
+++ b/src/plugins/qmljseditor/qmloutlinemodel.h
@@ -22,10 +22,12 @@ public:
     QmlJS::Document::Ptr document() const;
     void update(QmlJS::Document::Ptr doc, const QmlJS::Snapshot &snapshot);
 
-    QModelIndex enterElement(const QString &typeName, const QString &id, const QIcon &icon, const QmlJS::AST::SourceLocation &location);
+    QModelIndex enterElement(const QString &typeName, const QString &id, const QIcon &icon,
+                             const QmlJS::AST::SourceLocation &location);
     void leaveElement();
 
-    QModelIndex enterProperty(const QString &name, const QmlJS::AST::SourceLocation &location);
+    QModelIndex enterProperty(const QString &name, bool isCustomProperty,
+                              const QmlJS::AST::SourceLocation &location);
     void leaveProperty();
 
 signals:
-- 
GitLab