|
|
|
/*
|
|
|
|
* This file is part of the TDE Help Center
|
|
|
|
*
|
|
|
|
* Copyright (C) 1999 Matthias Elter (me@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.
|
|
|
|
*
|
|
|
|
* 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 "scrollkeepertreebuilder.h"
|
|
|
|
|
|
|
|
#include "navigatoritem.h"
|
|
|
|
#include "docentry.h"
|
|
|
|
|
|
|
|
#include <kapplication.h>
|
|
|
|
#include <kconfig.h>
|
|
|
|
#include <kdebug.h>
|
|
|
|
#include <kglobal.h>
|
|
|
|
#include <klocale.h>
|
|
|
|
#include <kprocio.h>
|
|
|
|
|
|
|
|
#include <tqdom.h>
|
|
|
|
#include <tqfile.h>
|
|
|
|
#include <tqregexp.h>
|
|
|
|
|
|
|
|
using namespace KHC;
|
|
|
|
|
|
|
|
ScrollKeeperTreeBuilder::ScrollKeeperTreeBuilder( TQObject *parent, const char *name )
|
|
|
|
: TQObject( parent, name )
|
|
|
|
{
|
|
|
|
loadConfig();
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScrollKeeperTreeBuilder::loadConfig()
|
|
|
|
{
|
|
|
|
KConfig *cfg = kapp->config();
|
|
|
|
{
|
|
|
|
KConfigGroupSaver groupSaver( cfg, "ScrollKeeper" );
|
|
|
|
mShowEmptyDirs = cfg->readBoolEntry( "ShowEmptyDirs", false );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
NavigatorItem *ScrollKeeperTreeBuilder::build( NavigatorItem *parent,
|
|
|
|
NavigatorItem *after )
|
|
|
|
{
|
|
|
|
TQString lang = KGlobal::locale()->language();
|
|
|
|
|
|
|
|
kdDebug(1400) << "ScrollKeeper language: " << lang << endl;
|
|
|
|
|
|
|
|
KProcIO proc;
|
|
|
|
proc << "scrollkeeper-get-content-list";
|
|
|
|
proc << lang;
|
|
|
|
connect(&proc,TQT_SIGNAL(readReady(KProcIO *)),TQT_SLOT(getContentsList(KProcIO *)));
|
|
|
|
if (!proc.start(KProcess::Block)) {
|
|
|
|
kdDebug(1400) << "Could not execute scrollkeeper-get-content-list" << endl;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!TQFile::exists(mContentsList)) {
|
|
|
|
kdDebug(1400) << "Scrollkeeper contents file '" << mContentsList
|
|
|
|
<< "' does not exist." << endl;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
TQDomDocument doc("ScrollKeeperContentsList");
|
|
|
|
TQFile f(mContentsList);
|
|
|
|
if ( !f.open( IO_ReadOnly ) )
|
|
|
|
return 0;
|
|
|
|
if ( !doc.setContent( &f ) ) {
|
|
|
|
f.close();
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
f.close();
|
|
|
|
|
|
|
|
// Create top-level item
|
|
|
|
mItems.append(parent);
|
|
|
|
|
|
|
|
TQDomElement docElem = doc.documentElement();
|
|
|
|
|
|
|
|
NavigatorItem *result = 0;
|
|
|
|
|
|
|
|
TQDomNode n = docElem.firstChild();
|
|
|
|
while( !n.isNull() ) {
|
|
|
|
TQDomElement e = n.toElement();
|
|
|
|
if( !e.isNull() ) {
|
|
|
|
if (e.tagName() == "sect") {
|
|
|
|
NavigatorItem *createdItem;
|
|
|
|
insertSection( parent, after, e, createdItem );
|
|
|
|
if ( createdItem ) result = createdItem;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
n = n.nextSibling();
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScrollKeeperTreeBuilder::getContentsList( KProcIO *proc )
|
|
|
|
{
|
|
|
|
TQString filename;
|
|
|
|
proc->readln( filename, true );
|
|
|
|
|
|
|
|
mContentsList = filename;
|
|
|
|
}
|
|
|
|
|
|
|
|
int ScrollKeeperTreeBuilder::insertSection( NavigatorItem *parent,
|
|
|
|
NavigatorItem *after,
|
|
|
|
const TQDomNode §Node,
|
|
|
|
NavigatorItem *§Item )
|
|
|
|
{
|
|
|
|
DocEntry *entry = new DocEntry( "", "", "contents2" );
|
|
|
|
sectItem = new NavigatorItem( entry, parent, after );
|
|
|
|
sectItem->setAutoDeleteDocEntry( true );
|
|
|
|
mItems.append( sectItem );
|
|
|
|
|
|
|
|
int numDocs = 0; // Number of docs created in this section
|
|
|
|
|
|
|
|
TQDomNode n = sectNode.firstChild();
|
|
|
|
while( !n.isNull() ) {
|
|
|
|
TQDomElement e = n.toElement();
|
|
|
|
if( !e.isNull() ) {
|
|
|
|
if ( e.tagName() == "title" ) {
|
|
|
|
entry->setName( e.text() );
|
|
|
|
sectItem->updateItem();
|
|
|
|
} else if (e.tagName() == "sect") {
|
|
|
|
NavigatorItem *created;
|
|
|
|
numDocs += insertSection( sectItem, 0, e, created );
|
|
|
|
} else if (e.tagName() == "doc") {
|
|
|
|
insertDoc(sectItem,e);
|
|
|
|
++numDocs;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
n = n.nextSibling();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Remove empty sections
|
|
|
|
if (!mShowEmptyDirs && numDocs == 0) {
|
|
|
|
delete sectItem;
|
|
|
|
sectItem = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
return numDocs;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScrollKeeperTreeBuilder::insertDoc( NavigatorItem *parent,
|
|
|
|
const TQDomNode &docNode )
|
|
|
|
{
|
|
|
|
DocEntry *entry = new DocEntry( "", "", "document2" );
|
|
|
|
NavigatorItem *docItem = new NavigatorItem( entry, parent );
|
|
|
|
docItem->setAutoDeleteDocEntry( true );
|
|
|
|
mItems.append( docItem );
|
|
|
|
|
|
|
|
TQString url;
|
|
|
|
|
|
|
|
TQDomNode n = docNode.firstChild();
|
|
|
|
while( !n.isNull() ) {
|
|
|
|
TQDomElement e = n.toElement();
|
|
|
|
if( !e.isNull() ) {
|
|
|
|
if ( e.tagName() == "doctitle" ) {
|
|
|
|
entry->setName( e.text() );
|
|
|
|
docItem->updateItem();
|
|
|
|
} else if ( e.tagName() == "docsource" ) {
|
|
|
|
url.append( e.text() );
|
|
|
|
} else if ( e.tagName() == "docformat" ) {
|
|
|
|
TQString mimeType = e.text();
|
|
|
|
if ( mimeType == "text/html") {
|
|
|
|
// Let the HTML part figure out how to get the doc
|
|
|
|
} else if ( mimeType == "text/xml" ) {
|
|
|
|
if ( url.left( 5 ) == "file:" ) url = url.mid( 5 );
|
|
|
|
url.prepend( "ghelp:" );
|
|
|
|
#if 0
|
|
|
|
url.replace( TQRegExp( ".xml$" ), ".html" );
|
|
|
|
#endif
|
|
|
|
} else if ( mimeType == "text/sgml" ) {
|
|
|
|
// GNOME docs use this type. We don't have a real viewer for this.
|
|
|
|
url.prepend( "file:" );
|
|
|
|
} else if ( mimeType.left(5) == "text/" ) {
|
|
|
|
url.prepend( "file:" );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
n = n.nextSibling();
|
|
|
|
}
|
|
|
|
|
|
|
|
entry->setUrl( url );
|
|
|
|
}
|
|
|
|
|
|
|
|
#include "scrollkeepertreebuilder.moc"
|
|
|
|
// vim:sw=2:ts=2:et
|