File indexing completed on 2024-12-01 09:50:26

0001 /*
0002  *  This file is part of the KDE libraries
0003  *  Copyright (C) 2006 Matt Broadstone (mbroadst@gmail.com)
0004  *  Copyright (C) 2008 Maks Orlovich (maksim@kde.org)
0005  *
0006  *  This library is free software; you can redistribute it and/or
0007  *  modify it under the terms of the GNU Library General Public
0008  *  License as published by the Free Software Foundation; either
0009  *  version 2 of the License, or (at your option) any later version.
0010  *
0011  *  This library is distributed in the hope that it will be useful,
0012  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
0013  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0014  *  Library General Public License for more details.
0015  *
0016  *  You should have received a copy of the GNU Library General Public
0017  *  License along with this library; if not, write to the Free Software
0018  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
0019  */
0020 
0021 #include "scriptsdock.h"
0022 
0023 #include <QVBoxLayout>
0024 #include <QTreeWidget>
0025 #include <QTreeWidgetItem>
0026 #include <QStandardItemModel>
0027 #include <QHeaderView>
0028 #include <QUrl>
0029 
0030 #include "debugwindow.h"
0031 #include "debugdocument.h"
0032 
0033 using namespace KJS;
0034 using namespace KJSDebugger;
0035 
0036 ScriptsDock::ScriptsDock(QWidget *parent)
0037     : QDockWidget(i18n("Loaded Scripts"), parent)
0038 {
0039     setFeatures(DockWidgetMovable | DockWidgetFloatable);
0040     m_widget = new QTreeWidget;
0041     m_widget->header()->hide();
0042 
0043     connect(m_widget, SIGNAL(itemClicked(QTreeWidgetItem*,int)),
0044             this, SLOT(scriptSelected(QTreeWidgetItem*,int)));
0045 
0046     setWidget(m_widget);
0047 }
0048 
0049 ScriptsDock::~ScriptsDock()
0050 {
0051 }
0052 
0053 void ScriptsDock::documentDestroyed(DebugDocument *document)
0054 {
0055     // We may be asked to remove a document held for reload repeatedly;
0056     // ignore later attempts
0057     if (!m_documents.contains(document)) {
0058         return;
0059     }
0060 
0061     QTreeWidgetItem *fragment = m_documents[document];
0062     m_documents.remove(document);
0063 
0064     QTreeWidgetItem *file      = fragment->parent();
0065     QTreeWidgetItem *domain    = file->parent();
0066 
0067     delete file->takeChild(file->indexOfChild(fragment));
0068 
0069     if (file->childCount()) {
0070         return;
0071     }
0072 
0073     // Need to clean up the file as well.
0074     delete domain->takeChild(domain->indexOfChild(file));
0075 
0076     if (domain->childCount()) {
0077         return;
0078     }
0079 
0080     // ... and domain
0081     m_headers.remove(domain->text(0));
0082     delete m_widget->takeTopLevelItem(m_widget->indexOfTopLevelItem(domain));
0083 }
0084 
0085 void ScriptsDock::addDocument(DebugDocument *document)
0086 {
0087     assert(!m_documents.contains(document));
0088 
0089     QString name = document->name();
0090     QString domain;
0091     QString favicon;
0092 
0093     if (document->url().isEmpty()) {
0094         domain = "????";    // TODO: proper i18n'able string
0095     }
0096 
0097     else {
0098         QUrl kurl(document->url());
0099         if (!kurl.host().isEmpty()) {
0100             domain = kurl.host();
0101         } else {
0102             domain = "localhost";
0103         }
0104 
0105         favicon = KIO::favIconForUrl(kurl);
0106     }
0107 
0108     QTreeWidgetItem *parent = 0;
0109     if (m_headers.contains(domain)) {
0110         parent = m_headers[domain];
0111     } else {
0112         parent = new QTreeWidgetItem(QStringList() << domain);
0113         if (!favicon.isEmpty()) {
0114             QIcon icon = QIcon::fromTheme(favicon);
0115             parent->setIcon(0, icon);
0116         }
0117 
0118         m_headers[domain] = parent;
0119         m_widget->invisibleRootItem()->addChild(parent);
0120     }
0121 
0122     // Now try to find a kid for the name
0123     QTreeWidgetItem *file = 0;
0124     for (int c = 0; c < parent->childCount(); ++c) {
0125         QTreeWidgetItem *cand = parent->child(c);
0126         if (cand->text(0) == name) {
0127             file = cand;
0128         }
0129     }
0130 
0131     if (!file) {
0132         file = new QTreeWidgetItem(parent, QStringList() << name);
0133     }
0134 
0135     // Now add the fragment
0136     QString lines = QString::number(1 + document->baseLine()) + "-" +
0137                     QString::number(1 + document->baseLine() + document->length() - 1);
0138 
0139     QTreeWidgetItem *child = new QTreeWidgetItem(file, QStringList() << lines);
0140     m_documents[document] = child;
0141 }
0142 
0143 void ScriptsDock::scriptSelected(QTreeWidgetItem *item, int /*column*/)
0144 {
0145     DebugDocument *doc = m_documents.key(item);
0146     if (doc) {
0147         emit displayScript(doc);
0148     }
0149 }
0150 
0151 #include "moc_scriptsdock.cpp"