From 35bc0137636c6d1c537188b909d173e523786ff9 Mon Sep 17 00:00:00 2001 From: Pranav Kant Date: Sat, 15 Aug 2015 18:48:11 +0530 Subject: [PATCH 094/398] gtktiledviewer: Jump to cursor position when it changes Change-Id: If50ac0bd21e59b0e0639aa353513451e88ae2a9f (cherry picked from commit a9b266aeea80423210618fe4c015e4791ceb1bc2) --- .../qa/gtktiledviewer/gtktiledviewer.cxx | 85 +++++++++++++++++----- libreofficekit/source/gtk/lokdocview.cxx | 25 +++++++ 2 files changed, 93 insertions(+), 17 deletions(-) diff --git a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx index 3399087cb6db..57d0c113d6ac 100644 --- a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx +++ b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx @@ -57,6 +57,25 @@ static void lcl_registerToolItem(GtkToolItem* pItem, const std::string& rName) const float fZooms[] = { 0.25, 0.5, 0.75, 1.0, 1.5, 2.0, 3.0, 5.0 }; + +/// Get the visible area of the scrolled window +static void getVisibleAreaTwips(GdkRectangle* pArea) +{ +#if GTK_CHECK_VERSION(2,14,0) // we need gtk_adjustment_get_page_size() + GtkAdjustment* pHAdjustment = gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(pScrolledWindow)); + GtkAdjustment* pVAdjustment = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(pScrolledWindow)); + + pArea->x = lok_doc_view_pixel_to_twip(LOK_DOC_VIEW(pDocView), + gtk_adjustment_get_value(pHAdjustment)); + pArea->y = lok_doc_view_pixel_to_twip(LOK_DOC_VIEW(pDocView), + gtk_adjustment_get_value(pVAdjustment)); + pArea->width = lok_doc_view_pixel_to_twip(LOK_DOC_VIEW(pDocView), + gtk_adjustment_get_page_size(pHAdjustment)); + pArea->height = lok_doc_view_pixel_to_twip(LOK_DOC_VIEW(pDocView), + gtk_adjustment_get_page_size(pVAdjustment)); +#endif +} + static void changeZoom( GtkWidget* pButton, gpointer /* pItem */ ) { const char *sName = gtk_tool_button_get_icon_name( GTK_TOOL_BUTTON(pButton) ); @@ -174,23 +193,6 @@ static void doCopy(GtkWidget* /*pButton*/, gpointer /*pItem*/) free(pSelection); } -/// Get the visible area of the scrolled window -static void getVisibleAreaTwips(GdkRectangle* pArea) -{ -#if GTK_CHECK_VERSION(2,14,0) // we need gtk_adjustment_get_page_size() - GtkAdjustment* pHAdjustment = gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(pScrolledWindow)); - GtkAdjustment* pVAdjustment = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(pScrolledWindow)); - - pArea->x = lok_doc_view_pixel_to_twip(LOK_DOC_VIEW(pDocView), - gtk_adjustment_get_value(pHAdjustment)); - pArea->y = lok_doc_view_pixel_to_twip(LOK_DOC_VIEW(pDocView), - gtk_adjustment_get_value(pVAdjustment)); - pArea->width = lok_doc_view_pixel_to_twip(LOK_DOC_VIEW(pDocView), - gtk_adjustment_get_page_size(pHAdjustment)); - pArea->height = lok_doc_view_pixel_to_twip(LOK_DOC_VIEW(pDocView), - gtk_adjustment_get_page_size(pVAdjustment)); -#endif -} /// Searches for the next or previous text of pFindbarEntry. static void doSearch(bool bBackwards) @@ -318,6 +320,54 @@ static void signalHyperlink(LOKDocView* /*pLOKDocView*/, char* pPayload, gpointe } } +/// Cursor position changed +static void cursorChanged(LOKDocView* /*pDocView*/, gint nX, gint nY, + gint /*nWidth*/, gint /*nHeight*/, gpointer /*pData*/) +{ + GtkAdjustment* vadj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(pScrolledWindow)); + GtkAdjustment* hadj = gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(pScrolledWindow)); + GdkRectangle visArea; + gdouble upper; + gint x = -1, y = -1; + + getVisibleAreaTwips(&visArea); + + // check vertically + if (nY < visArea.y) + { + y = nY - visArea.height/2; + if (y < 0) + y = gtk_adjustment_get_lower(vadj); + } + else if (nY > visArea.y + visArea.height) + { + y = nY - visArea.height/2; + upper = lok_doc_view_pixel_to_twip(LOK_DOC_VIEW(pDocView), gtk_adjustment_get_upper(vadj)); + if (y > upper) + y = upper; + + } + + if (nX < visArea.x) + { + x = nX - visArea.width/2; + if (x < 0) + x = gtk_adjustment_get_lower(hadj); + } + else if (nX > visArea.x + visArea.width) + { + x = nX - visArea.width/2; + upper = lok_doc_view_pixel_to_twip(LOK_DOC_VIEW(pDocView), gtk_adjustment_get_upper(hadj)); + if (x > upper) + x = upper; + } + + if (y!=-1) + gtk_adjustment_set_value(vadj, lok_doc_view_twip_to_pixel(LOK_DOC_VIEW(pDocView), y)); + if (x!=-1) + gtk_adjustment_set_value(hadj, lok_doc_view_twip_to_pixel(LOK_DOC_VIEW(pDocView), x)); +} + static void toggleToolItem(GtkWidget* pWidget, gpointer /*pData*/) { if (g_bToolItemBroadcast) @@ -575,6 +625,7 @@ int main( int argc, char* argv[] ) g_signal_connect(pDocView, "part-changed", G_CALLBACK(signalPart), NULL); g_signal_connect(pDocView, "size-changed", G_CALLBACK(signalSize), NULL); g_signal_connect(pDocView, "hyperlink-clicked", G_CALLBACK(signalHyperlink), NULL); + g_signal_connect(pDocView, "cursor-changed", G_CALLBACK(cursorChanged), NULL); // Scrolled window for DocView diff --git a/libreofficekit/source/gtk/lokdocview.cxx b/libreofficekit/source/gtk/lokdocview.cxx index 364590167f56..859e96b29e20 100644 --- a/libreofficekit/source/gtk/lokdocview.cxx +++ b/libreofficekit/source/gtk/lokdocview.cxx @@ -117,6 +117,7 @@ enum PART_CHANGED, SIZE_CHANGED, HYPERLINK_CLICKED, + CURSOR_CHANGED, LAST_SIGNAL }; @@ -518,6 +519,11 @@ callback (gpointer pData) { priv->m_aVisibleCursor = payloadToRectangle(pDocView, pCallback->m_aPayload.c_str()); priv->m_bCursorOverlayVisible = true; + g_signal_emit(pDocView, doc_view_signals[CURSOR_CHANGED], 0, + priv->m_aVisibleCursor.x, + priv->m_aVisibleCursor.y, + priv->m_aVisibleCursor.width, + priv->m_aVisibleCursor.height); gtk_widget_queue_draw(GTK_WIDGET(pDocView)); } break; @@ -1743,6 +1749,25 @@ static void lok_doc_view_class_init (LOKDocViewClass* pClass) g_cclosure_marshal_VOID__STRING, G_TYPE_NONE, 1, G_TYPE_STRING); + + /** + * LOKDocView::cursor-changed: + * @pDocView: the #LOKDocView on which the signal is emitted + * @nX: The new cursor position (X coordinate) in pixels + * @nY: The new cursor position (Y coordinate) in pixels + * @nWidth: The width of new cursor + * @nHeight: The height of new cursor + */ + doc_view_signals[CURSOR_CHANGED] = + g_signal_new("cursor-changed", + G_TYPE_FROM_CLASS(pGObjectClass), + G_SIGNAL_RUN_FIRST, + 0, + NULL, NULL, + g_cclosure_marshal_generic, + G_TYPE_NONE, 4, + G_TYPE_INT, G_TYPE_INT, + G_TYPE_INT, G_TYPE_INT); } /** -- 2.12.0