You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdebase/khelpcenter/docentry.cpp

349 lines
6.7 KiB

#include <qregexp.h>
#include <qfileinfo.h>
#include <kdebug.h>
#include <kdesktopfile.h>
#include <kurl.h>
#include <kstandarddirs.h>
#include <kapplication.h>
#include "prefs.h"
#include "docentry.h"
using namespace KHC;
DocEntry::DocEntry()
{
init();
}
DocEntry::DocEntry( const QString &name, const QString &url,
const QString &icon )
{
init();
mName = name;
mUrl = url;
mIcon = icon;
}
void DocEntry::init()
{
mWeight = 0;
mSearchEnabled = false;
mDirectory = false;
mParent = 0;
mNextSibling = 0;
}
void DocEntry::setName( const QString &name )
{
mName = name;
}
QString DocEntry::name() const
{
return mName;
}
void DocEntry::setSearch( const QString &search )
{
mSearch = search;
}
QString DocEntry::search() const
{
return mSearch;
}
void DocEntry::setIcon( const QString &icon )
{
mIcon = icon;
}
QString DocEntry::icon() const
{
if ( !mIcon.isEmpty() ) return mIcon;
if ( !docExists() ) return "unknown";
if ( isDirectory() ) return "contents2";
else return "document2";
}
void DocEntry::setUrl( const QString &url )
{
mUrl = url;
}
QString DocEntry::url() const
{
if ( !mUrl.isEmpty() ) return mUrl;
if ( identifier().isEmpty() ) return QString::null;
return "khelpcenter:" + identifier();
}
void DocEntry::setInfo( const QString &info )
{
mInfo = info;
}
QString DocEntry::info() const
{
return mInfo;
}
void DocEntry::setLang( const QString &lang )
{
mLang = lang;
}
QString DocEntry::lang() const
{
return mLang;
}
void DocEntry::setIdentifier( const QString &identifier )
{
mIdentifier = identifier;
}
QString DocEntry::identifier() const
{
if ( mIdentifier.isEmpty() ) mIdentifier = KApplication::randomString( 15 );
return mIdentifier;
}
void DocEntry::setIndexer( const QString &indexer )
{
mIndexer = indexer;
}
QString DocEntry::indexer() const
{
return mIndexer;
}
void DocEntry::setIndexTestFile( const QString &indexTestFile )
{
mIndexTestFile = indexTestFile;
}
QString DocEntry::indexTestFile() const
{
return mIndexTestFile;
}
void DocEntry::setWeight( int weight )
{
mWeight = weight;
}
int DocEntry::weight() const
{
return mWeight;
}
void DocEntry::setSearchMethod( const QString &method )
{
mSearchMethod = method;
}
QString DocEntry::searchMethod() const
{
return mSearchMethod;
}
void DocEntry::setDocumentType( const QString &str )
{
mDocumentType = str;
}
QString DocEntry::documentType() const
{
return mDocumentType;
}
QString DocEntry::khelpcenterSpecial() const
{
return mKhelpcenterSpecial;
}
void DocEntry::enableSearch( bool enabled )
{
mSearchEnabled = enabled;
}
bool DocEntry::searchEnabled() const
{
return mSearchEnabled;
}
void DocEntry::setSearchEnabledDefault( bool enabled )
{
mSearchEnabledDefault = enabled;
}
bool DocEntry::searchEnabledDefault() const
{
return mSearchEnabledDefault;
}
void DocEntry::setDirectory( bool dir )
{
mDirectory = dir;
}
bool DocEntry::isDirectory() const
{
return mDirectory;
}
bool DocEntry::readFromFile( const QString &fileName )
{
KDesktopFile file( fileName );
mName = file.readName();
mSearch = file.readEntry( "X-DOC-Search" );
mIcon = file.readIcon();
mUrl = file.readPathEntry( "DocPath" );
mInfo = file.readEntry( "Info" );
if ( mInfo.isNull() ) mInfo = file.readEntry( "Comment" );
mLang = file.readEntry( "Lang", "en" );
mIdentifier = file.readEntry( "X-DOC-Identifier" );
if ( mIdentifier.isEmpty() ) {
QFileInfo fi( fileName );
mIdentifier = fi.baseName( true );
}
mIndexer = file.readEntry( "X-DOC-Indexer" );
mIndexer.replace( "%f", fileName );
mIndexTestFile = file.readEntry( "X-DOC-IndexTestFile" );
mSearchEnabledDefault = file.readBoolEntry( "X-DOC-SearchEnabledDefault",
false );
mSearchEnabled = mSearchEnabledDefault;
mWeight = file.readNumEntry( "X-DOC-Weight", 0 );
mSearchMethod = file.readEntry( "X-DOC-SearchMethod" );
mDocumentType = file.readEntry( "X-DOC-DocumentType" );
mKhelpcenterSpecial = file.readEntry("X-KDE-KHelpcenter-Special");
return true;
}
bool DocEntry::indexExists( const QString &indexDir )
{
QString testFile;
if ( mIndexTestFile.isEmpty() ) {
testFile = identifier() + ".exists";
} else {
testFile = mIndexTestFile;
}
if ( !testFile.startsWith( "/" ) ) testFile = indexDir + "/" + testFile;
return QFile::exists( testFile );
}
bool DocEntry::docExists() const
{
if ( !mUrl.isEmpty() ) {
KURL docUrl( mUrl );
if ( docUrl.isLocalFile() && !KStandardDirs::exists( docUrl.path() ) ) {
// kdDebug(1400) << "URL not found: " << docUrl.url() << endl;
return false;
}
}
return true;
}
void DocEntry::addChild( DocEntry *entry )
{
entry->setParent( this );
uint i;
for( i = 0; i < mChildren.count(); ++i ) {
if ( i == 0 ) {
if ( entry->weight() < mChildren.first()->weight() ) {
entry->setNextSibling( mChildren.first() );
mChildren.prepend( entry );
break;
}
}
if ( i + 1 < mChildren.count() ) {
if ( entry->weight() >= mChildren[ i ]->weight() &&
entry->weight() < mChildren[ i + 1 ]->weight() ) {
entry->setNextSibling( mChildren[ i + 1 ] );
mChildren[ i ]->setNextSibling( entry );
mChildren.insert( mChildren.at( i + 1 ), entry );
break;
}
}
}
if ( i == mChildren.count() ) {
if ( i > 0 ) {
mChildren.last()->setNextSibling( entry );
}
mChildren.append( entry );
}
}
bool DocEntry::hasChildren()
{
return mChildren.count();
}
DocEntry *DocEntry::firstChild()
{
return mChildren.first();
}
DocEntry::List DocEntry::children()
{
return mChildren;
}
void DocEntry::setParent( DocEntry *parent )
{
mParent = parent;
}
DocEntry *DocEntry::parent()
{
return mParent;
}
void DocEntry::setNextSibling( DocEntry *next )
{
mNextSibling = next;
}
DocEntry *DocEntry::nextSibling()
{
return mNextSibling;
}
bool DocEntry::isSearchable()
{
return !search().isEmpty() && docExists() &&
indexExists( Prefs::indexDirectory() );
}
void DocEntry::dump() const
{
kdDebug() << " <docentry>" << endl;
kdDebug() << " <name>" << mName << "</name>" << endl;
kdDebug() << " <searchmethod>" << mSearchMethod << "</searchmethod>" << endl;
kdDebug() << " <search>" << mSearch << "</search>" << endl;
kdDebug() << " <indexer>" << mIndexer << "</indexer>" << endl;
kdDebug() << " <indextestfile>" << mIndexTestFile << "</indextestfile>" << endl;
kdDebug() << " <icon>" << mIcon << "</icon>" << endl;
kdDebug() << " <url>" << mUrl << "</url>" << endl;
kdDebug() << " <documenttype>" << mDocumentType << "</documenttype>" << endl;
kdDebug() << " </docentry>" << endl;
}
// vim:ts=2:sw=2:et