diff options
author | Pranav Kant <pranavk@collabora.co.uk> | 2017-07-14 18:54:52 +0530 |
---|---|---|
committer | Pranav Kant <pranavk@collabora.co.uk> | 2017-10-02 10:56:12 +0530 |
commit | 706e4d198683f6c2075a91050d21a298ad186cc6 (patch) | |
tree | 9f7c60a2ea893ed4e2bfcb17f23c0698c7151fb7 /libreofficekit | |
parent | 0f58e974a7d6a88491a97ea3d0f30755ec330253 (diff) |
gtktiledviewer: Implement modeless dialog rendering
Hardcode modeless dialogs available in writer (very few) as of now in
the combobox.
Change-Id: I82d1442fbc71776dd64640ad048a0375ca041a67
Diffstat (limited to 'libreofficekit')
8 files changed, 269 insertions, 1 deletions
diff --git a/libreofficekit/Executable_gtktiledviewer.mk b/libreofficekit/Executable_gtktiledviewer.mk index f0667e247680..55434cef376e 100644 --- a/libreofficekit/Executable_gtktiledviewer.mk +++ b/libreofficekit/Executable_gtktiledviewer.mk @@ -53,6 +53,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 dae6821600e7..fbe5746ddf1e 100644 --- a/libreofficekit/qa/gtktiledviewer/gtv-application-window.cxx +++ b/libreofficekit/qa/gtktiledviewer/gtv-application-window.cxx @@ -31,6 +31,7 @@ struct GtvApplicationWindowPrivate GtkWidget* gridcontainer; GtkWidget* toolbarcontainer; GtkWidget* scrolledwindowcontainer; + GtkWidget* lokDialog; gboolean toolbarBroadcast; gboolean partSelectorBroadcast; diff --git a/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.cxx b/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.cxx new file mode 100644 index 000000000000..31f16ae960b5 --- /dev/null +++ b/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.cxx @@ -0,0 +1,166 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <gtk/gtk.h> + +#include <cmath> +#include <iostream> + +#include <gtv-application-window.hxx> +#include <gtv-signal-handlers.hxx> +#include <gtv-helpers.hxx> +#include <gtv-lok-dialog.hxx> + +#include <map> +#include <boost/property_tree/json_parser.hpp> + +struct GtvLokDialogPrivate +{ + LOKDocView* lokdocview; + gchar* dialogid; +}; + +G_DEFINE_TYPE_WITH_PRIVATE(GtvLokDialog, gtv_lok_dialog, GTK_TYPE_DIALOG); + +enum +{ + PROP_0, + PROP_LOKDOCVIEW_CONTEXT, + PROP_DIALOG_ID, + PROP_LAST +}; + +static GParamSpec* properties[PROP_LAST]; + +static GtvLokDialogPrivate* +getPrivate(GtvLokDialog* dialog) +{ + return static_cast<GtvLokDialogPrivate*>(gtv_lok_dialog_get_instance_private(dialog)); +} + +static void +gtv_lok_dialog_draw(GtkWidget* pDialogDrawingArea, cairo_t* pCairo, gpointer) +{ + GtvLokDialog* pDialog = GTV_LOK_DIALOG(gtk_widget_get_toplevel(pDialogDrawingArea)); + GtvLokDialogPrivate* priv = getPrivate(pDialog); + + int nWidth = 1024; + int nHeight = 768; + cairo_surface_t* pSurface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, nWidth, nHeight); + unsigned char* pBuffer = cairo_image_surface_get_data(pSurface); + LibreOfficeKitDocument* pDocument = lok_doc_view_get_document(LOK_DOC_VIEW(priv->lokdocview)); + pDocument->pClass->paintDialog(pDocument, priv->dialogid, pBuffer, &nWidth, &nHeight); + gtk_widget_set_size_request(GTK_WIDGET(pDialogDrawingArea), nWidth, nHeight); + + cairo_surface_flush(pSurface); + cairo_surface_mark_dirty(pSurface); + + cairo_set_source_surface(pCairo, pSurface, 0, 0); + cairo_paint(pCairo); +} + +static void +gtv_lok_dialog_init(GtvLokDialog* dialog) +{ + GtkWidget* pContentArea = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); + GtkWidget* pDialogDrawingArea = gtk_drawing_area_new(); + + g_signal_connect(G_OBJECT(pDialogDrawingArea), "draw", G_CALLBACK(gtv_lok_dialog_draw), nullptr); + gtk_container_add(GTK_CONTAINER(pContentArea), pDialogDrawingArea); +} + +static void +gtv_lok_dialog_set_property(GObject* object, guint propId, const GValue* value, GParamSpec* pspec) +{ + GtvLokDialog* self = GTV_LOK_DIALOG(object); + GtvLokDialogPrivate* priv = getPrivate(self); + + switch(propId) + { + case PROP_LOKDOCVIEW_CONTEXT: + priv->lokdocview = LOK_DOC_VIEW(g_value_get_object(value)); + break; + case PROP_DIALOG_ID: + priv->dialogid = g_value_dup_string(value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, propId, pspec); + } +} + +static void +gtv_lok_dialog_get_property(GObject* object, guint propId, GValue* value, GParamSpec* pspec) +{ + GtvLokDialog* self = GTV_LOK_DIALOG(object); + GtvLokDialogPrivate* priv = getPrivate(self); + + switch(propId) + { + case PROP_LOKDOCVIEW_CONTEXT: + g_value_set_object(value, priv->lokdocview); + break; + case PROP_DIALOG_ID: + g_value_set_pointer(value, priv->dialogid); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, propId, pspec); + } +} + +static void +gtv_lok_dialog_finalize(GObject* object) +{ + GtvLokDialog* self = GTV_LOK_DIALOG(object); + GtvLokDialogPrivate* priv = getPrivate(self); + + g_free(priv->dialogid); + + G_OBJECT_CLASS(gtv_lok_dialog_parent_class)->finalize(object); +} + +static void +gtv_lok_dialog_class_init(GtvLokDialogClass* klass) +{ + G_OBJECT_CLASS(klass)->get_property = gtv_lok_dialog_get_property; + G_OBJECT_CLASS(klass)->set_property = gtv_lok_dialog_set_property; + G_OBJECT_CLASS(klass)->finalize = gtv_lok_dialog_finalize; + + properties[PROP_LOKDOCVIEW_CONTEXT] = g_param_spec_object("lokdocview", + "LOKDocView Context", + "The LOKDocView context object to be used for dialog rendering", + LOK_TYPE_DOC_VIEW, + static_cast<GParamFlags>(G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + + properties[PROP_DIALOG_ID] = g_param_spec_string("dialogid", + "Dialog identifier", + "Unique dialog identifier; UNO command for now", + nullptr, + static_cast<GParamFlags>(G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + + g_object_class_install_properties (G_OBJECT_CLASS(klass), PROP_LAST, properties); +} + +GtkWidget* +gtv_lok_dialog_new(LOKDocView* pDocView, const gchar* dialogId) +{ + GtkWindow* pWindow = GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(pDocView))); + return GTK_WIDGET(g_object_new(GTV_TYPE_LOK_DIALOG, + "lokdocview", pDocView, + "dialogid", dialogId, + "title", "LOK Dialog", + "modal", false, + "transient-for", pWindow, + nullptr)); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.hxx b/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.hxx new file mode 100644 index 000000000000..650d816e7e4a --- /dev/null +++ b/libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.hxx @@ -0,0 +1,44 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#ifndef GTV_LOK_DIALOG_H +#define GTV_LOK_DIALOG_H + +#include <gtk/gtk.h> + +#include <LibreOfficeKit/LibreOfficeKitGtk.h> + +G_BEGIN_DECLS + +#define GTV_TYPE_LOK_DIALOG (gtv_lok_dialog_get_type()) +#define GTV_LOK_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GTV_TYPE_LOK_DIALOG, GtvLokDialog)) +#define GTV_IS_LOK_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GTV_TYPE_LOK_DIALOG)) +#define GTV_LOK_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GTV_TYPE_LOK_DIALOG, GtvLokDialogClass)) +#define GTV_IS_LOK_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GTV_TYPE_LOK_DIALOG)) +#define GTV_LOK_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GTV_TYPE_LOK_DIALOG, GtvLokDialogClass)) + +struct GtvLokDialog +{ + GtkDialog parent; +}; + +struct GtvLokDialogClass +{ + GtkDialogClass parentClass; +}; + +GType gtv_lok_dialog_get_type (void) G_GNUC_CONST; + +GtkWidget* gtv_lok_dialog_new(LOKDocView* pDocView, const gchar* dialogId); + +G_END_DECLS + +#endif /* GTV_LOK_DIALOG_H */ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/libreofficekit/qa/gtktiledviewer/gtv-main-toolbar.cxx b/libreofficekit/qa/gtktiledviewer/gtv-main-toolbar.cxx index f94ef776b6d2..394ab8fb4cf9 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 9e0b575dcdd5..e009fe215ce7 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,18 @@ void changePartMode( GtkWidget* pSelector, gpointer /* pItem */ ) } } +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); + g_free(pDialogId); + + 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 eacec33b2d1b..ab93d0d48105 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> |