summaryrefslogtreecommitdiff
path: root/libreofficekit
diff options
context:
space:
mode:
authorPranav Kant <pranavk@collabora.co.uk>2017-07-14 18:54:52 +0530
committerPranav Kant <pranavk@collabora.co.uk>2017-10-02 10:56:12 +0530
commit706e4d198683f6c2075a91050d21a298ad186cc6 (patch)
tree9f7c60a2ea893ed4e2bfcb17f23c0698c7151fb7 /libreofficekit
parent0f58e974a7d6a88491a97ea3d0f30755ec330253 (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')
-rw-r--r--libreofficekit/Executable_gtktiledviewer.mk1
-rw-r--r--libreofficekit/qa/gtktiledviewer/gtv-application-window.cxx1
-rw-r--r--libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.cxx166
-rw-r--r--libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.hxx44
-rw-r--r--libreofficekit/qa/gtktiledviewer/gtv-main-toolbar.cxx26
-rw-r--r--libreofficekit/qa/gtktiledviewer/gtv-signal-handlers.cxx13
-rw-r--r--libreofficekit/qa/gtktiledviewer/gtv-signal-handlers.hxx2
-rw-r--r--libreofficekit/qa/gtktiledviewer/gtv.ui17
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>