Show
Ignore:
Timestamp:
06/11/07 09:12:09 (18 months ago)
Author:
jordi
Message:

Added a patch by Igor Vagulin which adds text selection and copy to clipboard features. This fixes bug #14.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/PDFDocument.cxx

    r258 r277  
    657657} 
    658658 
     659void  
     660PDFDocument::setTextSelection (DocumentRectangle *rect) 
     661{ 
     662    g_assert(rect); 
     663 
     664    PopplerPage *page = poppler_document_get_page (m_Document, getCurrentPageNum()-1); 
     665    if(!page) 
     666        return; 
     667 
     668    gdouble pageWidth, pageHeight; 
     669    poppler_page_get_size(page, &pageWidth, &pageHeight); 
     670     
     671    //for get text we must exchange y coordinate, don't ask me where logic here. 
     672    PopplerRectangle textRect = { rect->getX1(), 
     673                                  (pageHeight - rect->getY2()), 
     674                                  rect->getX2(), 
     675                                  (pageHeight - rect->getY1())}; 
     676    gchar *text = poppler_page_get_text(page, &textRect); 
     677    if(!text) 
     678        goto cleanup; 
     679         
     680    for ( GList *obs = g_list_first (m_Observers) ; 
     681          NULL != obs ; 
     682          obs = g_list_next (obs) ) 
     683        { 
     684            IDocumentObserver *observer = (IDocumentObserver*)obs->data; 
     685            observer->notifyTextSelected(text); 
     686        } 
     687 
     688 cleanup: 
     689    if(page) 
     690        g_object_unref(page); 
     691    if(text) 
     692        g_free(text); 
     693} 
     694GdkRegion* 
     695PDFDocument::getTextRegion (DocumentRectangle *r) 
     696{ 
     697    GdkRegion *res = NULL; 
     698    PopplerPage *page = poppler_document_get_page (m_Document, getCurrentPageNum()-1); 
     699    if(!page) 
     700        return NULL; 
     701 
     702    //calulate rect 
     703    PopplerRectangle rect; 
     704    rect.x1 = r->getX1() / getZoom(); 
     705    rect.y1 = r->getY1() / getZoom(); 
     706    rect.x2 = r->getX2() / getZoom(); 
     707    rect.y2 = r->getY2() / getZoom(); 
     708 
     709    //calc selection size 
     710    res = poppler_page_get_selection_region(page, getZoom(), &rect); 
     711                              
     712    //free some local data 
     713    g_object_unref(page); 
     714 
     715    return res; 
     716} 
     717 
     718 
    659719/// 
    660720/// @brief Gets the document's page layout from Poppler's page layout.