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"