OSDN Git Service

Update license.
[qt-creator-jp/qt-creator-jp.git] / src / plugins / cppeditor / cpptypehierarchy.cpp
1 /**************************************************************************
2 **
3 ** This file is part of Qt Creator
4 **
5 ** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
6 **
7 ** Contact: Nokia Corporation (info@qt.nokia.com)
8 **
9 **
10 ** GNU Lesser General Public License Usage
11 **
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.
18 **
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.
22 **
23 ** Other Usage
24 **
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.
27 **
28 ** If you have questions regarding the use of this file, please contact
29 ** Nokia at qt-info@nokia.com.
30 **
31 **************************************************************************/
32
33 #include "cpptypehierarchy.h"
34 #include "cppeditorconstants.h"
35 #include "cppeditor.h"
36 #include "cppelementevaluator.h"
37 #include "cppplugin.h"
38
39 #include <coreplugin/editormanager/ieditor.h>
40 #include <coreplugin/editormanager/editormanager.h>
41 #include <utils/navigationtreeview.h>
42 #include <utils/annotateditemdelegate.h>
43
44 #include <QtCore/QLatin1Char>
45 #include <QtCore/QLatin1String>
46 #include <QtCore/QModelIndex>
47 #include <QtGui/QVBoxLayout>
48 #include <QtGui/QStandardItemModel>
49 #include <QtGui/QLabel>
50
51 using namespace CppEditor;
52 using namespace Internal;
53 using namespace Utils;
54
55 // CppTypeHierarchyWidget
56 CppTypeHierarchyWidget::CppTypeHierarchyWidget(Core::IEditor *editor) :
57     QWidget(0),
58     m_cppEditor(0),
59     m_treeView(0),
60     m_model(0),
61     m_delegate(0)
62 {
63     QVBoxLayout *layout = new QVBoxLayout;
64     layout->setMargin(0);
65     layout->setSpacing(0);
66
67     if (CPPEditor *cppEditor = qobject_cast<CPPEditor *>(editor)) {
68         m_cppEditor = static_cast<CPPEditorWidget *>(cppEditor->widget());
69
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);
79
80         connect(m_treeView, SIGNAL(clicked(QModelIndex)), this, SLOT(onItemClicked(QModelIndex)));
81         connect(CppPlugin::instance(), SIGNAL(typeHierarchyRequested()), this, SLOT(perform()));
82     } else {
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);
88     }
89     setLayout(layout);
90 }
91
92 CppTypeHierarchyWidget::~CppTypeHierarchyWidget()
93 {
94     delete m_model;
95     delete m_delegate;
96 }
97
98 bool CppTypeHierarchyWidget::handleEditorChange(Core::IEditor *editor)
99 {
100     if (CPPEditor *cppEditor = qobject_cast<CPPEditor *>(editor)) {
101         if (m_cppEditor) {
102             m_cppEditor = static_cast<CPPEditorWidget *>(cppEditor->widget());
103             return true;
104         }
105     } else if (!m_cppEditor) {
106         return true;
107     }
108     return false;
109 }
110
111 void CppTypeHierarchyWidget::perform()
112 {
113     if (!m_cppEditor)
114         return;
115
116     m_model->clear();
117
118     CppElementEvaluator evaluator(m_cppEditor);
119     evaluator.setLookupBaseClasses(true);
120     evaluator.execute();
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());
126     }
127 }
128
129 void CppTypeHierarchyWidget::buildModel(const CppClass &cppClass, QStandardItem *parent)
130 {
131     QStandardItem *item = new QStandardItem;
132     parent->appendRow(item);
133
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);
138     QVariant link;
139     link.setValue(CPPEditorWidget::Link(cppClass.link()));
140     m_model->setData(m_model->indexFromItem(item), link, LinkRole);
141
142     foreach (const CppClass &cppBase, cppClass.bases())
143         buildModel(cppBase, item);
144
145     m_treeView->expand(m_model->indexFromItem(item));
146 }
147
148 void CppTypeHierarchyWidget::onItemClicked(const QModelIndex &index)
149 {
150     m_cppEditor->openLink(index.data(LinkRole).value<TextEditor::BaseTextEditorWidget::Link>());
151 }
152
153 // CppTypeHierarchyStackedWidget
154 CppTypeHierarchyStackedWidget::CppTypeHierarchyStackedWidget(QWidget *parent) :
155     QStackedWidget(parent),
156     m_typeHiearchyWidgetInstance(
157         new CppTypeHierarchyWidget(Core::EditorManager::instance()->currentEditor()))
158 {
159     addWidget(m_typeHiearchyWidgetInstance);
160
161     connect(Core::EditorManager::instance(), SIGNAL(currentEditorChanged(Core::IEditor*)),
162             this, SLOT(editorChanged(Core::IEditor*)));
163 }
164
165 CppTypeHierarchyStackedWidget::~CppTypeHierarchyStackedWidget()
166 {
167     delete m_typeHiearchyWidgetInstance;
168 }
169
170 void CppTypeHierarchyStackedWidget::editorChanged(Core::IEditor *editor)
171 {
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);
178     }
179 }
180
181 // CppTypeHierarchyFactory
182 CppTypeHierarchyFactory::CppTypeHierarchyFactory()
183 {}
184
185 CppTypeHierarchyFactory::~CppTypeHierarchyFactory()
186 {}
187
188 QString CppTypeHierarchyFactory::displayName() const
189 {
190     return tr("Type Hierarchy");
191 }
192
193 int CppTypeHierarchyFactory::priority() const
194 {
195     return Constants::TYPE_HIERARCHY_PRIORITY;
196 }
197
198 QString CppTypeHierarchyFactory::id() const
199 {
200     return QLatin1String(Constants::TYPE_HIERARCHY_ID);
201 }
202
203 QKeySequence CppTypeHierarchyFactory::activationSequence() const
204 {
205     return QKeySequence();
206 }
207
208 Core::NavigationView CppTypeHierarchyFactory::createWidget()
209 {
210     CppTypeHierarchyStackedWidget *w = new CppTypeHierarchyStackedWidget;
211     static_cast<CppTypeHierarchyWidget *>(w->currentWidget())->perform();
212     Core::NavigationView navigationView;
213     navigationView.widget = w;
214     return navigationView;
215 }