Hello,

I just noticed that there is a typo as my megalomania made me type
"WholeWorlds" instead of "WholeWords" everywhere... :-\

Best regards, Adam.

Am 20.01.2015 um 00:09 schrieb Albert Astals Cid:
>  qt4/src/poppler-page-private.h |    5 +
>  qt4/src/poppler-page.cc        |  114 +++++++++++++++++++++++++------------
>  qt4/src/poppler-qt4.h          |   44 +++++++++++++-
>  qt4/tests/check_search.cpp     |  112 +++++++++++++++++++++++++++++++-----
>  qt5/src/poppler-page-private.h |    5 +
>  qt5/src/poppler-page.cc        |  116 +++++++++++++++++++++++++------------
>  qt5/src/poppler-qt5.h          |   46 +++++++++++++-
>  qt5/tests/check_search.cpp     |  126 
> ++++++++++++++++++++++++++++++++---------
>  8 files changed, 447 insertions(+), 121 deletions(-)
> 
> New commits:
> commit 027eac4e565576ca2e7042e21426e28abd775d98
> Author: Adam Reichold <[email protected]>
> Date:   Tue Jan 20 00:09:09 2015 +0100
> 
>     Expose whole-words search option in Qt frontends
> 
> diff --git a/qt4/src/poppler-page-private.h b/qt4/src/poppler-page-private.h
> index 91955e0..1cb63e9 100644
> --- a/qt4/src/poppler-page-private.h
> +++ b/qt4/src/poppler-page-private.h
> @@ -2,6 +2,7 @@
>   * Copyright (C) 2005, Net Integration Technologies, Inc.
>   * Copyright (C) 2007, 2012, Albert Astals Cid <[email protected]>
>   * Copyright (C) 2008, Pino Toscano <[email protected]>
> + * Copyright (C) 2015 Adam Reichold <[email protected]>
>   *
>   * 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
> @@ -46,7 +47,9 @@ public:
>  
>    static Link* convertLinkActionToLink(::LinkAction * a, DocumentData 
> *parentDoc, const QRectF &linkArea);
>    
> -  TextPage *prepareTextSearch(const QString &text, Page::SearchMode 
> caseSensitive, Page::Rotation rotate, GBool *sCase, QVector<Unicode> *u);
> +  TextPage *prepareTextSearch(const QString &text, Page::Rotation rotate, 
> QVector<Unicode> *u);
> +  GBool performSingleTextSearch(TextPage* textPage, QVector<Unicode> &u, 
> double &sLeft, double &sTop, double &sRight, double &sBottom, 
> Page::SearchDirection direction, GBool sCase, GBool sWords);
> +  QList<QRectF> performMultipleTextSearch(TextPage* textPage, 
> QVector<Unicode> &u, GBool sCase, GBool sWords);
>  };
>  
>  }
> diff --git a/qt4/src/poppler-page.cc b/qt4/src/poppler-page.cc
> index 9c99cda..a4536af 100644
> --- a/qt4/src/poppler-page.cc
> +++ b/qt4/src/poppler-page.cc
> @@ -12,7 +12,7 @@
>   * Copyright (C) 2010 Hib Eris <[email protected]>
>   * Copyright (C) 2012 Tobias Koenig <[email protected]>
>   * Copyright (C) 2012 Fabio D'Urso <[email protected]>
> - * Copyright (C) 2012 Adam Reichold <[email protected]>
> + * Copyright (C) 2012, 2015 Adam Reichold <[email protected]>
>   * Copyright (C) 2012, 2013 Thomas Freitag <[email protected]>
>   * Copyright (C) 2015 William Bader <[email protected]>
>   *
> @@ -216,16 +216,13 @@ Link* PageData::convertLinkActionToLink(::LinkAction * 
> a, DocumentData *parentDo
>    return popplerLink;
>  }
>  
> -TextPage *PageData::prepareTextSearch(const QString &text, Page::SearchMode 
> caseSensitive, Page::Rotation rotate, GBool *sCase, QVector<Unicode> *u)
> +inline TextPage *PageData::prepareTextSearch(const QString &text, 
> Page::Rotation rotate, QVector<Unicode> *u)
>  {
>    const QChar * str = text.unicode();
>    const int len = text.length();
>    u->resize(len);
>    for (int i = 0; i < len; ++i) (*u)[i] = str[i].unicode();
>  
> -  if (caseSensitive == Page::CaseSensitive) *sCase = gTrue;
> -  else *sCase = gFalse;
> -
>    const int rotation = (int)rotate * 90;
>  
>    // fetch ourselves a textpage
> @@ -235,7 +232,43 @@ TextPage *PageData::prepareTextSearch(const QString 
> &text, Page::SearchMode case
>    TextPage *textPage=td.takeText();
>    
>    return textPage;
> -} 
> +}
> +
> +inline GBool PageData::performSingleTextSearch(TextPage* textPage, 
> QVector<Unicode> &u, double &sLeft, double &sTop, double &sRight, double 
> &sBottom, Page::SearchDirection direction, GBool sCase, GBool sWords)
> +{
> +  if (direction == Page::FromTop)
> +    return textPage->findText( u.data(), u.size(),
> +           gTrue, gTrue, gFalse, gFalse, sCase, gFalse, sWords, &sLeft, 
> &sTop, &sRight, &sBottom );
> +  else if ( direction == Page::NextResult )
> +    return textPage->findText( u.data(), u.size(),
> +           gFalse, gTrue, gTrue, gFalse, sCase, gFalse, sWords, &sLeft, 
> &sTop, &sRight, &sBottom );
> +  else if ( direction == Page::PreviousResult )
> +    return textPage->findText( u.data(), u.size(),
> +           gFalse, gTrue, gTrue, gFalse, sCase, gTrue, sWords, &sLeft, 
> &sTop, &sRight, &sBottom );
> +
> +  return gFalse;
> +}
> +
> +inline QList<QRectF> PageData::performMultipleTextSearch(TextPage* textPage, 
> QVector<Unicode> &u, GBool sCase, GBool sWords)
> +{
> +  QList<QRectF> results;
> +  double sLeft = 0.0, sTop = 0.0, sRight = 0.0, sBottom = 0.0;
> +
> +  while(textPage->findText( u.data(), u.size(),
> +        gFalse, gTrue, gTrue, gFalse, sCase, gFalse, sWords, &sLeft, &sTop, 
> &sRight, &sBottom ))
> +  {
> +      QRectF result;
> +
> +      result.setLeft(sLeft);
> +      result.setTop(sTop);
> +      result.setRight(sRight);
> +      result.setBottom(sBottom);
> +
> +      results.append(result);
> +  }
> +
> +  return results;
> +}
>  
>  Page::Page(DocumentData *doc, int index) {
>    m_page = new PageData();
> @@ -460,20 +493,27 @@ QString Page::text(const QRectF &r) const
>  
>  bool Page::search(const QString &text, double &sLeft, double &sTop, double 
> &sRight, double &sBottom, SearchDirection direction, SearchMode 
> caseSensitive, Rotation rotate) const
>  {
> -  GBool sCase;
> +  const GBool sCase = caseSensitive == Page::CaseSensitive ? gTrue : gFalse;
> +
>    QVector<Unicode> u;
> -  TextPage *textPage = m_page->prepareTextSearch(text, caseSensitive, 
> rotate, &sCase, &u);
> -
> -  bool found = false;
> -  if (direction == FromTop)
> -    found = textPage->findText( u.data(), u.size(), 
> -            gTrue, gTrue, gFalse, gFalse, sCase, gFalse, gFalse, &sLeft, 
> &sTop, &sRight, &sBottom );
> -  else if ( direction == NextResult )
> -    found = textPage->findText( u.data(), u.size(), 
> -            gFalse, gTrue, gTrue, gFalse, sCase, gFalse, gFalse, &sLeft, 
> &sTop, &sRight, &sBottom );
> -  else if ( direction == PreviousResult )
> -    found = textPage->findText( u.data(), u.size(), 
> -            gFalse, gTrue, gTrue, gFalse, sCase, gTrue, gFalse, &sLeft, 
> &sTop, &sRight, &sBottom );
> +  TextPage *textPage = m_page->prepareTextSearch(text, rotate, &u);
> +
> +  const bool found = m_page->performSingleTextSearch(textPage, u, sLeft, 
> sTop, sRight, sBottom, direction, sCase, gFalse);
> +
> +  textPage->decRefCnt();
> +
> +  return found;
> +}
> +
> +bool Page::search(const QString &text, double &sLeft, double &sTop, double 
> &sRight, double &sBottom, SearchDirection direction, SearchFlags flags, 
> Rotation rotate) const
> +{
> +  const GBool sCase = flags.testFlag(IgnoreCase) ? gFalse : gTrue;
> +  const GBool sWords = flags.testFlag(WholeWorlds) ? gTrue : gFalse;
> +
> +  QVector<Unicode> u;
> +  TextPage *textPage = m_page->prepareTextSearch(text, rotate, &u);
> +
> +  const bool found = m_page->performSingleTextSearch(textPage, u, sLeft, 
> sTop, sRight, sBottom, direction, sCase, sWords);
>  
>    textPage->decRefCnt();
>  
> @@ -500,31 +540,33 @@ bool Page::search(const QString &text, QRectF &rect, 
> SearchDirection direction,
>  
>  QList<QRectF> Page::search(const QString &text, SearchMode caseSensitive, 
> Rotation rotate) const
>  {
> -  GBool sCase;
> +  const GBool sCase = caseSensitive == Page::CaseSensitive ? gTrue : gFalse;
> +
>    QVector<Unicode> u;
> -  TextPage *textPage = m_page->prepareTextSearch(text, caseSensitive, 
> rotate, &sCase, &u);
> +  TextPage *textPage = m_page->prepareTextSearch(text, rotate, &u);
>  
> -  QList<QRectF> results;
> -  double sLeft = 0.0, sTop = 0.0, sRight = 0.0, sBottom = 0.0;
> -  
> -  while(textPage->findText( u.data(), u.size(), 
> -        gFalse, gTrue, gTrue, gFalse, sCase, gFalse, gFalse, &sLeft, &sTop, 
> &sRight, &sBottom ))
> -  {
> -      QRectF result;
> -      
> -      result.setLeft(sLeft);
> -      result.setTop(sTop);
> -      result.setRight(sRight);
> -      result.setBottom(sBottom);
> -      
> -      results.append(result);
> -  }
> +  const QList<QRectF> results = m_page->performMultipleTextSearch(textPage, 
> u, sCase, gFalse);
>    
>    textPage->decRefCnt();
>  
>    return results;
>  }
>  
> +QList<QRectF> Page::search(const QString &text, SearchFlags flags, Rotation 
> rotate) const
> +{
> +  const GBool sCase = flags.testFlag(IgnoreCase) ? gFalse : gTrue;
> +  const GBool sWords = flags.testFlag(WholeWorlds) ? gTrue : gFalse;
> +
> +  QVector<Unicode> u;
> +  TextPage *textPage = m_page->prepareTextSearch(text, rotate, &u);
> +
> +  const QList<QRectF> results = m_page->performMultipleTextSearch(textPage, 
> u, sCase, sWords);
> +
> +  textPage->decRefCnt();
> +
> +  return results;
> +}
> +
>  QList<TextBox*> Page::textList(Rotation rotate) const
>  {
>    TextOutputDev *output_dev;
> diff --git a/qt4/src/poppler-qt4.h b/qt4/src/poppler-qt4.h
> index ee7558e..48c517a 100644
> --- a/qt4/src/poppler-qt4.h
> +++ b/qt4/src/poppler-qt4.h
> @@ -12,7 +12,7 @@
>   * Copyright (C) 2012, Guillermo A. Amaral B. <[email protected]>
>   * Copyright (C) 2012, Fabio D'Urso <[email protected]>
>   * Copyright (C) 2012, Tobias Koenig <[email protected]>
> - * Copyright (C) 2012, 2014 Adam Reichold <[email protected]>
> + * Copyright (C) 2012, 2014, 2015 Adam Reichold <[email protected]>
>   * Copyright (C) 2012, 2013 Thomas Freitag <[email protected]>
>   *
>   * This program is free software; you can redistribute it and/or modify
> @@ -579,6 +579,16 @@ delete it;
>       enum SearchMode { CaseSensitive,   ///< Case differences cause no match 
> in searching
>                         CaseInsensitive  ///< Case differences are ignored in 
> matching
>       };
> +
> +        /**
> +           Flags to modify the search behaviour \since 0.31
> +        */
> +        enum SearchFlag
> +        {
> +            IgnoreCase = 0x00000001,    ///< Case differences are ignored
> +            WholeWorlds = 0x00000002    ///< Only whole words are matched
> +        };
> +        Q_DECLARE_FLAGS( SearchFlags, SearchFlag )
>       
>       /**
>          Returns true if the specified text was found.
> @@ -603,7 +613,21 @@ delete it;
>          \param rotate the rotation to apply for the search order
>          \since 0.14
>       **/
> -     bool search(const QString &text, double &rectLeft, double &rectTop, 
> double &rectRight, double &rectBottom, SearchDirection direction, SearchMode 
> caseSensitive, Rotation rotate = Rotate0) const;
> +        Q_DECL_DEPRECATED bool search(const QString &text, double &rectLeft, 
> double &rectTop, double &rectRight, double &rectBottom, SearchDirection 
> direction, SearchMode caseSensitive, Rotation rotate = Rotate0) const;
> +
> +        /**
> +           Returns true if the specified text was found.
> +
> +           \param text the text the search
> +           \param rectXXX in all directions is used to return where the text 
> was found, for NextResult and PreviousResult
> +                       indicates where to continue searching for
> +           \param direction in which direction do the search
> +           \param flags the flags to consider during matching
> +           \param rotate the rotation to apply for the search order
> +
> +           \since 0.31
> +        **/
> +        bool search(const QString &text, double &rectLeft, double &rectTop, 
> double &rectRight, double &rectBottom, SearchDirection direction, SearchFlags 
> flags = 0, Rotation rotate = Rotate0) const;
>       
>       /**
>          Returns a list of all occurrences of the specified text on the page.
> @@ -616,7 +640,20 @@ delete it;
>          
>          \since 0.22
>       **/
> -     QList<QRectF> search(const QString &text, SearchMode caseSensitive, 
> Rotation rotate = Rotate0) const;
> +        Q_DECL_DEPRECATED QList<QRectF> search(const QString &text, 
> SearchMode caseSensitive, Rotation rotate = Rotate0) const;
> +
> +        /**
> +           Returns a list of all occurrences of the specified text on the 
> page.
> +
> +           \param text the text to search
> +           \param flags the flags to consider during matching
> +           \param rotate the rotation to apply for the search order
> +
> +           \warning Do not use the returned QRectF as arguments of another 
> search call because of truncation issues if qreal is defined as float.
> +
> +           \since 0.31
> +        **/
> +        QList<QRectF> search(const QString &text, SearchFlags flags = 0, 
> Rotation rotate = Rotate0) const;
>  
>       /**
>          Returns a list of text of the page
> @@ -1826,6 +1863,7 @@ height = dummy.height();
>  }
>  
>  Q_DECLARE_OPERATORS_FOR_FLAGS(Poppler::Page::PainterFlags)
> +Q_DECLARE_OPERATORS_FOR_FLAGS(Poppler::Page::SearchFlags)
>  Q_DECLARE_OPERATORS_FOR_FLAGS(Poppler::Document::RenderHints)
>  Q_DECLARE_OPERATORS_FOR_FLAGS(Poppler::PDFConverter::PDFOptions)
>  Q_DECLARE_OPERATORS_FOR_FLAGS(Poppler::PSConverter::PSOptions)
> diff --git a/qt4/tests/check_search.cpp b/qt4/tests/check_search.cpp
> index cabf82d..77e62e3 100644
> --- a/qt4/tests/check_search.cpp
> +++ b/qt4/tests/check_search.cpp
> @@ -8,17 +8,18 @@ class TestSearch: public QObject
>  private slots:
>      void bug7063();
>      void testNextAndPrevious();
> +    void testWholeWordsOnly();
>  };
>  
>  void TestSearch::bug7063()
>  {
> -    Poppler::Document *doc;
> -    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/bug7063.pdf");
> -    QVERIFY( doc );
> -   
> -    Poppler::Page *page = doc->page(0);
> -    QRectF pageRegion( QPointF(0,0), page->pageSize() );
> +    QScopedPointer< Poppler::Document > 
> document(Poppler::Document::load(TESTDATADIR "/unittestcases/bug7063.pdf"));
> +    QVERIFY( document );
> +
> +    QScopedPointer< Poppler::Page > page(document->page(0));
> +    QVERIFY( page );
>  
> +    QRectF pageRegion( QPointF(0,0), page->pageSize() );
>      QCOMPARE( page->search(QString("non-ascii:"), pageRegion, 
> Poppler::Page::FromTop, Poppler::Page::CaseSensitive), true );
>  
>      QCOMPARE( page->search(QString("Ascii"), pageRegion, 
> Poppler::Page::FromTop, Poppler::Page::CaseSensitive), false );
> @@ -32,17 +33,32 @@ void TestSearch::bug7063()
>      QCOMPARE( page->search(QString::fromUtf8("search \"é\", \"à \" or 
> \"ç\""), pageRegion, Poppler::Page::FromTop, Poppler::Page::CaseSensitive), 
> true );
>      QCOMPARE( page->search(QString::fromUtf8("¥µ©"), pageRegion, 
> Poppler::Page::FromTop, Poppler::Page::CaseSensitive), true );
>      QCOMPARE( page->search(QString::fromUtf8("¥©"), pageRegion, 
> Poppler::Page::FromTop, Poppler::Page::CaseSensitive), false );
> -  
> -    delete doc;
> +
> +    double rectLeft = 0.0, rectTop = 0.0, rectRight = 
> page->pageSizeF().width(), rectBottom = page->pageSizeF().height();
> +
> +    QCOMPARE( page->search(QString("non-ascii:"), rectLeft, rectTop, 
> rectRight, rectBottom, Poppler::Page::FromTop), true );
> +
> +    QCOMPARE( page->search(QString("Ascii"), rectLeft, rectTop, rectRight, 
> rectBottom, Poppler::Page::FromTop), false );
> +    QCOMPARE( page->search(QString("Ascii"), rectLeft, rectTop, rectRight, 
> rectBottom, Poppler::Page::FromTop, Poppler::Page::IgnoreCase), true );
> +
> +    QCOMPARE( page->search(QString("latin1:"), rectLeft, rectTop, rectRight, 
> rectBottom, Poppler::Page::FromTop), false );
> +
> +    QCOMPARE( page->search(QString::fromUtf8("é"), rectLeft, rectTop, 
> rectRight, rectBottom, Poppler::Page::FromTop), true );
> +    QCOMPARE( page->search(QString::fromUtf8("Ã "), rectLeft, rectTop, 
> rectRight, rectBottom, Poppler::Page::FromTop), true );
> +    QCOMPARE( page->search(QString::fromUtf8("ç"), rectLeft, rectTop, 
> rectRight, rectBottom, Poppler::Page::FromTop), true );
> +    QCOMPARE( page->search(QString::fromUtf8("search \"é\", \"à \" or 
> \"ç\""), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::FromTop), 
> true );
> +    QCOMPARE( page->search(QString::fromUtf8("¥µ©"), rectLeft, rectTop, 
> rectRight, rectBottom, Poppler::Page::FromTop), true );
> +    QCOMPARE( page->search(QString::fromUtf8("¥©"), rectLeft, rectTop, 
> rectRight, rectBottom, Poppler::Page::FromTop), false );
>  }
>  
>  void TestSearch::testNextAndPrevious()
>  {
> -    Poppler::Document *doc;
> -    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/xr01.pdf");
> -    QVERIFY( doc );
> -  
> -    Poppler::Page *page = doc->page(0);
> +    QScopedPointer< Poppler::Document > 
> document(Poppler::Document::load(TESTDATADIR "/unittestcases/xr01.pdf"));
> +    QVERIFY( document );
> +
> +    QScopedPointer< Poppler::Page > page(document->page(0));
> +    QVERIFY( page );
> +
>      QRectF region( QPointF(0,0), page->pageSize() );
>      
>      QCOMPARE( page->search(QString("is"), region, Poppler::Page::FromTop, 
> Poppler::Page::CaseSensitive), true );
> @@ -83,7 +99,75 @@ void TestSearch::testNextAndPrevious()
>      QVERIFY( qAbs(region.height() - 8.85) < 0.01 );
>      QCOMPARE( page->search(QString("is"), region, 
> Poppler::Page::PreviousResult, Poppler::Page::CaseSensitive), false );
>      
> -    delete doc;
> +    double rectLeft = 0.0, rectTop = 0.0, rectRight = 
> page->pageSizeF().width(), rectBottom = page->pageSizeF().height();
> +
> +    QCOMPARE( page->search(QString("is"), rectLeft, rectTop, rectRight, 
> rectBottom, Poppler::Page::FromTop), true );
> +    QVERIFY( qAbs(rectLeft - 161.44) < 0.01 );
> +    QVERIFY( qAbs(rectTop - 127.85) < 0.01 );
> +    QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
> +    QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
> +    QCOMPARE( page->search(QString("is"), rectLeft, rectTop, rectRight, 
> rectBottom, Poppler::Page::NextResult), true );
> +    QVERIFY( qAbs(rectLeft - 171.46) < 0.01 );
> +    QVERIFY( qAbs(rectTop - 127.85) < 0.01 );
> +    QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
> +    QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
> +    QCOMPARE( page->search(QString("is"), rectLeft, rectTop, rectRight, 
> rectBottom, Poppler::Page::NextResult), true );
> +    QVERIFY( qAbs(rectLeft - 161.44) < 0.01 );
> +    QVERIFY( qAbs(rectTop - 139.81) < 0.01 );
> +    QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
> +    QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
> +    QCOMPARE( page->search(QString("is"), rectLeft, rectTop, rectRight, 
> rectBottom, Poppler::Page::NextResult), true );
> +    QVERIFY( qAbs(rectLeft - 171.46) < 0.01 );
> +    QVERIFY( qAbs(rectTop - 139.81) < 0.01 );
> +    QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
> +    QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
> +    QCOMPARE( page->search(QString("is"), rectLeft, rectTop, rectRight, 
> rectBottom, Poppler::Page::NextResult), false );
> +    QCOMPARE( page->search(QString("is"), rectLeft, rectTop, rectRight, 
> rectBottom, Poppler::Page::PreviousResult), true );
> +    QVERIFY( qAbs(rectLeft - 161.44) < 0.01 );
> +    QVERIFY( qAbs(rectTop - 139.81) < 0.01 );
> +    QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
> +    QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
> +    QCOMPARE( page->search(QString("is"), rectLeft, rectTop, rectRight, 
> rectBottom, Poppler::Page::PreviousResult), true );
> +    QVERIFY( qAbs(rectLeft - 171.46) < 0.01 );
> +    QVERIFY( qAbs(rectTop - 127.85) < 0.01 );
> +    QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
> +    QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
> +    QCOMPARE( page->search(QString("is"), rectLeft, rectTop, rectRight, 
> rectBottom, Poppler::Page::PreviousResult), true );
> +    QVERIFY( qAbs(rectLeft - 161.44) < 0.01 );
> +    QVERIFY( qAbs(rectTop - 127.85) < 0.01 );
> +    QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
> +    QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
> +    QCOMPARE( page->search(QString("is"), rectLeft, rectTop, rectRight, 
> rectBottom, Poppler::Page::PreviousResult), false );
> +}
> +
> +void TestSearch::testWholeWordsOnly()
> +{
> +    QScopedPointer< Poppler::Document > 
> document(Poppler::Document::load(TESTDATADIR 
> "/unittestcases/WithActualText.pdf"));
> +    QVERIFY( document );
> +
> +    QScopedPointer< Poppler::Page > page(document->page(0));
> +    QVERIFY( page );
> +
> +    const Poppler::Page::SearchDirection direction = Poppler::Page::FromTop;
> +
> +    const Poppler::Page::SearchFlags mode0 = 0;
> +    const Poppler::Page::SearchFlags mode1 = Poppler::Page::IgnoreCase;
> +    const Poppler::Page::SearchFlags mode2 = Poppler::Page::WholeWorlds;
> +    const Poppler::Page::SearchFlags mode3 = Poppler::Page::IgnoreCase | 
> Poppler::Page::WholeWorlds;
> +
> +    double left, top, right, bottom;
> +
> +    QCOMPARE( page->search(QLatin1String("brown"), left, top, right, bottom, 
> direction, mode0), true );
> +    QCOMPARE( page->search(QLatin1String("brOwn"), left, top, right, bottom, 
> direction, mode0), false );
> +
> +    QCOMPARE( page->search(QLatin1String("brOwn"), left, top, right, bottom, 
> direction, mode1), true );
> +    QCOMPARE( page->search(QLatin1String("brawn"), left, top, right, bottom, 
> direction, mode1), false );
> +
> +    QCOMPARE( page->search(QLatin1String("brown"), left, top, right, bottom, 
> direction, mode2), true );
> +    QCOMPARE( page->search(QLatin1String("own"), left, top, right, bottom, 
> direction, mode2), false );
> +
> +    QCOMPARE( page->search(QLatin1String("brOwn"), left, top, right, bottom, 
> direction, mode3), true );
> +    QCOMPARE( page->search(QLatin1String("Own"), left, top, right, bottom, 
> direction, mode3), false );
>  }
>  
>  QTEST_MAIN(TestSearch)
> diff --git a/qt5/src/poppler-page-private.h b/qt5/src/poppler-page-private.h
> index 91955e0..1cb63e9 100644
> --- a/qt5/src/poppler-page-private.h
> +++ b/qt5/src/poppler-page-private.h
> @@ -2,6 +2,7 @@
>   * Copyright (C) 2005, Net Integration Technologies, Inc.
>   * Copyright (C) 2007, 2012, Albert Astals Cid <[email protected]>
>   * Copyright (C) 2008, Pino Toscano <[email protected]>
> + * Copyright (C) 2015 Adam Reichold <[email protected]>
>   *
>   * 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
> @@ -46,7 +47,9 @@ public:
>  
>    static Link* convertLinkActionToLink(::LinkAction * a, DocumentData 
> *parentDoc, const QRectF &linkArea);
>    
> -  TextPage *prepareTextSearch(const QString &text, Page::SearchMode 
> caseSensitive, Page::Rotation rotate, GBool *sCase, QVector<Unicode> *u);
> +  TextPage *prepareTextSearch(const QString &text, Page::Rotation rotate, 
> QVector<Unicode> *u);
> +  GBool performSingleTextSearch(TextPage* textPage, QVector<Unicode> &u, 
> double &sLeft, double &sTop, double &sRight, double &sBottom, 
> Page::SearchDirection direction, GBool sCase, GBool sWords);
> +  QList<QRectF> performMultipleTextSearch(TextPage* textPage, 
> QVector<Unicode> &u, GBool sCase, GBool sWords);
>  };
>  
>  }
> diff --git a/qt5/src/poppler-page.cc b/qt5/src/poppler-page.cc
> index eec211e..88f2e73 100644
> --- a/qt5/src/poppler-page.cc
> +++ b/qt5/src/poppler-page.cc
> @@ -12,7 +12,7 @@
>   * Copyright (C) 2010 Hib Eris <[email protected]>
>   * Copyright (C) 2012 Tobias Koenig <[email protected]>
>   * Copyright (C) 2012 Fabio D'Urso <[email protected]>
> - * Copyright (C) 2012 Adam Reichold <[email protected]>
> + * Copyright (C) 2012, 2015 Adam Reichold <[email protected]>
>   * Copyright (C) 2012, 2013 Thomas Freitag <[email protected]>
>   * Copyright (C) 2015 William Bader <[email protected]>
>   *
> @@ -216,16 +216,13 @@ Link* PageData::convertLinkActionToLink(::LinkAction * 
> a, DocumentData *parentDo
>    return popplerLink;
>  }
>  
> -TextPage *PageData::prepareTextSearch(const QString &text, Page::SearchMode 
> caseSensitive, Page::Rotation rotate, GBool *sCase, QVector<Unicode> *u)
> +inline TextPage *PageData::prepareTextSearch(const QString &text, 
> Page::Rotation rotate, QVector<Unicode> *u)
>  {
>    const QChar * str = text.unicode();
>    const int len = text.length();
>    u->resize(len);
>    for (int i = 0; i < len; ++i) (*u)[i] = str[i].unicode();
>  
> -  if (caseSensitive == Page::CaseSensitive) *sCase = gTrue;
> -  else *sCase = gFalse;
> -
>    const int rotation = (int)rotate * 90;
>  
>    // fetch ourselves a textpage
> @@ -233,9 +230,45 @@ TextPage *PageData::prepareTextSearch(const QString 
> &text, Page::SearchMode case
>    parentDoc->doc->displayPage( &td, index + 1, 72, 72, rotation, false, 
> true, false,
>      NULL, NULL, NULL, NULL, gTrue);
>    TextPage *textPage=td.takeText();
> -  
> +
>    return textPage;
> -} 
> +}
> +
> +inline GBool PageData::performSingleTextSearch(TextPage* textPage, 
> QVector<Unicode> &u, double &sLeft, double &sTop, double &sRight, double 
> &sBottom, Page::SearchDirection direction, GBool sCase, GBool sWords)
> +{
> +  if (direction == Page::FromTop)
> +    return textPage->findText( u.data(), u.size(),
> +           gTrue, gTrue, gFalse, gFalse, sCase, gFalse, sWords, &sLeft, 
> &sTop, &sRight, &sBottom );
> +  else if ( direction == Page::NextResult )
> +    return textPage->findText( u.data(), u.size(),
> +           gFalse, gTrue, gTrue, gFalse, sCase, gFalse, sWords, &sLeft, 
> &sTop, &sRight, &sBottom );
> +  else if ( direction == Page::PreviousResult )
> +    return textPage->findText( u.data(), u.size(),
> +           gFalse, gTrue, gTrue, gFalse, sCase, gTrue, sWords, &sLeft, 
> &sTop, &sRight, &sBottom );
> +
> +  return gFalse;
> +}
> +
> +inline QList<QRectF> PageData::performMultipleTextSearch(TextPage* textPage, 
> QVector<Unicode> &u, GBool sCase, GBool sWords)
> +{
> +  QList<QRectF> results;
> +  double sLeft = 0.0, sTop = 0.0, sRight = 0.0, sBottom = 0.0;
> +
> +  while(textPage->findText( u.data(), u.size(),
> +        gFalse, gTrue, gTrue, gFalse, sCase, gFalse, sWords, &sLeft, &sTop, 
> &sRight, &sBottom ))
> +  {
> +      QRectF result;
> +
> +      result.setLeft(sLeft);
> +      result.setTop(sTop);
> +      result.setRight(sRight);
> +      result.setBottom(sBottom);
> +
> +      results.append(result);
> +  }
> +
> +  return results;
> +}
>  
>  Page::Page(DocumentData *doc, int index) {
>    m_page = new PageData();
> @@ -460,20 +493,27 @@ QString Page::text(const QRectF &r) const
>  
>  bool Page::search(const QString &text, double &sLeft, double &sTop, double 
> &sRight, double &sBottom, SearchDirection direction, SearchMode 
> caseSensitive, Rotation rotate) const
>  {
> -  GBool sCase;
> +  const GBool sCase = caseSensitive == Page::CaseSensitive ? gTrue : gFalse;
> +
>    QVector<Unicode> u;
> -  TextPage *textPage = m_page->prepareTextSearch(text, caseSensitive, 
> rotate, &sCase, &u);
> -
> -  bool found = false;
> -  if (direction == FromTop)
> -    found = textPage->findText( u.data(), u.size(), 
> -            gTrue, gTrue, gFalse, gFalse, sCase, gFalse, gFalse, &sLeft, 
> &sTop, &sRight, &sBottom );
> -  else if ( direction == NextResult )
> -    found = textPage->findText( u.data(), u.size(), 
> -            gFalse, gTrue, gTrue, gFalse, sCase, gFalse, gFalse, &sLeft, 
> &sTop, &sRight, &sBottom );
> -  else if ( direction == PreviousResult )
> -    found = textPage->findText( u.data(), u.size(), 
> -            gFalse, gTrue, gTrue, gFalse, sCase, gTrue, gFalse, &sLeft, 
> &sTop, &sRight, &sBottom );
> +  TextPage *textPage = m_page->prepareTextSearch(text, rotate, &u);
> +
> +  const bool found = m_page->performSingleTextSearch(textPage, u, sLeft, 
> sTop, sRight, sBottom, direction, sCase, gFalse);
> +
> +  textPage->decRefCnt();
> +
> +  return found;
> +}
> +
> +bool Page::search(const QString &text, double &sLeft, double &sTop, double 
> &sRight, double &sBottom, SearchDirection direction, SearchFlags flags, 
> Rotation rotate) const
> +{
> +  const GBool sCase = flags.testFlag(IgnoreCase) ? gFalse : gTrue;
> +  const GBool sWords = flags.testFlag(WholeWorlds) ? gTrue : gFalse;
> +
> +  QVector<Unicode> u;
> +  TextPage *textPage = m_page->prepareTextSearch(text, rotate, &u);
> +
> +  const bool found = m_page->performSingleTextSearch(textPage, u, sLeft, 
> sTop, sRight, sBottom, direction, sCase, sWords);
>  
>    textPage->decRefCnt();
>  
> @@ -482,31 +522,33 @@ bool Page::search(const QString &text, double &sLeft, 
> double &sTop, double &sRig
>  
>  QList<QRectF> Page::search(const QString &text, SearchMode caseSensitive, 
> Rotation rotate) const
>  {
> -  GBool sCase;
> +  const GBool sCase = caseSensitive == Page::CaseSensitive ? gTrue : gFalse;
> +
>    QVector<Unicode> u;
> -  TextPage *textPage = m_page->prepareTextSearch(text, caseSensitive, 
> rotate, &sCase, &u);
> +  TextPage *textPage = m_page->prepareTextSearch(text, rotate, &u);
>  
> -  QList<QRectF> results;
> -  double sLeft = 0.0, sTop = 0.0, sRight = 0.0, sBottom = 0.0;
> -  
> -  while(textPage->findText( u.data(), u.size(), 
> -        gFalse, gTrue, gTrue, gFalse, sCase, gFalse, gFalse, &sLeft, &sTop, 
> &sRight, &sBottom ))
> -  {
> -      QRectF result;
> -      
> -      result.setLeft(sLeft);
> -      result.setTop(sTop);
> -      result.setRight(sRight);
> -      result.setBottom(sBottom);
> -      
> -      results.append(result);
> -  }
> +  const QList<QRectF> results = m_page->performMultipleTextSearch(textPage, 
> u, sCase, gFalse);
>    
>    textPage->decRefCnt();
>  
>    return results;
>  }
>  
> +QList<QRectF> Page::search(const QString &text, SearchFlags flags, Rotation 
> rotate) const
> +{
> +  const GBool sCase = flags.testFlag(IgnoreCase) ? gFalse : gTrue;
> +  const GBool sWords = flags.testFlag(WholeWorlds) ? gTrue : gFalse;
> +
> +  QVector<Unicode> u;
> +  TextPage *textPage = m_page->prepareTextSearch(text, rotate, &u);
> +
> +  const QList<QRectF> results = m_page->performMultipleTextSearch(textPage, 
> u, sCase, sWords);
> +
> +  textPage->decRefCnt();
> +
> +  return results;
> +}
> +
>  QList<TextBox*> Page::textList(Rotation rotate) const
>  {
>    TextOutputDev *output_dev;
> diff --git a/qt5/src/poppler-qt5.h b/qt5/src/poppler-qt5.h
> index dee0b19..9ffecff 100644
> --- a/qt5/src/poppler-qt5.h
> +++ b/qt5/src/poppler-qt5.h
> @@ -12,7 +12,7 @@
>   * Copyright (C) 2012, Guillermo A. Amaral B. <[email protected]>
>   * Copyright (C) 2012, Fabio D'Urso <[email protected]>
>   * Copyright (C) 2012, Tobias Koenig <[email protected]>
> - * Copyright (C) 2012, 2014 Adam Reichold <[email protected]>
> + * Copyright (C) 2012, 2014, 2015 Adam Reichold <[email protected]>
>   * Copyright (C) 2012, 2013 Thomas Freitag <[email protected]>
>   * Copyright (C) 2013 Anthony Granger <[email protected]>
>   *
> @@ -580,6 +580,16 @@ delete it;
>       enum SearchMode { CaseSensitive,   ///< Case differences cause no match 
> in searching
>                         CaseInsensitive  ///< Case differences are ignored in 
> matching
>       };
> +
> +        /**
> +           Flags to modify the search behaviour \since 0.31
> +        */
> +        enum SearchFlag
> +        {
> +            IgnoreCase = 0x00000001,    ///< Case differences are ignored
> +            WholeWorlds = 0x00000002    ///< Only whole words are matched
> +        };
> +        Q_DECLARE_FLAGS( SearchFlags, SearchFlag )
>       
>       /**
>          Returns true if the specified text was found.
> @@ -592,8 +602,22 @@ delete it;
>          \param rotate the rotation to apply for the search order
>          \since 0.14
>       **/
> -     bool search(const QString &text, double &rectLeft, double &rectTop, 
> double &rectRight, double &rectBottom, SearchDirection direction, SearchMode 
> caseSensitive, Rotation rotate = Rotate0) const;
> -     
> +        Q_DECL_DEPRECATED bool search(const QString &text, double &rectLeft, 
> double &rectTop, double &rectRight, double &rectBottom, SearchDirection 
> direction, SearchMode caseSensitive, Rotation rotate = Rotate0) const;
> +
> +        /**
> +           Returns true if the specified text was found.
> +
> +           \param text the text the search
> +           \param rectXXX in all directions is used to return where the text 
> was found, for NextResult and PreviousResult
> +                       indicates where to continue searching for
> +           \param direction in which direction do the search
> +           \param flags the flags to consider during matching
> +           \param rotate the rotation to apply for the search order
> +
> +           \since 0.31
> +        **/
> +        bool search(const QString &text, double &rectLeft, double &rectTop, 
> double &rectRight, double &rectBottom, SearchDirection direction, SearchFlags 
> flags = 0, Rotation rotate = Rotate0) const;
> +
>       /**
>          Returns a list of all occurrences of the specified text on the page.
>          
> @@ -605,7 +629,20 @@ delete it;
>          
>          \since 0.22
>       **/
> -     QList<QRectF> search(const QString &text, SearchMode caseSensitive, 
> Rotation rotate = Rotate0) const;
> +        Q_DECL_DEPRECATED QList<QRectF> search(const QString &text, 
> SearchMode caseSensitive, Rotation rotate = Rotate0) const;
> +
> +        /**
> +           Returns a list of all occurrences of the specified text on the 
> page.
> +
> +           \param text the text to search
> +           \param flags the flags to consider during matching
> +           \param rotate the rotation to apply for the search order
> +
> +           \warning Do not use the returned QRectF as arguments of another 
> search call because of truncation issues if qreal is defined as float.
> +
> +           \since 0.31
> +        **/
> +        QList<QRectF> search(const QString &text, SearchFlags flags = 0, 
> Rotation rotate = Rotate0) const;
>  
>       /**
>          Returns a list of text of the page
> @@ -1787,6 +1824,7 @@ height = dummy.height();
>  }
>  
>  Q_DECLARE_OPERATORS_FOR_FLAGS(Poppler::Page::PainterFlags)
> +Q_DECLARE_OPERATORS_FOR_FLAGS(Poppler::Page::SearchFlags)
>  Q_DECLARE_OPERATORS_FOR_FLAGS(Poppler::Document::RenderHints)
>  Q_DECLARE_OPERATORS_FOR_FLAGS(Poppler::PDFConverter::PDFOptions)
>  Q_DECLARE_OPERATORS_FOR_FLAGS(Poppler::PSConverter::PSOptions)
> diff --git a/qt5/tests/check_search.cpp b/qt5/tests/check_search.cpp
> index efb5556..2f6f022 100644
> --- a/qt5/tests/check_search.cpp
> +++ b/qt5/tests/check_search.cpp
> @@ -8,20 +8,19 @@ class TestSearch: public QObject
>  private slots:
>      void bug7063();
>      void testNextAndPrevious();
> +    void testWholeWordsOnly();
>  };
>  
>  void TestSearch::bug7063()
>  {
> -    Poppler::Document *doc;
> -    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/bug7063.pdf");
> -    QVERIFY( doc );
> -   
> -    Poppler::Page *page = doc->page(0);
> -    double rectLeft, rectTop, rectRight, rectBottom;
> -    rectLeft = 0;
> -    rectTop = 0;
> -    rectRight = page->pageSize().width();
> -    rectBottom = page->pageSize().height();
> +    QScopedPointer< Poppler::Document > 
> document(Poppler::Document::load(TESTDATADIR "/unittestcases/bug7063.pdf"));
> +    QVERIFY( document );
> +
> +    QScopedPointer< Poppler::Page > page(document->page(0));
> +    QVERIFY( page );
> +
> +    double rectLeft = 0.0, rectTop = 0.0, rectRight = 
> page->pageSizeF().width(), rectBottom = page->pageSizeF().height();
> +
>      QCOMPARE( page->search(QString("non-ascii:"), rectLeft, rectTop, 
> rectRight, rectBottom, Poppler::Page::FromTop, Poppler::Page::CaseSensitive), 
> true );
>  
>      QCOMPARE( page->search(QString("Ascii"), rectLeft, rectTop, rectRight, 
> rectBottom, Poppler::Page::FromTop, Poppler::Page::CaseSensitive), false );
> @@ -35,23 +34,32 @@ void TestSearch::bug7063()
>      QCOMPARE( page->search(QString::fromUtf8("search \"é\", \"à \" or 
> \"ç\""), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::FromTop, 
> Poppler::Page::CaseSensitive), true );
>      QCOMPARE( page->search(QString::fromUtf8("¥µ©"), rectLeft, rectTop, 
> rectRight, rectBottom, Poppler::Page::FromTop, Poppler::Page::CaseSensitive), 
> true );
>      QCOMPARE( page->search(QString::fromUtf8("¥©"), rectLeft, rectTop, 
> rectRight, rectBottom, Poppler::Page::FromTop, Poppler::Page::CaseSensitive), 
> false );
> -  
> -    delete doc;
> +
> +    QCOMPARE( page->search(QString("non-ascii:"), rectLeft, rectTop, 
> rectRight, rectBottom, Poppler::Page::FromTop), true );
> +
> +    QCOMPARE( page->search(QString("Ascii"), rectLeft, rectTop, rectRight, 
> rectBottom, Poppler::Page::FromTop), false );
> +    QCOMPARE( page->search(QString("Ascii"), rectLeft, rectTop, rectRight, 
> rectBottom, Poppler::Page::FromTop, Poppler::Page::IgnoreCase), true );
> +
> +    QCOMPARE( page->search(QString("latin1:"), rectLeft, rectTop, rectRight, 
> rectBottom, Poppler::Page::FromTop), false );
> +
> +    QCOMPARE( page->search(QString::fromUtf8("é"), rectLeft, rectTop, 
> rectRight, rectBottom, Poppler::Page::FromTop), true );
> +    QCOMPARE( page->search(QString::fromUtf8("Ã "), rectLeft, rectTop, 
> rectRight, rectBottom, Poppler::Page::FromTop), true );
> +    QCOMPARE( page->search(QString::fromUtf8("ç"), rectLeft, rectTop, 
> rectRight, rectBottom, Poppler::Page::FromTop), true );
> +    QCOMPARE( page->search(QString::fromUtf8("search \"é\", \"à \" or 
> \"ç\""), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::FromTop), 
> true );
> +    QCOMPARE( page->search(QString::fromUtf8("¥µ©"), rectLeft, rectTop, 
> rectRight, rectBottom, Poppler::Page::FromTop), true );
> +    QCOMPARE( page->search(QString::fromUtf8("¥©"), rectLeft, rectTop, 
> rectRight, rectBottom, Poppler::Page::FromTop), false );
>  }
>  
>  void TestSearch::testNextAndPrevious()
>  {
> -    Poppler::Document *doc;
> -    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/xr01.pdf");
> -    QVERIFY( doc );
> -  
> -    Poppler::Page *page = doc->page(0);
> -    double rectLeft, rectTop, rectRight, rectBottom;
> -    rectLeft = 0;
> -    rectTop = 0;
> -    rectRight = page->pageSize().width();
> -    rectBottom = page->pageSize().height();
> -    
> +    QScopedPointer< Poppler::Document > 
> document(Poppler::Document::load(TESTDATADIR "/unittestcases/xr01.pdf"));
> +    QVERIFY( document );
> +
> +    QScopedPointer< Poppler::Page > page(document->page(0));
> +    QVERIFY( page );
> +
> +    double rectLeft = 0.0, rectTop = 0.0, rectRight = 
> page->pageSizeF().width(), rectBottom = page->pageSizeF().height();
> +
>      QCOMPARE( page->search(QString("is"), rectLeft, rectTop, rectRight, 
> rectBottom, Poppler::Page::FromTop, Poppler::Page::CaseSensitive), true );
>      QVERIFY( qAbs(rectLeft - 161.44) < 0.01 );
>      QVERIFY( qAbs(rectTop - 127.85) < 0.01 );
> @@ -89,8 +97,76 @@ void TestSearch::testNextAndPrevious()
>      QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
>      QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
>      QCOMPARE( page->search(QString("is"), rectLeft, rectTop, rectRight, 
> rectBottom, Poppler::Page::PreviousResult, Poppler::Page::CaseSensitive), 
> false );
> -    
> -    delete doc;
> +
> +    rectLeft = 0.0, rectTop = 0.0, rectRight = page->pageSizeF().width(), 
> rectBottom = page->pageSizeF().height();
> +
> +    QCOMPARE( page->search(QString("is"), rectLeft, rectTop, rectRight, 
> rectBottom, Poppler::Page::FromTop), true );
> +    QVERIFY( qAbs(rectLeft - 161.44) < 0.01 );
> +    QVERIFY( qAbs(rectTop - 127.85) < 0.01 );
> +    QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
> +    QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
> +    QCOMPARE( page->search(QString("is"), rectLeft, rectTop, rectRight, 
> rectBottom, Poppler::Page::NextResult), true );
> +    QVERIFY( qAbs(rectLeft - 171.46) < 0.01 );
> +    QVERIFY( qAbs(rectTop - 127.85) < 0.01 );
> +    QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
> +    QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
> +    QCOMPARE( page->search(QString("is"), rectLeft, rectTop, rectRight, 
> rectBottom, Poppler::Page::NextResult), true );
> +    QVERIFY( qAbs(rectLeft - 161.44) < 0.01 );
> +    QVERIFY( qAbs(rectTop - 139.81) < 0.01 );
> +    QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
> +    QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
> +    QCOMPARE( page->search(QString("is"), rectLeft, rectTop, rectRight, 
> rectBottom, Poppler::Page::NextResult), true );
> +    QVERIFY( qAbs(rectLeft - 171.46) < 0.01 );
> +    QVERIFY( qAbs(rectTop - 139.81) < 0.01 );
> +    QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
> +    QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
> +    QCOMPARE( page->search(QString("is"), rectLeft, rectTop, rectRight, 
> rectBottom, Poppler::Page::NextResult), false );
> +    QCOMPARE( page->search(QString("is"), rectLeft, rectTop, rectRight, 
> rectBottom, Poppler::Page::PreviousResult), true );
> +    QVERIFY( qAbs(rectLeft - 161.44) < 0.01 );
> +    QVERIFY( qAbs(rectTop - 139.81) < 0.01 );
> +    QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
> +    QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
> +    QCOMPARE( page->search(QString("is"), rectLeft, rectTop, rectRight, 
> rectBottom, Poppler::Page::PreviousResult), true );
> +    QVERIFY( qAbs(rectLeft - 171.46) < 0.01 );
> +    QVERIFY( qAbs(rectTop - 127.85) < 0.01 );
> +    QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
> +    QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
> +    QCOMPARE( page->search(QString("is"), rectLeft, rectTop, rectRight, 
> rectBottom, Poppler::Page::PreviousResult), true );
> +    QVERIFY( qAbs(rectLeft - 161.44) < 0.01 );
> +    QVERIFY( qAbs(rectTop - 127.85) < 0.01 );
> +    QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
> +    QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
> +    QCOMPARE( page->search(QString("is"), rectLeft, rectTop, rectRight, 
> rectBottom, Poppler::Page::PreviousResult), false );
> +}
> +
> +void TestSearch::testWholeWordsOnly()
> +{
> +    QScopedPointer< Poppler::Document > 
> document(Poppler::Document::load(TESTDATADIR 
> "/unittestcases/WithActualText.pdf"));
> +    QVERIFY( document );
> +
> +    QScopedPointer< Poppler::Page > page(document->page(0));
> +    QVERIFY( page );
> +
> +    const Poppler::Page::SearchDirection direction = Poppler::Page::FromTop;
> +
> +    const Poppler::Page::SearchFlags mode0 = 0;
> +    const Poppler::Page::SearchFlags mode1 = Poppler::Page::IgnoreCase;
> +    const Poppler::Page::SearchFlags mode2 = Poppler::Page::WholeWorlds;
> +    const Poppler::Page::SearchFlags mode3 = Poppler::Page::IgnoreCase | 
> Poppler::Page::WholeWorlds;
> +
> +    double left, top, right, bottom;
> +
> +    QCOMPARE( page->search(QLatin1String("brown"), left, top, right, bottom, 
> direction, mode0), true );
> +    QCOMPARE( page->search(QLatin1String("brOwn"), left, top, right, bottom, 
> direction, mode0), false );
> +
> +    QCOMPARE( page->search(QLatin1String("brOwn"), left, top, right, bottom, 
> direction, mode1), true );
> +    QCOMPARE( page->search(QLatin1String("brawn"), left, top, right, bottom, 
> direction, mode1), false );
> +
> +    QCOMPARE( page->search(QLatin1String("brown"), left, top, right, bottom, 
> direction, mode2), true );
> +    QCOMPARE( page->search(QLatin1String("own"), left, top, right, bottom, 
> direction, mode2), false );
> +
> +    QCOMPARE( page->search(QLatin1String("brOwn"), left, top, right, bottom, 
> direction, mode3), true );
> +    QCOMPARE( page->search(QLatin1String("Own"), left, top, right, bottom, 
> direction, mode3), false );
>  }
>  
>  QTEST_MAIN(TestSearch)
> 
> 
> 
> _______________________________________________
> poppler mailing list
> [email protected]
> http://lists.freedesktop.org/mailman/listinfo/poppler
> 
diff --git a/qt4/src/poppler-page.cc b/qt4/src/poppler-page.cc
index a4536af..49ad871 100644
--- a/qt4/src/poppler-page.cc
+++ b/qt4/src/poppler-page.cc
@@ -508,7 +508,7 @@ bool Page::search(const QString &text, double &sLeft, double &sTop, double &sRig
 bool Page::search(const QString &text, double &sLeft, double &sTop, double &sRight, double &sBottom, SearchDirection direction, SearchFlags flags, Rotation rotate) const
 {
   const GBool sCase = flags.testFlag(IgnoreCase) ? gFalse : gTrue;
-  const GBool sWords = flags.testFlag(WholeWorlds) ? gTrue : gFalse;
+  const GBool sWords = flags.testFlag(WholeWords) ? gTrue : gFalse;
 
   QVector<Unicode> u;
   TextPage *textPage = m_page->prepareTextSearch(text, rotate, &u);
@@ -555,7 +555,7 @@ QList<QRectF> Page::search(const QString &text, SearchMode caseSensitive, Rotati
 QList<QRectF> Page::search(const QString &text, SearchFlags flags, Rotation rotate) const
 {
   const GBool sCase = flags.testFlag(IgnoreCase) ? gFalse : gTrue;
-  const GBool sWords = flags.testFlag(WholeWorlds) ? gTrue : gFalse;
+  const GBool sWords = flags.testFlag(WholeWords) ? gTrue : gFalse;
 
   QVector<Unicode> u;
   TextPage *textPage = m_page->prepareTextSearch(text, rotate, &u);
diff --git a/qt4/src/poppler-qt4.h b/qt4/src/poppler-qt4.h
index 48c517a..e5e808d 100644
--- a/qt4/src/poppler-qt4.h
+++ b/qt4/src/poppler-qt4.h
@@ -586,7 +586,7 @@ delete it;
         enum SearchFlag
         {
             IgnoreCase = 0x00000001,    ///< Case differences are ignored
-            WholeWorlds = 0x00000002    ///< Only whole words are matched
+            WholeWords = 0x00000002    ///< Only whole words are matched
         };
         Q_DECLARE_FLAGS( SearchFlags, SearchFlag )
 	
diff --git a/qt4/tests/check_search.cpp b/qt4/tests/check_search.cpp
index 77e62e3..99659e0 100644
--- a/qt4/tests/check_search.cpp
+++ b/qt4/tests/check_search.cpp
@@ -152,8 +152,8 @@ void TestSearch::testWholeWordsOnly()
 
     const Poppler::Page::SearchFlags mode0 = 0;
     const Poppler::Page::SearchFlags mode1 = Poppler::Page::IgnoreCase;
-    const Poppler::Page::SearchFlags mode2 = Poppler::Page::WholeWorlds;
-    const Poppler::Page::SearchFlags mode3 = Poppler::Page::IgnoreCase | Poppler::Page::WholeWorlds;
+    const Poppler::Page::SearchFlags mode2 = Poppler::Page::WholeWords;
+    const Poppler::Page::SearchFlags mode3 = Poppler::Page::IgnoreCase | Poppler::Page::WholeWords;
 
     double left, top, right, bottom;
 
diff --git a/qt5/src/poppler-page.cc b/qt5/src/poppler-page.cc
index 88f2e73..408099c 100644
--- a/qt5/src/poppler-page.cc
+++ b/qt5/src/poppler-page.cc
@@ -508,7 +508,7 @@ bool Page::search(const QString &text, double &sLeft, double &sTop, double &sRig
 bool Page::search(const QString &text, double &sLeft, double &sTop, double &sRight, double &sBottom, SearchDirection direction, SearchFlags flags, Rotation rotate) const
 {
   const GBool sCase = flags.testFlag(IgnoreCase) ? gFalse : gTrue;
-  const GBool sWords = flags.testFlag(WholeWorlds) ? gTrue : gFalse;
+  const GBool sWords = flags.testFlag(WholeWords) ? gTrue : gFalse;
 
   QVector<Unicode> u;
   TextPage *textPage = m_page->prepareTextSearch(text, rotate, &u);
@@ -537,7 +537,7 @@ QList<QRectF> Page::search(const QString &text, SearchMode caseSensitive, Rotati
 QList<QRectF> Page::search(const QString &text, SearchFlags flags, Rotation rotate) const
 {
   const GBool sCase = flags.testFlag(IgnoreCase) ? gFalse : gTrue;
-  const GBool sWords = flags.testFlag(WholeWorlds) ? gTrue : gFalse;
+  const GBool sWords = flags.testFlag(WholeWords) ? gTrue : gFalse;
 
   QVector<Unicode> u;
   TextPage *textPage = m_page->prepareTextSearch(text, rotate, &u);
diff --git a/qt5/src/poppler-qt5.h b/qt5/src/poppler-qt5.h
index 9ffecff..79c3f74 100644
--- a/qt5/src/poppler-qt5.h
+++ b/qt5/src/poppler-qt5.h
@@ -587,7 +587,7 @@ delete it;
         enum SearchFlag
         {
             IgnoreCase = 0x00000001,    ///< Case differences are ignored
-            WholeWorlds = 0x00000002    ///< Only whole words are matched
+            WholeWords = 0x00000002    ///< Only whole words are matched
         };
         Q_DECLARE_FLAGS( SearchFlags, SearchFlag )
 	
diff --git a/qt5/tests/check_search.cpp b/qt5/tests/check_search.cpp
index 2f6f022..a24cc72 100644
--- a/qt5/tests/check_search.cpp
+++ b/qt5/tests/check_search.cpp
@@ -151,8 +151,8 @@ void TestSearch::testWholeWordsOnly()
 
     const Poppler::Page::SearchFlags mode0 = 0;
     const Poppler::Page::SearchFlags mode1 = Poppler::Page::IgnoreCase;
-    const Poppler::Page::SearchFlags mode2 = Poppler::Page::WholeWorlds;
-    const Poppler::Page::SearchFlags mode3 = Poppler::Page::IgnoreCase | Poppler::Page::WholeWorlds;
+    const Poppler::Page::SearchFlags mode2 = Poppler::Page::WholeWords;
+    const Poppler::Page::SearchFlags mode3 = Poppler::Page::IgnoreCase | Poppler::Page::WholeWords;
 
     double left, top, right, bottom;
 

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
poppler mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/poppler

Reply via email to