diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2015-04-22 17:56:18 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2015-04-22 20:07:46 +0200 |
commit | 57faa42ea2509093cabdcd2bfa1349a7704a4f42 (patch) | |
tree | e3aa0b2113b660b5ce6bfc0e52ce9e64f9cf6b27 /libreofficekit/qa | |
parent | 7d69f1e66a060c916f8ccdecb96427b4f329e22a (diff) |
gtktiledviewer: implement search using .uno:ExecuteSearch
And using boost::property_tree::write_json() to marshal the parameters.
Change-Id: I0027b6e1ce6c8d3b0b3a84642c76595eadc3db5f
Diffstat (limited to 'libreofficekit/qa')
-rw-r--r-- | libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx index 2502f40be46f..fc309ed8caf1 100644 --- a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx +++ b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx @@ -13,7 +13,9 @@ #include <string> #include <map> +#include <boost/property_tree/json_parser.hpp> #include <gdk/gdk.h> +#include <gdk/gdkkeysyms.h> #include <gtk/gtk.h> #include <LibreOfficeKit/LibreOfficeKitGtk.h> @@ -44,6 +46,8 @@ static GtkWidget* pVBox; #if ( GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION >= 24 ) || GTK_MAJOR_VERSION > 2 static GtkComboBoxText* pPartSelector; #endif +GtkWidget* pFindbar; +GtkWidget* pFindbarEntry; static LibreOfficeKit* pOffice; static char* pFileName; @@ -112,6 +116,67 @@ void toggleEditing(GtkWidget* /*pButton*/, gpointer /*pItem*/) lok_docview_set_edit(pLOKDocView, bActive); } +/// Toggle the visibility of the findbar. +void toggleFindbar(GtkWidget* /*pButton*/, gpointer /*pItem*/) +{ + if (gtk_widget_get_visible(pFindbar)) + { + gtk_widget_hide(pFindbar); + } + else + gtk_widget_show_all(pFindbar); +} + +/// Searches for the next or previous text of pFindbarEntry. +void doSearch(bool bBackwards) +{ + GtkEntry* pEntry = GTK_ENTRY(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); + std::stringstream aStream; + boost::property_tree::write_json(aStream, aTree); + + LOKDocView* pLOKDocView = LOK_DOCVIEW(pDocView); + lok_docview_post_command(pLOKDocView, ".uno:ExecuteSearch", aStream.str().c_str()); +} + +/// Click handler for the search next button. +void signalSearchNext(GtkWidget* /*pButton*/, gpointer /*pItem*/) +{ + doSearch(/*bBackwards=*/false); +} + +/// Click handler for the search previous button. +void signalSearchPrev(GtkWidget* /*pButton*/, gpointer /*pItem*/) +{ + doSearch(/*bBackwards=*/true); +} + +/// Handles the key-press-event of the search entry widget. +gboolean signalFindbar(GtkWidget* /*pWidget*/, GdkEventKey* pEvent, gpointer /*pData*/) +{ + switch(pEvent->keyval) + { + case GDK_Return: + { + // Search forward. + doSearch(/*bBackwards=*/false); + return TRUE; + } + case GDK_Escape: + { + // Hide the findbar. + gtk_widget_hide(pFindbar); + return TRUE; + } + } + return FALSE; +} + /// LOKDocView changed edit state -> inform the tool button. static void signalEdit(LOKDocView* pLOKDocView, gboolean bWasEdit, gpointer /*pData*/) { @@ -297,6 +362,9 @@ int main( int argc, char* argv[] ) pEnableEditing = gtk_toggle_tool_button_new_from_stock(GTK_STOCK_EDIT); gtk_toolbar_insert(GTK_TOOLBAR(pToolbar), pEnableEditing, -1); g_signal_connect(G_OBJECT(pEnableEditing), "toggled", G_CALLBACK(toggleEditing), NULL); + GtkToolItem* pFindButton = gtk_tool_button_new_from_stock(GTK_STOCK_FIND); + gtk_toolbar_insert(GTK_TOOLBAR(pToolbar), pFindButton, -1); + g_signal_connect(G_OBJECT(pFindButton), "clicked", G_CALLBACK(toggleFindbar), NULL); gtk_toolbar_insert( GTK_TOOLBAR(pToolbar), gtk_separator_tool_item_new(), -1); pBold = gtk_toggle_tool_button_new_from_stock(GTK_STOCK_BOLD); @@ -318,6 +386,29 @@ int main( int argc, char* argv[] ) gtk_box_pack_start( GTK_BOX(pVBox), pToolbar, FALSE, FALSE, 0 ); // Adds to top. + // Findbar + pFindbar = gtk_toolbar_new(); + gtk_toolbar_set_style(GTK_TOOLBAR(pFindbar), GTK_TOOLBAR_ICONS); + + GtkToolItem* pFindbarClose = gtk_tool_button_new_from_stock(GTK_STOCK_CLOSE); + gtk_toolbar_insert(GTK_TOOLBAR(pFindbar), pFindbarClose, -1); + g_signal_connect(G_OBJECT(pFindbarClose), "clicked", G_CALLBACK(toggleFindbar), NULL); + + GtkToolItem* pEntryContainer = gtk_tool_item_new(); + pFindbarEntry = gtk_entry_new(); + gtk_container_add(GTK_CONTAINER(pEntryContainer), pFindbarEntry); + g_signal_connect(pFindbarEntry, "key-press-event", G_CALLBACK(signalFindbar), 0); + gtk_toolbar_insert(GTK_TOOLBAR(pFindbar), pEntryContainer, -1); + + GtkToolItem* pFindbarNext = gtk_tool_button_new_from_stock(GTK_STOCK_GO_DOWN); + gtk_toolbar_insert(GTK_TOOLBAR(pFindbar), pFindbarNext, -1); + g_signal_connect(G_OBJECT(pFindbarNext), "clicked", G_CALLBACK(signalSearchNext), NULL); + GtkToolItem* pFindbarPrev = gtk_tool_button_new_from_stock(GTK_STOCK_GO_UP); + gtk_toolbar_insert(GTK_TOOLBAR(pFindbar), pFindbarPrev, -1); + g_signal_connect(G_OBJECT(pFindbarPrev), "clicked", G_CALLBACK(signalSearchPrev), NULL); + + gtk_box_pack_end(GTK_BOX(pVBox), pFindbar, FALSE, FALSE, 0); + // Docview pDocView = lok_docview_new( pOffice ); g_signal_connect(pDocView, "edit-changed", G_CALLBACK(signalEdit), NULL); @@ -330,6 +421,8 @@ int main( int argc, char* argv[] ) gtk_container_add( GTK_CONTAINER(pVBox), pDocView ); gtk_widget_show_all( pWindow ); + // Hide the findbar by default. + gtk_widget_hide(pFindbar); pFileName = argv[2]; int bOpened = lok_docview_open_document( LOK_DOCVIEW(pDocView), argv[2] ); |