diff options
-rw-r--r-- | include/LibreOfficeKit/LibreOfficeKitGtk.h | 38 | ||||
-rw-r--r-- | libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx | 46 | ||||
-rw-r--r-- | libreofficekit/source/gtk/lokdocview.cxx | 107 |
3 files changed, 139 insertions, 52 deletions
diff --git a/include/LibreOfficeKit/LibreOfficeKitGtk.h b/include/LibreOfficeKit/LibreOfficeKitGtk.h index 2548c11044e3..1b03e4633547 100644 --- a/include/LibreOfficeKit/LibreOfficeKitGtk.h +++ b/include/LibreOfficeKit/LibreOfficeKitGtk.h @@ -196,6 +196,44 @@ void lok_doc_view_post_command (LOKDocView* const gchar* pArguments, gboolean bNotifyWhenFinished); + +/** + * lok_doc_view_find_next: + * @pDocView: The #LOKDocView instance + * @pText: text to search for + * @bHighlightAll: Whether all the matches should be highlighted or not + * + * Highlights the next matching text in the view. `search-not-found` signal will + * be emitted when no search is found + */ +void lok_doc_view_find_next (LOKDocView* pDocView, + const gchar* pText, + gboolean bHighlightAll); + +/** + * lok_doc_view_find_prev: + * @pDocView: The #LOKDocView instance + * @pText: text to search for + * @bHighlightAll: Whether all the matches should be highlighted or not + * + * Highlights the previous matching text in the view. `search-not-found` signal + * will be emitted when no search is found + */ +void lok_doc_view_find_prev (LOKDocView* pDocView, + const gchar* pText, + gboolean bHighlightAll); + +/** + * lok_doc_view_highlight_all: + * @pDocView: The #LOKDocView instance + * @pText: text to search for + * + * Highlights all matching texts in the view. `search-not-found` signal + * will be emitted when no search is found + */ +void lok_doc_view_highlight_all (LOKDocView* pDocView, + const gchar* pText); + /** * lok_doc_view_pixel_to_twip: * @pDocView: The #LOKDocView instance diff --git a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx index e7b221651237..8d43737a4b7d 100644 --- a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx +++ b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx @@ -452,7 +452,11 @@ static void toggleEditing(GtkWidget* pButton, gpointer /*pItem*/) static void toggleFindAll(GtkWidget* pButton, gpointer /*pItem*/) { TiledWindow& rWindow = lcl_getTiledWindow(pButton); + GtkEntry* pEntry = GTK_ENTRY(rWindow.m_pFindbarEntry); + const char* pText = gtk_entry_get_text(pEntry); + rWindow.m_bFindAll = !rWindow.m_bFindAll; + lok_doc_view_highlight_all(LOK_DOC_VIEW(rWindow.m_pDocView), pText); } /// Toggle the visibility of the findbar. @@ -611,48 +615,24 @@ static void doPaste(GtkWidget* pButton, gpointer /*pItem*/) pDocument->pClass->paste(pDocument, "text/plain;charset=utf-8", pText, strlen(pText)); } -/// Searches for the next or previous text of TiledWindow::m_pFindbarEntry. -static void doSearch(GtkWidget* pButton, bool bBackwards) +/// Click handler for the search next button. +static void signalSearchNext(GtkWidget* pButton, gpointer /*pItem*/) { TiledWindow& rWindow = lcl_getTiledWindow(pButton); GtkEntry* pEntry = GTK_ENTRY(rWindow.m_pFindbarEntry); const char* pText = gtk_entry_get_text(pEntry); - boost::property_tree::ptree aTree; - aTree.put(boost::property_tree::ptree::path_type("SearchItem.SearchString/type", '/'), "string"); - aTree.put(boost::property_tree::ptree::path_type("SearchItem.SearchString/value", '/'), pText); - aTree.put(boost::property_tree::ptree::path_type("SearchItem.Backward/type", '/'), "boolean"); - aTree.put(boost::property_tree::ptree::path_type("SearchItem.Backward/value", '/'), bBackwards); - if (rWindow.m_bFindAll) - { - aTree.put(boost::property_tree::ptree::path_type("SearchItem.Command/type", '/'), "unsigned short"); - // SvxSearchCmd::FIND_ALL - aTree.put(boost::property_tree::ptree::path_type("SearchItem.Command/value", '/'), "1"); - } - - LOKDocView* pLOKDocView = LOK_DOC_VIEW(rWindow.m_pDocView); - GdkRectangle aArea; - getVisibleAreaTwips(rWindow.m_pDocView, &aArea); - aTree.put(boost::property_tree::ptree::path_type("SearchItem.SearchStartPointX/type", '/'), "long"); - aTree.put(boost::property_tree::ptree::path_type("SearchItem.SearchStartPointX/value", '/'), aArea.x); - aTree.put(boost::property_tree::ptree::path_type("SearchItem.SearchStartPointY/type", '/'), "long"); - aTree.put(boost::property_tree::ptree::path_type("SearchItem.SearchStartPointY/value", '/'), aArea.y); - - std::stringstream aStream; - boost::property_tree::write_json(aStream, aTree); - lok_doc_view_post_command(pLOKDocView, ".uno:ExecuteSearch", aStream.str().c_str(), false); -} - -/// Click handler for the search next button. -static void signalSearchNext(GtkWidget* pButton, gpointer /*pItem*/) -{ - doSearch(pButton, /*bBackwards=*/false); + lok_doc_view_find_next(LOK_DOC_VIEW(rWindow.m_pDocView), pText, rWindow.m_bFindAll); } /// Click handler for the search previous button. static void signalSearchPrev(GtkWidget* pButton, gpointer /*pItem*/) { - doSearch(pButton, /*bBackwards=*/true); + TiledWindow& rWindow = lcl_getTiledWindow(pButton); + GtkEntry* pEntry = GTK_ENTRY(rWindow.m_pFindbarEntry); + const char* pText = gtk_entry_get_text(pEntry); + + lok_doc_view_find_prev(LOK_DOC_VIEW(rWindow.m_pDocView), pText, rWindow.m_bFindAll); } /// Handles the key-press-event of the search entry widget. @@ -665,7 +645,7 @@ static gboolean signalFindbar(GtkWidget* pWidget, GdkEventKey* pEvent, gpointer case GDK_KEY_Return: { // Search forward. - doSearch(pWidget, /*bBackwards=*/false); + signalSearchNext(pWidget, nullptr); return TRUE; } case GDK_KEY_Escape: diff --git a/libreofficekit/source/gtk/lokdocview.cxx b/libreofficekit/source/gtk/lokdocview.cxx index 97a5e73c6b6f..ce21d6e784b7 100644 --- a/libreofficekit/source/gtk/lokdocview.cxx +++ b/libreofficekit/source/gtk/lokdocview.cxx @@ -305,6 +305,67 @@ callbackTypeToString (int nType) return nullptr; } +static void +LOKPostCommand (LOKDocView* pDocView, + const gchar* pCommand, + const gchar* pArguments, + gboolean bNotifyWhenFinished) +{ + LOKDocViewPrivate& priv = getPrivate(pDocView); + GTask* task = g_task_new(pDocView, nullptr, nullptr, nullptr); + LOEvent* pLOEvent = new LOEvent(LOK_POST_COMMAND); + GError* error = nullptr; + pLOEvent->m_pCommand = pCommand; + pLOEvent->m_pArguments = g_strdup(pArguments); + pLOEvent->m_bNotifyWhenFinished = bNotifyWhenFinished; + + g_task_set_task_data(task, pLOEvent, LOEvent::destroy); + g_thread_pool_push(priv->lokThreadPool, g_object_ref(task), &error); + if (error != nullptr) + { + g_warning("Unable to call LOK_POST_COMMAND: %s", error->message); + g_clear_error(&error); + } + g_object_unref(task); +} + +static void +doSearch(LOKDocView* pDocView, const char* pText, bool bBackwards, bool highlightAll) +{ + LOKDocViewPrivate& priv = getPrivate(pDocView); + boost::property_tree::ptree aTree; + GtkWidget* drawingWidget = GTK_WIDGET(pDocView); + GdkWindow* drawingWindow = gtk_widget_get_window(drawingWidget); + cairo_region_t* cairoVisRegion = gdk_window_get_visible_region(drawingWindow); + cairo_rectangle_int_t cairoVisRect; + int x, y; + + cairo_region_get_rectangle(cairoVisRegion, 0, &cairoVisRect); + x = pixelToTwip (cairoVisRect.x, priv->m_fZoom); + y = pixelToTwip (cairoVisRect.y, priv->m_fZoom); + + aTree.put(boost::property_tree::ptree::path_type("SearchItem.SearchString/type", '/'), "string"); + aTree.put(boost::property_tree::ptree::path_type("SearchItem.SearchString/value", '/'), pText); + aTree.put(boost::property_tree::ptree::path_type("SearchItem.Backward/type", '/'), "boolean"); + aTree.put(boost::property_tree::ptree::path_type("SearchItem.Backward/value", '/'), bBackwards); + if (highlightAll) + { + aTree.put(boost::property_tree::ptree::path_type("SearchItem.Command/type", '/'), "unsigned short"); + // SvxSearchCmd::FIND_ALL + aTree.put(boost::property_tree::ptree::path_type("SearchItem.Command/value", '/'), "1"); + } + + aTree.put(boost::property_tree::ptree::path_type("SearchItem.SearchStartPointX/type", '/'), "long"); + aTree.put(boost::property_tree::ptree::path_type("SearchItem.SearchStartPointX/value", '/'), x); + aTree.put(boost::property_tree::ptree::path_type("SearchItem.SearchStartPointY/type", '/'), "long"); + aTree.put(boost::property_tree::ptree::path_type("SearchItem.SearchStartPointY/value", '/'), y); + + std::stringstream aStream; + boost::property_tree::write_json(aStream, aTree); + + LOKPostCommand (pDocView, ".uno:ExecuteSearch", aStream.str().c_str(), false); +} + static bool isEmptyRectangle(const GdkRectangle& rRectangle) { @@ -1769,10 +1830,7 @@ lokThreadFunc(gpointer data, gpointer /*user_data*/) openDocumentInThread(task); break; case LOK_POST_COMMAND: - if (priv->m_bEdit) - postCommandInThread(task); - else - g_info ("LOK_POST_COMMAND: ignoring commands in view-only mode"); + postCommandInThread(task); break; case LOK_SET_EDIT: setEditInThread(task); @@ -2574,7 +2632,6 @@ lok_doc_view_get_edit (LOKDocView* pDocView) return priv->m_bEdit; } - SAL_DLLPUBLIC_EXPORT void lok_doc_view_post_command (LOKDocView* pDocView, const gchar* pCommand, @@ -2582,21 +2639,33 @@ lok_doc_view_post_command (LOKDocView* pDocView, gboolean bNotifyWhenFinished) { LOKDocViewPrivate& priv = getPrivate(pDocView); - GTask* task = g_task_new(pDocView, nullptr, nullptr, nullptr); - LOEvent* pLOEvent = new LOEvent(LOK_POST_COMMAND); - GError* error = nullptr; - pLOEvent->m_pCommand = pCommand; - pLOEvent->m_pArguments = g_strdup(pArguments); - pLOEvent->m_bNotifyWhenFinished = bNotifyWhenFinished; + if (priv->m_bEdit) + LOKPostCommand(pDocView, pCommand, pArguments, bNotifyWhenFinished); + else + g_info ("LOK_POST_COMMAND: ignoring commands in view-only mode"); +} - g_task_set_task_data(task, pLOEvent, LOEvent::destroy); - g_thread_pool_push(priv->lokThreadPool, g_object_ref(task), &error); - if (error != nullptr) - { - g_warning("Unable to call LOK_POST_COMMAND: %s", error->message); - g_clear_error(&error); - } - g_object_unref(task); +SAL_DLLPUBLIC_EXPORT void +lok_doc_view_find_prev (LOKDocView* pDocView, + const gchar* pText, + gboolean bHighlightAll) +{ + doSearch(pDocView, pText, true, bHighlightAll); +} + +SAL_DLLPUBLIC_EXPORT void +lok_doc_view_find_next (LOKDocView* pDocView, + const gchar* pText, + gboolean bHighlightAll) +{ + doSearch(pDocView, pText, false, bHighlightAll); +} + +SAL_DLLPUBLIC_EXPORT void +lok_doc_view_highlight_all (LOKDocView* pDocView, + const gchar* pText) +{ + doSearch(pDocView, pText, false, true); } SAL_DLLPUBLIC_EXPORT float |