summaryrefslogtreecommitdiffstats
path: root/src/kchmviewwindow_qtextbrowser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/kchmviewwindow_qtextbrowser.cpp')
-rw-r--r--src/kchmviewwindow_qtextbrowser.cpp270
1 files changed, 270 insertions, 0 deletions
diff --git a/src/kchmviewwindow_qtextbrowser.cpp b/src/kchmviewwindow_qtextbrowser.cpp
new file mode 100644
index 0000000..1ab7bf6
--- /dev/null
+++ b/src/kchmviewwindow_qtextbrowser.cpp
@@ -0,0 +1,270 @@
+/***************************************************************************
+ * Copyright (C) 2004-2007 by Georgy Yunaev, [email protected] *
+ * 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 <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_FACTORY
+
+KCHMViewWindow_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 Qt
+QString 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"