⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kchmviewwindow_qtextbrowser.cpp

📁 chm阅读器 用于在linux系统下chm文档的阅读
💻 CPP
字号:
/*************************************************************************** *   Copyright (C) 2004-2007 by Georgy Yunaev, gyunaev@ulduzsoft.com       * *   Please do not use email address above for bug reports; see            * *   the README file                                                       * *                                                                         * *   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.,                                       * *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             * ***************************************************************************/#include <qprinter.h>#include <qpainter.h>#include <qsimplerichtext.h>#include <qpaintdevicemetrics.h>#include "kde-qt.h"#include "kchmmainwindow.h"#include "kchmviewwindow_qtextbrowser.h"/* * If defined, all the data viewed is kept in source factory. It increases the response time * when a user opens the page he has already seen, in cost of everything which has been opened  * is stored in memory, increasing memory usage. * * If not defined, on any page change the source factory cleans up, saving the memory, but  * increasing the page loading time in case the page has the same images, or the page is opened * second time. */#define KEEP_ALL_OPENED_DATA_IN_SOURCE_FACTORYKCHMViewWindow_QTextBrowser::KCHMViewWindow_QTextBrowser( QTabWidget * parent )	: QTextBrowser ( parent ), KCHMViewWindow ( parent ){	m_zoomfactor = 0;	m_sourcefactory = 0;	invalidate();		setTextFormat ( Qt::RichText );	connect( this, SIGNAL( linkClicked (const QString &) ), this, SLOT( slotLinkClicked(const QString &) ) );}KCHMViewWindow_QTextBrowser::~KCHMViewWindow_QTextBrowser(){	delete m_sourcefactory;}bool KCHMViewWindow_QTextBrowser::openPage (const QString& url){	// If we're using a memory saving scheme, we destroy MimeSourceFactory (including all the stored data)	// when opening a new page. It saves some memory, but spends more time while looking for already loaded	// images and HTML pages#if !defined (KEEP_ALL_OPENED_DATA_IN_SOURCE_FACTORY)	delete m_sourcefactory;	m_sourcefactory = new KCHMSourceFactory;	setMimeSourceFactory (m_sourcefactory);#endif		setSource (url);	return true;}void KCHMViewWindow_QTextBrowser::setSource ( const QString & name ){	if ( m_allowSourceChange )	{		// Do URI decoding, qtextbrowser does stupid job.		QString fixedname = decodeUrl( name );		QTextBrowser::setSource (fixedname);	}	else		m_allowSourceChange = true;}void KCHMViewWindow_QTextBrowser::setZoomFactor( int zoom ){	m_zoomfactor = zoom;		if ( zoom < 0 )		QTextBrowser::zoomOut( -zoom );	else if ( zoom > 0 )		QTextBrowser::zoomIn( zoom);}void KCHMViewWindow_QTextBrowser::invalidate( ){	delete m_sourcefactory;	m_sourcefactory = new KCHMSourceFactory (this);	setMimeSourceFactory (m_sourcefactory);	m_zoomfactor = 0;	m_allowSourceChange = true;	m_searchLastIndex = 0;	m_searchLastParagraph = 0;	m_searchText = QString::null;	reload();		KCHMViewWindow::invalidate( );}int KCHMViewWindow_QTextBrowser::getScrollbarPosition( ){	return contentsY ();}void KCHMViewWindow_QTextBrowser::setScrollbarPosition( int pos ){	setContentsPos (0, pos);}void KCHMViewWindow_QTextBrowser::addZoomFactor( int value ){	setZoomFactor( value);}void KCHMViewWindow_QTextBrowser::slotLinkClicked( const QString & newlink ){	emit signalLinkClicked (newlink, m_allowSourceChange);}bool KCHMViewWindow_QTextBrowser::printCurrentPage( ){#if !defined (QT_NO_PRINTER)    QPrinter printer( QPrinter::HighResolution );    printer.setFullPage(TRUE);		if ( printer.setup( this ) )	{		QPainter p( &printer );				if( !p.isActive() ) // starting printing failed			return false;				QPaintDeviceMetrics metrics(p.device());		int dpiy = metrics.logicalDpiY();		int margin = (int) ( (2/2.54)*dpiy ); // 2 cm margins		QRect body( margin, margin, metrics.width() - 2*margin, metrics.height() - 2*margin );		QSimpleRichText richText( text(),								  QFont(),								  context(),								  styleSheet(),								  mimeSourceFactory(),								  body.height() );		richText.setWidth( &p, body.width() );		QRect view( body );				int page = 1;				do		{			richText.draw( &p, body.left(), body.top(), view, colorGroup() );			view.moveBy( 0, body.height() );			p.translate( 0 , -body.height() );			p.drawText( view.right() - p.fontMetrics().width( QString::number(page) ),						view.bottom() + p.fontMetrics().ascent() + 5, QString::number(page) );						if ( view.top()  >= richText.height() )				break;						QString msg = i18n( "Printing (page %1)...") .arg(page);			::mainWindow->showInStatusBar( msg );						printer.newPage();			page++;		}		while (TRUE);			::mainWindow->showInStatusBar( i18n( "Printing completed") );		return true;	}	::mainWindow->showInStatusBar( i18n( "Printing aborted") );	return false;#else /* QT_NO_PRINTER */	QMessageBox::warning( this, 		i18n( "%1 - could not print") . arg(APP_NAME),		i18n( "Could not print.\nYour Qt library has been compiled without printing support");	return false;#endif /* QT_NO_PRINTER */}void KCHMViewWindow_QTextBrowser::searchWord( const QString & word, bool forward, bool ){	if ( m_searchText == word )	{		if ( forward && (m_searchLastIndex || m_searchLastParagraph) )			m_searchLastIndex += m_searchText.length();	}	else	{		m_searchLastParagraph = m_searchLastIndex = 0;		m_searchText = word;	}	if ( find (m_searchText, false, false, forward, &m_searchLastParagraph, &m_searchLastIndex) )		::mainWindow->showInStatusBar( i18n( "Search failed") );}void KCHMViewWindow_QTextBrowser::clipSelectAll( ){	selectAll (TRUE);}void KCHMViewWindow_QTextBrowser::clipCopy( ){	copy ();}// Shamelessly stolen from QtQString KCHMViewWindow_QTextBrowser::decodeUrl( const QString &input ){	QString temp;    int i = 0;	int len = input.length();	int a, b;	QChar c;	while (i < len)	{		c = input[i];		if (c == '%' && i + 2 < len)		{			a = input[++i];			b = input[++i];			if (a >= '0' && a <= '9') a -= '0';			else if (a >= 'a' && a <= 'f') a = a - 'a' + 10;			else if (a >= 'A' && a <= 'F') a = a - 'A' + 10;			if (b >= '0' && b <= '9') b -= '0';			else if (b >= 'a' && b <= 'f') b  = b - 'a' + 10;			else if (b >= 'A' && b <= 'F') b  = b - 'A' + 10;			temp.append( (QChar)((a << 4) | b ) );		}		else		{			temp.append( c );		}		++i;	}    return temp;}QPopupMenu * KCHMViewWindow_QTextBrowser::createPopupMenu( const QPoint & pos ){	KQPopupMenu * menu = getContextMenu( anchorAt( pos ), this );	menu->exec( mapToGlobal( contentsToViewport( pos ) ) );	return 0;}#include "kchmviewwindow_qtextbrowser.moc"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -