diff options
Diffstat (limited to 'khtml/domtreeview.cpp')
-rw-r--r-- | khtml/domtreeview.cpp | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/khtml/domtreeview.cpp b/khtml/domtreeview.cpp new file mode 100644 index 000000000..e5516edfd --- /dev/null +++ b/khtml/domtreeview.cpp @@ -0,0 +1,97 @@ +/*************************************************************************** + domtreeview.cpp + ------------------- + + copyright : (C) 2001 - The Kafka Team + email : kde-kafka@master.kde.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 "khtml_part.h" +#include "domtreeview.moc" +#include "xml/dom_nodeimpl.h" + +DOMTreeView::DOMTreeView(QWidget *parent, KHTMLPart *currentpart, const char * name) : KListView(parent, name) +{ + setCaption(name); + setRootIsDecorated(true); + addColumn("Name"); + addColumn("Value"); + addColumn("Renderer"); + setSorting(-1); + part = currentpart; + connect(part, SIGNAL(nodeActivated(const DOM::Node &)), this, SLOT(showTree(const DOM::Node &))); + connect(this, SIGNAL(clicked(QListViewItem *)), this, SLOT(slotItemClicked(QListViewItem *))); + m_nodedict.setAutoDelete(true); +} + +DOMTreeView::~DOMTreeView() +{ + disconnect(part); +} + +void DOMTreeView::showTree(const DOM::Node &pNode) +{ + if(pNode.isNull() || document != pNode.ownerDocument()) + { + clear(); + m_itemdict.clear(); + m_nodedict.clear(); + if(pNode.isNull()) + return; + else if(pNode.ownerDocument().isNull()) + recursive(0, pNode); + else + recursive(0, pNode.ownerDocument()); + } + setCurrentItem(m_itemdict[pNode.handle()]); + ensureItemVisible(m_itemdict[pNode.handle()]); +} + +void DOMTreeView::recursive(const DOM::Node &pNode, const DOM::Node &node) +{ + QListViewItem *cur_item; + if(pNode.ownerDocument() != document) + { + QString val = node.nodeValue().string(); + if ( val.length() > 20 ) + val.truncate( 20 ); + cur_item = new QListViewItem(static_cast<QListView *>(this), node.nodeName().string(), val ); + document = pNode.ownerDocument(); + } + else { + QString val = node.nodeValue().string(); + if ( val.length() > 20 ) + val.truncate( 20 ); + cur_item = new QListViewItem(m_itemdict[pNode.handle()], node.nodeName().string(), val); + } + + if(node.handle()) + { + m_itemdict.insert(node.handle(), cur_item); + m_nodedict.insert(cur_item, new DOM::Node(node)); + } + + DOM::Node cur_child = node.lastChild(); + while(!cur_child.isNull()) + { + recursive(node, cur_child); + cur_child = cur_child.previousSibling(); + } +} + +void DOMTreeView::slotItemClicked(QListViewItem *cur_item) +{ + DOM::Node *handle = m_nodedict[cur_item]; + if(handle) { + emit part->setActiveNode(*handle); + } +} |