From kde-commits Sun Feb 22 03:29:19 2004 From: Hamish Rodda Date: Sun, 22 Feb 2004 03:29:19 +0000 To: kde-commits Subject: kdevelop/parts/doctreeview Message-Id: <20040222032919.19B249959 () office ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=107742056718914 CVS commit by rodda: Ok, I decided this wasn't fast enough as I left it, so i've switched to a binary format cache of the titles for the doctree, to avoid parsing XML. Its speed is now up to scratch :) M +69 -6 doctreeviewwidget.cpp 1.78 --- kdevelop/parts/doctreeview/doctreeviewwidget.cpp #1.77:1.78 @@ -30,4 +30,5 @@ #include #include +#include #include @@ -419,4 +420,5 @@ class DocTreeTocFolder : public DocTreeI { public: + DocTreeTocFolder(const QString& name, KListView *parent, const QString &fileName, const QString &context); DocTreeTocFolder(KListView *parent, const QString &fileName, const QString &context); @@ -426,5 +428,5 @@ public: private: - void init(); + //void init(); void addTocSect(DocTreeItem *parent, QDomElement childEl, uint level); @@ -433,4 +435,5 @@ private: }; +#if 0 class TocNameExtractor : public QXmlDefaultHandler { @@ -471,4 +474,13 @@ private: bool m_titleNext; }; +#endif + +DocTreeTocFolder::DocTreeTocFolder(const QString& name, KListView *parent, const QString &fileName, const QString &context) + : DocTreeItem(parent, Folder, fileName, context, true) +{ + setFileName( fileName ); + setIndexFileName( fileName ); + setText(0, name); +} DocTreeTocFolder::DocTreeTocFolder(KListView *parent, const QString &fileName, const QString &context) @@ -478,7 +490,8 @@ DocTreeTocFolder::DocTreeTocFolder(KList setIndexFileName( fileName ); - init(); + refresh(); } +#if 0 void DocTreeTocFolder::init() { @@ -501,4 +514,5 @@ void DocTreeTocFolder::init() r.parse(&s); } +#endif void DocTreeTocFolder::refresh() @@ -1074,4 +1088,37 @@ DocTreeViewWidget::DocTreeViewWidget(Doc // doctocs + // We're caching title only because it is a huge startup speed gain to not have to extract the title from the XML + QStringList tocs = dirs->findAllResources("doctocs", QString::null, false, true); + QString cache = dirs->findResource("data", "kdevdoctreeview/docpartcache"); + bool regenerateCache = false; + QFile cacheFile(cache); + if (!cache.isEmpty() && cacheFile.open(IO_ReadOnly)) { + QDataStream ds(&cacheFile); + int version; + ds >> version; + // Opening cache + if (version == 1) { + QString fileName, title; + while (!ds.atEnd()) { + ds >> fileName >> title; + if (tocs.contains(fileName) && QFileInfo(fileName).lastModified() < QFileInfo(cacheFile).lastModified()) { + // Cache hit! + DocTreeTocFolder* item = new DocTreeTocFolder(title, docView, fileName, QString("ctx_%1").arg(fileName)); + item->postInit(); + folder_toc.append(item); + tocs.remove(fileName); + } else { + // couldn't find toc, may have been uninstalled. don't need to regenerate. + } + } + } else { + // Incorrect cache version + regenerateCache = true; + } + cacheFile.close(); + } + + if (tocs.count()) { + regenerateCache = true; QStringList tocs = dirs->findAllResources("doctocs", QString::null, false, true); for (QStringList::Iterator tit = tocs.begin(); tit != tocs.end(); ++tit) { @@ -1080,4 +1127,20 @@ DocTreeViewWidget::DocTreeViewWidget(Doc folder_toc.append(item); } + } + + if (regenerateCache) { + // update cache here + if (cache.isEmpty()) { + cache = dirs->saveLocation("data"); + cache += "kdevdoctreeview/docpartcache"; + cacheFile.setName(cache); + } + // Creating cache + cacheFile.open(IO_WriteOnly); + QDataStream ds(&cacheFile); + ds << 1; + for (DocTreeTocFolder* f = folder_toc.first(); f; f = folder_toc.next()) + ds << f->fileName() << f->text(0); + } // initKDocKDELibs();