diff options
author | Andras Timar <andras.timar@collabora.com> | 2018-03-19 10:37:12 +0100 |
---|---|---|
committer | Andras Timar <andras.timar@collabora.com> | 2018-03-19 14:55:31 +0100 |
commit | adfb5fd51f3c84dd530d27a403eec72da53f0a26 (patch) | |
tree | cb8f29df0fa673d959805b9ad3045148c979b7ad /libreofficekit | |
parent | 749c38d5db9e11fc748e1cab00d46eb53f28ea54 (diff) |
Revert "Revert the incomplete dialog tunneling, the API has changed ..."
This reverts commit 9364ae836e6975da64abf87eb7c2b02e601e69db.
Change-Id: I88e09818149871a8e3130d4e87ec4e14b080ecb5
Diffstat (limited to 'libreofficekit')
12 files changed, 331 insertions, 32 deletions
diff --git a/libreofficekit/Executable_gtktiledviewer.mk b/libreofficekit/Executable_gtktiledviewer.mk index f0667e247680..5dd89e6065f6 100644 --- a/libreofficekit/Executable_gtktiledviewer.mk +++ b/libreofficekit/Executable_gtktiledviewer.mk @@ -9,10 +9,14 @@ $(eval $(call gb_Executable_Executable,gtktiledviewer)) +$(eval $(call gb_Library_use_sdk_api,gtktiledviewer)) + $(eval $(call gb_Executable_set_include,gtktiledviewer,\ $$(INCLUDE) \ -I$(SRCDIR)/desktop/inc \ -I$(SRCDIR)/libreofficekit/qa/gtktiledviewer/ \ + -I$(WORKDIR)/UnoApiHeadersTarget/offapi/normal/ \ + -I$(WORKDIR)/UnoApiHeadersTarget/udkapi/normal/ \ )) $(eval $(call gb_Executable_use_externals,gtktiledviewer,\ @@ -53,6 +57,7 @@ $(eval $(call gb_Executable_add_exception_objects,gtktiledviewer,\ libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers \ libreofficekit/qa/gtktiledviewer/gtv-calc-header-bar \ libreofficekit/qa/gtktiledviewer/gtv-comments-sidebar \ + libreofficekit/qa/gtktiledviewer/gtv-lok-dialog \ )) # vim: set noet sw=4 ts=4: diff --git a/libreofficekit/qa/gtktiledviewer/gtv-application-window.cxx b/libreofficekit/qa/gtktiledviewer/gtv-application-window.cxx index 0b403514e631..118be6c0100d 100644 --- a/libreofficekit/qa/gtktiledviewer/gtv-application-window.cxx +++ b/libreofficekit/qa/gtktiledviewer/gtv-application-window.cxx @@ -31,10 +31,13 @@ struct GtvApplicationWindowPrivate GtkWidget* gridcontainer; GtkWidget* toolbarcontainer; GtkWidget* scrolledwindowcontainer; + GtkWidget* lokDialog; gboolean toolbarBroadcast; gboolean partSelectorBroadcast; + GList* m_pChildWindows; + // Rendering args; options with which lokdocview was rendered in this window GtvRenderingArgs* m_pRenderingArgs; }; @@ -104,6 +107,7 @@ gtv_application_window_init(GtvApplicationWindow* win) gtk_container_add(GTK_CONTAINER(win), priv->container); + priv->m_pChildWindows = nullptr; priv->m_pRenderingArgs = new GtvRenderingArgs(); } @@ -310,6 +314,8 @@ static void setupDocView(GtvApplicationWindow* window) g_signal_connect(window->lokdocview, "formula-changed", G_CALLBACK(LOKDocViewSigHandlers::formulaChanged), nullptr); g_signal_connect(window->lokdocview, "password-required", G_CALLBACK(LOKDocViewSigHandlers::passwordRequired), nullptr); g_signal_connect(window->lokdocview, "comment", G_CALLBACK(LOKDocViewSigHandlers::comment), nullptr); + g_signal_connect(window->lokdocview, "dialog", G_CALLBACK(LOKDocViewSigHandlers::dialog), nullptr); + g_signal_connect(window->lokdocview, "dialog-child", G_CALLBACK(LOKDocViewSigHandlers::dialogChild), nullptr); g_signal_connect(window->lokdocview, "configure-event", G_CALLBACK(LOKDocViewSigHandlers::configureEvent), nullptr); } @@ -393,6 +399,60 @@ gtv_application_window_get_part_broadcast(GtvApplicationWindow* window) return priv->partSelectorBroadcast; } +void +gtv_application_window_register_child_window(GtvApplicationWindow* window, GtkWindow* pChildWin) +{ + GtvApplicationWindowPrivate* priv = getPrivate(window); + if (pChildWin) + priv->m_pChildWindows = g_list_append(priv->m_pChildWindows, pChildWin); +} + +void +gtv_application_window_unregister_child_window(GtvApplicationWindow* window, GtkWindow* pChildWin) +{ + GtvApplicationWindowPrivate* priv = getPrivate(window); + if (pChildWin) + priv->m_pChildWindows = g_list_remove(priv->m_pChildWindows, pChildWin); +} + +GtkWindow* +gtv_application_window_get_child_window_by_id(GtvApplicationWindow* window, const gchar* pWinId) +{ + GtvApplicationWindowPrivate* priv = getPrivate(window); + GList* pIt = nullptr; + GtkWindow* ret = nullptr; + // For now, only dialogs are registered as child window + for (pIt = priv->m_pChildWindows; pIt != nullptr; pIt = pIt->next) + { + gchar* dialogId = nullptr; + g_object_get(G_OBJECT(pIt->data), "dialogid", &dialogId, nullptr); + + // prepend .uno: + gchar* completeWinId = nullptr; + if (pWinId != nullptr) + { + completeWinId = g_strconcat(".uno:", pWinId, nullptr); + } + + if (dialogId != nullptr && g_str_equal(dialogId, completeWinId)) + { + ret = GTK_WINDOW(pIt->data); + break; + } + } + return ret; +} + +// temporary function to invalidate all opened dialogs +// because currently the dialog id returned in dialog invalidation payload +// doesn't match our hard-coded list of dialog ids (uno commands) for some dialogs +GList* +gtv_application_window_get_all_child_windows(GtvApplicationWindow* window) +{ + GtvApplicationWindowPrivate* priv = getPrivate(window); + return priv->m_pChildWindows; +} + GtvApplicationWindow* gtv_application_window_new(GtkApplication* app) { diff --git a/libreofficekit/qa/gtktiledviewer/gtv-application-window.hxx b/libreofficekit/qa/gtktiledviewer/gtv-application-window.hxx index 8451da564c09..f0d5afc0513c 100644 --- a/libreofficekit/qa/gtktiledviewer/gtv-application-window.hxx +++ b/libreofficekit/qa/gtktiledviewer/gtv-application-window.hxx @@ -99,6 +99,14 @@ void gtv_application_window_set_part_broadcast(GtvApplicationWindow* window, boo gboolean gtv_application_window_get_part_broadcast(GtvApplicationWindow* window); +void gtv_application_window_register_child_window(GtvApplicationWindow* window, GtkWindow* pChildWin); + +void gtv_application_window_unregister_child_window(GtvApplicationWindow* window, GtkWindow* pChildWin); + +GtkWindow* gtv_application_window_get_child_window_by_id(GtvApplicationWindow* window, const gchar* pWinId); + +GList* gtv_application_window_get_all_child_windows(GtvApplicationWindow* window); + G_END_DECLS #endif /* GTV_APPLICATION_WINDOW_H */ diff --git a/libreofficekit/qa/gtktiledviewer/gtv-helpers.cxx b/libreofficekit/qa/gtktiledviewer/gtv-helpers.cxx index 5dca746d5f25..9dee02a0ac45 100644 --- a/libreofficekit/qa/gtktiledviewer/gtv-helpers.cxx +++ b/libreofficekit/qa/gtktiledviewer/gtv-helpers.cxx @@ -148,4 +148,23 @@ const std::string GtvHelpers::getDirPath(const std::string& filePath) return dirPath; } +const std::vector<int> GtvHelpers::splitIntoIntegers(const std::string& aPayload, const std::string& aDelim, const int nItems) +{ + std::vector<int> aRet; + + if (!aPayload.empty()) + { + gchar** ppCoordinates = g_strsplit(aPayload.c_str(), aDelim.c_str(), nItems); + gchar** ppCoordinate = ppCoordinates; + while (*ppCoordinate) + { + aRet.push_back(atoi(*ppCoordinate)); + ++ppCoordinate; + } + g_strfreev(ppCoordinates); + } + + return aRet; +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/libreofficekit/qa/gtktiledviewer/gtv-helpers.hxx b/libreofficekit/qa/gtktiledviewer/gtv-helpers.hxx index e0a2defa72d9..9e984846f0ab 100644 --- a/libreofficekit/qa/gtktiledviewer/gtv-helpers.hxx +++ b/libreofficekit/qa/gtktiledviewer/gtv-helpers.hxx @@ -38,6 +38,8 @@ namespace GtvHelpers GtkWidget* createCommentBox(const boost::property_tree::ptree& aComment); const std::string getDirPath(const std::string& filePath); + + const std::vector<int> splitIntoIntegers(const std::string& aPayload, const std::string& aDelim, const int nItems); } #endif diff --git a/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.cxx b/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.cxx index f0d926425a5f..dfdbc3bc6ca6 100644 --- a/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.cxx +++ b/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.cxx @@ -15,10 +15,13 @@ #include "gtv-calc-header-bar.hxx" #include "gtv-comments-sidebar.hxx" #include "gtv-lokdocview-signal-handlers.hxx" +#include "gtv-lok-dialog.hxx" #include <boost/property_tree/json_parser.hpp> #include <boost/optional.hpp> +#include <iostream> + void LOKDocViewSigHandlers::editChanged(LOKDocView* pDocView, gboolean bWasEdit, gpointer) { GtvApplicationWindow* window = GTV_APPLICATION_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(pDocView))); @@ -280,6 +283,90 @@ void LOKDocViewSigHandlers::comment(LOKDocView* pDocView, gchar* pComment, gpoin } } +void LOKDocViewSigHandlers::dialog(LOKDocView* pDocView, gchar* pPayload, gpointer) +{ + GtvApplicationWindow* window = GTV_APPLICATION_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(pDocView))); + + std::stringstream aStream(pPayload); + boost::property_tree::ptree aRoot; + boost::property_tree::read_json(aStream, aRoot); + const std::string aDialogId = aRoot.get<std::string>("dialogId"); + const std::string aAction = aRoot.get<std::string>("action"); + + // we only understand 'invalidate' and 'close' as of now + if (aAction != "invalidate" && aAction != "close") + return; + + GList* pChildWins = gtv_application_window_get_all_child_windows(window); + GList* pIt = nullptr; + for (pIt = pChildWins; pIt != nullptr; pIt = pIt->next) + { + gchar* pChildDialogId = nullptr; + g_object_get(pIt->data, "dialogid", &pChildDialogId, nullptr); + if (g_strcmp0(pChildDialogId, aDialogId.c_str()) == 0) + { + if (aAction == "close") + gtk_widget_destroy(GTK_WIDGET(pIt->data)); + else if (aAction == "invalidate") + { + GdkRectangle aGdkRectangle = {0, 0, 0, 0}; + try + { + const std::string aRectangle = aRoot.get<std::string>("rectangle"); + std::vector<int> aRectPoints = GtvHelpers::splitIntoIntegers(aRectangle, ", ", 4); + if (aRectPoints.size() == 4) + aGdkRectangle = {aRectPoints[0], aRectPoints[1], aRectPoints[2], aRectPoints[3]}; + } + catch(const std::exception& e) + {} + + gtv_lok_dialog_invalidate(GTV_LOK_DIALOG(pIt->data), aGdkRectangle); + } + } + g_free(pChildDialogId); + } +} + +void LOKDocViewSigHandlers::dialogChild(LOKDocView* pDocView, gchar* pPayload, gpointer) +{ + GtvApplicationWindow* window = GTV_APPLICATION_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(pDocView))); + + std::stringstream aStream(pPayload); + boost::property_tree::ptree aRoot; + boost::property_tree::read_json(aStream, aRoot); + std::string aDialogId = aRoot.get<std::string>("dialogId"); + std::string aAction = aRoot.get<std::string>("action"); + std::string aPos = aRoot.get<std::string>("position"); + gchar** ppCoordinates = g_strsplit(aPos.c_str(), ", ", 2); + gchar** ppCoordinate = ppCoordinates; + int nX = 0; + int nY = 0; + + if (*ppCoordinate) + nX = atoi(*ppCoordinate); + ++ppCoordinate; + if (*ppCoordinate) + nY = atoi(*ppCoordinate); + + g_strfreev(ppCoordinates); + + GList* pChildWins = gtv_application_window_get_all_child_windows(window); + GList* pIt = nullptr; + for (pIt = pChildWins; pIt != nullptr; pIt = pIt->next) + { + gchar* pChildDialogId = nullptr; + g_object_get(pIt->data, "dialogid", &pChildDialogId, nullptr); + if (g_strcmp0(pChildDialogId, aDialogId.c_str()) == 0) + { + if (aAction == "invalidate") + gtv_lok_dialog_child_invalidate(GTV_LOK_DIALOG(pIt->data), nX, nY); + else if (aAction == "close") + gtv_lok_dialog_child_close(GTV_LOK_DIALOG(pIt->data)); + } + g_free(pChildDialogId); + } +} + gboolean LOKDocViewSigHandlers::configureEvent(GtkWidget* pWidget, GdkEventConfigure* /*pEvent*/, gpointer /*pData*/) { GtvApplicationWindow* window = GTV_APPLICATION_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(pWidget))); diff --git a/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.hxx b/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.hxx index 724f2031d4f5..54f54b396bf3 100644 --- a/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.hxx +++ b/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.hxx @@ -25,6 +25,8 @@ namespace LOKDocViewSigHandlers { void formulaChanged(LOKDocView* pDocView, char* pPayload, gpointer); void passwordRequired(LOKDocView* pDocView, char* pUrl, gboolean bModify, gpointer); void comment(LOKDocView* pDocView, gchar* pComment, gpointer); + void dialog(LOKDocView* pDocView, gchar* pDialogId, gpointer); + void dialogChild(LOKDocView* pDocView, gchar* pPayload, gpointer); gboolean configureEvent(GtkWidget* pWidget, GdkEventConfigure* pEvent, gpointer pData); } diff --git a/libreofficekit/qa/gtktiledviewer/gtv-main-toolbar.cxx b/libreofficekit/qa/gtktiledviewer/gtv-main-toolbar.cxx index 9e280c9d0f1c..d18482447a7e 100644 --- a/libreofficekit/qa/gtktiledviewer/gtv-main-toolbar.cxx +++ b/libreofficekit/qa/gtktiledviewer/gtv-main-toolbar.cxx @@ -14,6 +14,7 @@ #include "gtv-signal-handlers.hxx" #include "gtv-helpers.hxx" #include "gtv-calc-header-bar.hxx" +#include "gtv-lok-dialog.hxx" #include <map> #include <memory> @@ -34,6 +35,7 @@ struct GtvMainToolbarPrivateImpl GtkWidget* m_pDeleteComment; GtkWidget* m_pPartSelector; GtkWidget* m_pPartModeSelector; + GtkWidget* m_pDialogSelector; /// Sensitivity (enabled or disabled) for each tool item, ignoring edit state std::map<GtkToolItem*, bool> m_aToolItemSensitivities; @@ -48,7 +50,8 @@ struct GtvMainToolbarPrivateImpl m_pJustifypara(nullptr), m_pDeleteComment(nullptr), m_pPartSelector(nullptr), - m_pPartModeSelector(nullptr) + m_pPartModeSelector(nullptr), + m_pDialogSelector(nullptr) { } }; @@ -95,6 +98,8 @@ gtv_main_toolbar_init(GtvMainToolbar* toolbar) priv->m_pDeleteComment = GTK_WIDGET(gtk_builder_get_object(builder.get(), "btn_removeannotation")); priv->m_pPartSelector = GTK_WIDGET(gtk_builder_get_object(builder.get(), "combo_partselector")); priv->m_pPartModeSelector = GTK_WIDGET(gtk_builder_get_object(builder.get(), "combo_partsmodeselector")); + priv->m_pDialogSelector = GTK_WIDGET(gtk_builder_get_object(builder.get(), "combo_dialogselector")); + toolbar->m_pAddressbar = GTK_WIDGET(gtk_builder_get_object(builder.get(), "addressbar_entry")); toolbar->m_pFormulabar = GTK_WIDGET(gtk_builder_get_object(builder.get(), "formulabar_entry")); @@ -114,6 +119,7 @@ gtv_main_toolbar_init(GtvMainToolbar* toolbar) gtk_builder_add_callback_symbol(builder.get(), "documentRepair", G_CALLBACK(documentRepair)); gtk_builder_add_callback_symbol(builder.get(), "signalAddressbar", G_CALLBACK(signalAddressbar)); gtk_builder_add_callback_symbol(builder.get(), "signalFormulabar", G_CALLBACK(signalFormulabar)); + gtk_builder_add_callback_symbol(builder.get(), "openLokDialog", G_CALLBACK(openLokDialog)); // find toolbar // Note: These buttons are not the part of GtvMainToolbar @@ -176,6 +182,22 @@ static void populatePartSelector(GtvMainToolbar* toolbar) gtv_application_window_set_part_broadcast(window, true); } +static void populateDialogSelector(GtvMainToolbar* toolbar) +{ + GtvMainToolbarPrivate& priv = getPrivate(toolbar); + + GtkComboBoxText* pSelector = GTK_COMBO_BOX_TEXT(priv->m_pDialogSelector); + gtk_combo_box_text_append_text( pSelector, ".uno:SearchDialog" ); + gtk_combo_box_text_append_text( pSelector, ".uno:AcceptTrackedChanges" ); + gtk_combo_box_text_append_text( pSelector, ".uno:SpellingAndGrammarDialog" ); + gtk_combo_box_text_append_text( pSelector, ".uno:InsertField" ); + gtk_combo_box_text_append_text( pSelector, ".uno:ImageMapDialog" ); + gtk_combo_box_text_append_text( pSelector, ".uno:WordCountDialog" ); + gtk_combo_box_text_append_text( pSelector, ".uno:HyperlinkDialog" ); + gtk_combo_box_text_append_text( pSelector, ".uno:InsertIndexesEntry" ); + gtk_combo_box_text_append_text( pSelector, ".uno:InsertAuthoritiesEntry"); +} + void gtv_main_toolbar_doc_loaded(GtvMainToolbar* toolbar, LibreOfficeKitDocumentType eDocType, bool bEditMode) { @@ -202,6 +224,8 @@ gtv_main_toolbar_doc_loaded(GtvMainToolbar* toolbar, LibreOfficeKitDocumentType // populate combo boxes populatePartSelector(toolbar); + // populate dialogs + populateDialogSelector(toolbar); } GtkContainer* diff --git a/libreofficekit/qa/gtktiledviewer/gtv-signal-handlers.cxx b/libreofficekit/qa/gtktiledviewer/gtv-signal-handlers.cxx index 60068a8f89d7..fee24c6a0f25 100644 --- a/libreofficekit/qa/gtktiledviewer/gtv-signal-handlers.cxx +++ b/libreofficekit/qa/gtktiledviewer/gtv-signal-handlers.cxx @@ -12,6 +12,7 @@ #include "gtv-application-window.hxx" #include "gtv-helpers.hxx" #include "gtv-lokdocview-signal-handlers.hxx" +#include "gtv-lok-dialog.hxx" #include <sal/types.h> @@ -289,6 +290,40 @@ void changePartMode( GtkWidget* pSelector, gpointer /* pItem */ ) } } +static gboolean deleteLokDialog(GtkWidget* pWidget, GdkEvent* /*event*/, gpointer userdata) +{ + GtvApplicationWindow* window = GTV_APPLICATION_WINDOW(userdata); + g_info("deleteLokDialog"); + gtv_application_window_unregister_child_window(window, GTK_WINDOW(pWidget)); + + return FALSE; +} + +static gboolean destroyLokDialog(GtkWidget* pWidget, gpointer userdata) +{ + GtvApplicationWindow* window = GTV_APPLICATION_WINDOW(userdata); + g_info("destroyLokDialog"); + gtv_application_window_unregister_child_window(window, GTK_WINDOW(pWidget)); + + return FALSE; +} + +void openLokDialog( GtkWidget* pSelector, gpointer /*pItem*/ ) +{ + GtvApplicationWindow* window = GTV_APPLICATION_WINDOW(gtk_widget_get_toplevel(pSelector)); + gchar* pDialogId = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(pSelector)); + GtkWidget* pDialog = gtv_lok_dialog_new(LOK_DOC_VIEW(window->lokdocview), pDialogId); + gtv_application_window_register_child_window(window, GTK_WINDOW(pDialog)); + g_signal_connect(pDialog, "destroy", G_CALLBACK(destroyLokDialog), window); + g_signal_connect(pDialog, "delete-event", G_CALLBACK(deleteLokDialog), window); + g_free(pDialogId); + + g_info("openLokDialog"); + gtk_window_set_resizable(GTK_WINDOW(pDialog), false); + gtk_widget_show_all(GTK_WIDGET(pDialog)); + gtk_window_present(GTK_WINDOW(pDialog)); +} + void changeZoom( GtkWidget* pButton, gpointer /* pItem */ ) { static const float fZooms[] = { 0.25, 0.5, 0.75, 1.0, 1.5, 2.0, 3.0, 5.0 }; diff --git a/libreofficekit/qa/gtktiledviewer/gtv-signal-handlers.hxx b/libreofficekit/qa/gtktiledviewer/gtv-signal-handlers.hxx index 2f9948fe61d7..80c5c6061f9a 100644 --- a/libreofficekit/qa/gtktiledviewer/gtv-signal-handlers.hxx +++ b/libreofficekit/qa/gtktiledviewer/gtv-signal-handlers.hxx @@ -30,6 +30,8 @@ void changePartMode( GtkWidget* pSelector, gpointer /* pItem */ ); void changePart( GtkWidget* pSelector, gpointer /*pItem*/ ); +void openLokDialog( GtkWidget* pSelector, gpointer /*pItem*/ ); + void changeZoom( GtkWidget* pButton, gpointer /* pItem */ ); void toggleFindbar(GtkWidget* pButton, gpointer /*pItem*/); diff --git a/libreofficekit/qa/gtktiledviewer/gtv.ui b/libreofficekit/qa/gtktiledviewer/gtv.ui index 966c97e46967..7030ecaead5b 100644 --- a/libreofficekit/qa/gtktiledviewer/gtv.ui +++ b/libreofficekit/qa/gtktiledviewer/gtv.ui @@ -445,6 +445,23 @@ </packing> </child> <child> + <object class="GtkToolItem" id="dialogselectortoolitem"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkComboBoxText" id="combo_dialogselector"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <signal name="changed" handler="openLokDialog" swapped="no"/> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> <object class="GtkToggleToolButton" id="btn_editmode"> <property name="visible">True</property> <property name="can_focus">False</property> diff --git a/libreofficekit/source/gtk/lokdocview.cxx b/libreofficekit/source/gtk/lokdocview.cxx index 4b0f2e4c4d81..70a0016739c5 100644 --- a/libreofficekit/source/gtk/lokdocview.cxx +++ b/libreofficekit/source/gtk/lokdocview.cxx @@ -274,8 +274,9 @@ enum PASSWORD_REQUIRED, COMMENT, RULER, + DIALOG, + DIALOG_CHILD, INVALIDATE_HEADER, - LAST_SIGNAL }; @@ -434,6 +435,10 @@ callbackTypeToString (int nType) return "LOK_CALLBACK_COMMENT"; case LOK_CALLBACK_RULER_UPDATE: return "LOK_CALLBACK_RULER_UPDATE"; + case LOK_CALLBACK_DIALOG: + return "LOK_CALLBACK_DIALOG"; + case LOK_CALLBACK_DIALOG_CHILD: + return "LOK_CALLBACK_DIALOG_CHILD"; } g_assert(false); return nullptr; @@ -810,38 +815,19 @@ signalKey (GtkWidget* pWidget, GdkEventKey* pEvent) } } - if (pEvent->type == GDK_KEY_RELEASE) - { - GTask* task = g_task_new(pDocView, nullptr, nullptr, nullptr); - LOEvent* pLOEvent = new LOEvent(LOK_POST_KEY); - pLOEvent->m_nKeyEvent = LOK_KEYEVENT_KEYUP; - pLOEvent->m_nCharCode = nCharCode; - pLOEvent->m_nKeyCode = nKeyCode; - 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_KEY: %s", error->message); - g_clear_error(&error); - } - g_object_unref(task); - } - else + GTask* task = g_task_new(pDocView, nullptr, nullptr, nullptr); + LOEvent* pLOEvent = new LOEvent(LOK_POST_KEY); + pLOEvent->m_nKeyEvent = pEvent->type == GDK_KEY_RELEASE ? LOK_KEYEVENT_KEYUP : LOK_KEYEVENT_KEYINPUT; + pLOEvent->m_nCharCode = nCharCode; + pLOEvent->m_nKeyCode = nKeyCode; + g_task_set_task_data(task, pLOEvent, LOEvent::destroy); + g_thread_pool_push(priv->lokThreadPool, g_object_ref(task), &error); + if (error != nullptr) { - GTask* task = g_task_new(pDocView, nullptr, nullptr, nullptr); - LOEvent* pLOEvent = new LOEvent(LOK_POST_KEY); - pLOEvent->m_nKeyEvent = LOK_KEYEVENT_KEYINPUT; - pLOEvent->m_nCharCode = nCharCode; - pLOEvent->m_nKeyCode = nKeyCode; - 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_KEY: %s", error->message); - g_clear_error(&error); - } - g_object_unref(task); + g_warning("Unable to call LOK_POST_KEY: %s", error->message); + g_clear_error(&error); } + g_object_unref(task); return FALSE; } @@ -1426,6 +1412,12 @@ callback (gpointer pData) case LOK_CALLBACK_RULER_UPDATE: g_signal_emit(pCallback->m_pDocView, doc_view_signals[RULER], 0, pCallback->m_aPayload.c_str()); break; + case LOK_CALLBACK_DIALOG: + g_signal_emit(pCallback->m_pDocView, doc_view_signals[DIALOG], 0, pCallback->m_aPayload.c_str()); + break; + case LOK_CALLBACK_DIALOG_CHILD: + g_signal_emit(pCallback->m_pDocView, doc_view_signals[DIALOG_CHILD], 0, pCallback->m_aPayload.c_str()); + break; case LOK_CALLBACK_INVALIDATE_HEADER: g_signal_emit(pCallback->m_pDocView, doc_view_signals[INVALIDATE_HEADER], 0, pCallback->m_aPayload.c_str()); break; @@ -3259,6 +3251,52 @@ static void lok_doc_view_class_init (LOKDocViewClass* pClass) g_cclosure_marshal_generic, G_TYPE_NONE, 1, G_TYPE_STRING); + + /** + * LOKDocView::dialog-invalidate: + * @pDocView: the #LOKDocView on which the signal is emitted + * @pDialogId: The uno command for the dialog (dialog ID) + */ + doc_view_signals[DIALOG] = + g_signal_new("dialog", + G_TYPE_FROM_CLASS(pGObjectClass), + G_SIGNAL_RUN_FIRST, + 0, + nullptr, nullptr, + g_cclosure_marshal_generic, + G_TYPE_NONE, 1, + G_TYPE_STRING); + + /** + * LOKDocView::dialog-child: + * @pDocView: the #LOKDocView on which the signal is emitted + * @pPayload: JSON described below: + * + * Invalidation corresponding to dialog's children. + * Eg: Floating window etc. + * + * Payload example: + * { + * "dialogID": "SpellDialog", + * "action": "close" + * } + * + * - dialogID is the UNO command of the dialog + * - action can be + * - close, means dialog child window is closed now + * - invalidate, means dialog child window is invalidated + * It also means that dialog child window is created if it's the first + * invalidate + */ + doc_view_signals[DIALOG_CHILD] = + g_signal_new("dialog-child", + G_TYPE_FROM_CLASS(pGObjectClass), + G_SIGNAL_RUN_FIRST, + 0, + nullptr, nullptr, + g_cclosure_marshal_generic, + G_TYPE_NONE, 1, + G_TYPE_STRING); } SAL_DLLPUBLIC_EXPORT GtkWidget* |