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.
kchmviewer/src/kchmviewwindow_qtextbrowser...

271 lines
7.5 KiB

/***************************************************************************
* 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., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
#include <tqprinter.h>
#include <tqpainter.h>
#include <tqsimplerichtext.h>
#include <tqpaintdevicemetrics.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_FACTORY
KCHMViewWindow_QTextBrowser::KCHMViewWindow_QTextBrowser( TQTabWidget * parent )
: TQTextBrowser ( parent ), KCHMViewWindow ( parent )
{
m_zoomfactor = 0;
m_sourcefactory = 0;
tqinvalidate();
setTextFormat ( TQt::RichText );
connect( this, TQT_SIGNAL( linkClicked (const TQString &) ), this, TQT_SLOT( slotLinkClicked(const TQString &) ) );
}
KCHMViewWindow_QTextBrowser::~KCHMViewWindow_QTextBrowser()
{
delete m_sourcefactory;
}
bool KCHMViewWindow_QTextBrowser::openPage (const TQString& 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 TQString & name )
{
if ( m_allowSourceChange )
{
// Do URI decoding, qtextbrowser does stupid job.
TQString fixedname = decodeUrl( name );
TQTextBrowser::setSource (fixedname);
}
else
m_allowSourceChange = true;
}
void KCHMViewWindow_QTextBrowser::setZoomFactor( int zoom )
{
m_zoomfactor = zoom;
if ( zoom < 0 )
TQTextBrowser::zoomOut( -zoom );
else if ( zoom > 0 )
TQTextBrowser::zoomIn( zoom);
}
void KCHMViewWindow_QTextBrowser::tqinvalidate( )
{
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 = TQString();
reload();
KCHMViewWindow::tqinvalidate( );
}
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 TQString & newlink )
{
emit signalLinkClicked (newlink, m_allowSourceChange);
}
bool KCHMViewWindow_QTextBrowser::printCurrentPage( )
{
#if !defined (TQT_NO_PRINTER)
TQPrinter printer( TQPrinter::HighResolution );
printer.setFullPage(TRUE);
if ( printer.setup( this ) )
{
TQPainter p( &printer );
if( !p.isActive() ) // starting printing failed
return false;
TQPaintDeviceMetrics metrics(p.device());
int dpiy = metrics.logicalDpiY();
int margin = (int) ( (2/2.54)*dpiy ); // 2 cm margins
TQRect body( margin, margin, metrics.width() - 2*margin, metrics.height() - 2*margin );
TQSimpleRichText richText( text(),
TQFont(),
context(),
styleSheet(),
mimeSourceFactory(),
body.height() );
richText.setWidth( &p, body.width() );
TQRect view( body );
int page = 1;
do
{
richText.draw( &p, body.left(), body.top(), view, tqcolorGroup() );
view.moveBy( 0, body.height() );
p.translate( 0 , -body.height() );
p.drawText( view.right() - p.fontMetrics().width( TQString::number(page) ),
view.bottom() + p.fontMetrics().ascent() + 5, TQString::number(page) );
if ( view.top() >= richText.height() )
break;
TQString msg = i18n( "Printing (page %1)...") .tqarg(page);
::mainWindow->showInStatusBar( msg );
printer.newPage();
page++;
}
while (TRUE);
::mainWindow->showInStatusBar( i18n( "Printing completed") );
return true;
}
::mainWindow->showInStatusBar( i18n( "Printing aborted") );
return false;
#else /* TQT_NO_PRINTER */
TQMessageBox::warning( this,
i18n( "%1 - could not print") . arg(APP_NAME),
i18n( "Could not print.\nYour TQt library has been compiled without printing support");
return false;
#endif /* TQT_NO_PRINTER */
}
void KCHMViewWindow_QTextBrowser::searchWord( const TQString & 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 TQt
TQString KCHMViewWindow_QTextBrowser::decodeUrl( const TQString &input )
{
TQString temp;
int i = 0;
int len = input.length();
int a, b;
TQChar 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( (TQChar)((a << 4) | b ) );
}
else
{
temp.append( c );
}
++i;
}
return temp;
}
TQPopupMenu * KCHMViewWindow_QTextBrowser::createPopupMenu( const TQPoint & pos )
{
KTQPopupMenu * menu = getContextMenu( anchorAt( pos ), this );
menu->exec( mapToGlobal( contentsToViewport( pos ) ) );
return 0;
}
#include "kchmviewwindow_qtextbrowser.moc"