Changeset 277
- Timestamp:
- 06/11/07 09:12:09 (15 months ago)
- Location:
- trunk
- Files:
-
- 16 modified
-
data/epdfview-ui.xml (modified) (3 diffs)
-
src/DocumentPage.cxx (modified) (6 diffs)
-
src/DocumentPage.h (modified) (3 diffs)
-
src/IDocument.h (modified) (3 diffs)
-
src/IDocumentObserver.h (modified) (1 diff)
-
src/IMainView.h (modified) (1 diff)
-
src/IPageView.h (modified) (1 diff)
-
src/MainPter.cxx (modified) (2 diffs)
-
src/MainPter.h (modified) (2 diffs)
-
src/PDFDocument.cxx (modified) (1 diff)
-
src/PDFDocument.h (modified) (1 diff)
-
src/PagePter.cxx (modified) (8 diffs)
-
src/PagePter.h (modified) (3 diffs)
-
src/gtk/MainView.cxx (modified) (5 diffs)
-
src/gtk/MainView.h (modified) (2 diffs)
-
src/gtk/PageView.cxx (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/data/epdfview-ui.xml
r254 r277 11 11 <menu action="EditMenu"> 12 12 <menuitem name="Find" action="Find"/> 13 <separator /> 14 <menuitem name="PageModeScroll" action="PageModeScroll"/> 15 <menuitem name="PageModeText" action="PageModeText"/> 13 16 <separator /> 14 17 <menuitem name="Preferences" action="Preferences"/> … … 39 42 </menu> 40 43 </menubar> 41 44 42 45 <toolbar name="ToolBar"> 43 46 <toolitem name="OpenFile" action="OpenFile"/> … … 50 53 <toolitem name="ZoomFit" action="ZoomFit"/> 51 54 <toolitem name="ZoomWidth" action="ZoomWidth"/> 55 <separator/> 56 <toolitem name="PageModeScroll" action="PageModeScroll"/> 57 <toolitem name="PageModeText" action="PageModeText"/> 52 58 </toolbar> 53 59 -
trunk/src/DocumentPage.cxx
r206 r277 18 18 #include <config.h> 19 19 #include <string.h> 20 #include <gdk/gdk.h> 20 21 #include "epdfview.h" 21 22 … … 29 30 DocumentPage::DocumentPage () 30 31 { 32 m_Selection = NULL; 31 33 m_Data = NULL; 32 34 m_HasSelection = FALSE; … … 50 52 } 51 53 g_list_free (m_LinkList); 54 55 if(m_Selection) 56 gdk_region_destroy(m_Selection); 52 57 } 53 58 … … 79 84 invertArea (m_SelectionX1, m_SelectionY1, m_SelectionX2, m_SelectionY2); 80 85 m_HasSelection = FALSE; 86 } 87 88 if(NULL != m_Selection){ 89 invertRegion(m_Selection); 90 gdk_region_destroy(m_Selection); 91 m_Selection = NULL; 81 92 } 82 93 } … … 196 207 } 197 208 209 void 210 DocumentPage::invertRegion (GdkRegion* region) 211 { 212 int count; 213 GdkRectangle *rectangles; 214 gdk_region_get_rectangles(region, &rectangles, &count); 215 while(count--){ 216 GdkRectangle r = rectangles[count]; 217 invertArea(r.x, r.y, r.x + r.width, r.y + r.height); 218 } 219 g_free(rectangles); 220 } 221 222 198 223 /// 199 224 /// @brief Allocates the memory for a new page. … … 254 279 m_HasSelection = TRUE; 255 280 } 281 282 void 283 DocumentPage::setSelection (GdkRegion *region) 284 { 285 clearSelection (); 286 287 invertRegion (region); 288 289 m_Selection = gdk_region_copy(region); 290 } -
trunk/src/DocumentPage.h
r196 r277 18 18 #if !defined (__DOCUMENT_PAGE_H__) 19 19 #define __DOCUMENT_PAGE_H__ 20 21 typedef struct _GdkRegion GdkRegion; 20 22 21 23 namespace ePDFView … … 42 44 gboolean newPage (gint width, gint height); 43 45 void setSelection (DocumentRectangle &selection, gdouble scale); 46 void setSelection (GdkRegion *region); 44 47 45 48 protected: … … 62 65 /// The list of links from the page. 63 66 GList *m_LinkList; 64 67 /// Selection region 68 GdkRegion *m_Selection; 69 70 void invertRegion (GdkRegion*); 65 71 void invertArea (gint x1, gint y1, gint x2, gint y2); 66 72 }; -
trunk/src/IDocument.h
r222 r277 22 22 #define EPDFVIEW_DOCUMENT_ERROR ePDFView::IDocument::getErrorQuark () 23 23 24 typedef struct _GdkRegion GdkRegion; 25 24 26 namespace ePDFView 25 27 { … … 27 29 class DocumentIndex; 28 30 class IDocumentObserver; 29 class DocumentPage; 31 class DocumentPage; 30 32 31 33 /// … … 263 265 virtual gboolean saveFile (const gchar *filename, 264 266 GError **error) = 0; 267 268 virtual GdkRegion* getTextRegion (DocumentRectangle *rect) = 0; 269 virtual void setTextSelection (DocumentRectangle *rect) = 0; 265 270 266 271 void attach (const IDocumentObserver *observer); -
trunk/src/IDocumentObserver.h
r200 r277 151 151 virtual void notifySaveError (const GError *error) { } 152 152 153 /// 154 /// @brief Someone select text in document. 155 /// 156 /// This function called when someone select some text 157 /// in document. 158 /// 159 /// @param text Selected text. 160 /// 161 virtual void notifyTextSelected (const gchar* text) { } 162 153 163 protected: 154 164 /// -
trunk/src/IMainView.h
r263 r277 577 577 virtual void setOutline (DocumentOutline *outline) = 0; 578 578 579 virtual void copyTextToClibboard(const gchar* text) = 0; 580 virtual void activePageModeScroll (gboolean active) = 0; 581 virtual void activePageModeText (gboolean active) = 0; 582 579 583 protected: 580 584 /// -
trunk/src/IPageView.h
r172 r277 33 33 /// Drag cursor. 34 34 PAGE_VIEW_CURSOR_DRAG, 35 /// Text selection cursor. 36 PAGE_VIEW_CURSOR_SELECT_TEXT, 35 37 /// Link cursor. 36 38 PAGE_VIEW_CURSOR_LINK -
trunk/src/MainPter.cxx
r263 r277 696 696 } 697 697 698 void 699 MainPter::pageModeScrollActivated (gboolean active) 700 { 701 IMainView &view = getView (); 702 if ( active ) 703 { 704 m_PagePter->setMode(PagePterModeScroll); 705 view.activePageModeText (FALSE); 706 } 707 } 708 709 void 710 MainPter::pageModeTextActivated (gboolean active) 711 { 712 IMainView &view = getView (); 713 if ( active ) 714 { 715 m_PagePter->setMode(PagePterModeSelectText); 716 view.activePageModeScroll (FALSE); 717 } 718 } 719 698 720 /// 699 721 /// @brief The "Zoom In" was activated. … … 996 1018 } 997 1019 #endif // DEBUG 1020 1021 void 1022 MainPter::notifyTextSelected (const gchar* text) 1023 { 1024 getView ().copyTextToClibboard(text); 1025 } -
trunk/src/MainPter.h
r253 r277 40 40 MainPter (IDocument *document); 41 41 ~MainPter (void); 42 43 void pageModeTextActivated(gboolean active); 44 void pageModeScrollActivated(gboolean active); 42 45 43 46 void setInitialState (void); … … 85 88 void notifySave (void); 86 89 void notifySaveError (const GError *error); 90 void notifyTextSelected (const gchar* text); 87 91 88 92 #if defined (DEBUG) -
trunk/src/PDFDocument.cxx
r258 r277 657 657 } 658 658 659 void 660 PDFDocument::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 } 694 GdkRegion* 695 PDFDocument::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 659 719 /// 660 720 /// @brief Gets the document's page layout from Poppler's page layout. -
trunk/src/PDFDocument.h
r222 r277 55 55 DocumentPage *renderPage (gint pageNum); 56 56 gboolean saveFile (const gchar *fileName, GError **error); 57 GdkRegion* getTextRegion (DocumentRectangle* rect); 58 void setTextSelection (DocumentRectangle *rect); 57 59 58 60 protected: -
trunk/src/PagePter.cxx
r275 r277 16 16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 17 17 18 #include <gdk/gdk.h> 18 19 #include "epdfview.h" 19 20 … … 48 49 gint y; 49 50 /// The horizontal position of the page view scroll when the drag started. 50 gdouble scrollX;51 int startX; 51 52 /// The vertical position of the page view scroll when the drag started. 52 gdouble scrollY;53 int startY; 53 54 }; 54 55 … … 61 62 PagePter::PagePter (IDocument *document) 62 63 { 64 m_LastSelection = NULL; 63 65 m_Document = document; 64 66 m_Document->attach (this); … … 66 68 m_NextPageScroll = PAGE_SCROLL_START; 67 69 m_PageView = NULL; 70 m_Mode = PagePterModeScroll; 68 71 } 69 72 … … 130 133 131 134 IPageView &view = getView (); 132 m_DragInfo->scrollX = view.getHorizontalScroll (); 133 m_DragInfo->scrollY = view.getVerticalScroll (); 134 view.setCursor (PAGE_VIEW_CURSOR_DRAG); 135 m_DragInfo->startX = x; 136 m_DragInfo->startY = y; 137 if(m_Mode == PagePterModeScroll) 138 view.setCursor (PAGE_VIEW_CURSOR_DRAG); 139 else 140 view.setCursor (PAGE_VIEW_CURSOR_SELECT_TEXT); 135 141 } 136 142 } … … 150 156 if ( 1 == button ) 151 157 { 158 if(m_LastSelection) 159 gdk_region_destroy(m_LastSelection); 160 m_LastSelection = NULL; 161 162 if(m_Document->isLoaded() && m_Mode == PagePterModeSelectText){ 163 DocumentRectangle rect(m_DragInfo->startX, m_DragInfo->startY, 164 m_DragInfo->x, m_DragInfo->y); 165 m_Document->setTextSelection(&rect); 166 } 167 152 168 delete m_DragInfo; 153 169 m_DragInfo = NULL; 170 171 refreshPage(PAGE_SCROLL_NONE, FALSE); 172 154 173 getView ().setCursor (PAGE_VIEW_CURSOR_NORMAL); 155 174 } … … 182 201 } 183 202 } 184 else 185 { 186 view.scrollPage (view.getHorizontalScroll (), view.getVerticalScroll (), 187 x - m_DragInfo->x, y - m_DragInfo->y); 203 else{ 204 m_DragInfo->x = x; 205 m_DragInfo->y = y; 206 207 if(m_Mode == PagePterModeScroll){ 208 view.scrollPage (view.getHorizontalScroll (), view.getVerticalScroll (), 209 x - m_DragInfo->startX, y - m_DragInfo->startY); 210 } 211 else{ 212 if(!m_Document->isLoaded()) 213 return ; 214 215 DocumentRectangle rect(m_DragInfo->startX, m_DragInfo->startY, 216 m_DragInfo->x, m_DragInfo->y); 217 218 GdkRegion *region = m_Document->getTextRegion (&rect); 219 220 if( !m_LastSelection || !gdk_region_equal(m_LastSelection, region)){ 221 if(m_LastSelection) 222 gdk_region_destroy(m_LastSelection); 223 m_LastSelection = gdk_region_copy(region); 224 DocumentPage *page = m_Document->getCurrentPage(); 225 if ( NULL != page ) 226 refreshPage (PAGE_SCROLL_NONE, FALSE); 227 } 228 } 188 229 } 189 230 } … … 274 315 { 275 316 g_WaitingForPage = FALSE; 317 if ( NULL != m_LastSelection ) 318 documentPage->setSelection(m_LastSelection); 276 319 view.showPage (documentPage, pageScroll); 277 320 } -
trunk/src/PagePter.h
r170 r277 24 24 namespace ePDFView 25 25 { 26 enum PagePterMode{ 27 PagePterModeScroll, 28 PagePterModeSelectText, 29 }; 30 26 31 /// 27 32 /// @class PagePter. … … 54 59 void setView (IMainView &view); 55 60 void viewResized (gint width, gint height); 61 void setMode(PagePterMode mode) 62 { 63 m_Mode = mode; 64 } 56 65 57 66 protected: … … 64 73 /// The page view. 65 74 IPageView *m_PageView; 66 67 void refreshPage (PageScroll pageScroll, gboolean wasZoomed); 75 /// Last text selection 76 GdkRegion *m_LastSelection; 77 /// What page presenter must do when user move mouse with button pressed. 78 PagePterMode m_Mode; 79 80 void refreshPage (PageScroll pageScroll, gboolean wasZoomed); 68 81 }; 69 82 } -
trunk/src/gtk/MainView.cxx
r263 r277 77 77 static void main_window_zoom_out_cb (GtkWidget *, gpointer); 78 78 static void main_window_zoom_width_cb (GtkToggleAction *, gpointer); 79 static void main_window_page_mode_scroll_cb (GtkToggleAction *, gpointer); 80 static void main_window_page_mode_text_cb (GtkToggleAction *, gpointer); 79 81 80 82 #if defined (HAVE_CUPS) … … 186 188 { "ZoomWidth", EPDFVIEW_STOCK_ZOOM_WIDTH, N_("Zoom to _Width"), NULL, 187 189 N_("Make the current document fill the window width"), 188 G_CALLBACK (main_window_zoom_width_cb), FALSE } 190 G_CALLBACK (main_window_zoom_width_cb), FALSE }, 191 192 { "PageModeScroll", GTK_STOCK_FULLSCREEN, N_("Scroll"), NULL, 193 N_("Mouse scroll page"), 194 G_CALLBACK (main_window_page_mode_scroll_cb), FALSE }, 195 196 { "PageModeText", GTK_STOCK_SELECT_ALL, N_("Select Text"), NULL, 197 N_(" Mouse select text"), 198 G_CALLBACK (main_window_page_mode_text_cb), FALSE }, 189 199 190 200 }; … … 273 283 } 274 284 285 void 286 MainView::activePageModeScroll (gboolean active) 287 { 288 GtkAction *action = 289 gtk_ui_manager_get_action (m_UIManager, "/ToolBar/PageModeScroll"); 290 gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), active); 291 } 292 293 294 void 295 MainView::activePageModeText (gboolean active) 296 { 297 GtkAction *action = 298 gtk_ui_manager_get_action (m_UIManager, "/ToolBar/PageModeText"); 299 gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), active); 300 } 301 275 302 gchar * 276 303 MainView::openFileDialog (const gchar *lastFolder) … … 1037 1064 } 1038 1065 } 1066 } 1067 1068 void 1069 MainView::copyTextToClibboard(const gchar* text) 1070 { 1071 GtkClipboard *clipboard = gtk_clipboard_get(GDK_SELECTION_PRIMARY); 1072 gtk_clipboard_set_text(clipboard, text, -1); 1039 1073 } 1040 1074 … … 1417 1451 pter->zoomWidthActivated (gtk_toggle_action_get_active (action)); 1418 1452 } 1453 1454 void 1455 main_window_page_mode_scroll_cb (GtkToggleAction *action, gpointer data) 1456 { 1457 g_assert ( NULL != data && "The data parameter is NULL."); 1458 1459 MainPter *pter = (MainPter *)data; 1460 pter->pageModeScrollActivated (gtk_toggle_action_get_active (action)); 1461 } 1462 1463 void 1464 main_window_page_mode_text_cb (GtkToggleAction *action, gpointer data) 1465 { 1466 g_assert ( NULL != data && "The data parameter is NULL."); 1467 1468 MainPter *pter = (MainPter *)data; 1469 pter->pageModeTextActivated (gtk_toggle_action_get_active (action)); 1470 } -
trunk/src/gtk/MainView.h
r263 r277 36 36 void activeZoomFit (gboolean active); 37 37 void activeZoomWidth (gboolean active); 38 void activePageModeScroll (gboolean active); 39 void activePageModeText (gboolean active); 38 40 gchar *openFileDialog (const gchar *lastFolder); 39 41 gchar *promptPasswordDialog (void); … … 69 71 void setZoomText (const gchar *text); 70 72 const gchar *getGoToPageText (void); 73 void copyTextToClibboard(const gchar* text); 71 74 IFindView *getFindView (void); 72 75 IPageView *getPageView (void); -
trunk/src/gtk/PageView.cxx
r212 r277 185 185 switch (cursorType) 186 186 { 187 case PAGE_VIEW_CURSOR_SELECT_TEXT: 188 cursor = gdk_cursor_new (GDK_XTERM); 189 break; 187 190 case PAGE_VIEW_CURSOR_LINK: 188 191 cursor = gdk_cursor_new (GDK_HAND2);
