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.
205 lines
4.7 KiB
205 lines
4.7 KiB
#include "QOutputDevPixmap.h" |
|
|
|
#include <kglobal.h> |
|
#include <qcursor.h> |
|
#include <qpainter.h> |
|
#include <qmutex.h> |
|
#include <kdebug.h> |
|
|
|
#include "PDFDoc.h" |
|
|
|
#include "kpdf_pagewidget.h" |
|
#include "kpdf_pagewidget.moc" |
|
|
|
namespace KPDF |
|
{ |
|
PageWidget::PageWidget(QWidget* parent, const char* name) |
|
: QScrollView(parent, name, WRepaintNoErase), |
|
m_doc(0), |
|
m_zoomFactor( 1.0 ), |
|
m_currentPage( 1 ), |
|
m_pressedAction( 0 ) |
|
{ |
|
m_outputdev = new QOutputDevPixmap(); |
|
setFocusPolicy( QWidget::StrongFocus ); |
|
viewport()->setFocusPolicy( QWidget::WheelFocus ); |
|
} |
|
PageWidget::~PageWidget() |
|
{ |
|
delete m_outputdev; |
|
} |
|
void |
|
PageWidget::setPDFDocument(PDFDoc* doc) |
|
{ |
|
m_doc = doc; |
|
updatePixmap(); |
|
} |
|
|
|
void |
|
PageWidget::setPixelsPerPoint(float ppp) |
|
{ |
|
m_ppp = ppp; |
|
} |
|
|
|
void |
|
PageWidget::contentsMousePressEvent(QMouseEvent* e) |
|
{ |
|
if (m_doc == 0) |
|
return; |
|
|
|
m_pressedAction = m_doc->findLink(e->x()/m_ppp, e->y()/m_ppp); |
|
} |
|
|
|
void |
|
PageWidget::contentsMouseReleaseEvent(QMouseEvent* e) |
|
{ |
|
if (m_doc == 0) |
|
return; |
|
|
|
LinkAction* action = m_doc->findLink(e->x()/m_ppp, e->y()/m_ppp); |
|
if (action == m_pressedAction) |
|
emit linkClicked(action); |
|
|
|
m_pressedAction = 0; |
|
} |
|
|
|
void |
|
PageWidget::contentsMouseMoveEvent(QMouseEvent* e) |
|
{ |
|
if (m_doc == 0) |
|
return; |
|
|
|
LinkAction* action = m_doc->findLink(e->x()/m_ppp, e->y()/m_ppp); |
|
setCursor(action != 0 ? Qt::PointingHandCursor : Qt::ArrowCursor); |
|
} |
|
|
|
void PageWidget::drawContents ( QPainter *p, int clipx, int clipy, int clipw, int cliph ) |
|
{ |
|
QPixmap * m_pixmap = NULL; |
|
if (m_outputdev) |
|
m_pixmap = m_outputdev->getPixmap(); |
|
if ( m_pixmap != NULL && ! m_pixmap->isNull() ) |
|
p->drawPixmap ( clipx, clipy, *m_pixmap, clipx, clipy, clipw, cliph ); |
|
else |
|
p->fillRect ( clipx, clipy, clipw, cliph, white ); |
|
} |
|
|
|
void PageWidget::nextPage() |
|
{ |
|
setPage( getPage() + 1); |
|
} |
|
|
|
void PageWidget::previousPage() |
|
{ |
|
setPage( getPage() - 1 ); |
|
} |
|
|
|
void PageWidget::zoomIn() |
|
{ |
|
m_zoomFactor += 0.1; |
|
updatePixmap(); |
|
} |
|
|
|
void PageWidget::zoomOut() |
|
{ |
|
if ( (m_zoomFactor-0.1)<0.1 ) |
|
return; |
|
m_zoomFactor -= 0.1; |
|
updatePixmap(); |
|
} |
|
|
|
void PageWidget::setPage(int page) |
|
{ |
|
static QMutex mutex; |
|
|
|
Q_ASSERT(mutex.locked() == false); |
|
mutex.lock(); |
|
if (m_doc) |
|
{ |
|
m_currentPage = KMAX(0, KMIN( page, m_doc->getNumPages())); |
|
} else { |
|
m_currentPage = 0; |
|
} |
|
updatePixmap(); |
|
mutex.unlock(); |
|
} |
|
|
|
void PageWidget::enableScrollBars( bool b ) |
|
{ |
|
setHScrollBarMode( b ? Auto : AlwaysOff ); |
|
setVScrollBarMode( b ? Auto : AlwaysOff ); |
|
} |
|
|
|
void PageWidget::scrollRight() |
|
{ |
|
horizontalScrollBar()->addLine(); |
|
} |
|
|
|
void PageWidget::scrollLeft() |
|
{ |
|
horizontalScrollBar()->subtractLine(); |
|
} |
|
|
|
void PageWidget::scrollDown() |
|
{ |
|
verticalScrollBar()->addLine(); |
|
} |
|
|
|
void PageWidget::scrollUp() |
|
{ |
|
verticalScrollBar()->subtractLine(); |
|
} |
|
|
|
void PageWidget::scrollBottom() |
|
{ |
|
verticalScrollBar()->setValue( verticalScrollBar()->maxValue() ); |
|
} |
|
|
|
void PageWidget::scrollTop() |
|
{ |
|
verticalScrollBar()->setValue( verticalScrollBar()->minValue() ); |
|
} |
|
|
|
void PageWidget::keyPressEvent( QKeyEvent* e ) |
|
{ |
|
switch ( e->key() ) { |
|
case Key_Up: |
|
scrollUp(); |
|
break; |
|
case Key_Down: |
|
scrollDown(); |
|
break; |
|
case Key_Left: |
|
scrollLeft(); |
|
break; |
|
case Key_Right: |
|
scrollRight(); |
|
break; |
|
default: |
|
e->ignore(); |
|
return; |
|
} |
|
e->accept(); |
|
} |
|
void PageWidget::updatePixmap() |
|
{ |
|
if ( m_doc ) |
|
{ |
|
const double pageWidth = m_doc->getPageWidth (m_currentPage) * m_zoomFactor; |
|
const double pageHeight = m_doc->getPageHeight(m_currentPage) * m_zoomFactor; |
|
|
|
// Pixels per point when the zoomFactor is 1. |
|
const float basePpp = QPaintDevice::x11AppDpiX() / 72.0; |
|
|
|
const float ppp = basePpp * m_zoomFactor; // pixels per point |
|
|
|
m_doc->displayPage(m_outputdev, m_currentPage, int(ppp * 72.0), 0, true); |
|
|
|
resizeContents ( m_outputdev->getPixmap()->width ( ), m_outputdev->getPixmap()->height ( )); |
|
|
|
viewport()->update(); |
|
} |
|
} |
|
} |
|
|
|
// vim:ts=2:sw=2:tw=78:et
|
|
|