Kaydet (Commit) 706e4d19 authored tarafından Pranav Kant's avatar Pranav Kant

gtktiledviewer: Implement modeless dialog rendering

Hardcode modeless dialogs available in writer (very few) as of now in
the combobox.

Change-Id: I82d1442fbc71776dd64640ad048a0375ca041a67
üst 0f58e974
......@@ -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:
......@@ -31,6 +31,7 @@ struct GtvApplicationWindowPrivate
GtkWidget* gridcontainer;
GtkWidget* toolbarcontainer;
GtkWidget* scrolledwindowcontainer;
GtkWidget* lokDialog;
gboolean toolbarBroadcast;
gboolean partSelectorBroadcast;
......
/* -*- 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: */
/* -*- 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: */
......@@ -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*
......
......@@ -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 };
......
......@@ -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*/);
......
......@@ -444,6 +444,23 @@
<property name="homogeneous">True</property>
</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>
......
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