summaryrefslogtreecommitdiffstats
path: root/src/kchmtreeviewitem.cpp
diff options
context:
space:
mode:
authortpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-02-15 18:23:18 +0000
committertpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-02-15 18:23:18 +0000
commit3133bbc63a2d32dac638db58fa13e966488e88b5 (patch)
tree326595b5fefc87fd7cf5ab3905bc00883fe3c919 /src/kchmtreeviewitem.cpp
downloadkchmviewer-3133bbc63a2d32dac638db58fa13e966488e88b5.tar.gz
kchmviewer-3133bbc63a2d32dac638db58fa13e966488e88b5.zip
Added abandoned KDE3 version of kchmviewer
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/kchmviewer@1090662 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'src/kchmtreeviewitem.cpp')
-rw-r--r--src/kchmtreeviewitem.cpp286
1 files changed, 286 insertions, 0 deletions
diff --git a/src/kchmtreeviewitem.cpp b/src/kchmtreeviewitem.cpp
new file mode 100644
index 0000000..7a82a39
--- /dev/null
+++ b/src/kchmtreeviewitem.cpp
@@ -0,0 +1,286 @@
+/***************************************************************************
+ * Copyright (C) 2004-2007 by Georgy Yunaev, gyunaev@ulduzsoft.com *
+ * Please do not use email address above for bug reports; see *
+ * the README file *
+ * *
+ * 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. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+#include <qstringlist.h>
+#include <qstyle.h>
+
+#include "kchmtreeviewitem.h"
+#include "kchmmainwindow.h"
+#include "kchmdialogchooseurlfromlist.h"
+#include "iconstorage.h"
+
+
+KCHMIndTocItem::KCHMIndTocItem( QListViewItem * parent, QListViewItem * after, QString name, QString aurl, int image) : QListViewItem(parent, after, name), url(aurl), image_number(image)
+{
+}
+
+KCHMIndTocItem::KCHMIndTocItem( QListView * parent, QListViewItem * after, QString name, QString aurl, int image) : QListViewItem(parent, after, name), url(aurl), image_number(image)
+{
+}
+
+
+const QPixmap * KCHMIndTocItem::pixmap( int i ) const
+{
+ int imagenum;
+
+ if ( i || image_number == LCHMBookIcons::IMAGE_NONE || image_number == LCHMBookIcons::IMAGE_INDEX )
+ return 0;
+
+ if ( firstChild () )
+ {
+ if ( isOpen() )
+ imagenum = (image_number == LCHMBookIcons::IMAGE_AUTO) ? 1 : image_number;
+ else
+ imagenum = (image_number == LCHMBookIcons::IMAGE_AUTO) ? 0 : image_number + 1;
+ }
+ else
+ imagenum = (image_number == LCHMBookIcons::IMAGE_AUTO) ? 10 : image_number;
+
+ return ::mainWindow->chmFile()->getBookIconPixmap( imagenum );
+}
+
+
+QString KCHMIndTocItem::getUrl( ) const
+{
+ if ( url.find ('|') == -1 )
+ return url;
+
+ // Create a dialog with URLs, and show it, so user can select an URL he/she wants.
+ QStringList urls = QStringList::split ('|', url);
+ QStringList titles;
+ LCHMFile * xchm = ::mainWindow->chmFile();
+
+ for ( unsigned int i = 0; i < urls.size(); i++ )
+ {
+ QString title = xchm->getTopicByUrl (urls[i]);
+
+ if ( !title )
+ {
+ qWarning ("Could not get item name for url '%s'", urls[i].ascii());
+ titles.push_back(QString::null);
+ }
+ else
+ titles.push_back(title);
+ }
+
+ KCHMDialogChooseUrlFromList dlg (urls, titles, ::mainWindow);
+
+ if ( dlg.exec() == QDialog::Accepted )
+ return dlg.getSelectedItemUrl();
+
+ return QString::null;
+}
+
+
+void KCHMIndTocItem::paintBranches( QPainter * p, const QColorGroup & cg, int w, int y, int h )
+{
+ if ( image_number != LCHMBookIcons::IMAGE_INDEX )
+ QListViewItem::paintBranches(p, cg, w, y, h);
+ else
+ {
+ // Too bad that listView()->paintEmptyArea( p, QRect( 0, 0, w, h ) ) is protected.
+ // Taken from qt-x11-free-3.0.4/src/widgets/qlistview.cpp
+ QStyleOption opt( 0, 0 );
+ QStyle::SFlags how = QStyle::Style_Default | QStyle::Style_Enabled;
+
+ listView()->style().drawComplexControl( QStyle::CC_ListView,
+ p, listView(), QRect( 0, 0, w, h ), cg,
+ how, QStyle::SC_ListView, QStyle::SC_None,
+ opt );
+ }
+}
+
+
+void KCHMIndTocItem::paintCell( QPainter * p, const QColorGroup & cg, int column, int width, int align )
+{
+ QColorGroup newcg ( cg );
+ QColor c = newcg.text();
+
+ if ( url.find ('|') != -1 )
+ newcg.setColor( QColorGroup::Text, Qt::red );
+ else if ( url[0] == ':' )
+ newcg.setColor( QColorGroup::Text, Qt::lightGray );
+ else
+ {
+ QListViewItem::paintCell( p, cg, column, width, align );
+ return;
+ }
+
+ QListViewItem::paintCell( p, newcg, column, width, align );
+ newcg.setColor( QColorGroup::Text, c );
+}
+
+
+void KCHMIndTocItem::setOpen( bool open )
+{
+ if ( image_number != LCHMBookIcons::IMAGE_INDEX || open )
+ QListViewItem::setOpen (open);
+}
+
+void kchmFillListViewWithParsedData( QListView * list, const QValueVector< LCHMParsedEntry >& data, QMap<QString, KCHMIndTocItem*> * map )
+{
+ QValueVector< KCHMIndTocItem *> lastchild;
+ QValueVector< KCHMIndTocItem *> rootentry;
+
+ if ( map )
+ map->clear();
+
+ list->clear();
+
+ for ( unsigned int i = 0; i < data.size(); i++ )
+ {
+ unsigned int indent = data[i].indent;
+
+ // Do we need to add another indent?
+ if ( indent >= lastchild.size() )
+ {
+ lastchild.resize( indent + 1 );
+ lastchild[indent] = 0;
+
+ rootentry.resize( indent + 1 );
+ rootentry[indent] = 0;
+ }
+
+ // Create the node
+ KCHMIndTocItem * item;
+ QString url = data[i].urls.join ("|");
+
+ if ( indent == 0 )
+ item = new KCHMIndTocItem( list, lastchild[indent], data[i].name, url, data[i].imageid );
+ else
+ {
+ // New non-root entry. It is possible (for some buggy CHMs) that there is no previous entry: previoous entry had indent 1,
+ // and next entry has indent 3. Backtracking it up, creating missing entries.
+ if ( rootentry[indent-1] == 0 )
+ qFatal("Child entry indented as %d with no root entry!", indent);
+
+ item = new KCHMIndTocItem( rootentry[indent-1], lastchild[indent], data[i].name, url, data[i].imageid );
+ }
+
+ // Hack: if map is 0, we have index, so make it open
+ if ( map )
+ {
+ for ( unsigned int li = 0; li < data[i].urls.size(); li++ )
+ map->insert( data[i].urls[li], item );
+ }
+ else
+ item->setOpen( true );
+
+ lastchild[indent] = item;
+ rootentry[indent] = item;
+ }
+
+ list->triggerUpdate();
+/*
+ KCHMMainTreeViewItem * item;
+
+ if ( !root_indent_offset_set )
+ {
+ root_indent_offset_set = true;
+ root_indent_offset = indent;
+
+ if ( root_indent_offset > 1 )
+ qWarning("CHM has improper index; root indent offset is %d", root_indent_offset);
+ }
+
+ int real_indent = indent - root_indent_offset;
+ QString url = urls.join ("|");
+
+ if ( real_indent == 0 )
+ {
+ // New root entry
+ item = new KCHMMainTreeViewItem (tree, lastchild[real_indent], name, url, imagenum);
+ DEBUGPARSER(("<root object>: '%s', new rootentry %08X\n", name.ascii(), item));
+ }
+ else
+ {
+ // New non-root entry
+ if ( !rootentry[real_indent-1] )
+ qFatal("CHMFile::ParseAndFillTopicsTree: child entry \"%s\" indented as %d with no root entry!", name.ascii(), real_indent);
+
+ item = new KCHMMainTreeViewItem (rootentry[real_indent-1], lastchild[real_indent], name, url, imagenum);
+ DEBUGPARSER(("<object>: '%s', indent %d, rootentry %08X, item %08X\n", name.ascii(), real_indent, rootentry[real_indent-1], item));
+ }
+
+ lastchild[real_indent] = item;
+ rootentry[real_indent] = item;
+
+ if ( asIndex )
+ rootentry[real_indent]->setOpen(true);
+
+ // There are no 'titles' in index file
+ if ( add2treemap )
+ {
+ for ( unsigned int li = 0; li < urls.size(); li++ )
+ m_treeUrlMap[urls[li]] = item;
+ }
+ }
+ else
+ {
+ if ( !urls.isEmpty() )
+ qDebug ("CHMFile::ParseAndFillTopicsTree: <object> tag with url \"%s\" is parsed, but name is empty.", urls[0].ascii());
+ else
+ qDebug ("CHMFile::ParseAndFillTopicsTree: <object> tag is parsed, but both name and url are empty.");
+ }
+
+ name = QString::null;
+ urls.clear();
+ in_object = false;
+ imagenum = defaultimagenum;
+ }
+ }
+ else if ( tagword == "ul" ) // increase indent level
+ {
+ // Fix for buggy help files
+ if ( ++indent >= MAX_NEST_DEPTH )
+ qFatal("CHMFile::ParseAndFillTopicsTree: max nest depth (%d) is reached, error in help file", MAX_NEST_DEPTH);
+
+ lastchild[indent] = 0;
+ rootentry[indent] = 0;
+
+ // This intended to fix <ul><ul>, which was seen in some buggy chm files,
+ // and brokes rootentry[indent-1] check
+ int real_indent = indent - root_indent_offset;
+ if ( real_indent > 1
+ && rootentry[real_indent - 1] == 0
+ && rootentry[real_indent - 2] != 0 )
+ {
+ rootentry[real_indent - 1] = rootentry[real_indent - 2];
+ qWarning("Broken CHM index/content: tree autocorrection enabled.");
+ }
+
+ DEBUGPARSER(("<ul>: new indent is %d, last rootentry was %08X\n", indent - root_indent_offset, rootentry[indent-1]));
+ }
+ else if ( tagword == "/ul" ) // decrease indent level
+ {
+ if ( --indent < root_indent_offset )
+ indent = root_indent_offset;
+
+ rootentry[indent] = 0;
+ DEBUGPARSER(("</ul>: new intent is %d\n", indent - root_indent_offset));
+ }
+
+ pos = i;
+ }
+
+ return true;
+*/
+}