diff options
Diffstat (limited to 'src/modules/help/helpwindow.cpp')
-rw-r--r-- | src/modules/help/helpwindow.cpp | 329 |
1 files changed, 329 insertions, 0 deletions
diff --git a/src/modules/help/helpwindow.cpp b/src/modules/help/helpwindow.cpp new file mode 100644 index 00000000..9fc11427 --- /dev/null +++ b/src/modules/help/helpwindow.cpp @@ -0,0 +1,329 @@ +// +// File : helpwindow.cpp +// Creation date : Tue Aug 11 2000 18:08:22 by Szymon Stefanek +// +// This file is part of the KVirc irc client distribution +// Copyright (C) 1999-2000 Szymon Stefanek (pragma at kvirc dot net) +// +// This program is FREE software. You can redistribute it and/or +// modify it under the m_terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your opinion) 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 "helpwindow.h" +#include "helpwidget.h" +#include "kvi_app.h" + +#include "kvi_iconmanager.h" +#include "kvi_options.h" +#include "kvi_locale.h" +#include "kvi_module.h" +#include "kvi_config.h" +#include "kvi_styled_controls.h" + +#include <qfileinfo.h> +#include <qsplitter.h> +#include <qlineedit.h> +#include <qmessagebox.h> +#include <qregexp.h> +#include <qtooltip.h> +#include "kvi_valuelist.h" + +#include "kvi_sourcesdate.h" + +extern Index * g_pDocIndex; +extern KviPointerList<KviHelpWindow> * g_pHelpWindowList; +extern KviPointerList<KviHelpWidget> * g_pHelpWidgetList; + +bool g_bIndexingDone = FALSE; +KviHelpWindow::KviHelpWindow(KviFrame * lpFrm,const char * name) +: KviWindow(KVI_WINDOW_TYPE_HELP,lpFrm,name) +{ + + if(!g_bIndexingDone) + { + QString szDoclist,szDict; + + g_pApp->getLocalKvircDirectory(szDoclist,KviApp::Help,"help.doclist." KVI_SOURCES_DATE); + g_pApp->getLocalKvircDirectory(szDict,KviApp::Help,"help.dict." KVI_SOURCES_DATE); + + if ( QFileInfo( szDoclist ).exists() && QFileInfo( szDict ).exists() ) { + g_pDocIndex->readDict(); + } else { +#ifdef COMPILE_USE_QT4 + QProgressDialog* pProgressDialog = new QProgressDialog( __tr2qs("Indexing help files"), __tr2qs("Cancel"), 0,100 ); +#else + QProgressDialog* pProgressDialog = new QProgressDialog( __tr2qs("Indexing help files"), __tr2qs("Cancel"), 100 ); +#endif + connect(g_pDocIndex,SIGNAL(indexingProgress(int)), pProgressDialog, SLOT(setProgress(int)) ); + g_pDocIndex->makeIndex(); + g_pDocIndex->writeDict(); + g_pDocIndex->writeDocumentList(); + delete pProgressDialog; + } + g_bIndexingDone=TRUE; + } + + g_pHelpWindowList->append(this); + m_pSplitter = new QSplitter(Qt::Horizontal,this,"main_splitter"); + m_pHelpWidget = new KviHelpWidget(m_pSplitter,lpFrm); + + m_pToolBar=new KviTalVBox(m_pSplitter); + + m_pTabWidget = new QTabWidget(m_pToolBar); + + m_pIndexTab = new KviTalVBox(m_pTabWidget); + m_pTabWidget->insertTab(m_pIndexTab,__tr2qs("Index")); + + KviTalHBox* pSearchBox = new KviTalHBox(m_pIndexTab); + m_pIndexSearch = new QLineEdit(pSearchBox); + connect( m_pIndexSearch, SIGNAL( textChanged(const QString&) ), + this, SLOT( searchInIndex(const QString&) ) ); + connect( m_pIndexSearch, SIGNAL( returnPressed() ), + this, SLOT( showIndexTopic() ) ); + + KviStyledToolButton* pBtnRefreshIndex = new KviStyledToolButton(pSearchBox); + pBtnRefreshIndex->setIconSet(*g_pIconManager->getBigIcon(KVI_REFRESH_IMAGE_NAME)); + connect(pBtnRefreshIndex,SIGNAL(clicked()),this,SLOT(refreshIndex())); + QToolTip::add( pBtnRefreshIndex, __tr2qs("Refresh index") ); + + m_pIndexListBox = new KviTalListBox(m_pIndexTab); + QStringList docList=g_pDocIndex->titlesList(); + m_pIndexListBox->insertStringList(docList); + connect(m_pIndexListBox,SIGNAL(selected(int)),this,SLOT(indexSelected ( int ))); + m_pIndexListBox->sort(); + + m_pSearchTab = new KviTalVBox(m_pTabWidget); + m_pTabWidget->insertTab(m_pSearchTab,__tr2qs("Search")); + + m_pTermsEdit = new QLineEdit(m_pSearchTab); +/* connect( m_pTermsEdit, SIGNAL( textChanged(const QString&) ), + this, SLOT( searchInIndex(const QString&) ) );*/ + connect( m_pTermsEdit, SIGNAL( returnPressed() ), + this, SLOT( startSearch() ) ); + + m_pResultBox = new KviTalListBox(m_pSearchTab); + connect(m_pResultBox,SIGNAL(selected(int)),this,SLOT(searchSelected ( int ))); + + KviValueList<int> li; + li.append(width()-80); + li.append(80); + m_pSplitter->setSizes(li); + +} + +KviHelpWindow::~KviHelpWindow() +{ + g_pHelpWindowList->removeRef(this); +} + +void KviHelpWindow::saveProperties(KviConfig *cfg) +{ + KviWindow::saveProperties(cfg); + cfg->writeEntry("Splitter",m_pSplitter->sizes()); +} + +void KviHelpWindow::loadProperties(KviConfig *cfg) +{ + KviValueList<int> def; + int w = width(); + def.append((w * 82) / 100); + def.append((w * 18) / 100); + m_pSplitter->setSizes(cfg->readIntListEntry("Splitter",def)); + KviWindow::loadProperties(cfg); +} + + +void KviHelpWindow::refreshIndex() +{ + m_pIndexListBox->clear(); +#ifdef COMPILE_USE_QT4 + QProgressDialog* pProgressDialog = new QProgressDialog( __tr2qs("Indexing help files"), __tr2qs("Cancel"), 0,100 ); +#else + QProgressDialog* pProgressDialog = new QProgressDialog( __tr2qs("Indexing help files"), __tr2qs("Cancel"), 100 ); +#endif + connect(g_pDocIndex,SIGNAL(indexingProgress(int)), pProgressDialog, SLOT(setProgress(int)) ); + g_pDocIndex->makeIndex(); + g_pDocIndex->writeDict(); + g_pDocIndex->writeDocumentList(); + delete pProgressDialog; + g_bIndexingDone=TRUE; + QStringList docList=g_pDocIndex->titlesList(); + m_pIndexListBox->insertStringList(docList); + m_pIndexListBox->sort(); +} + +void KviHelpWindow::startSearch() +{ + + QString str = m_pTermsEdit->text(); + str = str.replace( "\'", "\"" ); + str = str.replace( "`", "\"" ); + QString buf = str; + str = str.replace( "-", " " ); + str = str.replace( QRegExp( "\\s[\\S]?\\s" ), " " ); + m_terms = QStringList::split( " ", str ); + QStringList termSeq; + QStringList seqWords; + QStringList::iterator it = m_terms.begin(); + for ( ; it != m_terms.end(); ++it ) { + (*it) = (*it).simplifyWhiteSpace(); + (*it) = (*it).lower(); + (*it) = (*it).replace( "\"", "" ); + } + if ( str.contains( '\"' ) ) { +#ifdef COMPILE_USE_QT4 + if ( (str.count( '\"' ))%2 == 0 ) { +#else + if ( (str.contains( '\"' ))%2 == 0 ) { +#endif + int beg = 0; + int end = 0; + QString 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( '*' ) ) { + QMessageBox::warning( this, tr( "Full Text Search" ), + tr( "Using a wildcard within phrases is not allowed." ) ); + return; + } + seqWords += QStringList::split( ' ', s ); + termSeq << s; + beg = str.find( '\"', end + 1); + } + } else { + QMessageBox::warning( this, tr( "Full Text Search" ), + tr( "The closing quotation mark is missing." ) ); + return; + } + } +#ifdef COMPILE_USE_QT4 + setCursor( Qt::WaitCursor ); +#else + setCursor( waitCursor ); +#endif + m_foundDocs.clear(); + m_foundDocs = g_pDocIndex->query( m_terms, termSeq, seqWords ); + + m_pResultBox->clear(); + for ( it = m_foundDocs.begin(); it != m_foundDocs.end(); ++it ) + m_pResultBox->insertItem( g_pDocIndex->getDocumentTitle( *it ) ); + + m_terms.clear(); + bool isPhrase = FALSE; + QString s = ""; + for ( int i = 0; i < (int)buf.length(); ++i ) { + if ( buf[i] == '\"' ) { + isPhrase = !isPhrase; + s = s.simplifyWhiteSpace(); + if ( !s.isEmpty() ) + m_terms << s; + s = ""; + } else if ( buf[i] == ' ' && !isPhrase ) { + s = s.simplifyWhiteSpace(); + if ( !s.isEmpty() ) + m_terms << s; + s = ""; + } else + s += buf[i]; + } + if ( !s.isEmpty() ) + m_terms << s; + +#ifdef COMPILE_USE_QT4 + setCursor( Qt::ArrowCursor ); +#else + setCursor( arrowCursor ); +#endif +} + +QTextBrowser * KviHelpWindow::textBrowser() +{ + return m_pHelpWidget->textBrowser(); +} + +void KviHelpWindow::showIndexTopic() +{ + if (m_pIndexSearch->text().isEmpty()|| !m_pIndexListBox->selectedItem()) return; + int i=g_pDocIndex->titlesList().findIndex(m_pIndexListBox->selectedItem()->text()); + textBrowser()->setSource(g_pDocIndex->documentList()[ i ]); +} + +void KviHelpWindow::searchInIndex( const QString &s ) +{ + KviTalListBoxItem *i = m_pIndexListBox->firstItem(); + QString sl = s.lower(); + while ( i ) { + QString t = i->text(); + if ( t.length() >= sl.length() && + i->text().left(s.length()).lower() == sl ) { + m_pIndexListBox->setCurrentItem( i ); + m_pIndexListBox->setTopItem(m_pIndexListBox->index(i)); + break; + } + i = i->next(); + } +} + +void KviHelpWindow::indexSelected ( int index ) +{ + int i=g_pDocIndex->titlesList().findIndex(m_pIndexListBox->text(index)); + textBrowser()->setSource(g_pDocIndex->documentList()[ i ]); +} + +void KviHelpWindow::searchSelected ( int index ) +{ + int i=g_pDocIndex->titlesList().findIndex(m_pResultBox->text(index)); + textBrowser()->setSource(g_pDocIndex->documentList()[ i ]); +} + +QPixmap * KviHelpWindow::myIconPtr() +{ + return g_pIconManager->getSmallIcon(KVI_SMALLICON_MDIHELP); +} + +void KviHelpWindow::resizeEvent(QResizeEvent *e) +{ + m_pSplitter->setGeometry(0,0,width(),height()); +} + +QSize KviHelpWindow::sizeHint() const +{ + return m_pHelpWidget->sizeHint(); +} +void KviHelpWindow::fillCaptionBuffers() +{ + m_szPlainTextCaption = __tr2qs("Help Browser"); + + m_szHtmlActiveCaption = "<nobr><font color=\""; + m_szHtmlActiveCaption += KVI_OPTION_COLOR(KviOption_colorCaptionTextActive).name(); + m_szHtmlActiveCaption += "\"><b>"; + m_szHtmlActiveCaption += m_szPlainTextCaption; + m_szHtmlActiveCaption += "</b></font></nobr>"; + + + m_szHtmlInactiveCaption = "<nobr><font color=\""; + m_szHtmlInactiveCaption += KVI_OPTION_COLOR(KviOption_colorCaptionTextInactive).name(); + m_szHtmlInactiveCaption += "\"><b>"; + m_szHtmlInactiveCaption += m_szPlainTextCaption; + m_szHtmlInactiveCaption += "</b></font></nobr>"; +} + + +#include "helpwindow.moc" |