diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2015-04-14 11:00:11 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2015-04-14 11:53:30 +0200 |
commit | f9339d1ba316b11d00c235e9538ef0afde514443 (patch) | |
tree | 7841fe02f35cb34c6664e875500205785f964c53 /libreofficekit | |
parent | bc892b04144d82507ccd59953c9f4da357c2e7b4 (diff) |
lokdocview: implement LOK_CALLBACK_STATE_CHANGED
Change-Id: I239849056dd88f785dce239c4d53d6c905177b64
Diffstat (limited to 'libreofficekit')
-rw-r--r-- | libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx | 35 | ||||
-rw-r--r-- | libreofficekit/source/gtk/lokdocview.cxx | 20 |
2 files changed, 53 insertions, 2 deletions
diff --git a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx index 9c1c7ed6ce38..b706b41785db 100644 --- a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx +++ b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx @@ -10,6 +10,7 @@ #include <assert.h> #include <stdio.h> #include <string.h> +#include <string> #include <gdk/gdk.h> #include <gtk/gtk.h> @@ -31,6 +32,7 @@ static int help() static GtkWidget* pDocView; static GtkToolItem* pEnableEditing; static GtkToolItem* pBold; +bool g_bToolItemBroadcast = true; static GtkWidget* pVBox; // GtkComboBox requires gtk 2.24 or later #if ( GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION >= 24 ) || GTK_MAJOR_VERSION > 2 @@ -107,12 +109,42 @@ static void signalEdit(LOKDocView* pLOKDocView, gboolean bWasEdit, gpointer /*pD gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(pEnableEditing), bEdit); } +/// LOKDocView changed command state -> inform the tool button. +static void signalCommand(LOKDocView* /*pLOKDocView*/, char* pPayload, gpointer /*pData*/) +{ + std::string aPayload(pPayload); + size_t nPosition = aPayload.find("="); + if (nPosition != std::string::npos) + { + std::string aKey = aPayload.substr(0, nPosition); + std::string aValue = aPayload.substr(nPosition + 1); + g_info("signalCommand: '%s' is '%s'", aKey.c_str(), aValue.c_str()); + + GtkToolItem* pItem = 0; + if (aKey == ".uno:Bold") + pItem = pBold; + + if (pItem) + { + bool bEdit = aValue == "true"; + if (gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(pItem)) != bEdit) + { + // Avoid invoking lok_docview_post_command(). + g_bToolItemBroadcast = false; + gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(pItem), bEdit); + g_bToolItemBroadcast = true; + } + } + } +} + /// User clicked on the 'Bold' button -> inform LOKDocView. void toggleBold(GtkWidget* /*pButton*/, gpointer /*pItem*/) { LOKDocView* pLOKDocView = LOK_DOCVIEW(pDocView); - lok_docview_post_command(pLOKDocView, ".uno:Bold"); + if (g_bToolItemBroadcast) + lok_docview_post_command(pLOKDocView, ".uno:Bold"); } // GtkComboBox requires gtk 2.24 or later @@ -265,6 +297,7 @@ int main( int argc, char* argv[] ) // Docview pDocView = lok_docview_new( pOffice ); g_signal_connect(pDocView, "edit-changed", G_CALLBACK(signalEdit), NULL); + g_signal_connect(pDocView, "command-changed", G_CALLBACK(signalCommand), NULL); // Input handling. g_signal_connect(pWindow, "key-press-event", G_CALLBACK(lok_docview_post_key), pDocView); diff --git a/libreofficekit/source/gtk/lokdocview.cxx b/libreofficekit/source/gtk/lokdocview.cxx index 2e2313a14b21..2e6858cddedf 100644 --- a/libreofficekit/source/gtk/lokdocview.cxx +++ b/libreofficekit/source/gtk/lokdocview.cxx @@ -182,6 +182,8 @@ struct LOKDocView_Impl static void callbackWorker(int nType, const char* pPayload, void* pData); /// Implementation of the callback worder handler, invoked by callbackWorker(). void callbackWorkerImpl(int nType, const char* pPayload); + /// Command state (various buttons like bold are toggled or not) is changed. + void commandChanged(const std::string& rPayload); }; LOKDocView_Impl::CallbackData::CallbackData(int nType, const std::string& rPayload, LOKDocView* pDocView) @@ -941,7 +943,7 @@ gboolean LOKDocView_Impl::callbackImpl(CallbackData* pCallback) } case LOK_CALLBACK_STATE_CHANGED: { - g_info("%s", pCallback->m_aPayload.c_str()); + commandChanged(pCallback->m_aPayload); } break; default: @@ -971,11 +973,17 @@ void LOKDocView_Impl::callbackWorkerImpl(int nType, const char* pPayload) enum { EDIT_CHANGED, + COMMAND_CHANGED, LAST_SIGNAL }; static guint docview_signals[LAST_SIGNAL] = { 0 }; +void LOKDocView_Impl::commandChanged(const std::string& rString) +{ + g_signal_emit(m_pDocView, docview_signals[COMMAND_CHANGED], 0, rString.c_str()); +} + static void lok_docview_class_init( gpointer ptr ) { LOKDocViewClass* pClass = static_cast<LOKDocViewClass *>(ptr); @@ -990,6 +998,16 @@ static void lok_docview_class_init( gpointer ptr ) g_cclosure_marshal_VOID__BOOLEAN, G_TYPE_NONE, 1, G_TYPE_BOOLEAN); + pClass->command_changed = NULL; + docview_signals[COMMAND_CHANGED] = + g_signal_new("command-changed", + G_TYPE_FROM_CLASS(gobject_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET(LOKDocViewClass, command_changed), + NULL, NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, 1, + G_TYPE_STRING); } static void lok_docview_init( GTypeInstance* pInstance, gpointer ) |