Changeset 157

Show
Ignore:
Timestamp:
05/09/06 13:07:25 (2 years ago)
Author:
jordi
Message:

The FindPter? now can also search backwards.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/src/FindPter.cxx

    r156 r157  
    6565    else 
    6666    { 
     67        if ( FIND_DIRECTION_BACKWARDS == m_Job->getDirection () ) 
     68        { 
     69            m_Job->setCurrentPage (m_Job->getCurrentPage () + 2); 
     70        } 
     71        m_Job->setDirection (FIND_DIRECTION_FORWARDS); 
     72        IJob::queue (m_Job); 
     73    } 
     74} 
     75 
     76/// 
     77/// @brief The Find Previous button has been clicked. 
     78/// 
     79void 
     80FindPter::findPreviousActivated () 
     81{ 
     82    m_CurrentMatch = g_list_previous (m_CurrentMatch); 
     83    if ( NULL != m_CurrentMatch ) 
     84    { 
     85        DocumentRectangle *rect = ((DocumentRectangle *)m_CurrentMatch->data); 
     86        m_Document->goToPage (m_FindPage); 
     87        m_Document->notifyFindChanged (rect); 
     88    } 
     89    else 
     90    { 
     91        if ( FIND_DIRECTION_FORWARDS == m_Job->getDirection () ) 
     92        { 
     93            m_Job->setCurrentPage (m_Job->getCurrentPage () - 2); 
     94        } 
     95        m_Job->setDirection (FIND_DIRECTION_BACKWARDS); 
    6796        IJob::queue (m_Job); 
    6897    } 
     
    98127FindPter::notifyFindFinished (void) 
    99128{ 
    100     m_Job->cancel (); 
    101     m_Job = NULL; 
    102     m_View->setInformationText (_("Not Found!")); 
    103     m_Document->notifyFindFinished (); 
    104 
    105  
    106 void 
    107 FindPter::notifyFindResults (gint pageNum, GList *results) 
     129    if ( NULL == m_FindResults ) 
     130    { 
     131        m_Job->cancel (); 
     132        m_Job = NULL; 
     133        m_View->setInformationText (_("Not Found!")); 
     134        m_Document->notifyFindFinished (); 
     135    } 
     136    else 
     137    { 
     138        gchar *infoText = g_strdup_printf (_("Searching in page %d of %d..."), 
     139                                           m_Job->getCurrentPage (), 
     140                                           m_Document->getNumPages ()); 
     141        m_View->setInformationText (infoText); 
     142        g_free (infoText); 
     143    } 
     144
     145 
     146void 
     147FindPter::notifyFindResults (gint pageNum, GList *results,  
     148                             FindDirection direction) 
    108149{ 
    109150    m_FindPage = pageNum; 
    110151    freeFindResults (); 
    111152    m_FindResults = results; 
    112     m_CurrentMatch = g_list_first (m_FindResults); 
     153    if ( FIND_DIRECTION_FORWARDS == direction ) 
     154    { 
     155        m_CurrentMatch = g_list_first (m_FindResults); 
     156    } 
     157    else 
     158    { 
     159        m_CurrentMatch = g_list_last (m_FindResults); 
     160    } 
    113161    m_Document->goToPage (m_FindPage); 
    114162    DocumentRectangle *rect = (DocumentRectangle *)m_CurrentMatch->data; 
  • trunk/src/FindPter.h

    r156 r157  
    3838 
    3939            void findNextActivated (void); 
     40            void findPreviousActivated (void); 
    4041            IFindView &getView (void); 
    4142            void notifyFindFinished (void); 
    42             void notifyFindResults (gint pageNum, GList *results); 
     43            void notifyFindResults (gint pageNum, GList *results, 
     44                                    FindDirection direction); 
    4345            void setView (IFindView *view); 
    4446            void textToFindChanged (void); 
  • trunk/src/JobFind.cxx

    r156 r157  
    3030    m_Canceled = FALSE; 
    3131    m_CurrentPage = 0; 
     32    m_Direction = FIND_DIRECTION_FORWARDS; 
    3233    m_Document = NULL; 
    3334    m_FindPter = NULL; 
     
    5758} 
    5859 
     60FindDirection 
     61JobFind::getDirection () 
     62{ 
     63    return m_Direction; 
     64} 
     65 
    5966IDocument * 
    60 JobFind::getDocument (void
     67JobFind::getDocument (
    6168{ 
    6269    return m_Document; 
     
    6471 
    6572FindPter * 
    66 JobFind::getFindPter (void
     73JobFind::getFindPter (
    6774{ 
    6875    return m_FindPter; 
     
    8289 
    8390gint 
    84 JobFind::getStartingPage (void
     91JobFind::getStartingPage (
    8592{ 
    8693    return m_StartingPage; 
     
    112119        GList *result = getDocument ()->findTextInPage (currentPage, 
    113120                                                        getTextToFind ()); 
    114         gint nextPage = currentPage + 1; 
    115         if ( nextPage > getDocument ()->getNumPages () ) 
    116         { 
    117             nextPage = 1
     121         
     122        if ( FIND_DIRECTION_FORWARDS == getDirection () ) 
     123        { 
     124            setCurrentPage (currentPage + 1)
    118125        } 
    119          
    120         setCurrentPage (nextPage); 
     126        else 
     127        { 
     128            setCurrentPage (currentPage - 1); 
     129        } 
    121130         
    122131        if ( NULL != result ) 
     
    127136        else  
    128137        { 
    129             if ( getStartingPage () == nextPage
     138            if ( getStartingPage () == getCurrentPage ()
    130139            { 
    131140                JOB_NOTIFIER (job_find_end, this); 
     
    143152{ 
    144153    m_CurrentPage = pageNum; 
     154 
     155    gint numPages = m_Document->getNumPages (); 
     156    if ( m_CurrentPage > numPages ) 
     157    { 
     158        m_CurrentPage = 1; 
     159    } 
     160    else if ( 1 > m_CurrentPage ) 
     161    { 
     162        m_CurrentPage = numPages; 
     163    } 
     164} 
     165 
     166void 
     167JobFind::setDirection (FindDirection direction) 
     168{ 
     169    m_Direction = direction; 
    145170} 
    146171 
     
    207232    JobFind *job = (JobFind *)data; 
    208233    job->getFindPter ()->notifyFindResults (job->getResultsPage (), 
    209                                             job->getResults ()); 
     234                                            job->getResults (), 
     235                                            job->getDirection ()); 
    210236 
    211237    JOB_NOTIFIER_END (); 
  • trunk/src/JobFind.h

    r156 r157  
    2121namespace ePDFView 
    2222{ 
     23    // Forward declarations. 
     24    class FindPter; 
     25 
     26    /// 
     27    /// @brief The search direction. 
     28    /// 
     29    typedef enum 
     30    { 
     31        /// Search forwards. 
     32        FIND_DIRECTION_FORWARDS, 
     33        /// Search backwards. 
     34        FIND_DIRECTION_BACKWARDS 
     35    } FindDirection; 
     36     
    2337    class JobFind: public IJob 
    2438    { 
     
    2943            void cancel (void); 
    3044            gint getCurrentPage (void); 
     45            FindDirection getDirection (void); 
    3146            IDocument *getDocument (void); 
    3247            FindPter *getFindPter (void); 
     
    3853            gboolean run (void); 
    3954            void setCurrentPage (gint pageNum); 
     55            void setDirection (FindDirection direction); 
    4056            void setDocument (IDocument *document); 
    4157            void setFindPter (FindPter *pter); 
     
    4763            gboolean m_Canceled; 
    4864            gint m_CurrentPage; 
     65            FindDirection m_Direction; 
    4966            IDocument *m_Document; 
    5067            FindPter *m_FindPter; 
  • trunk/src/epdfview.h

    r155 r157  
    3232#include <PDFDocument.h> 
    3333 
     34#include <IJob.h> 
     35#include <JobFind.h> 
     36#include <JobLoad.h> 
     37#include <JobRender.h> 
     38 
    3439#include <IFindView.h> 
    3540#include <IPageView.h> 
     
    3944#include <MainPter.h> 
    4045 
    41 #include <IJob.h> 
    42 #include <JobFind.h> 
    43 #include <JobLoad.h> 
    44 #include <JobRender.h> 
    45  
    4646#endif //!__E_PDF_VIEW_H__ 
  • trunk/tests/FindPterTest.cxx

    r156 r157  
    120120FindPterTest::findNext () 
    121121{ 
    122     m_View->setTextToFind ("first"); 
    123     while ( m_Observer->isStillSearching () ) { } 
     122    m_View->setTextToFind ("first");    
     123    volatile gboolean stillSearching = TRUE; 
     124    while ( stillSearching ) {stillSearching = m_Observer->isStillSearching ();} 
    124125     
    125126    // The 'first' text appears twice in page 4 and also twice in 
     
    137138    m_Observer->notifyFindStarted (); 
    138139    m_FindPter->findNextActivated (); 
    139     while ( m_Observer->isStillSearching () ) { } 
     140    stillSearching = TRUE; 
     141    while ( stillSearching ) {stillSearching = m_Observer->isStillSearching ();} 
    140142    CPPUNIT_ASSERT_EQUAL (4, m_Observer->getCurrentPage ()); 
    141143    { 
     
    147149        CPPUNIT_ASSERT_DOUBLES_EQUAL (157.1100, rect->getY2 (), 0.0001); 
    148150    } 
    149      
    150     m_Observer->notifyFindStarted (); 
    151     m_FindPter->findNextActivated (); 
    152     while ( m_Observer->isStillSearching () ) { } 
     151    
     152    m_Observer->notifyFindStarted (); 
     153    m_FindPter->findNextActivated (); 
     154    stillSearching = TRUE; 
     155    while ( stillSearching ) {stillSearching = m_Observer->isStillSearching ();} 
    153156    CPPUNIT_ASSERT_EQUAL (5, m_Observer->getCurrentPage ()); 
    154157    { 
     
    163166    m_Observer->notifyFindStarted (); 
    164167    m_FindPter->findNextActivated (); 
    165     while ( m_Observer->isStillSearching () ) { } 
     168    stillSearching = TRUE; 
     169    while ( stillSearching ) {stillSearching = m_Observer->isStillSearching ();} 
    166170    CPPUNIT_ASSERT_EQUAL (5, m_Observer->getCurrentPage ()); 
    167171    { 
     
    176180    m_Observer->notifyFindStarted (); 
    177181    m_FindPter->findNextActivated (); 
    178     while ( m_Observer->isStillSearching () ) { } 
     182    stillSearching = TRUE; 
     183    while ( stillSearching ) {stillSearching = m_Observer->isStillSearching ();} 
    179184    CPPUNIT_ASSERT_EQUAL (5, m_Observer->getCurrentPage ()); 
    180185    { 
     
    190195    m_Observer->notifyFindStarted (); 
    191196    m_FindPter->findNextActivated (); 
    192     while ( m_Observer->isStillSearching () ) { } 
     197    stillSearching = TRUE; 
     198    while ( stillSearching ) {stillSearching = m_Observer->isStillSearching ();} 
    193199    CPPUNIT_ASSERT_EQUAL (4, m_Observer->getCurrentPage ()); 
    194200    { 
     
    201207    } 
    202208} 
     209 
     210/// 
     211/// @brief Tests the Find Previous button. 
     212/// 
     213/// When a search starts it tried to find the next text in the document. 
     214/// If the user presses the Find Previous button, it will try to find the 
     215/// previous found text in the document, searching backwards. 
     216/// 
     217void 
     218FindPterTest::findPrevious () 
     219{    
     220    m_View->setTextToFind ("first"); 
     221    volatile gboolean stillSearching = TRUE; 
     222    while ( stillSearching ) {stillSearching = m_Observer->isStillSearching ();} 
     223     
     224    // The 'first' text appears twice in page 4 and also twice in 
     225    // page 5. So the first time it will set a rect on page 4. 
     226    CPPUNIT_ASSERT_EQUAL (4, m_Observer->getCurrentPage ()); 
     227    { 
     228        DocumentRectangle *rect = m_Observer->getFindMatchRect (); 
     229        CPPUNIT_ASSERT (NULL != rect); 
     230        CPPUNIT_ASSERT_DOUBLES_EQUAL (82.0000, rect->getX1 (), 0.0001); 
     231        CPPUNIT_ASSERT_DOUBLES_EQUAL (137.1100, rect->getY1 (), 0.0001); 
     232        CPPUNIT_ASSERT_DOUBLES_EQUAL (100.3400, rect->getX2 (), 0.0001); 
     233        CPPUNIT_ASSERT_DOUBLES_EQUAL (146.1100, rect->getY2 (), 0.0001); 
     234    } 
     235     
     236    m_Observer->notifyFindStarted (); 
     237    m_FindPter->findPreviousActivated (); 
     238    stillSearching = TRUE; 
     239    while ( stillSearching ) {stillSearching = m_Observer->isStillSearching ();} 
     240    CPPUNIT_ASSERT_EQUAL (5, m_Observer->getCurrentPage ()); 
     241    { 
     242        DocumentRectangle *rect = m_Observer->getFindMatchRect (); 
     243        CPPUNIT_ASSERT (NULL != rect); 
     244        CPPUNIT_ASSERT_DOUBLES_EQUAL (72.0000, rect->getX1 (), 0.0001); 
     245        CPPUNIT_ASSERT_DOUBLES_EQUAL (143.1745, rect->getY1 (), 0.0001); 
     246        CPPUNIT_ASSERT_DOUBLES_EQUAL (116.9349, rect->getX2 (), 0.0001); 
     247        CPPUNIT_ASSERT_DOUBLES_EQUAL (162.3553, rect->getY2 (), 0.0001); 
     248    } 
     249    
     250    m_Observer->notifyFindStarted (); 
     251    m_FindPter->findPreviousActivated (); 
     252    stillSearching = TRUE; 
     253    while ( stillSearching ) {stillSearching = m_Observer->isStillSearching ();} 
     254    CPPUNIT_ASSERT_EQUAL (5, m_Observer->getCurrentPage ()); 
     255    { 
     256        DocumentRectangle *rect = m_Observer->getFindMatchRect (); 
     257        CPPUNIT_ASSERT (NULL != rect); 
     258        CPPUNIT_ASSERT_DOUBLES_EQUAL (164.1700, rect->getX1 (), 0.0001); 
     259        CPPUNIT_ASSERT_DOUBLES_EQUAL (121.1020, rect->getY1 (), 0.0001); 
     260        CPPUNIT_ASSERT_DOUBLES_EQUAL (180.2800, rect->getX2 (), 0.0001); 
     261        CPPUNIT_ASSERT_DOUBLES_EQUAL (130.1020, rect->getY2 (), 0.0001); 
     262    } 
     263 
     264    m_Observer->notifyFindStarted (); 
     265    m_FindPter->findPreviousActivated (); 
     266    stillSearching = TRUE; 
     267    while ( stillSearching ) {stillSearching = m_Observer->isStillSearching ();} 
     268    CPPUNIT_ASSERT_EQUAL (5, m_Observer->getCurrentPage ()); 
     269    { 
     270        DocumentRectangle *rect = m_Observer->getFindMatchRect (); 
     271        CPPUNIT_ASSERT (NULL != rect); 
     272        CPPUNIT_ASSERT_DOUBLES_EQUAL (200.5943, rect->getX1 (), 0.0001); 
     273        CPPUNIT_ASSERT_DOUBLES_EQUAL (84.5980, rect->getY1 (), 0.0001); 
     274        CPPUNIT_ASSERT_DOUBLES_EQUAL (254.5158, rect->getX2 (), 0.0001); 
     275        CPPUNIT_ASSERT_DOUBLES_EQUAL (107.6147, rect->getY2 (), 0.0001); 
     276    } 
     277   
     278    m_Observer->notifyFindStarted (); 
     279    m_FindPter->findPreviousActivated (); 
     280    stillSearching = TRUE; 
     281    while ( stillSearching ) {stillSearching = m_Observer->isStillSearching ();} 
     282    CPPUNIT_ASSERT_EQUAL (4, m_Observer->getCurrentPage ()); 
     283    { 
     284        DocumentRectangle *rect = m_Observer->getFindMatchRect (); 
     285        CPPUNIT_ASSERT (NULL != rect); 
     286        CPPUNIT_ASSERT_DOUBLES_EQUAL (96.0000, rect->getX1 (), 0.0001); 
     287        CPPUNIT_ASSERT_DOUBLES_EQUAL (148.1100, rect->getY1 (), 0.0001); 
     288        CPPUNIT_ASSERT_DOUBLES_EQUAL (114.3400, rect->getX2 (), 0.0001); 
     289        CPPUNIT_ASSERT_DOUBLES_EQUAL (157.1100, rect->getY2 (), 0.0001); 
     290    } 
     291 
     292    m_Observer->notifyFindStarted (); 
     293    m_FindPter->findNextActivated (); 
     294    stillSearching = TRUE; 
     295    while ( stillSearching ) {stillSearching = m_Observer->isStillSearching ();} 
     296    CPPUNIT_ASSERT_EQUAL (5, m_Observer->getCurrentPage ()); 
     297    { 
     298        DocumentRectangle *rect = m_Observer->getFindMatchRect (); 
     299        CPPUNIT_ASSERT (NULL != rect); 
     300        CPPUNIT_ASSERT_DOUBLES_EQUAL (200.5943, rect->getX1 (), 0.0001); 
     301        CPPUNIT_ASSERT_DOUBLES_EQUAL (84.5980, rect->getY1 (), 0.0001); 
     302        CPPUNIT_ASSERT_DOUBLES_EQUAL (254.5158, rect->getX2 (), 0.0001); 
     303        CPPUNIT_ASSERT_DOUBLES_EQUAL (107.6147, rect->getY2 (), 0.0001); 
     304    } 
     305} 
  • trunk/tests/FindPterTest.h

    r156 r157  
    2929        CPPUNIT_TEST (textDoesNotExist); 
    3030        CPPUNIT_TEST (findNext); 
     31        CPPUNIT_TEST (findPrevious); 
    3132        CPPUNIT_TEST_SUITE_END (); 
    3233 
     
    3839            void textDoesNotExist (void); 
    3940            void findNext (void); 
     41            void findPrevious (void); 
    4042 
    4143        private: