Kaydet (Commit) f9339d1b authored tarafından Miklos Vajna's avatar Miklos Vajna

lokdocview: implement LOK_CALLBACK_STATE_CHANGED

Change-Id: I239849056dd88f785dce239c4d53d6c905177b64
üst bc892b04
...@@ -38,6 +38,7 @@ struct _LOKDocViewClass ...@@ -38,6 +38,7 @@ struct _LOKDocViewClass
{ {
GtkScrolledWindowClass parent_class; GtkScrolledWindowClass parent_class;
void (* edit_changed) (LOKDocView* pView, gboolean was_edit); void (* edit_changed) (LOKDocView* pView, gboolean was_edit);
void (* command_changed) (LOKDocView* pView, char* new_state);
}; };
guint lok_docview_get_type (void); guint lok_docview_get_type (void);
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include <assert.h> #include <assert.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <string>
#include <gdk/gdk.h> #include <gdk/gdk.h>
#include <gtk/gtk.h> #include <gtk/gtk.h>
...@@ -31,6 +32,7 @@ static int help() ...@@ -31,6 +32,7 @@ static int help()
static GtkWidget* pDocView; static GtkWidget* pDocView;
static GtkToolItem* pEnableEditing; static GtkToolItem* pEnableEditing;
static GtkToolItem* pBold; static GtkToolItem* pBold;
bool g_bToolItemBroadcast = true;
static GtkWidget* pVBox; static GtkWidget* pVBox;
// GtkComboBox requires gtk 2.24 or later // GtkComboBox requires gtk 2.24 or later
#if ( GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION >= 24 ) || GTK_MAJOR_VERSION > 2 #if ( GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION >= 24 ) || GTK_MAJOR_VERSION > 2
...@@ -107,11 +109,41 @@ static void signalEdit(LOKDocView* pLOKDocView, gboolean bWasEdit, gpointer /*pD ...@@ -107,11 +109,41 @@ static void signalEdit(LOKDocView* pLOKDocView, gboolean bWasEdit, gpointer /*pD
gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(pEnableEditing), bEdit); 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. /// User clicked on the 'Bold' button -> inform LOKDocView.
void toggleBold(GtkWidget* /*pButton*/, gpointer /*pItem*/) void toggleBold(GtkWidget* /*pButton*/, gpointer /*pItem*/)
{ {
LOKDocView* pLOKDocView = LOK_DOCVIEW(pDocView); LOKDocView* pLOKDocView = LOK_DOCVIEW(pDocView);
if (g_bToolItemBroadcast)
lok_docview_post_command(pLOKDocView, ".uno:Bold"); lok_docview_post_command(pLOKDocView, ".uno:Bold");
} }
...@@ -265,6 +297,7 @@ int main( int argc, char* argv[] ) ...@@ -265,6 +297,7 @@ int main( int argc, char* argv[] )
// Docview // Docview
pDocView = lok_docview_new( pOffice ); pDocView = lok_docview_new( pOffice );
g_signal_connect(pDocView, "edit-changed", G_CALLBACK(signalEdit), NULL); g_signal_connect(pDocView, "edit-changed", G_CALLBACK(signalEdit), NULL);
g_signal_connect(pDocView, "command-changed", G_CALLBACK(signalCommand), NULL);
// Input handling. // Input handling.
g_signal_connect(pWindow, "key-press-event", G_CALLBACK(lok_docview_post_key), pDocView); g_signal_connect(pWindow, "key-press-event", G_CALLBACK(lok_docview_post_key), pDocView);
......
...@@ -182,6 +182,8 @@ struct LOKDocView_Impl ...@@ -182,6 +182,8 @@ struct LOKDocView_Impl
static void callbackWorker(int nType, const char* pPayload, void* pData); static void callbackWorker(int nType, const char* pPayload, void* pData);
/// Implementation of the callback worder handler, invoked by callbackWorker(). /// Implementation of the callback worder handler, invoked by callbackWorker().
void callbackWorkerImpl(int nType, const char* pPayload); 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) LOKDocView_Impl::CallbackData::CallbackData(int nType, const std::string& rPayload, LOKDocView* pDocView)
...@@ -941,7 +943,7 @@ gboolean LOKDocView_Impl::callbackImpl(CallbackData* pCallback) ...@@ -941,7 +943,7 @@ gboolean LOKDocView_Impl::callbackImpl(CallbackData* pCallback)
} }
case LOK_CALLBACK_STATE_CHANGED: case LOK_CALLBACK_STATE_CHANGED:
{ {
g_info("%s", pCallback->m_aPayload.c_str()); commandChanged(pCallback->m_aPayload);
} }
break; break;
default: default:
...@@ -971,11 +973,17 @@ void LOKDocView_Impl::callbackWorkerImpl(int nType, const char* pPayload) ...@@ -971,11 +973,17 @@ void LOKDocView_Impl::callbackWorkerImpl(int nType, const char* pPayload)
enum enum
{ {
EDIT_CHANGED, EDIT_CHANGED,
COMMAND_CHANGED,
LAST_SIGNAL LAST_SIGNAL
}; };
static guint docview_signals[LAST_SIGNAL] = { 0 }; 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 ) static void lok_docview_class_init( gpointer ptr )
{ {
LOKDocViewClass* pClass = static_cast<LOKDocViewClass *>(ptr); LOKDocViewClass* pClass = static_cast<LOKDocViewClass *>(ptr);
...@@ -990,6 +998,16 @@ static void lok_docview_class_init( gpointer ptr ) ...@@ -990,6 +998,16 @@ static void lok_docview_class_init( gpointer ptr )
g_cclosure_marshal_VOID__BOOLEAN, g_cclosure_marshal_VOID__BOOLEAN,
G_TYPE_NONE, 1, G_TYPE_NONE, 1,
G_TYPE_BOOLEAN); 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 ) static void lok_docview_init( GTypeInstance* pInstance, gpointer )
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment