summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlbert Astals Cid <aacid@kde.org>2014-05-11 18:31:10 +0200
committerAlbert Astals Cid <aacid@kde.org>2014-05-11 18:31:10 +0200
commit93373cd113d046b65538fe983b46842d689a2112 (patch)
tree5a170487453f18a855b941b92994a8957fa3ec3d
parentd2892cd893e4379914a08e66682ed5c423743a41 (diff)
Qt: Add a new page->annotations() call that let's you specify subtypesHEADmaster
This way we don't return annotations you may not be interested in
-rw-r--r--qt4/src/poppler-annotation-private.h4
-rw-r--r--qt4/src/poppler-annotation.cc48
-rw-r--r--qt4/src/poppler-page.cc7
-rw-r--r--qt4/src/poppler-qt4.h14
-rw-r--r--qt5/src/poppler-annotation-private.h4
-rw-r--r--qt5/src/poppler-annotation.cc48
-rw-r--r--qt5/src/poppler-page.cc7
-rw-r--r--qt5/src/poppler-qt5.h15
8 files changed, 137 insertions, 10 deletions
diff --git a/qt4/src/poppler-annotation-private.h b/qt4/src/poppler-annotation-private.h
index c755eb35..4c263eb4 100644
--- a/qt4/src/poppler-annotation-private.h
+++ b/qt4/src/poppler-annotation-private.h
@@ -93,8 +93,8 @@ class AnnotationPrivate : public QSharedData
PDFRectangle boundaryToPdfRectangle(const QRectF &r, int flags) const;
AnnotPath * toAnnotPath(const QLinkedList<QPointF> &l) const;
- /* Scan page for annotations, parentId=0 searches for root annotations */
- static QList<Annotation*> findAnnotations(::Page *pdfPage, DocumentData *doc, int parentId = 0);
+ /* Scan page for annotations, parentId=0 searches for root annotations, subtypes empty means all subtypes */
+ static QList<Annotation*> findAnnotations(::Page *pdfPage, DocumentData *doc, const QSet<Annotation::SubType> &subtypes, int parentId = 0);
/* Add given annotation to given page */
static void addAnnotationToPage(::Page *pdfPage, DocumentData *doc, const Annotation * ann);
diff --git a/qt4/src/poppler-annotation.cc b/qt4/src/poppler-annotation.cc
index 70a5ea2b..8375287c 100644
--- a/qt4/src/poppler-annotation.cc
+++ b/qt4/src/poppler-annotation.cc
@@ -366,7 +366,7 @@ AnnotPath * AnnotationPrivate::toAnnotPath(const QLinkedList<QPointF> &list) con
return new AnnotPath(ac, count);
}
-QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentData *doc, int parentID)
+QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentData *doc, const QSet<Annotation::SubType> &subtypes, int parentID)
{
Annots* annots = pdfPage->getAnnots();
const uint numAnnotations = annots->getNumAnnots();
@@ -375,6 +375,20 @@ QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentD
return QList<Annotation*>();
}
+ const bool wantTextAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::AText);
+ const bool wantLineAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::ALine);
+ const bool wantGeomAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::AGeom);
+ const bool wantHighlightAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::AHighlight);
+ const bool wantStampAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::AStamp);
+ const bool wantInkAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::AInk);
+ const bool wantLinkAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::ALink);
+ const bool wantCaretAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::ACaret);
+ const bool wantFileAttachmentAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::AFileAttachment);
+ const bool wantSoundAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::ASound);
+ const bool wantMovieAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::AMovie);
+ const bool wantScreenAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::AScreen);
+ const bool wantWidgetAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::AWidget);
+
// Create Annotation objects and tie to their native Annot
QList<Annotation*> res;
for ( uint j = 0; j < numAnnotations; j++ )
@@ -405,36 +419,54 @@ QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentD
switch ( subType )
{
case Annot::typeText:
+ if (!wantTextAnnotations)
+ continue;
annotation = new TextAnnotation(TextAnnotation::Linked);
break;
case Annot::typeFreeText:
+ if (!wantTextAnnotations)
+ continue;
annotation = new TextAnnotation(TextAnnotation::InPlace);
break;
case Annot::typeLine:
+ if (!wantLineAnnotations)
+ continue;
annotation = new LineAnnotation(LineAnnotation::StraightLine);
break;
case Annot::typePolygon:
case Annot::typePolyLine:
+ if (!wantLineAnnotations)
+ continue;
annotation = new LineAnnotation(LineAnnotation::Polyline);
break;
case Annot::typeSquare:
case Annot::typeCircle:
+ if (!wantGeomAnnotations)
+ continue;
annotation = new GeomAnnotation();
break;
case Annot::typeHighlight:
case Annot::typeUnderline:
case Annot::typeSquiggly:
case Annot::typeStrikeOut:
+ if (!wantHighlightAnnotations)
+ continue;
annotation = new HighlightAnnotation();
break;
case Annot::typeStamp:
+ if (!wantStampAnnotations)
+ continue;
annotation = new StampAnnotation();
break;
case Annot::typeInk:
+ if (!wantInkAnnotations)
+ continue;
annotation = new InkAnnotation();
break;
case Annot::typeLink: /* TODO: Move logic to getters */
{
+ if (!wantLinkAnnotations)
+ continue;
// parse Link params
AnnotLink * linkann = static_cast< AnnotLink * >( ann );
LinkAnnotation * l = new LinkAnnotation();
@@ -458,10 +490,14 @@ QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentD
break;
}
case Annot::typeCaret:
+ if (!wantCaretAnnotations)
+ continue;
annotation = new CaretAnnotation();
break;
case Annot::typeFileAttachment: /* TODO: Move logic to getters */
{
+ if (!wantFileAttachmentAnnotations)
+ continue;
AnnotFileAttachment * attachann = static_cast< AnnotFileAttachment * >( ann );
FileAttachmentAnnotation * f = new FileAttachmentAnnotation();
annotation = f;
@@ -474,6 +510,8 @@ QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentD
}
case Annot::typeSound: /* TODO: Move logic to getters */
{
+ if (!wantSoundAnnotations)
+ continue;
AnnotSound * soundann = static_cast< AnnotSound * >( ann );
SoundAnnotation * s = new SoundAnnotation();
annotation = s;
@@ -486,6 +524,8 @@ QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentD
}
case Annot::typeMovie: /* TODO: Move logic to getters */
{
+ if (!wantMovieAnnotations)
+ continue;
AnnotMovie * movieann = static_cast< AnnotMovie * >( ann );
MovieAnnotation * m = new MovieAnnotation();
annotation = m;
@@ -501,6 +541,8 @@ QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentD
}
case Annot::typeScreen:
{
+ if (!wantScreenAnnotations)
+ continue;
AnnotScreen * screenann = static_cast< AnnotScreen * >( ann );
if (!screenann->getAction())
continue;
@@ -522,6 +564,8 @@ QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentD
case Annot::typeUnknown:
continue; // special case for ignoring unknown annotations
case Annot::typeWidget:
+ if (!wantWidgetAnnotations)
+ continue;
annotation = new WidgetAnnotation();
break;
default:
@@ -1607,7 +1651,7 @@ QList<Annotation*> Annotation::revisions() const
if ( !d->pdfAnnot->getHasRef() )
return QList<Annotation*>();
- return AnnotationPrivate::findAnnotations( d->pdfPage, d->parentDoc, d->pdfAnnot->getId() );
+ return AnnotationPrivate::findAnnotations( d->pdfPage, d->parentDoc, QSet<Annotation::SubType>(), d->pdfAnnot->getId() );
}
//END Annotation implementation
diff --git a/qt4/src/poppler-page.cc b/qt4/src/poppler-page.cc
index f7c24273..32f6d7e7 100644
--- a/qt4/src/poppler-page.cc
+++ b/qt4/src/poppler-page.cc
@@ -671,7 +671,12 @@ QList<Link*> Page::links() const
QList<Annotation*> Page::annotations() const
{
- return AnnotationPrivate::findAnnotations(m_page->page, m_page->parentDoc);
+ return AnnotationPrivate::findAnnotations(m_page->page, m_page->parentDoc, QSet<Annotation::SubType>());
+}
+
+QList<Annotation*> Page::annotations(const QSet<Annotation::SubType> &subtypes) const
+{
+ return AnnotationPrivate::findAnnotations(m_page->page, m_page->parentDoc, subtypes);
}
void Page::addAnnotation( const Annotation *ann )
diff --git a/qt4/src/poppler-qt4.h b/qt4/src/poppler-qt4.h
index 30295cf7..6c4a410d 100644
--- a/qt4/src/poppler-qt4.h
+++ b/qt4/src/poppler-qt4.h
@@ -701,6 +701,20 @@ delete it;
QList<Annotation*> annotations() const;
/**
+ Returns the annotations of the page
+
+ \param subtypes the subtypes of annotations you are interested in
+
+ \note If you call this method twice, you get different objects
+ pointing to the same annotations (see Annotation).
+ The caller owns the returned objects and they should be deleted
+ when no longer required.
+
+ \since 0.28
+ */
+ QList<Annotation*> annotations(const QSet<Annotation::SubType> &subtypes) const;
+
+ /**
Adds an annotation to the page
\note Ownership of the annotation object stays with the caller, who can
diff --git a/qt5/src/poppler-annotation-private.h b/qt5/src/poppler-annotation-private.h
index c755eb35..4c263eb4 100644
--- a/qt5/src/poppler-annotation-private.h
+++ b/qt5/src/poppler-annotation-private.h
@@ -93,8 +93,8 @@ class AnnotationPrivate : public QSharedData
PDFRectangle boundaryToPdfRectangle(const QRectF &r, int flags) const;
AnnotPath * toAnnotPath(const QLinkedList<QPointF> &l) const;
- /* Scan page for annotations, parentId=0 searches for root annotations */
- static QList<Annotation*> findAnnotations(::Page *pdfPage, DocumentData *doc, int parentId = 0);
+ /* Scan page for annotations, parentId=0 searches for root annotations, subtypes empty means all subtypes */
+ static QList<Annotation*> findAnnotations(::Page *pdfPage, DocumentData *doc, const QSet<Annotation::SubType> &subtypes, int parentId = 0);
/* Add given annotation to given page */
static void addAnnotationToPage(::Page *pdfPage, DocumentData *doc, const Annotation * ann);
diff --git a/qt5/src/poppler-annotation.cc b/qt5/src/poppler-annotation.cc
index e6d331df..3654cb38 100644
--- a/qt5/src/poppler-annotation.cc
+++ b/qt5/src/poppler-annotation.cc
@@ -366,7 +366,7 @@ AnnotPath * AnnotationPrivate::toAnnotPath(const QLinkedList<QPointF> &list) con
return new AnnotPath(ac, count);
}
-QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentData *doc, int parentID)
+QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentData *doc, const QSet<Annotation::SubType> &subtypes, int parentID)
{
Annots* annots = pdfPage->getAnnots();
const uint numAnnotations = annots->getNumAnnots();
@@ -375,6 +375,20 @@ QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentD
return QList<Annotation*>();
}
+ const bool wantTextAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::AText);
+ const bool wantLineAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::ALine);
+ const bool wantGeomAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::AGeom);
+ const bool wantHighlightAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::AHighlight);
+ const bool wantStampAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::AStamp);
+ const bool wantInkAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::AInk);
+ const bool wantLinkAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::ALink);
+ const bool wantCaretAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::ACaret);
+ const bool wantFileAttachmentAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::AFileAttachment);
+ const bool wantSoundAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::ASound);
+ const bool wantMovieAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::AMovie);
+ const bool wantScreenAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::AScreen);
+ const bool wantWidgetAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::AWidget);
+
// Create Annotation objects and tie to their native Annot
QList<Annotation*> res;
for ( uint j = 0; j < numAnnotations; j++ )
@@ -405,36 +419,54 @@ QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentD
switch ( subType )
{
case Annot::typeText:
+ if (!wantTextAnnotations)
+ continue;
annotation = new TextAnnotation(TextAnnotation::Linked);
break;
case Annot::typeFreeText:
+ if (!wantTextAnnotations)
+ continue;
annotation = new TextAnnotation(TextAnnotation::InPlace);
break;
case Annot::typeLine:
+ if (!wantLineAnnotations)
+ continue;
annotation = new LineAnnotation(LineAnnotation::StraightLine);
break;
case Annot::typePolygon:
case Annot::typePolyLine:
+ if (!wantLineAnnotations)
+ continue;
annotation = new LineAnnotation(LineAnnotation::Polyline);
break;
case Annot::typeSquare:
case Annot::typeCircle:
+ if (!wantGeomAnnotations)
+ continue;
annotation = new GeomAnnotation();
break;
case Annot::typeHighlight:
case Annot::typeUnderline:
case Annot::typeSquiggly:
case Annot::typeStrikeOut:
+ if (!wantHighlightAnnotations)
+ continue;
annotation = new HighlightAnnotation();
break;
case Annot::typeStamp:
+ if (!wantStampAnnotations)
+ continue;
annotation = new StampAnnotation();
break;
case Annot::typeInk:
+ if (!wantInkAnnotations)
+ continue;
annotation = new InkAnnotation();
break;
case Annot::typeLink: /* TODO: Move logic to getters */
{
+ if (!wantLinkAnnotations)
+ continue;
// parse Link params
AnnotLink * linkann = static_cast< AnnotLink * >( ann );
LinkAnnotation * l = new LinkAnnotation();
@@ -458,10 +490,14 @@ QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentD
break;
}
case Annot::typeCaret:
+ if (!wantCaretAnnotations)
+ continue;
annotation = new CaretAnnotation();
break;
case Annot::typeFileAttachment: /* TODO: Move logic to getters */
{
+ if (!wantFileAttachmentAnnotations)
+ continue;
AnnotFileAttachment * attachann = static_cast< AnnotFileAttachment * >( ann );
FileAttachmentAnnotation * f = new FileAttachmentAnnotation();
annotation = f;
@@ -474,6 +510,8 @@ QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentD
}
case Annot::typeSound: /* TODO: Move logic to getters */
{
+ if (!wantSoundAnnotations)
+ continue;
AnnotSound * soundann = static_cast< AnnotSound * >( ann );
SoundAnnotation * s = new SoundAnnotation();
annotation = s;
@@ -486,6 +524,8 @@ QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentD
}
case Annot::typeMovie: /* TODO: Move logic to getters */
{
+ if (!wantMovieAnnotations)
+ continue;
AnnotMovie * movieann = static_cast< AnnotMovie * >( ann );
MovieAnnotation * m = new MovieAnnotation();
annotation = m;
@@ -501,6 +541,8 @@ QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentD
}
case Annot::typeScreen:
{
+ if (!wantScreenAnnotations)
+ continue;
AnnotScreen * screenann = static_cast< AnnotScreen * >( ann );
if (!screenann->getAction())
continue;
@@ -522,6 +564,8 @@ QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentD
case Annot::typeUnknown:
continue; // special case for ignoring unknown annotations
case Annot::typeWidget:
+ if (!wantWidgetAnnotations)
+ continue;
annotation = new WidgetAnnotation();
break;
default:
@@ -1604,7 +1648,7 @@ QList<Annotation*> Annotation::revisions() const
if ( !d->pdfAnnot->getHasRef() )
return QList<Annotation*>();
- return AnnotationPrivate::findAnnotations( d->pdfPage, d->parentDoc, d->pdfAnnot->getId() );
+ return AnnotationPrivate::findAnnotations( d->pdfPage, d->parentDoc, QSet<Annotation::SubType>(), d->pdfAnnot->getId() );
}
//END Annotation implementation
diff --git a/qt5/src/poppler-page.cc b/qt5/src/poppler-page.cc
index df2ef691..29772147 100644
--- a/qt5/src/poppler-page.cc
+++ b/qt5/src/poppler-page.cc
@@ -653,7 +653,12 @@ QList<Link*> Page::links() const
QList<Annotation*> Page::annotations() const
{
- return AnnotationPrivate::findAnnotations(m_page->page, m_page->parentDoc);
+ return AnnotationPrivate::findAnnotations(m_page->page, m_page->parentDoc, QSet<Annotation::SubType>());
+}
+
+QList<Annotation*> Page::annotations(const QSet<Annotation::SubType> &subtypes) const
+{
+ return AnnotationPrivate::findAnnotations(m_page->page, m_page->parentDoc, subtypes);
}
void Page::addAnnotation( const Annotation *ann )
diff --git a/qt5/src/poppler-qt5.h b/qt5/src/poppler-qt5.h
index 6f360888..d8f13eac 100644
--- a/qt5/src/poppler-qt5.h
+++ b/qt5/src/poppler-qt5.h
@@ -689,6 +689,21 @@ delete it;
*/
QList<Annotation*> annotations() const;
+
+ /**
+ Returns the annotations of the page
+
+ \param subtypes the subtypes of annotations you are interested in
+
+ \note If you call this method twice, you get different objects
+ pointing to the same annotations (see Annotation).
+ The caller owns the returned objects and they should be deleted
+ when no longer required.
+
+ \since 0.28
+ */
+ QList<Annotation*> annotations(const QSet<Annotation::SubType> &subtypes) const;
+
/**
Adds an annotation to the page