hierarchydlg.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "hierarchydlg.h"
00013
00014 #include <kdialog.h>
00015 #include <klocale.h>
00016 #include <kpushbutton.h>
00017 #include <kstdguiitem.h>
00018
00019 #include <qlayout.h>
00020 #include <qlistview.h>
00021 #include <qsplitter.h>
00022
00023 #include "kdevlanguagesupport.h"
00024 #include "kcomboview.h"
00025
00026 #include "classviewpart.h"
00027
00028 #include "digraphview.h"
00029 #include "viewcombos.h"
00030
00031
00032 HierarchyDialog::HierarchyDialog( ClassViewPart *part )
00033 : QDialog(0, "hierarchy dialog", WDestructiveClose)
00034 {
00035 class_combo = new KComboView(false, 150, this);
00036
00037 namespace_combo = new KComboView(false, 150, this);
00038
00039
00040 QPushButton *close_button = new KPushButton(KStdGuiItem::close(), this);
00041
00042 QSplitter *splitter = new QSplitter(Vertical, this);
00043 digraph = new DigraphView(splitter, "digraph view");
00044
00045
00046 QBoxLayout *layout = new QVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint());
00047 QBoxLayout *combo_layout = new QHBoxLayout();
00048 layout->addLayout(combo_layout);
00049 combo_layout->addWidget(namespace_combo);
00050 combo_layout->addWidget(class_combo);
00051 combo_layout->addStretch();
00052 combo_layout->addWidget(close_button);
00053 layout->addWidget(splitter);
00054
00055 connect( namespace_combo, SIGNAL(activated(QListViewItem*)),
00056 this, SLOT(slotNamespaceComboChoice(QListViewItem*)) );
00057 connect( class_combo, SIGNAL(activated(QListViewItem*)),
00058 this, SLOT(slotClassComboChoice(QListViewItem*)) );
00059 connect( close_button, SIGNAL(clicked()),
00060 this, SLOT(reject()) );
00061 connect( digraph, SIGNAL(selected(const QString&)),
00062 this, SLOT(classSelected(const QString&)) );
00063
00064 m_part = part;
00065
00066 refresh();
00067 }
00068
00069
00070 HierarchyDialog::~HierarchyDialog()
00071 {
00072
00073 }
00074
00075
00076 void HierarchyDialog::refresh()
00077 {
00078 digraph->clear();
00079 ViewCombosOp::refreshNamespaces(m_part, namespace_combo);
00080 processNamespace("", m_part->codeModel()->globalNamespace());
00081
00082 KDevLanguageSupport *ls = m_part->languageSupport();
00083
00084 for (QMap<QString, ClassDom>::const_iterator it = classes.begin(); it != classes.end(); ++it)
00085 {
00086 QString formattedName = ls->formatClassName(it.key());
00087 QStringList baseClasses = it.data()->baseClassList();
00088 for (QStringList::const_iterator bit = baseClasses.begin(); bit != baseClasses.end(); ++bit)
00089 {
00090 QMap<QString, QString>::const_iterator baseIt = uclasses.find(*bit);
00091 if (baseIt != uclasses.end())
00092 {
00093 QString formattedParentName = ls->formatClassName(baseIt.data());
00094 digraph->addEdge(formattedParentName, formattedName);
00095 }
00096 }
00097 }
00098 digraph->process();
00099 }
00100
00101 void HierarchyDialog::setLanguageSupport(KDevLanguageSupport *ls)
00102 {
00103 if (ls)
00104 connect(ls, SIGNAL(updatedSourceInfo()), this, SLOT(refresh()));
00105 else
00106 refresh();
00107 }
00108
00109
00110 void HierarchyDialog::slotClassComboChoice(QListViewItem * item)
00111 {
00112 ClassItem *ci = dynamic_cast<ClassItem*>(item);
00113 if (!ci)
00114 return;
00115
00116 KDevLanguageSupport *ls = m_part->languageSupport();
00117
00118 QString className = ls->formatClassName(uclasses[item->text(0)]);
00119 digraph->setSelected(className);
00120 digraph->ensureVisible(className);
00121 classSelected(className);
00122 }
00123
00124
00125 void HierarchyDialog::classSelected(const QString &)
00126 {
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136 }
00137
00138 void HierarchyDialog::slotNamespaceComboChoice( QListViewItem * item )
00139 {
00140 NamespaceItem *ni = dynamic_cast<NamespaceItem*>(item);
00141 if (!ni)
00142 return;
00143 ViewCombosOp::refreshClasses(m_part, class_combo, ni->dom()->name());
00144 }
00145
00146 void HierarchyDialog::processNamespace( QString prefix, NamespaceDom dom )
00147 {
00148 qWarning("processNamespace: prefix %s", prefix.latin1());
00149 QString prefixInc = prefix.isEmpty() ? "" : ".";
00150
00151
00152 NamespaceList namespaceList = dom->namespaceList();
00153 for (NamespaceList::const_iterator it = namespaceList.begin(); it != namespaceList.end(); ++it)
00154 {
00155 qWarning("about to processNamespace: prefix %s", (prefixInc + (*it)->name()).latin1());
00156 processNamespace(prefixInc + (*it)->name(), *it);
00157 }
00158
00159 ClassList classList = dom->classList();
00160 for (ClassList::const_iterator it = classList.begin(); it != classList.end(); ++it)
00161 {
00162 processClass(prefix, *it);
00163 }
00164 }
00165
00166 void HierarchyDialog::processClass( QString prefix, ClassDom dom )
00167 {
00168 qWarning("processClass: prefix %s class %s", prefix.latin1(), dom->name().latin1());
00169
00170 QString prefixInc = prefix.isEmpty() ? "" : ".";
00171 classes[prefix + prefixInc + dom->name()] = dom;
00172 uclasses[dom->name()] = prefix + prefixInc + dom->name();
00173
00174 ClassList classList = dom->classList();
00175 for (ClassList::const_iterator it = classList.begin(); it != classList.end(); ++it)
00176 {
00177 processClass(prefix + prefixInc + dom->name(), *it);
00178 }
00179 }
00180
00181 #include "hierarchydlg.moc"
This file is part of the documentation for KDevelop Version 3.1.2.