diff options
Diffstat (limited to 'src/modules/help/HelpWindow.cpp')
| -rw-r--r-- | src/modules/help/HelpWindow.cpp | 322 |
1 files changed, 322 insertions, 0 deletions
diff --git a/src/modules/help/HelpWindow.cpp b/src/modules/help/HelpWindow.cpp new file mode 100644 index 000000000..5f58d85ed --- /dev/null +++ b/src/modules/help/HelpWindow.cpp @@ -0,0 +1,322 @@ +//============================================================================= +// +// 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) 2000-2010 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 "KviApplication.h" +#include "KviIconManager.h" +#include "KviOptions.h" +#include "KviLocale.h" +#include "KviModule.h" +#include "KviConfigurationFile.h" +#include "kvi_sourcesdate.h" + +#include <QList> +#include <QFileInfo> +#include <QLineEdit> +#include <QMessageBox> +#include <QPushButton> +#include <QRegExp> +#include <QToolTip> +#include <QTimer> + +extern HelpIndex * g_pDocIndex; +extern KviPointerList<HelpWindow> * g_pHelpWindowList; +extern KviPointerList<HelpWidget> * g_pHelpWidgetList; + +bool g_bIndexingDone = FALSE; +HelpWindow::HelpWindow(KviMainWindow * lpFrm,const char * name) +: KviWindow(KVI_WINDOW_TYPE_HELP,lpFrm,name) +{ + g_pHelpWindowList->append(this); + m_pSplitter = new KviTalSplitter(Qt::Horizontal,this); + m_pSplitter->setObjectName("main_splitter"); + m_pSplitter->setChildrenCollapsible(false); + + m_pHelpWidget = new HelpWidget(m_pSplitter,lpFrm); + + m_pToolBar=new KviTalVBox(m_pSplitter); + m_pTabWidget = new QTabWidget(m_pToolBar); + + m_pBottomLayout = new KviTalHBox(m_pToolBar); + m_pProgressBar = new QProgressBar(m_pBottomLayout); + m_pCancelButton = new QPushButton(m_pBottomLayout); + m_pCancelButton->setText(__tr2qs_ctx("Cancel","logview")); + connect(m_pCancelButton,SIGNAL(clicked()),g_pDocIndex,SLOT(setLastWinClosed())); + m_pBottomLayout->setVisible(false); + + m_pIndexTab = new KviTalVBox(m_pTabWidget); + m_pTabWidget->addTab(m_pIndexTab,__tr2qs("HelpIndex")); + + 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() ) ); + + m_pBtnRefreshIndex = new QPushButton(pSearchBox); + m_pBtnRefreshIndex->setIcon(*g_pIconManager->getBigIcon(KVI_REFRESH_IMAGE_NAME)); + connect(m_pBtnRefreshIndex,SIGNAL(clicked()),this,SLOT(refreshIndex())); + m_pBtnRefreshIndex->setToolTip(__tr2qs("Refresh index") ); + + m_pIndexListWidget = new KviTalListWidget(m_pIndexTab); + connect(m_pIndexListWidget,SIGNAL(itemActivated(QListWidgetItem *)),this,SLOT(indexSelected (QListWidgetItem * ))); + + m_pSearchTab = new KviTalVBox(m_pTabWidget); + m_pTabWidget->addTab(m_pSearchTab,__tr2qs("Search")); + + m_pTermsEdit = new QLineEdit(m_pSearchTab); + + connect( m_pTermsEdit, SIGNAL( returnPressed() ), + this, SLOT( startSearch() ) ); + + m_pResultBox = new KviTalListWidget(m_pSearchTab); + connect(m_pResultBox,SIGNAL(itemActivated(QListWidgetItem *)),this,SLOT(searchSelected (QListWidgetItem *))); + + QList<int> li; + li.append(width()-80); + li.append(80); + m_pSplitter->setSizes(li); + + connect(g_pDocIndex, SIGNAL(indexingStart(int)), this, SLOT(indexingStart(int))); + connect(g_pDocIndex, SIGNAL(indexingProgress(int)), this, SLOT(indexingProgress(int))); + connect(g_pDocIndex, SIGNAL(indexingEnd()), this, SLOT(indexingEnd())); + + QTimer::singleShot(0,this,SLOT(initialSetup())); +} + +HelpWindow::~HelpWindow() +{ + g_pHelpWindowList->removeRef(this); +} + +void HelpWindow::initialSetup() +{ + m_pIndexSearch->setFocus(); + + if(!g_bIndexingDone) + { + g_bIndexingDone=TRUE; + QString szDoclist,szDict; + + g_pApp->getLocalKvircDirectory(szDoclist,KviApplication::Help,"help.doclist." KVI_SOURCES_DATE); + g_pApp->getLocalKvircDirectory(szDict,KviApplication::Help,"help.dict." KVI_SOURCES_DATE); + + if ( QFileInfo( szDoclist ).exists() && QFileInfo( szDict ).exists() ) { + g_pDocIndex->readDict(); + m_pIndexListWidget->clear(); + QStringList docList=g_pDocIndex->titlesList(); + m_pIndexListWidget->addItems(docList); + m_pIndexListWidget->sortItems(); + m_pBtnRefreshIndex->setEnabled(true); + } else { + g_pDocIndex->makeIndex(); + } + } +} + +void HelpWindow::indexingStart( int iNum ) +{ + m_pBtnRefreshIndex->setEnabled(false); + m_pBottomLayout->setVisible(true); + m_pProgressBar->setRange(0, iNum); + m_pProgressBar->setValue(0); +} +void HelpWindow::indexingProgress( int iNum ) +{ + m_pProgressBar->setValue(iNum); +} + +void HelpWindow::indexingEnd() +{ + m_pProgressBar->setValue(0); + m_pBottomLayout->setVisible(false); + g_pDocIndex->writeDict(); + m_pIndexListWidget->clear(); + QStringList docList=g_pDocIndex->titlesList(); + m_pIndexListWidget->addItems(docList); + m_pIndexListWidget->sortItems(); + m_pBtnRefreshIndex->setEnabled(true); +} + +void HelpWindow::saveProperties(KviConfigurationFile *cfg) +{ + KviWindow::saveProperties(cfg); + cfg->writeEntry("Splitter",m_pSplitter->sizes()); +} + +void HelpWindow::loadProperties(KviConfigurationFile *cfg) +{ + QList<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 HelpWindow::refreshIndex() +{ + g_pDocIndex->makeIndex(); +} + +void HelpWindow::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 = str.split(" ",QString::SkipEmptyParts); + QStringList termSeq; + QStringList seqWords; + QStringList::iterator it = m_terms.begin(); + for ( ; it != m_terms.end(); ++it ) { + (*it) = (*it).simplified(); + (*it) = (*it).toLower(); + (*it) = (*it).replace( "\"", "" ); + } + if ( str.contains( '\"' ) ) { + if ( (str.count( '\"' ))%2 == 0 ) { + int beg = 0; + int end = 0; + QString s; + beg = str.indexOf( '\"', beg ); + while ( beg != -1 ) { + beg++; + end = str.indexOf( '\"', beg ); + s = str.mid( beg, end - beg ); + s = s.toLower(); + s = s.simplified(); + if ( s.contains( '*' ) ) { + QMessageBox::warning( this, tr( "Full Text Search" ), + tr( "Using a wildcard within phrases is not allowed." ) ); + return; + } + seqWords += s.split( ' ', QString::SkipEmptyParts ); + termSeq << s; + beg = str.indexOf( '\"', end + 1); + } + } else { + QMessageBox::warning( this, tr( "Full Text Search" ), + tr( "The closing quotation mark is missing." ) ); + return; + } + } + setCursor( Qt::WaitCursor ); + 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->addItem( 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.simplified(); + if ( !s.isEmpty() ) + m_terms << s; + s = ""; + } else if ( buf[i] == ' ' && !isPhrase ) { + s = s.simplified(); + if ( !s.isEmpty() ) + m_terms << s; + s = ""; + } else + s += buf[i]; + } + if ( !s.isEmpty() ) m_terms << s; + + setCursor( Qt::ArrowCursor ); +} + +QTextBrowser * HelpWindow::textBrowser() +{ + return m_pHelpWidget->textBrowser(); +} + +void HelpWindow::showIndexTopic() +{ + if (m_pIndexSearch->text().isEmpty()|| !m_pIndexListWidget->selectedItems().count()) return; + int i=g_pDocIndex->titlesList().indexOf(m_pIndexListWidget->selectedItems().at(0)->text()); + textBrowser()->setSource(QUrl(g_pDocIndex->documentList()[ i ])); +} + +void HelpWindow::searchInIndex( const QString &s ) +{ + QListWidgetItem *item ; + QString sl = s.toLower(); + for(int i=0;i<m_pIndexListWidget->count();i++) + { + item=m_pIndexListWidget->item(i); + QString t = item->text(); + if ( t.length() >= sl.length() && + item->text().left(s.length()).toLower() == sl ) { + m_pIndexListWidget->setCurrentItem( item ); + m_pIndexListWidget->scrollToItem(item,QAbstractItemView::PositionAtTop); + break; + } + } +} + +void HelpWindow::indexSelected ( QListWidgetItem *item ) +{ + if (!item) return; + int i=g_pDocIndex->titlesList().indexOf(item->text()); + textBrowser()->setSource(QUrl(g_pDocIndex->documentList()[ i ])); +} + +void HelpWindow::searchSelected ( QListWidgetItem *item ) +{ + if (!item) return; + int i=g_pDocIndex->titlesList().indexOf(item->text()); + textBrowser()->setSource(QUrl(g_pDocIndex->documentList()[ i ])); +} + +QPixmap * HelpWindow::myIconPtr() +{ + return g_pIconManager->getSmallIcon(KVI_SMALLICON_MDIHELP); +} + +void HelpWindow::resizeEvent(QResizeEvent *) +{ + m_pSplitter->setGeometry(0,0,width(),height()); +} + +void HelpWindow::fillCaptionBuffers() +{ + m_szPlainTextCaption = __tr2qs("Help Browser"); +} + + +#ifndef COMPILE_USE_STANDALONE_MOC_SOURCES +#include "HelpWindow.moc" +#endif //!COMPILE_USE_STANDALONE_MOC_SOURCES |
