summaryrefslogtreecommitdiff
path: root/Build/source/libs/poppler/poppler-0.12.4/qt4/src/poppler-link.cc
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/poppler/poppler-0.12.4/qt4/src/poppler-link.cc')
-rw-r--r--Build/source/libs/poppler/poppler-0.12.4/qt4/src/poppler-link.cc584
1 files changed, 584 insertions, 0 deletions
diff --git a/Build/source/libs/poppler/poppler-0.12.4/qt4/src/poppler-link.cc b/Build/source/libs/poppler/poppler-0.12.4/qt4/src/poppler-link.cc
new file mode 100644
index 00000000000..de062423717
--- /dev/null
+++ b/Build/source/libs/poppler/poppler-0.12.4/qt4/src/poppler-link.cc
@@ -0,0 +1,584 @@
+/* poppler-link.cc: qt interface to poppler
+ * Copyright (C) 2006-2007, Albert Astals Cid
+ * Copyright (C) 2007-2008, Pino Toscano <pino@kde.org>
+ * Adapting code from
+ * Copyright (C) 2004 by Enrico Ros <eros.kde@email.it>
+ *
+ * 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, 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 <poppler-qt4.h>
+#include <poppler-private.h>
+
+#include <QtCore/QStringList>
+
+#include "Link.h"
+
+namespace Poppler {
+
+class LinkDestinationPrivate : public QSharedData
+{
+ public:
+ LinkDestinationPrivate();
+
+ LinkDestination::Kind kind; // destination type
+ QString name;
+ int pageNum; // page number
+ double left, bottom; // position
+ double right, top;
+ double zoom; // zoom factor
+ bool changeLeft : 1, changeTop : 1; // for destXYZ links, which position
+ bool changeZoom : 1; // components to change
+};
+
+ LinkDestinationPrivate::LinkDestinationPrivate()
+ {
+ // sane defaults
+ kind = LinkDestination::destXYZ;
+ pageNum = 0;
+ left = 0;
+ bottom = 0;
+ right = 0;
+ top = 0;
+ zoom = 1;
+ changeLeft = true;
+ changeTop = true;
+ changeZoom = false;
+ }
+
+class LinkPrivate
+{
+ public:
+ LinkPrivate( const QRectF &area );
+ virtual ~LinkPrivate();
+
+ QRectF linkArea;
+};
+
+ LinkPrivate::LinkPrivate( const QRectF &area )
+ : linkArea( area )
+ {
+ }
+
+ LinkPrivate::~LinkPrivate()
+ {
+ }
+
+class LinkGotoPrivate : public LinkPrivate
+{
+ public:
+ LinkGotoPrivate( const QRectF &area, const LinkDestination &dest );
+
+ QString extFileName;
+ LinkDestination destination;
+};
+
+ LinkGotoPrivate::LinkGotoPrivate( const QRectF &area, const LinkDestination &dest )
+ : LinkPrivate( area ), destination( dest )
+ {
+ }
+
+class LinkExecutePrivate : public LinkPrivate
+{
+ public:
+ LinkExecutePrivate( const QRectF &area );
+
+ QString fileName;
+ QString parameters;
+};
+
+ LinkExecutePrivate::LinkExecutePrivate( const QRectF &area )
+ : LinkPrivate( area )
+ {
+ }
+
+class LinkBrowsePrivate : public LinkPrivate
+{
+ public:
+ LinkBrowsePrivate( const QRectF &area );
+
+ QString url;
+};
+
+ LinkBrowsePrivate::LinkBrowsePrivate( const QRectF &area )
+ : LinkPrivate( area )
+ {
+ }
+
+class LinkActionPrivate : public LinkPrivate
+{
+ public:
+ LinkActionPrivate( const QRectF &area );
+
+ LinkAction::ActionType type;
+};
+
+ LinkActionPrivate::LinkActionPrivate( const QRectF &area )
+ : LinkPrivate( area )
+ {
+ }
+
+class LinkSoundPrivate : public LinkPrivate
+{
+ public:
+ LinkSoundPrivate( const QRectF &area );
+ ~LinkSoundPrivate();
+
+ double volume;
+ bool sync : 1;
+ bool repeat : 1;
+ bool mix : 1;
+ SoundObject *sound;
+};
+
+ LinkSoundPrivate::LinkSoundPrivate( const QRectF &area )
+ : LinkPrivate( area ), sound( 0 )
+ {
+ }
+
+ LinkSoundPrivate::~LinkSoundPrivate()
+ {
+ delete sound;
+ }
+
+class LinkJavaScriptPrivate : public LinkPrivate
+{
+ public:
+ LinkJavaScriptPrivate( const QRectF &area );
+
+ QString js;
+};
+
+ LinkJavaScriptPrivate::LinkJavaScriptPrivate( const QRectF &area )
+ : LinkPrivate( area )
+ {
+ }
+
+#if 0
+class LinkMoviePrivate : public LinkPrivate
+{
+ public:
+ LinkMoviePrivate( const QRectF &area );
+};
+
+ LinkMoviePrivate::LinkMoviePrivate( const QRectF &area )
+ : LinkPrivate( area )
+ {
+ }
+#endif
+
+ static void cvtUserToDev(::Page *page, double xu, double yu, int *xd, int *yd) {
+ double ctm[6];
+
+ page->getDefaultCTM(ctm, 72.0, 72.0, 0, false, true);
+ *xd = (int)(ctm[0] * xu + ctm[2] * yu + ctm[4] + 0.5);
+ *yd = (int)(ctm[1] * xu + ctm[3] * yu + ctm[5] + 0.5);
+ }
+
+ LinkDestination::LinkDestination(const LinkDestinationData &data)
+ : d( new LinkDestinationPrivate )
+ {
+ bool deleteDest = false;
+ LinkDest *ld = data.ld;
+
+ if ( data.namedDest && !ld && !data.externalDest )
+ {
+ deleteDest = true;
+ ld = data.doc->doc->findDest( data.namedDest );
+ }
+ // in case this destination was named one, and it was not resolved
+ if ( data.namedDest && !ld )
+ {
+ d->name = QString::fromLatin1( data.namedDest->getCString() );
+ }
+
+ if (!ld) return;
+
+ if (ld->getKind() == ::destXYZ) d->kind = destXYZ;
+ else if (ld->getKind() == ::destFit) d->kind = destFit;
+ else if (ld->getKind() == ::destFitH) d->kind = destFitH;
+ else if (ld->getKind() == ::destFitV) d->kind = destFitV;
+ else if (ld->getKind() == ::destFitR) d->kind = destFitR;
+ else if (ld->getKind() == ::destFitB) d->kind = destFitB;
+ else if (ld->getKind() == ::destFitBH) d->kind = destFitBH;
+ else if (ld->getKind() == ::destFitBV) d->kind = destFitBV;
+
+ if ( !ld->isPageRef() ) d->pageNum = ld->getPageNum();
+ else
+ {
+ Ref ref = ld->getPageRef();
+ d->pageNum = data.doc->doc->findPage( ref.num, ref.gen );
+ }
+ double left = ld->getLeft();
+ double bottom = ld->getBottom();
+ double right = ld->getRight();
+ double top = ld->getTop();
+ d->zoom = ld->getZoom();
+ d->changeLeft = ld->getChangeLeft();
+ d->changeTop = ld->getChangeTop();
+ d->changeZoom = ld->getChangeZoom();
+
+ int leftAux = 0, topAux = 0, rightAux = 0, bottomAux = 0;
+
+ if (d->pageNum > 0 && d->pageNum <= data.doc->doc->getNumPages())
+ {
+ ::Page *page = data.doc->doc->getCatalog()->getPage( d->pageNum );
+ cvtUserToDev( page, left, top, &leftAux, &topAux );
+ cvtUserToDev( page, right, bottom, &rightAux, &bottomAux );
+
+ d->left = leftAux / (double)page->getCropWidth();
+ d->top = topAux / (double)page->getCropHeight();
+ d->right = rightAux/ (double)page->getCropWidth();
+ d->bottom = bottomAux / (double)page->getCropHeight();
+ }
+ else d->pageNum = 0;
+
+ if (deleteDest) delete ld;
+ }
+
+ LinkDestination::LinkDestination(const QString &description)
+ : d( new LinkDestinationPrivate )
+ {
+ QStringList tokens = description.split( ';' );
+ d->kind = static_cast<Kind>(tokens.at(0).toInt());
+ d->pageNum = tokens.at(1).toInt();
+ d->left = tokens.at(2).toDouble();
+ d->bottom = tokens.at(3).toDouble();
+ d->right = tokens.at(4).toDouble();
+ d->top = tokens.at(5).toDouble();
+ d->zoom = tokens.at(6).toDouble();
+ d->changeLeft = static_cast<bool>(tokens.at(7).toInt());
+ d->changeTop = static_cast<bool>(tokens.at(8).toInt());
+ d->changeZoom = static_cast<bool>(tokens.at(9).toInt());
+ }
+
+ LinkDestination::LinkDestination(const LinkDestination &other)
+ : d( other.d )
+ {
+ }
+
+ LinkDestination::~LinkDestination()
+ {
+ }
+
+ LinkDestination::Kind LinkDestination::kind() const
+ {
+ return d->kind;
+ }
+
+ int LinkDestination::pageNumber() const
+ {
+ return d->pageNum;
+ }
+
+ double LinkDestination::left() const
+ {
+ return d->left;
+ }
+
+ double LinkDestination::bottom() const
+ {
+ return d->bottom;
+ }
+
+ double LinkDestination::right() const
+ {
+ return d->right;
+ }
+
+ double LinkDestination::top() const
+ {
+ return d->top;
+ }
+
+ double LinkDestination::zoom() const
+ {
+ return d->zoom;
+ }
+
+ bool LinkDestination::isChangeLeft() const
+ {
+ return d->changeLeft;
+ }
+
+ bool LinkDestination::isChangeTop() const
+ {
+ return d->changeTop;
+ }
+
+ bool LinkDestination::isChangeZoom() const
+ {
+ return d->changeZoom;
+ }
+
+ QString LinkDestination::toString() const
+ {
+ QString s = QString::number( (qint8)d->kind );
+ s += ";" + QString::number( d->pageNum );
+ s += ";" + QString::number( d->left );
+ s += ";" + QString::number( d->bottom );
+ s += ";" + QString::number( d->right );
+ s += ";" + QString::number( d->top );
+ s += ";" + QString::number( d->zoom );
+ s += ";" + QString::number( (qint8)d->changeLeft );
+ s += ";" + QString::number( (qint8)d->changeTop );
+ s += ";" + QString::number( (qint8)d->changeZoom );
+ return s;
+ }
+
+ QString LinkDestination::destinationName() const
+ {
+ return d->name;
+ }
+
+ LinkDestination& LinkDestination::operator=(const LinkDestination &other)
+ {
+ if ( this == &other )
+ return *this;
+
+ d = other.d;
+ return *this;
+ }
+
+
+ // Link
+ Link::~Link()
+ {
+ delete d_ptr;
+ }
+
+ Link::Link(const QRectF &linkArea)
+ : d_ptr( new LinkPrivate( linkArea ) )
+ {
+ }
+
+ Link::Link( LinkPrivate &dd )
+ : d_ptr( &dd )
+ {
+ }
+
+ Link::LinkType Link::linkType() const
+ {
+ return None;
+ }
+
+ QRectF Link::linkArea() const
+ {
+ Q_D( const Link );
+ return d->linkArea;
+ }
+
+ // LinkGoto
+ LinkGoto::LinkGoto( const QRectF &linkArea, QString extFileName, const LinkDestination & destination )
+ : Link( *new LinkGotoPrivate( linkArea, destination ) )
+ {
+ Q_D( LinkGoto );
+ d->extFileName = extFileName;
+ }
+
+ LinkGoto::~LinkGoto()
+ {
+ }
+
+ bool LinkGoto::isExternal() const
+ {
+ Q_D( const LinkGoto );
+ return !d->extFileName.isEmpty();
+ }
+
+ QString LinkGoto::fileName() const
+ {
+ Q_D( const LinkGoto );
+ return d->extFileName;
+ }
+
+ LinkDestination LinkGoto::destination() const
+ {
+ Q_D( const LinkGoto );
+ return d->destination;
+ }
+
+ Link::LinkType LinkGoto::linkType() const
+ {
+ return Goto;
+ }
+
+ // LinkExecute
+ LinkExecute::LinkExecute( const QRectF &linkArea, const QString & file, const QString & params )
+ : Link( *new LinkExecutePrivate( linkArea ) )
+ {
+ Q_D( LinkExecute );
+ d->fileName = file;
+ d->parameters = params;
+ }
+
+ LinkExecute::~LinkExecute()
+ {
+ }
+
+ QString LinkExecute::fileName() const
+ {
+ Q_D( const LinkExecute );
+ return d->fileName;
+ }
+ QString LinkExecute::parameters() const
+ {
+ Q_D( const LinkExecute );
+ return d->parameters;
+ }
+
+ Link::LinkType LinkExecute::linkType() const
+ {
+ return Execute;
+ }
+
+ // LinkBrowse
+ LinkBrowse::LinkBrowse( const QRectF &linkArea, const QString &url )
+ : Link( *new LinkBrowsePrivate( linkArea ) )
+ {
+ Q_D( LinkBrowse );
+ d->url = url;
+ }
+
+ LinkBrowse::~LinkBrowse()
+ {
+ }
+
+ QString LinkBrowse::url() const
+ {
+ Q_D( const LinkBrowse );
+ return d->url;
+ }
+
+ Link::LinkType LinkBrowse::linkType() const
+ {
+ return Browse;
+ }
+
+ // LinkAction
+ LinkAction::LinkAction( const QRectF &linkArea, ActionType actionType )
+ : Link( *new LinkActionPrivate( linkArea ) )
+ {
+ Q_D( LinkAction );
+ d->type = actionType;
+ }
+
+ LinkAction::~LinkAction()
+ {
+ }
+
+ LinkAction::ActionType LinkAction::actionType() const
+ {
+ Q_D( const LinkAction );
+ return d->type;
+ }
+
+ Link::LinkType LinkAction::linkType() const
+ {
+ return Action;
+ }
+
+ // LinkSound
+ LinkSound::LinkSound( const QRectF &linkArea, double volume, bool sync, bool repeat, bool mix, SoundObject *sound )
+ : Link( *new LinkSoundPrivate( linkArea ) )
+ {
+ Q_D( LinkSound );
+ d->volume = volume;
+ d->sync = sync;
+ d->repeat = repeat;
+ d->mix = mix;
+ d->sound = sound;
+ }
+
+ LinkSound::~LinkSound()
+ {
+ }
+
+ Link::LinkType LinkSound::linkType() const
+ {
+ return Sound;
+ }
+
+ double LinkSound::volume() const
+ {
+ Q_D( const LinkSound );
+ return d->volume;
+ }
+
+ bool LinkSound::synchronous() const
+ {
+ Q_D( const LinkSound );
+ return d->sync;
+ }
+
+ bool LinkSound::repeat() const
+ {
+ Q_D( const LinkSound );
+ return d->repeat;
+ }
+
+ bool LinkSound::mix() const
+ {
+ Q_D( const LinkSound );
+ return d->mix;
+ }
+
+ SoundObject *LinkSound::sound() const
+ {
+ Q_D( const LinkSound );
+ return d->sound;
+ }
+
+ // LinkJavaScript
+ LinkJavaScript::LinkJavaScript( const QRectF &linkArea, const QString &js )
+ : Link( *new LinkJavaScriptPrivate( linkArea ) )
+ {
+ Q_D( LinkJavaScript );
+ d->js = js;
+ }
+
+ LinkJavaScript::~LinkJavaScript()
+ {
+ }
+
+ Link::LinkType LinkJavaScript::linkType() const
+ {
+ return JavaScript;
+ }
+
+ QString LinkJavaScript::script() const
+ {
+ Q_D( const LinkJavaScript );
+ return d->js;
+ }
+
+#if 0
+ // LinkMovie
+ LinkMovie::LinkMovie( const QRectF &linkArea )
+ : Link( *new LinkMoviePrivate( linkArea ) )
+ {
+ }
+
+ LinkMovie::~LinkMovie()
+ {
+ }
+
+ Link::LinkType LinkMovie::linkType() const
+ {
+ return Movie;
+ }
+#endif
+
+}