d6e1417f9c17e87b1f41430c72a115ffa83b75e2
[pykit.git] / PDFWidget.cc
1 // $Id$
2 //
3 // Copyright (C) 2010
4 //     Stefan Bund <info@j32.de>
5
6 /** \file
7     \brief PDFWidget non-inline non-template implementation */
8
9 #include "PDFWidget.hh"
10 //#include "PDFWidget.ih"
11
12 // Custom includes
13 #include <iostream>
14 #include <QNetworkRequest>
15 #include <QNetworkReply>
16 #include <QKeyEvent>
17 #include <QWebView>
18 #include <QWebFrame>
19
20 //#include "PDFWidget.mpp"
21 #define prefix_
22 ///////////////////////////////cc.p////////////////////////////////////////
23
24 prefix_ pykit::PDFWidget::PDFWidget(QString const & id, QNetworkAccessManager * manager,
25                                     QWidget * parent)
26     : QLabel(parent), id_ (id), manager_ (manager), currentPage_ (0)
27
28 {
29     QWebView * webView (dynamic_cast<QWebView*>(parent));
30     if (webView && !id_.isEmpty())
31         webView->page()->mainFrame()->addToJavaScriptWindowObject(id_,this);
32 }
33
34 prefix_ pykit::PDFWidget::PDFWidget(QString const & id, QString const & document,
35                                     QNetworkAccessManager * manager, QWidget * parent)
36     : QLabel(parent), id_ (id), manager_ (manager), currentPage_ (0)
37
38 {
39     setFocusPolicy(Qt::WheelFocus);
40     document_.reset(Poppler::Document::load(document));
41     QWebView * webView (dynamic_cast<QWebView*>(parent));
42     if (webView && !id_.isEmpty())
43         webView->page()->mainFrame()->addToJavaScriptWindowObject(id_,this);
44     documentSetup();
45 }
46
47 prefix_ void pykit::PDFWidget::load(QUrl const & url)
48 {
49     QNetworkRequest request (url);
50     QNetworkReply * reply (manager_->get(request));
51     connect(reply, SIGNAL(finished()), this, SLOT(netLoadDocument()));
52 }
53
54 prefix_ void pykit::PDFWidget::resizeEvent(QResizeEvent *)
55 {
56     if (! document_)
57         return;
58     QSizeF pageSize (document_->page(currentPage_)->pageSizeF());
59     double n = 72.0 * width() / pageSize.width();
60    if (n != dpi_) {
61         dpi_ = n;
62         showPage();
63     }
64 }
65
66 prefix_ void pykit::PDFWidget::netLoadDocument()
67 {
68     QNetworkReply * reply = static_cast<QNetworkReply*>(sender());
69     if (reply->error() != QNetworkReply::NoError)
70         return;
71     QByteArray data (reply->read(reply->size()));
72     document_.reset(Poppler::Document::loadFromData(data));
73     documentSetup();
74     reply->deleteLater();
75 }
76
77 prefix_ void pykit::PDFWidget::documentSetup()
78 {
79     if (! document_)
80         return;
81     document_->setRenderHint(Poppler::Document::Antialiasing, true);
82     document_->setRenderHint(Poppler::Document::TextAntialiasing, true);
83     document_->setRenderHint(Poppler::Document::TextHinting, false);
84     resizeEvent(0);
85     showPage();
86 }
87
88 prefix_ void pykit::PDFWidget::showPage()
89 {
90     if (! document_)
91         return;
92     QImage image (document_->page(currentPage_)->renderToImage(
93                       dpi_, dpi_, 0, 0, width(), height()));
94     setPixmap(QPixmap::fromImage(image));
95 }
96
97 ///////////////////////////////cc.e////////////////////////////////////////
98 #undef prefix_
99 //#include "PDFWidget.mpp"
100
101 \f
102 // Local Variables:
103 // mode: c++
104 // fill-column: 100
105 // comment-column: 40
106 // c-file-style: "j32"
107 // indent-tabs-mode: nil
108 // ispell-local-dictionary: "american"
109 // compile-command: "make"
110 // End: