00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
#include <qdir.h>
00015
#include <kconfig.h>
00016
#include <kdebug.h>
00017
#include <kglobal.h>
00018
#include <kinstance.h>
00019
#include <klocale.h>
00020
#include <kurl.h>
00021
#include <kstandarddirs.h>
00022
#include <kio/netaccess.h>
00023
#include <kapplication.h>
00024
#include <qdom.h>
00025
#include <qvaluestack.h>
00026
00027
#include "domutil.h"
00028
#include "urlutil.h"
00029
00030
#include "doctreeviewfactory.h"
00031
00032
#include "misc.h"
00033
#include "../../config.h"
00034
00035 static KConfig *
instanceConfig()
00036 {
00037
#ifdef INDEXER
00038
return KGlobal::config();
00039
#else
00040
return DocTreeViewFactory::instance()->config();
00041
#endif
00042
}
00043
00044 void DocTreeViewTool::getLibraries(
QStringList *libNames,
QStringList *docDirs,
QStringList *sourceDirs)
00045 {
00046
KConfig *config =
instanceConfig();
00047 config->
setGroup(
"DocTreeView");
00048 *libNames = config->
readListEntry(
"LibrariesNames");
00049 *docDirs = config->
readListEntry(
"LibrariesDocDirs");
00050 *sourceDirs = config->
readListEntry(
"LibrariesSourceDirs");
00051 }
00052
00053 void DocTreeViewTool::setLibraries(
QStringList *libNames,
QStringList *docDirs,
QStringList *sourceDirs)
00054 {
00055
KConfig *config =
instanceConfig();
00056 config->
setGroup(
"DocTreeView");
00057 config->
writeEntry(
"LibrariesNames", *libNames);
00058 config->
writeEntry(
"LibrariesDocDirs", *docDirs );
00059 config->
writeEntry(
"LibrariesSourceDirs", *sourceDirs);
00060 }
00061
00062 void DocTreeViewTool::readLibraryDocs(
QString dir,
QStringList *itemNames,
QStringList *fileNames)
00063 {
00064
QDir globaldir(dir +
"/kdoc-reference");
00065
QStringList globalentries =
00066 globaldir.exists()? globaldir.entryList(
"*", QDir::Files) :
QStringList();
00067
for (QStringList::Iterator it = globalentries.begin(); it != globalentries.end(); ++it) {
00068 *itemNames +=
QFileInfo(*it).baseName();
00069 *fileNames += globaldir.filePath(*it);
00070
kdDebug(9002) <<
"Global: " << globaldir.filePath(*it) <<
endl;
00071 }
00072
QDir privatedir(QDir::homeDirPath() +
"/.kdoc");
00073
QStringList privateentries =
00074 privatedir.exists()? privatedir.entryList(
"*", QDir::Files) :
QStringList();
00075
for (QStringList::Iterator it = privateentries.begin(); it != privateentries.end(); ++it) {
00076
QDir libdir(dir +
"/" +
QFileInfo(*it).baseName());
00077
if (libdir.exists())
00078 {
00079 *itemNames += i18n(
"%1 (private)").arg(
QFileInfo(*it).baseName());
00080 *fileNames += privatedir.filePath(*it);
00081
kdDebug(9002) <<
"Local: " << privatedir.filePath(*it) <<
endl;
00082 }
00083 }
00084 }
00085
00086 void DocTreeViewTool::getAllLibraries(
QStringList *itemNames,
QStringList *fileNames)
00087 {
00088
KConfig *config =
instanceConfig();
00089 config->
setGroup(
"DocTreeView");
00090
QString idx_path = config->
readPathEntry(
"KDEDocDir", KDELIBS_DOCDIR);
00091
00092
readLibraryDocs(idx_path, itemNames, fileNames);
00093 }
00094
00095
00096 void DocTreeViewTool::getHiddenLibraries(
QStringList *hiddenNames)
00097 {
00098
KConfig *config =
instanceConfig();
00099 config->
setGroup(
"DocTreeView");
00100 *hiddenNames = config->
readListEntry(
"LibrariesHidden");
00101 }
00102
00103
00104 void DocTreeViewTool::setHiddenLibraries(
const QStringList &hiddenNames)
00105 {
00106
KConfig *config =
instanceConfig();
00107 config->
setGroup(
"DocTreeView");
00108 config->
writeEntry(
"LibrariesHidden", hiddenNames);
00109 }
00110
00111
00112 void DocTreeViewTool::getBookmarks(
QStringList *itemNames,
QStringList *fileNames)
00113 {
00114
KConfig *config =
instanceConfig();
00115 config->
setGroup(
"DocTreeView");
00116 *itemNames = config->
readListEntry(
"BookmarksTitle");
00117 *fileNames = config->
readListEntry(
"BookmarksURL");
00118 }
00119
00120
00121 void DocTreeViewTool::setBookmarks(
const QStringList &itemNames,
const QStringList &fileNames)
00122 {
00123
KConfig *config =
instanceConfig();
00124 config->
setGroup(
"DocTreeView");
00125 config->
writeEntry(
"BookmarksTitle", itemNames);
00126 config->
writeEntry(
"BookmarksURL", fileNames);
00127 }
00128
00129 void DocTreeViewTool::addBookmark(
const QString& itemName,
const QString & fileName)
00130 {
00131
KConfig *config =
instanceConfig();
00132 config->
setGroup(
"DocTreeView");
00133
QStringList iNames = config->
readListEntry(
"BookmarksTitle");
00134
QStringList fNames = config->
readListEntry(
"BookmarksURL");
00135
00136 iNames.append( itemName );
00137 fNames.append( fileName );
00138
00139
setBookmarks( iNames, fNames );
00140 }
00141 void DocTreeViewTool::removeBookmark(
int index)
00142 {
00143
KConfig *config =
instanceConfig();
00144 config->
setGroup(
"DocTreeView");
00145
QStringList itemNames = config->
readListEntry(
"BookmarksTitle");
00146
QStringList fileNames = config->
readListEntry(
"BookmarksURL");
00147
00148 fileNames.remove( fileNames.at( fileNames.size() - index ) );
00149 itemNames.remove( itemNames.at( itemNames.size() - index ) );
00150
00151
setBookmarks( itemNames, fileNames );
00152 }
00153
00154 QString DocTreeViewTool::tocDocDefaultLocation(
const QString& fileName)
00155 {
00156
QFile f(fileName);
00157
if (!f.open(IO_ReadOnly)) {
00158
kdDebug(9002) <<
"Could not read doc toc: " << fileName <<
endl;
00159
return QString::null;
00160 }
00161
QDomDocument doc;
00162
if (!doc.setContent(&f) || doc.doctype().name() !=
"kdeveloptoc") {
00163
kdDebug(9002) <<
"Not a valid kdeveloptoc file: " << fileName <<
endl;
00164
return QString::null;
00165 }
00166 f.close();
00167
00168
QDomElement docEl = doc.documentElement();
00169
QDomElement childEl = docEl.firstChild().toElement();
00170
QString base;
00171
while (!childEl.isNull())
00172 {
00173
if (childEl.tagName() ==
"base")
00174 {
00175 base = childEl.attribute(
"href");
00176
if (!base.isEmpty())
00177 base +=
"/";
00178
break;
00179 }
00180 childEl = childEl.nextSibling().toElement();
00181 }
00182
return base;
00183 }
00184
00185 QString DocTreeViewTool::tocTitle(
const QString& fileName)
00186 {
00187
QFile f(fileName);
00188
if (!f.open(IO_ReadOnly)) {
00189
kdDebug(9002) <<
"Could not read doc toc: " << fileName <<
endl;
00190
return QString::null;
00191 }
00192
QDomDocument doc;
00193
if (!doc.setContent(&f) || doc.doctype().name() !=
"kdeveloptoc") {
00194
kdDebug(9002) <<
"Not a valid kdeveloptoc file: " << fileName <<
endl;
00195
return QString::null;
00196 }
00197 f.close();
00198
QDomElement docEl = doc.documentElement();
00199
QDomElement childEl = docEl.firstChild().toElement();
00200
QString title;
00201
while (!childEl.isNull())
00202 {
00203
if (childEl.tagName() ==
"title")
00204 {
00205 title = childEl.text();
00206
break;
00207 }
00208 childEl = childEl.nextSibling().toElement();
00209 }
00210
return title;
00211 }
00212
00213
00214 QString DocTreeViewTool::tocLocation(
const QString& fileName)
00215 {
00216
KConfig *config =
instanceConfig();
00217 config->
setGroup(
"TocDirs");
00218
const QString docName(
QFileInfo( fileName ).baseName() );
00219
return config->
readPathEntry( docName,
DocTreeViewTool::tocDocDefaultLocation( fileName ));
00220 }
00221
00222 QString DocTreeViewTool::devhelpLocation(
const QString& docName,
const QString &defaultLocation)
00223 {
00224
KConfig *config =
instanceConfig();
00225 config->
setGroup(
"TocDevHelp");
00226
return config->
readPathEntry( docName, defaultLocation);
00227 }
00228
00229 QString DocTreeViewTool::devhelpLocation(
const QString& fileName)
00230 {
00231
KConfig *config =
instanceConfig();
00232 config->
setGroup(
"TocDevHelp");
00233
QString docName =
QFileInfo(fileName).baseName();
00234
BookInfo inf =
DocTreeViewTool::devhelpInfo(fileName);
00235
return config->
readPathEntry( docName, inf.
defaultLocation);
00236 }
00237
00238
00239 void DocTreeViewTool::scanDevHelpDirs(
const QString )
00240 {
00241
00242
scanDevHelpNewWay();
00243 }
00244
00245 BookInfo DocTreeViewTool::devhelpInfo(
const QString& fileName)
00246 {
00247
BookInfo inf;
00248
00249
QFileInfo fi(fileName);
00250
if (!fi.exists())
00251
return inf;
00252
QFile f(fileName);
00253
if (!f.open(IO_ReadOnly)) {
00254
return inf;
00255 }
00256
QDomDocument doc;
00257
if (!doc.setContent(&f)) {
00258
return inf;
00259 }
00260 f.close();
00261
QDomElement docEl = doc.documentElement();
00262 inf.
name = docEl.attribute(
"name", QString::null);
00263 inf.
title = docEl.attribute(
"title", QString::null);
00264 inf.
author = docEl.attribute(
"author", QString::null);
00265 inf.
defaultLocation = docEl.attribute(
"base", QString::null);
00266
00267
return inf;
00268 }
00269
00270 void DocTreeViewTool::scanDevHelpOldWay(
const QString path )
00271 {
00272
KStandardDirs *dirs = DocTreeViewFactory::instance()->dirs();
00273
00274
QString devhelpDir;
00275
if (path.isEmpty())
00276 {
00277
KConfig *config =
instanceConfig();
00278 config->
setGroup(
"DevHelp");
00279 devhelpDir = config->
readPathEntry(
"DevHelpDir",
"~/.devhelp");
00280 }
00281
else
00282 devhelpDir = path;
00283
00284
00285
if (devhelpDir.isEmpty())
00286
return;
00287
00288
00289
if (devhelpDir[devhelpDir.length()-1] ==
QChar(
'/'))
00290 devhelpDir.remove(devhelpDir.length()-1, 1);
00291
QDir d(devhelpDir +
QString(
"/specs/"));
00292
if (! d.exists())
00293 {
00294
return;
00295 }
00296 d.setFilter( QDir::Files );
00297
00298
const QFileInfoList *list = d.entryInfoList();
00299 QFileInfoListIterator it( *list );
00300
QFileInfo *fi;
00301
while ( (fi = it.current()) != 0 ) {
00302
if (fi->extension() ==
"devhelp")
00303 {
00304
00305
00306
KURL src;
00307 src.
setPath(fi->absFilePath());
00308
KURL dest;
00309 dest.
setPath(dirs->
saveLocation(
"docdevhelp") + fi->baseName() +
".devhelp");
00310
00311
QString contentDirURL = devhelpDir +
QString(
"/books/") + fi->baseName() +
"/";
00312
QDir contentDir(contentDirURL);
00313
if (contentDir.exists())
00314 {
00315
KConfig *config = DocTreeViewFactory::instance()->config();
00316 config->
setGroup(
"TocDevHelp");
00317 QString temp = config->
readPathEntry( fi->baseName());
00318
if (temp.isEmpty() ) {
00319
#if defined(KDE_IS_VERSION)
00320
# if KDE_IS_VERSION(3,1,3)
00321
# ifndef _KDE_3_1_3_
00322
# define _KDE_3_1_3_
00323
# endif
00324
# endif
00325
#endif
00326
#if defined(_KDE_3_1_3_)
00327
config->
writePathEntry( fi->baseName(), contentDirURL);
00328
#else
00329
config->
writeEntry( fi->baseName(), contentDirURL);
00330
#endif
00331
}
00332 }
00333
00334
KIO::NetAccess::copy(src, dest);
00335 }
00336 ++it;
00337 }
00338 }
00339
00340 void DocTreeViewTool::scanDevHelpNewWay( )
00341 {
00342
QValueStack<QString> scanStack;
00343
00344 scanStack <<
"/usr/share/devhelp/books/"
00345 <<
"/usr/local/share/devhelp/books"
00346 <<
"/opt/gnome/share/devhelp/books"
00347 <<
"/opt/gnome2/share/devhelp/books"
00348 <<
"/usr/share/gtk-doc/html"
00349 <<
"/usr/local/share/gtk-doc/html"
00350 <<
"/opt/gnome/share/gtk-doc/html"
00351 <<
"/opt/gnome2/share/gtk-doc/html";
00352
00353
KConfig *config =
instanceConfig();
00354 config->
setGroup(
"DevHelp");
00355
QString confDir = config->
readPathEntry(
"DevHelpDir", URLUtil::envExpand(
"$HOME/.devhelp"));
00356
if ((!confDir.isEmpty()) && (!scanStack.contains(confDir)))
00357 scanStack << confDir;
00358
00359
QStringList scanList;
00360
00361
QDir dir;
00362
do {
00363 dir.setPath(scanStack.pop());
00364
if (!dir.exists())
00365
continue;
00366 scanList << dir.path();
00367
00368
const QFileInfoList *dirEntries = dir.entryInfoList();
00369
QPtrListIterator<QFileInfo> it(*dirEntries);
00370
for (; it.current(); ++it) {
00371
QString fileName = it.current()->fileName();
00372
if (fileName ==
"." || fileName ==
"..")
00373
continue;
00374
QString path = it.current()->absFilePath();
00375
if (it.current()->isDir()) {
00376 scanStack.push(path);
00377 }
00378 }
00379 }
while (!scanStack.isEmpty());
00380
00381
for (QStringList::const_iterator it = scanList.begin(); it != scanList.end(); ++it)
00382 {
00383
scanDevHelpNewWay(*it);
00384 }
00385 }
00386
00387 void DocTreeViewTool::scanDevHelpNewWay(
const QString & path )
00388 {
00389
KStandardDirs *dirs = DocTreeViewFactory::instance()->dirs();
00390
00391
QDir d(path);
00392
if (! d.exists())
00393 {
00394
return;
00395 }
00396 d.setFilter( QDir::Files );
00397
00398
const QFileInfoList *list = d.entryInfoList();
00399 QFileInfoListIterator it( *list );
00400
QFileInfo *fi;
00401
while ( (fi = it.current()) != 0 ) {
00402
if (fi->extension() ==
"devhelp")
00403 {
00404
00405
00406
KURL src;
00407 src.
setPath(fi->absFilePath());
00408
KURL dest;
00409 dest.
setPath(dirs->
saveLocation(
"docdevhelp") + fi->baseName() +
".devhelp");
00410
00411
QString contentDirURL = QDir::cleanDirPath(path) +
"/";
00412
QDir contentDir(contentDirURL);
00413
if (contentDir.exists())
00414 {
00415
KConfig *config = DocTreeViewFactory::instance()->config();
00416 config->
setGroup(
"TocDevHelp");
00417
#if defined(KDE_IS_VERSION)
00418
# if KDE_IS_VERSION(3,1,3)
00419
# ifndef _KDE_3_1_3_
00420
# define _KDE_3_1_3_
00421
# endif
00422
# endif
00423
#endif
00424
#if defined(_KDE_3_1_3_)
00425
config->
writePathEntry( fi->baseName(), contentDirURL);
00426
#else
00427
config->
writeEntry( fi->baseName(), contentDirURL);
00428
#endif
00429
}
00430
00431
KIO::NetAccess::copy(src, dest);
00432 }
00433 ++it;
00434 }
00435 }