summaryrefslogtreecommitdiffstats
path: root/tqtinterface/qt4/tools/assistant/helpdialogimpl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tqtinterface/qt4/tools/assistant/helpdialogimpl.cpp')
-rw-r--r--tqtinterface/qt4/tools/assistant/helpdialogimpl.cpp1161
1 files changed, 0 insertions, 1161 deletions
diff --git a/tqtinterface/qt4/tools/assistant/helpdialogimpl.cpp b/tqtinterface/qt4/tools/assistant/helpdialogimpl.cpp
deleted file mode 100644
index db7b0af..0000000
--- a/tqtinterface/qt4/tools/assistant/helpdialogimpl.cpp
+++ /dev/null
@@ -1,1161 +0,0 @@
-/**********************************************************************
-** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
-**
-** This file is part of TQt Assistant.
-**
-** This file may be used under the terms of the GNU General
-** Public License versions 2.0 or 3.0 as published by the Free
-** Software Foundation and appearing in the files LICENSE.GPL2
-** and LICENSE.GPL3 included in the packaging of this file.
-** Alternatively you may (at your option) use any later version
-** of the GNU General Public License if such license has been
-** publicly approved by Trolltech ASA (or its successors, if any)
-** and the KDE Free TQt Foundation.
-**
-** Please review the following information to ensure GNU General
-** Public Licensing requirements will be met:
-** http://trolltech.com/products/qt/licenses/licensing/opensource/.
-** If you are unsure which license is appropriate for your use, please
-** review the following information:
-** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
-** or contact the sales department at sales@trolltech.com.
-**
-** Licensees holding valid TQt Commercial licenses may use this file in
-** accordance with the TQt Commercial License Agreement provided with
-** the Software.
-**
-** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
-** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
-** herein.
-**
-**********************************************************************/
-
-#include "helpdialogimpl.h"
-#include "helpwindow.h"
-#include "topicchooserimpl.h"
-#include "docuparser.h"
-#include "mainwindow.h"
-#include "config.h"
-#include "tabbedbrowser.h"
-
-#include <tqaccel.h>
-#include <tqapplication.h>
-#include <tqcursor.h>
-#include <tqdir.h>
-#include <tqeventloop.h>
-#include <tqfile.h>
-#include <tqfileinfo.h>
-#include <tqheader.h>
-#include <tqlabel.h>
-#include <tqlineedit.h>
-#include <tqmessagebox.h>
-#include <tqpixmap.h>
-#include <tqprogressbar.h>
-#include <tqptrlist.h>
-#include <tqptrstack.h>
-#include <tqpushbutton.h>
-#include <tqregexp.h>
-#include <tqsettings.h>
-#include <tqstatusbar.h>
-#include <tqtabwidget.h>
-#include <tqtextbrowser.h>
-#include <tqtextstream.h>
-#include <tqtimer.h>
-#include <tqurl.h>
-#include <tqvalidator.h>
-
-#include <stdlib.h>
-#include <limits.h>
-
-static TQString stripAmpersand( const TQString &str )
-{
- TQString s( str );
- s = s.replace( '&', "" );
- return s;
-}
-
-static bool verifyDirectory(const TQString &str)
-{
- TQFileInfo dirInfo(str);
- if (!dirInfo.exists())
- return TQDir().mkdir(str);
- if (!dirInfo.isDir()) {
- qWarning("'%s' exists but is not a directory", str.latin1());
- return FALSE;
- }
- return TRUE;
-}
-
-struct IndexKeyword {
- IndexKeyword( const TQString &kw, const TQString &l )
- : keyword( kw ), link( l ) {}
- IndexKeyword() : keyword( TQString() ), link( TQString() ) {}
- bool operator<( const IndexKeyword &ik ) const {
- return keyword.lower() < ik.keyword.lower();
- }
- bool operator<=( const IndexKeyword &ik ) const {
- return keyword.lower() <= ik.keyword.lower();
- }
- bool operator>( const IndexKeyword &ik ) const {
- return keyword.lower() > ik.keyword.lower();
- }
- TQ_DUMMY_COMPARISON_OPERATOR( IndexKeyword )
- TQString keyword;
- TQString link;
-};
-
-TQDataStream &operator>>( TQDataStream &s, IndexKeyword &ik )
-{
- s >> ik.keyword;
- s >> ik.link;
- return s;
-}
-
-TQDataStream &operator<<( TQDataStream &s, const IndexKeyword &ik )
-{
- s << ik.keyword;
- s << ik.link;
- return s;
-}
-
-TQValidator::State SearchValidator::validate( TQString &str, int & ) const
-{
- for ( int i = 0; i < (int) str.length(); ++i ) {
- TQChar c = str[i];
- if ( !c.isLetterOrNumber() && c != '\'' && c != '`'
- && c != '\"' && c != ' ' && c != '-' && c != '_'
- && c!= '*' )
- return TQValidator::Invalid;
- }
- return TQValidator::Acceptable;
-}
-
-HelpNavigationListItem::HelpNavigationListItem( TQListBox *ls, const TQString &txt )
- : TQListBoxText( ls, txt )
-{
-}
-
-void HelpNavigationListItem::addLink( const TQString &link )
-{
- int hash = link.find( '#' );
- if ( hash == -1 ) {
- linkList << link;
- return;
- }
-
- TQString preHash = link.left( hash );
- if ( linkList.grep( preHash, FALSE ).count() > 0 )
- return;
- linkList << link;
-}
-
-HelpNavigationContentsItem::HelpNavigationContentsItem( TQListView *v, TQListViewItem *after )
- : TQListViewItem( v, after )
-{
-}
-
-HelpNavigationContentsItem::HelpNavigationContentsItem( TQListViewItem *v, TQListViewItem *after )
- : TQListViewItem( v, after )
-{
-}
-
-void HelpNavigationContentsItem::setLink( const TQString &lnk )
-{
- theLink = lnk;
-}
-
-TQString HelpNavigationContentsItem::link() const
-{
- return theLink;
-}
-
-
-
-HelpDialog::HelpDialog( TQWidget *parent, MainWindow *h )
- : HelpDialogBase( parent, 0, FALSE ), lwClosed( FALSE ), help( h )
-{
-}
-
-void HelpDialog::initialize()
-{
- connect( tabWidget, TQT_SIGNAL( selected(const TQString&) ),
- this, TQT_SLOT( currentTabChanged(const TQString&) ) );
- connect( listContents, TQT_SIGNAL( mouseButtonClicked(int, TQListViewItem*, const TQPoint &, int ) ),
- this, TQT_SLOT( showTopic(int,TQListViewItem*, const TQPoint &) ) );
- connect( listContents, TQT_SIGNAL( currentChanged(TQListViewItem*) ),
- this, TQT_SLOT( currentContentsChanged(TQListViewItem*) ) );
- connect( listContents, TQT_SIGNAL( selectionChanged(TQListViewItem*) ),
- this, TQT_SLOT( currentContentsChanged(TQListViewItem*) ) );
- connect( listContents, TQT_SIGNAL( doubleClicked(TQListViewItem*) ),
- this, TQT_SLOT( showTopic(TQListViewItem*) ) );
- connect( listContents, TQT_SIGNAL( returnPressed(TQListViewItem*) ),
- this, TQT_SLOT( showTopic(TQListViewItem*) ) );
- connect( listContents, TQT_SIGNAL( contextMenuRequested( TQListViewItem*, const TQPoint&, int ) ),
- this, TQT_SLOT( showItemMenu( TQListViewItem*, const TQPoint& ) ) );
- connect( editIndex, TQT_SIGNAL( returnPressed() ),
- this, TQT_SLOT( showTopic() ) );
- connect( editIndex, TQT_SIGNAL( textChanged(const TQString&) ),
- this, TQT_SLOT( searchInIndex(const TQString&) ) );
-
- connect( listIndex, TQT_SIGNAL( selectionChanged(TQListBoxItem*) ),
- this, TQT_SLOT( currentIndexChanged(TQListBoxItem*) ) );
- connect( listIndex, TQT_SIGNAL( returnPressed(TQListBoxItem*) ),
- this, TQT_SLOT( showTopic() ) );
- connect( listIndex, TQT_SIGNAL( mouseButtonClicked(int, TQListBoxItem*, const TQPoint &) ),
- this, TQT_SLOT( showTopic( int, TQListBoxItem *, const TQPoint & ) ) );
- connect( listIndex, TQT_SIGNAL( currentChanged(TQListBoxItem*) ),
- this, TQT_SLOT( currentIndexChanged(TQListBoxItem*) ) );
- connect( listIndex, TQT_SIGNAL( contextMenuRequested( TQListBoxItem*, const TQPoint& ) ),
- this, TQT_SLOT( showItemMenu( TQListBoxItem*, const TQPoint& ) ) );
-
- connect( listBookmarks, TQT_SIGNAL( mouseButtonClicked(int, TQListViewItem*, const TQPoint&, int ) ),
- this, TQT_SLOT( showTopic(int, TQListViewItem*, const TQPoint &) ) );
- connect( listBookmarks, TQT_SIGNAL( returnPressed(TQListViewItem*) ),
- this, TQT_SLOT( showTopic(TQListViewItem*) ) );
- connect( listBookmarks, TQT_SIGNAL( selectionChanged(TQListViewItem*) ),
- this, TQT_SLOT( currentBookmarkChanged(TQListViewItem*) ) );
- connect( listBookmarks, TQT_SIGNAL( currentChanged(TQListViewItem*) ),
- this, TQT_SLOT( currentBookmarkChanged(TQListViewItem*) ) );
- connect( listBookmarks, TQT_SIGNAL( contextMenuRequested( TQListViewItem*, const TQPoint&, int ) ),
- this, TQT_SLOT( showItemMenu( TQListViewItem*, const TQPoint& ) ) );
- connect( resultBox, TQT_SIGNAL( contextMenuRequested( TQListBoxItem*, const TQPoint& ) ),
- this, TQT_SLOT( showItemMenu( TQListBoxItem*, const TQPoint& ) ) );
-
- cacheFilesPath = TQDir::homeDirPath() + "/.assistant/"; //### Find a better location for the dbs
-
- editIndex->installEventFilter( this );
- listBookmarks->header()->hide();
- listBookmarks->header()->setStretchEnabled( TRUE );
- listContents->header()->hide();
- listContents->header()->setStretchEnabled( TRUE );
- framePrepare->hide();
- connect( tqApp, TQT_SIGNAL(lastWindowClosed()), TQT_SLOT(lastWinClosed()) );
-
- termsEdit->setValidator( new SearchValidator( TQT_TQOBJECT(termsEdit) ) );
-
- itemPopup = new TQPopupMenu( this );
- itemPopup->insertItem( tr( "Open Link in Current Tab" ), 0 );
- itemPopup->insertItem( tr( "Open Link in New Window" ), 1 );
- itemPopup->insertItem( tr( "Open Link in New Tab" ), 2 );
-
- contentList.setAutoDelete( TRUE );
- contentList.clear();
-
- initDoneMsgShown = FALSE;
- fullTextIndex = 0;
- indexDone = FALSE;
- titleMapDone = FALSE;
- contentsInserted = FALSE;
- bookmarksInserted = FALSE;
- setupTitleMap();
-}
-
-
-void HelpDialog::processEvents()
-{
- tqApp->eventLoop()->processEvents( TQEventLoop::ExcludeUserInput );
-}
-
-
-void HelpDialog::lastWinClosed()
-{
- lwClosed = TRUE;
-}
-
-
-void HelpDialog::removeOldCacheFiles()
-{
- TQString dir = cacheFilesPath; // ### remove the last '/' ?
- if (!verifyDirectory(cacheFilesPath)) {
- qWarning( "Failed to created assistant directory" );
- return;
- }
- TQString pname = "." + Config::configuration()->profileName();
-
- TQStringList fileList;
- fileList << "indexdb" << "indexdb.dict" << "indexdb.doc" << "contentdb";
- TQStringList::iterator it = fileList.begin();
- for ( ; it != fileList.end(); ++it ) {
- if ( TQFile::exists( cacheFilesPath + *it + pname ) ) {
- TQFile f( cacheFilesPath + *it + pname );
- f.remove();
- }
- }
-}
-
-void HelpDialog::timerEvent(TQTimerEvent *e)
-{
- static int opacity = 255;
- // To allow patching of 3.2.3 assistant for qsa.
-#if TQT_VERSION >= 0x030300
- help->setWindowOpacity((opacity-=4)/255.0);
- if (opacity<=0)
-#endif
- tqApp->quit();
-}
-
-
-void HelpDialog::loadIndexFile()
-{
- if ( indexDone )
- return;
-
- setCursor( Qt::WaitCursor );
- indexDone = TRUE;
- labelPrepare->setText( tr( "Prepare..." ) );
- framePrepare->show();
- processEvents();
-
- TQProgressBar *bar = progressPrepare;
- bar->setTotalSteps( 100 );
- bar->setProgress( 0 );
-
- keywordDocuments.clear();
- TQValueList<IndexKeyword> lst;
- TQFile indexFile( cacheFilesPath + "indexdb." +
- Config::configuration()->profileName() );
- if ( !indexFile.open( IO_ReadOnly ) ) {
- buildKeywordDB();
- processEvents();
- if( lwClosed )
- return;
- if (!indexFile.open(IO_ReadOnly)) {
- TQMessageBox::warning(help, tr("TQt Assistant"), tr("Failed to load keyword index file\n"
- "Assistant will not work!"));
-#if defined TQ_WS_WIN || defined TQ_WS_MACX
- startTimer(50);
-#endif
- return;
- }
- }
-
- editIndex->setEnabled(FALSE);
-
- TQDataStream ds( &indexFile );
- TQ_UINT32 fileAges;
- ds >> fileAges;
- if ( fileAges != getFileAges() ) {
- indexFile.close();
- buildKeywordDB();
- if ( !indexFile.open( IO_ReadOnly ) ) {
- TQMessageBox::warning( help, tr( "TQt Assistant" ),
- tr( "Cannot open the index file %1" ).arg( TQFileInfo( indexFile ).absFilePath() ) );
- editIndex->setEnabled(TRUE);
- return;
- }
- ds.setDevice( &indexFile );
- ds >> fileAges;
- }
- ds >> lst;
- indexFile.close();
-
- bar->setProgress( bar->totalSteps() );
- processEvents();
-
- listIndex->clear();
- HelpNavigationListItem *lastItem = 0;
- TQString lastKeyword = TQString();
- TQValueList<IndexKeyword>::ConstIterator it = lst.begin();
- for ( ; it != lst.end(); ++it ) {
- if ( lastKeyword.lower() != (*it).keyword.lower() )
- lastItem = new HelpNavigationListItem( listIndex, (*it).keyword );
- lastItem->addLink( (*it).link );
- lastKeyword = (*it).keyword;
-
- TQString lnk = (*it).link;
- int i = lnk.findRev('#');
- if ( i > -1 )
- lnk = lnk.left( i );
- if (!keywordDocuments.contains(lnk))
- keywordDocuments.append(lnk);
- }
- framePrepare->hide();
- showInitDoneMessage();
- setCursor( Qt::ArrowCursor );
- editIndex->setEnabled(TRUE);
-}
-
-TQ_UINT32 HelpDialog::getFileAges()
-{
- TQStringList addDocuFiles = Config::configuration()->docFiles();
- TQStringList::const_iterator i = addDocuFiles.begin();
-
- TQ_UINT32 fileAges = 0;
- for( ; i != addDocuFiles.end(); ++i ) {
- TQFileInfo fi( *i );
- if ( fi.exists() )
- fileAges += fi.lastModified().toTime_t();
- }
-
- return fileAges;
-}
-
-void HelpDialog::buildKeywordDB()
-{
- TQStringList addDocuFiles = Config::configuration()->docFiles();
- TQStringList::iterator i = addDocuFiles.begin();
-
- int steps = 0;
- for( ; i != addDocuFiles.end(); i++ )
- steps += TQFileInfo( *i ).size();
-
- labelPrepare->setText( tr( "Prepare..." ) );
- progressPrepare->setTotalSteps( steps );
- progressPrepare->setProgress( 0 );
- processEvents();
-
- TQValueList<IndexKeyword> lst;
- TQ_UINT32 fileAges = 0;
- for( i = addDocuFiles.begin(); i != addDocuFiles.end(); i++ ){
- TQFile file( *i );
- if ( !file.exists() ) {
- TQMessageBox::warning( this, tr( "Warning" ),
- tr( "Documentation file %1 does not exist!\n"
- "Skipping file." ).arg( TQFileInfo( file ).absFilePath() ) );
- continue;
- }
- fileAges += TQFileInfo( file ).lastModified().toTime_t();
- DocuParser *handler = DocuParser::createParser( *i );
- bool ok = handler->parse( &file );
- file.close();
- if( !ok ){
- TQString msg = TQString( "In file %1:\n%2" )
- .arg( TQFileInfo( file ).absFilePath() )
- .arg( handler->errorProtocol() );
- TQMessageBox::critical( this, tr( "Parse Error" ), tr( msg ) );
- delete handler;
- continue;
- }
-
- TQPtrList<IndexItem> indLst = handler->getIndexItems();
- TQPtrListIterator<IndexItem> it( indLst );
- IndexItem *indItem;
- int counter = 0;
- while ( ( indItem = it.current() ) != 0 ) {
- TQFileInfo fi( indItem->reference );
- lst.append( IndexKeyword( indItem->keyword, fi.absFilePath() ) );
- if ( progressPrepare )
- progressPrepare->setProgress( progressPrepare->progress() +
- int(fi.absFilePath().length() * 1.6) );
-
- if( ++counter%100 == 0 ) {
- processEvents();
- if( lwClosed ) {
- return;
- }
- }
- ++it;
- }
- delete handler;
- }
- if ( !lst.isEmpty() )
- qHeapSort( lst );
-
- TQFile indexout( cacheFilesPath + "indexdb." + Config::configuration()->profileName() );
- if ( verifyDirectory(cacheFilesPath) && indexout.open( IO_WriteOnly ) ) {
- TQDataStream s( &indexout );
- s << fileAges;
- s << lst;
- indexout.close();
- }
-}
-
-void HelpDialog::setupTitleMap()
-{
- if ( titleMapDone )
- return;
- if ( Config::configuration()->docRebuild() ) {
- removeOldCacheFiles();
- Config::configuration()->setDocRebuild( FALSE );
- Config::configuration()->saveProfile( Config::configuration()->profile() );
- }
- if ( contentList.isEmpty() )
- getAllContents();
-
- titleMapDone = TRUE;
- titleMap.clear();
- TQDictIterator<ContentList> lstIt( contentList );
- for ( ; lstIt.current(); ++lstIt ) {
- TQValueList<ContentItem> &lst = *(lstIt.current());
- TQValueListConstIterator<ContentItem> it;
- for ( it = lst.begin(); it != lst.end(); ++it ) {
- TQFileInfo link( (*it).reference.simplifyWhiteSpace() );
- titleMap[ link.absFilePath() ] = (*it).title.stripWhiteSpace();
- }
- }
- processEvents();
-}
-
-void HelpDialog::getAllContents()
-{
- TQFile contentFile( cacheFilesPath + "contentdb." + Config::configuration()->profileName() );
- contentList.clear();
- if ( !contentFile.open( IO_ReadOnly ) ) {
- buildContentDict();
- return;
- }
-
- TQDataStream ds( &contentFile );
- TQ_UINT32 fileAges;
- ds >> fileAges;
- if ( fileAges != getFileAges() ) {
- contentFile.close();
- buildContentDict();
- return;
- }
- TQString key;
- TQValueList<ContentItem> lst;
- while ( !ds.atEnd() ) {
- ds >> key;
- ds >> lst;
- contentList.insert( key, new TQValueList<ContentItem>( lst ) );
- }
- contentFile.close();
- processEvents();
-
-}
-
-void HelpDialog::buildContentDict()
-{
- TQStringList docuFiles = Config::configuration()->docFiles();
-
- TQ_UINT32 fileAges = 0;
- for( TQStringList::iterator it = docuFiles.begin(); it != docuFiles.end(); it++ ) {
- TQFile file( *it );
- if ( !file.exists() ) {
- TQMessageBox::warning( this, tr( "Warning" ),
- tr( "Documentation file %1 does not exist!\n"
- "Skipping file." ).arg( TQFileInfo( file ).absFilePath() ) );
- continue;
- }
- fileAges += TQFileInfo( file ).lastModified().toTime_t();
- DocuParser *handler = DocuParser::createParser( *it );
- if( !handler ) {
- TQMessageBox::warning( this, tr( "Warning" ),
- tr( "Documentation file %1 is not compatible!\n"
- "Skipping file." ).arg( TQFileInfo( file ).absFilePath() ) );
- continue;
- }
- bool ok = handler->parse( &file );
- file.close();
- if( ok ) {
- contentList.insert( *it, new TQValueList<ContentItem>( handler->getContentItems() ) );
- delete handler;
- } else {
- TQString msg = TQString( "In file %1:\n%2" )
- .arg( TQFileInfo( file ).absFilePath() )
- .arg( handler->errorProtocol() );
- TQMessageBox::critical( this, tr( "Parse Error" ), tr( msg ) );
- continue;
- }
- }
-
- TQString pname = Config::configuration()->profileName();
- TQFile contentOut( cacheFilesPath + "contentdb." + pname );
- TQFile::remove( cacheFilesPath + "indexdb.dict." + pname );
- TQFile::remove( cacheFilesPath + "indexdb.doc." + pname );
- if ( contentOut.open( IO_WriteOnly ) ) {
- TQDataStream s( &contentOut );
- s << fileAges;
- TQDictIterator<ContentList> it( contentList );
- for ( ; it.current(); ++it ) {
- s << it.currentKey();
- s << *(it.current());
- }
- contentOut.close();
- }
-}
-
-void HelpDialog::currentTabChanged( const TQString &s )
-{
- if ( stripAmpersand( s ).contains( tr( "Index" ) ) )
- TQTimer::singleShot( 0, this, TQT_SLOT( loadIndexFile() ) );
- else if ( stripAmpersand( s ).contains( tr( "Bookmarks" ) ) )
- insertBookmarks();
- else if ( stripAmpersand( s ).contains( tr( "Contents" ) ) )
- TQTimer::singleShot( 0, this, TQT_SLOT( insertContents() ) );
- else if ( stripAmpersand( s ).contains( tr( "Search" ) ) )
- TQTimer::singleShot( 0, this, TQT_SLOT( setupFullTextIndex() ) );
-}
-
-void HelpDialog::showInitDoneMessage()
-{
- if ( initDoneMsgShown )
- return;
- initDoneMsgShown = TRUE;
- help->statusBar()->message( tr( "Done" ), 3000 );
-}
-
-void HelpDialog::currentIndexChanged( TQListBoxItem * )
-{
-}
-
-
-void HelpDialog::showTopic( int button, TQListBoxItem *item,
- const TQPoint & )
-{
- if( button == Qt::LeftButton && item )
- showTopic();
-}
-
-void HelpDialog::showTopic( int button, TQListViewItem *item,
- const TQPoint & )
-{
- if( button == Qt::LeftButton && item )
- showTopic();
-}
-
-void HelpDialog::showTopic( TQListViewItem *item )
-{
- if( item )
- showTopic();
-}
-
-void HelpDialog::showTopic()
-{
- if ( stripAmpersand( tabWidget->tabLabel( tabWidget->currentPage() ) ).contains( tr( "Index" ) ) )
- showIndexTopic();
- else if ( stripAmpersand( tabWidget->tabLabel( tabWidget->currentPage() ) ).contains( tr( "Bookmarks" ) ) )
- showBookmarkTopic();
- else if ( stripAmpersand( tabWidget->tabLabel( tabWidget->currentPage() ) ).contains( tr( "Contents" ) ) )
- showContentsTopic();
-}
-
-void HelpDialog::showIndexTopic()
-{
- TQListBoxItem *i = listIndex->item( listIndex->currentItem() );
- if ( !i )
- return;
-
- editIndex->blockSignals( TRUE );
- editIndex->setText( i->text() );
- editIndex->blockSignals( FALSE );
-
- HelpNavigationListItem *item = (HelpNavigationListItem*)i;
-
- TQStringList links = item->links();
- if ( links.count() == 1 ) {
- emit showLink( links.first() );
- } else {
- qHeapSort( links );
- TQStringList::Iterator it = links.begin();
- TQStringList linkList;
- TQStringList linkNames;
- for ( ; it != links.end(); ++it ) {
- linkList << *it;
- linkNames << titleOfLink( *it );
- }
- TQString link = TopicChooser::getLink( this, linkNames, linkList, i->text() );
- if ( !link.isEmpty() )
- emit showLink( link );
- }
-}
-
-void HelpDialog::searchInIndex( const TQString &s )
-{
- TQListBoxItem *i = listIndex->firstItem();
- TQString sl = s.lower();
- while ( i ) {
- TQString t = i->text();
- if ( t.length() >= sl.length() &&
- i->text().left(s.length()).lower() == sl ) {
- listIndex->setCurrentItem( i );
- listIndex->setTopItem(listIndex->index(i));
- break;
- }
- i = i->next();
- }
-}
-
-TQString HelpDialog::titleOfLink( const TQString &link )
-{
- TQString s( link );
- s.remove( s.find( '#' ), s.length() );
- s = titleMap[ s ];
- if ( s.isEmpty() )
- return link;
- return s;
-}
-
-bool HelpDialog::eventFilter( TQObject * o, TQEvent * e )
-{
- if ( !o || !e )
- return TRUE;
-
- if ( TQT_BASE_OBJECT(o) == TQT_BASE_OBJECT(editIndex) && e->type() == TQEvent::KeyPress ) {
- TQKeyEvent *ke = (TQKeyEvent*)e;
- if ( ke->key() == Qt::Key_Up ) {
- int i = listIndex->currentItem();
- if ( --i >= 0 ) {
- listIndex->setCurrentItem( i );
- editIndex->blockSignals( TRUE );
- editIndex->setText( listIndex->currentText() );
- editIndex->blockSignals( FALSE );
- }
- return TRUE;
- } else if ( ke->key() == Qt::Key_Down ) {
- int i = listIndex->currentItem();
- if ( ++i < int(listIndex->count()) ) {
- listIndex->setCurrentItem( i );
- editIndex->blockSignals( TRUE );
- editIndex->setText( listIndex->currentText() );
- editIndex->blockSignals( FALSE );
- }
- return TRUE;
- } else if ( ke->key() == TQt::Key_Next || ke->key() == TQt::Key_Prior ) {
- TQApplication::sendEvent( listIndex, e);
- editIndex->blockSignals( TRUE );
- editIndex->setText( listIndex->currentText() );
- editIndex->blockSignals( FALSE );
- }
- }
-
- return TQWidget::eventFilter( o, e );
-}
-
-void HelpDialog::addBookmark()
-{
- if ( !bookmarksInserted )
- insertBookmarks();
- TQString link = TQUrl( help->browsers()->currentBrowser()->context(),
- help->browsers()->currentBrowser()->source() ).path();
- TQString title = help->browsers()->currentBrowser()->documentTitle();
- if ( title.isEmpty() )
- title = titleOfLink( link );
- HelpNavigationContentsItem *i = new HelpNavigationContentsItem( listBookmarks, 0 );
- i->setText( 0, title );
- i->setLink( link );
- saveBookmarks();
- help->updateBookmarkMenu();
-}
-
-void HelpDialog::removeBookmark()
-{
- if ( !listBookmarks->currentItem() )
- return;
-
- delete listBookmarks->currentItem();
- saveBookmarks();
- if ( listBookmarks->firstChild() ) {
- listBookmarks->setSelected( listBookmarks->firstChild(), TRUE );
- }
- help->updateBookmarkMenu();
-}
-
-void HelpDialog::insertBookmarks()
-{
- if ( bookmarksInserted )
- return;
- bookmarksInserted = TRUE;
- listBookmarks->clear();
- TQFile f( cacheFilesPath + "bookmarks." + Config::configuration()->profileName() );
- if ( !f.open( IO_ReadOnly ) )
- return;
- TQTextStream ts( &f );
- while ( !ts.atEnd() ) {
- HelpNavigationContentsItem *i = new HelpNavigationContentsItem( listBookmarks, 0 );
- i->setText( 0, ts.readLine() );
- i->setLink( ts.readLine() );
- }
- help->updateBookmarkMenu();
- showInitDoneMessage();
-}
-
-void HelpDialog::currentBookmarkChanged( TQListViewItem * )
-{
-}
-
-void HelpDialog::showBookmarkTopic()
-{
- if ( !listBookmarks->currentItem() )
- return;
-
- HelpNavigationContentsItem *i = (HelpNavigationContentsItem*)listBookmarks->currentItem();
- TQString absPath = "";
- if ( TQFileInfo( i->link() ).isRelative() )
- absPath = documentationPath + "/";
- emit showLink( absPath + i->link() );
-}
-
-void HelpDialog::saveBookmarks()
-{
- TQFile f( cacheFilesPath + "bookmarks." + Config::configuration()->profileName() );
- if ( !f.open( IO_WriteOnly ) )
- return;
- TQTextStream ts( &f );
- TQListViewItemIterator it( listBookmarks );
- for ( ; it.current(); ++it ) {
- HelpNavigationContentsItem *i = (HelpNavigationContentsItem*)it.current();
- ts << i->text( 0 ) << endl;
- ts << i->link() << endl;
- }
- f.close();
-}
-
-void HelpDialog::insertContents()
-{
- if ( contentsInserted )
- return;
-
- if ( contentList.isEmpty() )
- getAllContents();
-
- contentsInserted = TRUE;
- listContents->clear();
- setCursor( Qt::WaitCursor );
- if ( !titleMapDone )
- setupTitleMap();
-
- listContents->setSorting( -1 );
-
- TQDictIterator<ContentList> lstIt( contentList );
- for ( ; lstIt.current(); ++lstIt ) {
- HelpNavigationContentsItem *newEntry;
-
- HelpNavigationContentsItem *contentEntry = 0;
- TQPtrStack<HelpNavigationContentsItem> stack;
- stack.clear();
- int depth = 0;
- bool root = FALSE;
-
- HelpNavigationContentsItem *lastItem[64];
- for( int j = 0; j < 64; ++j )
- lastItem[j] = 0;
-
-
- TQValueList<ContentItem> &lst = *(lstIt.current());
- TQValueListConstIterator<ContentItem> it;
- for( it = lst.begin(); it != lst.end(); ++it ){
- ContentItem item = *it;
- if( item.depth == 0 ){
- newEntry = new HelpNavigationContentsItem( listContents, 0 );
- newEntry->setPixmap( 0, TQPixmap::fromMimeSource( "book.png" ) );
- newEntry->setText( 0, item.title );
- newEntry->setLink( item.reference );
- stack.push( newEntry );
- depth = 1;
- root = TRUE;
- }
- else{
- if( (item.depth > depth) && root ) {
- depth = item.depth;
- stack.push( contentEntry );
- }
- if( item.depth == depth ) {
- contentEntry = new HelpNavigationContentsItem( stack.top(), lastItem[ depth ] );
- lastItem[ depth ] = contentEntry;
- contentEntry->setText( 0, item.title );
- contentEntry->setLink( item.reference );
- }
- else if( item.depth < depth ) {
- stack.pop();
- depth--;
- item = *(--it);
- }
- }
- }
- processEvents();
- }
- setCursor( Qt::ArrowCursor );
- showInitDoneMessage();
-}
-
-void HelpDialog::currentContentsChanged( TQListViewItem * )
-{
-}
-
-void HelpDialog::showContentsTopic()
-{
- HelpNavigationContentsItem *i = (HelpNavigationContentsItem*)listContents->currentItem();
- if ( !i )
- return;
- emit showLink( i->link() );
-}
-
-void HelpDialog::toggleContents()
-{
- if ( !isVisible() || tabWidget->currentPageIndex() != 0 ) {
- tabWidget->setCurrentPage( 0 );
- parentWidget()->show();
- }
- else
- parentWidget()->hide();
-}
-
-void HelpDialog::toggleIndex()
-{
- if ( !isVisible() || tabWidget->currentPageIndex() != 1 || !editIndex->hasFocus() ) {
- tabWidget->setCurrentPage( 1 );
- parentWidget()->show();
- editIndex->setFocus();
- }
- else
- parentWidget()->hide();
-}
-
-void HelpDialog::toggleBookmarks()
-{
- if ( !isVisible() || tabWidget->currentPageIndex() != 2 ) {
- tabWidget->setCurrentPage( 2 );
- parentWidget()->show();
- }
- else
- parentWidget()->hide();
-}
-
-void HelpDialog::toggleSearch()
-{
- if ( !isVisible() || tabWidget->currentPageIndex() != 3 ) {
- tabWidget->setCurrentPage( 3 );
- parentWidget()->show();
- }
- else
- parentWidget()->hide();
-}
-
-void HelpDialog::setupFullTextIndex()
-{
- if ( fullTextIndex )
- return;
-
- TQStringList documentList;
- TQString pname = Config::configuration()->profileName();
- fullTextIndex = new Index( documentList, TQDir::homeDirPath() ); // ### Is this correct ?
- if (!verifyDirectory(cacheFilesPath)) {
- TQMessageBox::warning(help, tr("TQt Assistant"),
- tr("Failed to save fulltext search index\n"
- "Assistant will not work!"));
- return;
- }
- searchButton->setEnabled(FALSE);
- helpButton->setEnabled(FALSE);
- termsEdit->setEnabled(FALSE);
-
- fullTextIndex->setDictionaryFile( cacheFilesPath + "indexdb.dict." + pname );
- fullTextIndex->setDocListFile( cacheFilesPath + "indexdb.doc." + pname );
- processEvents();
-
- connect( fullTextIndex, TQT_SIGNAL( indexingProgress( int ) ),
- this, TQT_SLOT( setIndexingProgress( int ) ) );
- TQFile f( cacheFilesPath + "indexdb.dict." + pname );
- if ( !f.exists() ) {
- TQMap<TQString, TQString>::ConstIterator it = titleMap.begin();
- TQString documentName;
- for ( ; it != titleMap.end(); ++it ) {
- documentName = it.key();
- int i = documentName.findRev('#');
- if ( i > -1 )
- documentName = documentName.left( i );
-
- if (!documentList.contains(documentName))
- documentList << documentName;
- }
- loadIndexFile();
- for (TQStringList::Iterator it2 = keywordDocuments.begin(); it2 != keywordDocuments.end(); ++it2) {
- if (!documentList.contains(*it2))
- documentList << *it2;
- }
- fullTextIndex->setDocList( documentList );
-
- help->statusBar()->clear();
- setCursor( Qt::WaitCursor );
- labelPrepare->setText( tr( "Indexing files..." ) );
- progressPrepare->setTotalSteps( 100 );
- progressPrepare->reset();
- progressPrepare->show();
- framePrepare->show();
- processEvents();
- if ( fullTextIndex->makeIndex() != -1 ) {
- fullTextIndex->writeDict();
- progressPrepare->setProgress( 100 );
- framePrepare->hide();
- setCursor( Qt::ArrowCursor );
- showInitDoneMessage();
- keywordDocuments.clear();
- }
- } else {
- setCursor( Qt::WaitCursor );
- help->statusBar()->message( tr( "Reading dictionary..." ) );
- processEvents();
- fullTextIndex->readDict();
- help->statusBar()->message( tr( "Done" ), 3000 );
- setCursor( Qt::ArrowCursor );
- }
- searchButton->setEnabled(TRUE);
- termsEdit->setEnabled(TRUE);
- helpButton->setEnabled(TRUE);
-}
-
-void HelpDialog::setIndexingProgress( int prog )
-{
- progressPrepare->setProgress( prog );
- processEvents();
-}
-
-void HelpDialog::startSearch()
-{
- TQString str = termsEdit->text();
- str = str.replace( "\'", "\"" );
- str = str.replace( "`", "\"" );
- TQString buf = str;
- str = str.replace( "-", " " );
- str = str.replace( TQRegExp( "\\s[\\S]?\\s" ), " " );
- terms = TQStringList::split( " ", str );
- TQStringList termSeq;
- TQStringList seqWords;
- TQStringList::iterator it = terms.begin();
- for ( ; it != terms.end(); ++it ) {
- (*it) = (*it).simplifyWhiteSpace();
- (*it) = (*it).lower();
- (*it) = (*it).replace( "\"", "" );
- }
- if ( str.contains( '\"' ) ) {
- if ( (str.contains( '\"' ))%2 == 0 ) {
- int beg = 0;
- int end = 0;
- TQString s;
- beg = str.find( '\"', beg );
- while ( beg != -1 ) {
- beg++;
- end = str.find( '\"', beg );
- s = str.mid( beg, end - beg );
- s = s.lower();
- s = s.simplifyWhiteSpace();
- if ( s.contains( '*' ) ) {
- TQMessageBox::warning( this, tr( "Full Text Search" ),
- tr( "Using a wildcard within phrases is not allowed." ) );
- return;
- }
- seqWords += TQStringList::split( ' ', s );
- termSeq << s;
- beg = str.find( '\"', end + 1);
- }
- } else {
- TQMessageBox::warning( this, tr( "Full Text Search" ),
- tr( "The closing quotation mark is missing." ) );
- return;
- }
- }
- setCursor( Qt::WaitCursor );
- foundDocs.clear();
- foundDocs = fullTextIndex->query( terms, termSeq, seqWords );
- TQString msg( TQString( "%1 documents found." ).arg( foundDocs.count() ) );
- help->statusBar()->message( tr( msg ), 3000 );
- resultBox->clear();
- for ( it = foundDocs.begin(); it != foundDocs.end(); ++it )
- resultBox->insertItem( fullTextIndex->getDocumentTitle( *it ) );
-
- terms.clear();
- bool isPhrase = FALSE;
- TQString s = "";
- for ( int i = 0; i < (int)buf.length(); ++i ) {
- if ( buf[i] == '\"' ) {
- isPhrase = !isPhrase;
- s = s.simplifyWhiteSpace();
- if ( !s.isEmpty() )
- terms << s;
- s = "";
- } else if ( buf[i] == ' ' && !isPhrase ) {
- s = s.simplifyWhiteSpace();
- if ( !s.isEmpty() )
- terms << s;
- s = "";
- } else
- s += buf[i];
- }
- if ( !s.isEmpty() )
- terms << s;
-
- setCursor( Qt::ArrowCursor );
-}
-
-void HelpDialog::showSearchHelp()
-{
- emit showLink( Config::configuration()->assistantDocPath() + "/assistant-5.html" );
-}
-
-void HelpDialog::showResultPage( int button, TQListBoxItem *i, const TQPoint & )
-{
- if( button == Qt::LeftButton ) {
- showResultPage( i );
- }
-}
-
-void HelpDialog::showResultPage( TQListBoxItem *i )
-{
- if( !i )
- return;
- emit showSearchLink( foundDocs[resultBox->index( i )], terms );
-}
-
-void HelpDialog::showItemMenu( TQListBoxItem *item, const TQPoint &pos )
-{
- if ( !item )
- return;
- int id = itemPopup->exec( pos );
- if ( id == 0 ) {
- if ( stripAmpersand( tabWidget->tabLabel( tabWidget->currentPage() ) ).contains( tr( "Index" ) ) )
- showTopic();
- else {
- showResultPage( item );
- }
- } else if ( id > 0 ) {
- HelpWindow *hw = help->browsers()->currentBrowser();
- if ( stripAmpersand( tabWidget->tabLabel( tabWidget->currentPage() ) ).contains( tr( "Index" ) ) ) {
- editIndex->blockSignals( TRUE );
- editIndex->setText( item->text() );
- editIndex->blockSignals( FALSE );
-
- HelpNavigationListItem *hi = (HelpNavigationListItem*)item;
-
- TQStringList links = hi->links();
- if ( links.count() == 1 ) {
- if ( id == 1 )
- hw->openLinkInNewWindow( links.first() );
- else
- hw->openLinkInNewPage( links.first() );
- } else {
- TQStringList::Iterator it = links.begin();
- TQStringList linkList;
- TQStringList linkNames;
- for ( ; it != links.end(); ++it ) {
- linkList << *it;
- linkNames << titleOfLink( *it );
- }
- TQString link = TopicChooser::getLink( this, linkNames, linkList, item->text() );
- if ( !link.isEmpty() ) {
- if ( id == 1 )
- hw->openLinkInNewWindow( link );
- else
- hw->openLinkInNewPage( link );
- }
- }
- } else {
- TQString link = foundDocs[ resultBox->index( item ) ];
- if ( id == 1 )
- hw->openLinkInNewWindow( link );
- else
- hw->openLinkInNewPage( link );
- }
- }
-}
-
-void HelpDialog::showItemMenu( TQListViewItem *item, const TQPoint &pos )
-{
- if ( !item )
- return;
- int id = itemPopup->exec( pos );
- if ( id == 0 ) {
- if ( stripAmpersand( tabWidget->tabLabel( tabWidget->currentPage() ) ).contains( tr( "Contents" ) ) )
- showContentsTopic();
- else
- showBookmarkTopic();
- } else if ( id > 0 ) {
- HelpNavigationContentsItem *i = (HelpNavigationContentsItem*)item;
- if ( id == 1 )
- help->browsers()->currentBrowser()->openLinkInNewWindow( i->link() );
- else
- help->browsers()->currentBrowser()->openLinkInNewPage( i->link() );
- }
-}