You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdevelop/parts/classview/hierarchydlg.cpp

277 lines
9.9 KiB

/***************************************************************************
* Copyright (C) 2001 by Bernd Gehrmann *
* bernd@kdevelop.org *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include "hierarchydlg.h"
#include <kdialog.h>
#include <klocale.h>
#include <kpushbutton.h>
#include <kstdguiitem.h>
#include <kfile.h>
#include <kfiledialog.h>
#include <kurlrequesterdlg.h>
#include <kurlrequester.h>
#include <kmessagebox.h>
#include <kdebug.h>
#include <qlayout.h>
#include <qfileinfo.h>
#include <qlistview.h>
#include <qapplication.h>
#include <qsplitter.h>
#include "kdevlanguagesupport.h"
#include "kcomboview.h"
#include "classviewpart.h"
//#include "classtoolwidget.h"
#include "digraphview.h"
#include "viewcombos.h"
HierarchyDialog::HierarchyDialog( ClassViewPart *part )
: QDialog(0, "hierarchy dialog", false)
{
class_combo = new KComboView(true, 150, this);
class_combo->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred );
// class_combo->setMinimumWidth(150);
namespace_combo = new KComboView(true, 150, this);
namespace_combo->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred );
// namespace_combo->setMinimumWidth(150);
QPushButton *close_button = new KPushButton(KStdGuiItem::close(), this);
QPushButton *save_button = new KPushButton(KStdGuiItem::save(), this);
QPushButton *refresh_button = new KPushButton(i18n("Refresh"), this);
QSplitter *splitter = new QSplitter(Vertical, this);
digraph = new DigraphView(splitter, "digraph view");
// member_tree = new ClassToolWidget(part, splitter);
QBoxLayout *layout = new QVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint());
QBoxLayout *combo_layout = new QHBoxLayout();
layout->addLayout(combo_layout);
combo_layout->addWidget(namespace_combo);
combo_layout->addWidget(class_combo);
combo_layout->addSpacing(60);
combo_layout->addWidget(refresh_button);
combo_layout->addWidget(save_button);
combo_layout->addWidget(close_button);
layout->addWidget(splitter);
connect( namespace_combo, SIGNAL(activated(QListViewItem*)),
this, SLOT(slotNamespaceComboChoice(QListViewItem*)) );
connect( class_combo, SIGNAL(activated(QListViewItem*)),
this, SLOT(slotClassComboChoice(QListViewItem*)) );
connect( namespace_combo, SIGNAL(textChanged(const QString&)),
this, SLOT(slotNamespaceComboChoice(const QString&)) );
connect( class_combo, SIGNAL(textChanged(const QString&)),
this, SLOT(slotClassComboChoice(const QString&)) );
connect( close_button, SIGNAL(clicked()),
this, SLOT(hide()) );
connect( save_button, SIGNAL(clicked()),
this, SLOT(save()) );
connect( refresh_button, SIGNAL(clicked()),
this, SLOT(refresh()) );
connect( digraph, SIGNAL(selected(const QString&)),
this, SLOT(classSelected(const QString&)) );
m_part = part;
// m_part->registerHierarchyDialog(this);
refresh();
}
HierarchyDialog::~HierarchyDialog()
{
// m_part->unregisterHierarchyDialog(this);
}
void HierarchyDialog::save()
{
KURLRequesterDlg dlg(QString::null, this, "save_inheritance");
dlg.fileDialog()->setFilter("image/png image/jpeg image/bmp image/svg+xml");
dlg.fileDialog()->setOperationMode( KFileDialog::Saving );
dlg.fileDialog()->setMode( KFile::File | KFile::LocalOnly );
dlg.urlRequester()->setMode( KFile::File | KFile::LocalOnly );
if(dlg.exec() && dlg.selectedURL().isLocalFile())
{
QFileInfo fi(dlg.selectedURL().pathOrURL());
QApplication::setOverrideCursor( Qt::waitCursor );
KDevLanguageSupport *ls = m_part->languageSupport();
for (QMap<QString, ClassDom>::const_iterator it = classes.begin(); it != classes.end(); ++it)
{
kdDebug(9003) << "Adding class to graph: " << it.key() << endl;
QString formattedName = ls->formatClassName(it.key());
QStringList baseClasses = it.data()->baseClassList();
for (QStringList::const_iterator bit = baseClasses.begin(); bit != baseClasses.end(); ++bit)
{
QMap<QString, QString>::const_iterator baseIt = uclasses.find(*bit);
if (baseIt != uclasses.end())
{
QString formattedParentName = ls->formatClassName(baseIt.data());
digraph->addEdge(formattedParentName, formattedName);
}
}
}
digraph->process(fi.absFilePath(), fi.extension());
QApplication::restoreOverrideCursor();
}
}
void HierarchyDialog::refresh()
{
digraph->clear();
classes.clear();
uclasses.clear();
ViewCombosOp::refreshNamespaces(m_part, namespace_combo);
processNamespace("", m_part->codeModel()->globalNamespace());
KDevLanguageSupport *ls = m_part->languageSupport();
for (QMap<QString, ClassDom>::const_iterator it = classes.begin(); it != classes.end(); ++it)
{
kdDebug(9003) << "Adding class to graph: " << it.key() << endl;
QString formattedName = ls->formatClassName(it.key());
QStringList baseClasses = it.data()->baseClassList();
for (QStringList::const_iterator bit = baseClasses.begin(); bit != baseClasses.end(); ++bit)
{
QMap<QString, QString>::const_iterator baseIt = uclasses.find(*bit);
if (baseIt != uclasses.end())
{
QString formattedParentName = ls->formatClassName(baseIt.data());
digraph->addEdge(formattedParentName, formattedName);
}
}
}
digraph->process();
}
void HierarchyDialog::setLanguageSupport(KDevLanguageSupport *ls)
{
if (ls)
connect(ls, SIGNAL(updatedSourceInfo()), this, SLOT(refresh()));
else
refresh();
}
void HierarchyDialog::slotClassComboChoice(QListViewItem * item)
{
ClassItem *ci = dynamic_cast<ClassItem*>(item);
if (!ci)
return;
KDevLanguageSupport *ls = m_part->languageSupport();
QString className = ls->formatClassName(uclasses[item->text(0)]);
digraph->setSelected(className);
digraph->ensureVisible(className);
classSelected(className);
}
void HierarchyDialog::slotClassComboChoice( const QString& itemText )
{
QListViewItem* item = class_combo->listView()->firstChild();
while( item )
{
if( item->text(0) == itemText )
{
ClassItem *ci = dynamic_cast<ClassItem*>(item);
if (!ci)
return;
KDevLanguageSupport *ls = m_part->languageSupport();
QString className = ls->formatClassName(uclasses[item->text(0)]);
digraph->setSelected(className);
digraph->ensureVisible(className);
classSelected(className);
return;
}
item = item->nextSibling();
}
}
void HierarchyDialog::classSelected(const QString &/*className*/)
{
/* ParsedClass *currentClass = m_part->classStore()->getClassByName(className);
member_tree->clear();
if (currentClass) {
KDevLanguageSupport::Features features = m_part->languageSupport()->features();
if (features & KDevLanguageSupport::Functions)
member_tree->insertAllClassMethods(currentClass, (PIAccess)-1);
if (features & KDevLanguageSupport::Variables)
member_tree->insertAllClassAttributes(currentClass, (PIAccess)-1);
}*/
}
void HierarchyDialog::slotNamespaceComboChoice( QListViewItem * item )
{
NamespaceItem *ni = dynamic_cast<NamespaceItem*>(item);
if (!ni)
return;
ViewCombosOp::refreshClasses(m_part, class_combo, ni->dom()->name());
}
void HierarchyDialog::slotNamespaceComboChoice( const QString& itemText )
{
QListViewItem* item = namespace_combo->listView()->firstChild();
while( item )
{
if( item->text(0) == itemText )
{
NamespaceItem *ni = dynamic_cast<NamespaceItem*>(item);
if (!ni)
return;
ViewCombosOp::refreshClasses(m_part, class_combo, ni->dom()->name());
return;
}
item = item->nextSibling();
}
}
void HierarchyDialog::processNamespace( QString prefix, NamespaceDom dom )
{
qWarning("processNamespace: prefix %s", prefix.latin1());
QString prefixInc = prefix.isEmpty() ? "" : ".";
// QString nsprefix = dom->name().isEmpty() ? QString("") : prefixInc + dom->name();
NamespaceList namespaceList = dom->namespaceList();
for (NamespaceList::const_iterator it = namespaceList.begin(); it != namespaceList.end(); ++it)
{
qWarning("about to processNamespace: prefix %s", (prefixInc + (*it)->name()).latin1());
processNamespace(prefixInc + (*it)->name(), *it);
}
ClassList classList = dom->classList();
for (ClassList::const_iterator it = classList.begin(); it != classList.end(); ++it)
{
processClass(prefix, *it);
}
}
void HierarchyDialog::processClass( QString prefix, ClassDom dom )
{
qWarning("processClass: prefix %s class %s", prefix.latin1(), dom->name().latin1());
QString prefixInc = prefix.isEmpty() ? "" : ".";
classes[prefix + prefixInc + dom->name()] = dom;
uclasses[dom->name()] = prefix + prefixInc + dom->name();
ClassList classList = dom->classList();
for (ClassList::const_iterator it = classList.begin(); it != classList.end(); ++it)
{
processClass(prefix + prefixInc + dom->name(), *it);
}
}
#include "hierarchydlg.moc"