1 /**************************************************************************
3 ** This file is part of Qt Creator
5 ** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
7 ** Contact: Nokia Corporation (info@qt.nokia.com)
10 ** GNU Lesser General Public License Usage
12 ** This file may be used under the terms of the GNU Lesser General Public
13 ** License version 2.1 as published by the Free Software Foundation and
14 ** appearing in the file LICENSE.LGPL included in the packaging of this file.
15 ** Please review the following information to ensure the GNU Lesser General
16 ** Public License version 2.1 requirements will be met:
17 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
19 ** In addition, as a special exception, Nokia gives you certain additional
20 ** rights. These rights are described in the Nokia Qt LGPL Exception
21 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
25 ** Alternatively, this file may be used in accordance with the terms and
26 ** conditions contained in a signed written agreement between you and Nokia.
28 ** If you have questions regarding the use of this file, please contact
29 ** Nokia at qt-info@nokia.com.
31 **************************************************************************/
33 #include "cpptypehierarchy.h"
34 #include "cppeditorconstants.h"
35 #include "cppeditor.h"
36 #include "cppelementevaluator.h"
37 #include "cppplugin.h"
39 #include <coreplugin/editormanager/ieditor.h>
40 #include <coreplugin/editormanager/editormanager.h>
41 #include <utils/navigationtreeview.h>
42 #include <utils/annotateditemdelegate.h>
44 #include <QtCore/QLatin1Char>
45 #include <QtCore/QLatin1String>
46 #include <QtCore/QModelIndex>
47 #include <QtGui/QVBoxLayout>
48 #include <QtGui/QStandardItemModel>
49 #include <QtGui/QLabel>
51 using namespace CppEditor;
52 using namespace Internal;
53 using namespace Utils;
55 // CppTypeHierarchyWidget
56 CppTypeHierarchyWidget::CppTypeHierarchyWidget(Core::IEditor *editor) :
63 QVBoxLayout *layout = new QVBoxLayout;
65 layout->setSpacing(0);
67 if (CPPEditor *cppEditor = qobject_cast<CPPEditor *>(editor)) {
68 m_cppEditor = static_cast<CPPEditorWidget *>(cppEditor->widget());
70 m_model = new QStandardItemModel;
71 m_treeView = new Utils::NavigationTreeView;
72 m_delegate = new AnnotatedItemDelegate;
73 m_delegate->setDelimiter(QLatin1String(" "));
74 m_delegate->setAnnotationRole(AnnotationRole);
75 m_treeView->setModel(m_model);
76 m_treeView->setEditTriggers(QAbstractItemView::NoEditTriggers);
77 m_treeView->setItemDelegate(m_delegate);
78 layout->addWidget(m_treeView);
80 connect(m_treeView, SIGNAL(clicked(QModelIndex)), this, SLOT(onItemClicked(QModelIndex)));
81 connect(CppPlugin::instance(), SIGNAL(typeHierarchyRequested()), this, SLOT(perform()));
83 QLabel *label = new QLabel(tr("No type hierarchy available"), this);
84 label->setAlignment(Qt::AlignCenter);
85 label->setAutoFillBackground(true);
86 label->setBackgroundRole(QPalette::Base);
87 layout->addWidget(label);
92 CppTypeHierarchyWidget::~CppTypeHierarchyWidget()
98 bool CppTypeHierarchyWidget::handleEditorChange(Core::IEditor *editor)
100 if (CPPEditor *cppEditor = qobject_cast<CPPEditor *>(editor)) {
102 m_cppEditor = static_cast<CPPEditorWidget *>(cppEditor->widget());
105 } else if (!m_cppEditor) {
111 void CppTypeHierarchyWidget::perform()
118 CppElementEvaluator evaluator(m_cppEditor);
119 evaluator.setLookupBaseClasses(true);
121 if (evaluator.identifiedCppElement()) {
122 const QSharedPointer<CppElement> &cppElement = evaluator.cppElement();
123 CppElement *element = cppElement.data();
124 if (CppClass *cppClass = dynamic_cast<CppClass *>(element))
125 buildModel(*cppClass, m_model->invisibleRootItem());
129 void CppTypeHierarchyWidget::buildModel(const CppClass &cppClass, QStandardItem *parent)
131 QStandardItem *item = new QStandardItem;
132 parent->appendRow(item);
134 m_model->setData(m_model->indexFromItem(item), cppClass.name(), Qt::DisplayRole);
135 if (cppClass.name() != cppClass.qualifiedName())
136 m_model->setData(m_model->indexFromItem(item), cppClass.qualifiedName(), AnnotationRole);
137 m_model->setData(m_model->indexFromItem(item), cppClass.icon(), Qt::DecorationRole);
139 link.setValue(CPPEditorWidget::Link(cppClass.link()));
140 m_model->setData(m_model->indexFromItem(item), link, LinkRole);
142 foreach (const CppClass &cppBase, cppClass.bases())
143 buildModel(cppBase, item);
145 m_treeView->expand(m_model->indexFromItem(item));
148 void CppTypeHierarchyWidget::onItemClicked(const QModelIndex &index)
150 m_cppEditor->openLink(index.data(LinkRole).value<TextEditor::BaseTextEditorWidget::Link>());
153 // CppTypeHierarchyStackedWidget
154 CppTypeHierarchyStackedWidget::CppTypeHierarchyStackedWidget(QWidget *parent) :
155 QStackedWidget(parent),
156 m_typeHiearchyWidgetInstance(
157 new CppTypeHierarchyWidget(Core::EditorManager::instance()->currentEditor()))
159 addWidget(m_typeHiearchyWidgetInstance);
161 connect(Core::EditorManager::instance(), SIGNAL(currentEditorChanged(Core::IEditor*)),
162 this, SLOT(editorChanged(Core::IEditor*)));
165 CppTypeHierarchyStackedWidget::~CppTypeHierarchyStackedWidget()
167 delete m_typeHiearchyWidgetInstance;
170 void CppTypeHierarchyStackedWidget::editorChanged(Core::IEditor *editor)
172 if (!m_typeHiearchyWidgetInstance->handleEditorChange(editor)) {
173 CppTypeHierarchyWidget *replacement = new CppTypeHierarchyWidget(editor);
174 removeWidget(m_typeHiearchyWidgetInstance);
175 m_typeHiearchyWidgetInstance->deleteLater();
176 m_typeHiearchyWidgetInstance = replacement;
177 addWidget(m_typeHiearchyWidgetInstance);
181 // CppTypeHierarchyFactory
182 CppTypeHierarchyFactory::CppTypeHierarchyFactory()
185 CppTypeHierarchyFactory::~CppTypeHierarchyFactory()
188 QString CppTypeHierarchyFactory::displayName() const
190 return tr("Type Hierarchy");
193 int CppTypeHierarchyFactory::priority() const
195 return Constants::TYPE_HIERARCHY_PRIORITY;
198 QString CppTypeHierarchyFactory::id() const
200 return QLatin1String(Constants::TYPE_HIERARCHY_ID);
203 QKeySequence CppTypeHierarchyFactory::activationSequence() const
205 return QKeySequence();
208 Core::NavigationView CppTypeHierarchyFactory::createWidget()
210 CppTypeHierarchyStackedWidget *w = new CppTypeHierarchyStackedWidget;
211 static_cast<CppTypeHierarchyWidget *>(w->currentWidget())->perform();
212 Core::NavigationView navigationView;
213 navigationView.widget = w;
214 return navigationView;