diff options
Diffstat (limited to 'Source/WebKit2/UIProcess/API/gtk/WebKitPrintCustomWidget.cpp')
-rw-r--r-- | Source/WebKit2/UIProcess/API/gtk/WebKitPrintCustomWidget.cpp | 254 |
1 files changed, 254 insertions, 0 deletions
diff --git a/Source/WebKit2/UIProcess/API/gtk/WebKitPrintCustomWidget.cpp b/Source/WebKit2/UIProcess/API/gtk/WebKitPrintCustomWidget.cpp new file mode 100644 index 000000000..21037e7a2 --- /dev/null +++ b/Source/WebKit2/UIProcess/API/gtk/WebKitPrintCustomWidget.cpp @@ -0,0 +1,254 @@ +/* + * Copyright (C) 2017 Red Hat Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include "config.h" +#include "WebKitPrintCustomWidget.h" + +#include "WebKitPrintCustomWidgetPrivate.h" +#include <glib/gi18n-lib.h> +#include <gtk/gtk.h> +#include <wtf/glib/GRefPtr.h> + +using namespace WebKit; + +/** + * SECTION: WebKitPrintCustomWidget + * @Short_description: Allows to embed a custom widget in print dialog + * @Title: WebKitPrintCustomWidget + * @See_also: #WebKitPrintOperation + * + * A WebKitPrintCustomWidget allows to embed a custom widget in the print + * dialog by connecting to the #WebKitPrintOperation::create-custom-widget + * signal, creating a new WebKitPrintCustomWidget with + * webkit_print_custom_widget_new() and returning it from there. You can later + * use webkit_print_operation_run_dialog() to display the dialog. + * + * Since: 2.16 + */ + +enum { + APPLY, + UPDATE, + + LAST_SIGNAL +}; + +enum { + PROP_0, + + PROP_WIDGET, + PROP_TITLE +}; + +struct _WebKitPrintCustomWidgetPrivate { + CString title; + GRefPtr<GtkWidget> widget; +}; + +static guint signals[LAST_SIGNAL] = { 0, }; + +WEBKIT_DEFINE_TYPE(WebKitPrintCustomWidget, webkit_print_custom_widget, G_TYPE_OBJECT) + +static void webkitPrintCustomWidgetGetProperty(GObject* object, guint propId, GValue* value, GParamSpec* paramSpec) +{ + WebKitPrintCustomWidget* printCustomWidget = WEBKIT_PRINT_CUSTOM_WIDGET(object); + + switch (propId) { + case PROP_WIDGET: + g_value_set_object(value, webkit_print_custom_widget_get_widget(printCustomWidget)); + break; + case PROP_TITLE: + g_value_set_string(value, webkit_print_custom_widget_get_title(printCustomWidget)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propId, paramSpec); + } +} + +static void webkitPrintCustomWidgetSetProperty(GObject* object, guint propId, const GValue* value, GParamSpec* paramSpec) +{ + WebKitPrintCustomWidget* printCustomWidget = WEBKIT_PRINT_CUSTOM_WIDGET(object); + + switch (propId) { + case PROP_WIDGET: + printCustomWidget->priv->widget = GTK_WIDGET(g_value_get_object(value)); + break; + case PROP_TITLE: + printCustomWidget->priv->title = g_value_get_string(value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propId, paramSpec); + } +} + +static void webkit_print_custom_widget_class_init(WebKitPrintCustomWidgetClass* printCustomWidgetClass) +{ + GObjectClass* objectClass = G_OBJECT_CLASS(printCustomWidgetClass); + objectClass->get_property = webkitPrintCustomWidgetGetProperty; + objectClass->set_property = webkitPrintCustomWidgetSetProperty; + + /** + * WebKitPrintCustomWidget:widget: + * + * The custom #GtkWidget that will be embedded in the dialog. + * + * Since: 2.16 + */ + g_object_class_install_property( + objectClass, + PROP_WIDGET, + g_param_spec_object( + "widget", + _("Widget"), + _("Widget that will be added to the print dialog."), + GTK_TYPE_WIDGET, + static_cast<GParamFlags>(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY))); + + /** + * WebKitPrintCustomWidget:title: + * + * The title of the custom widget. + * + * Since: 2.16 + */ + g_object_class_install_property( + objectClass, + PROP_TITLE, + g_param_spec_string( + "title", + _("Title"), + _("Title of the widget that will be added to the print dialog."), + nullptr, + static_cast<GParamFlags>(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY))); + + /** + * WebKitPrintCustomWidget::update: + * @print_custom_widget: the #WebKitPrintCustomWidget on which the signal was emitted + * @page_setup: actual page setup + * @print_settings: actual print settings + * + * Emitted after change of selected printer in the dialog. The actual page setup + * and print settings are available and the custom widget can actualize itself + * according to their values. + * + * Since: 2.16 + */ + signals[UPDATE] = + g_signal_new( + "update", + G_TYPE_FROM_CLASS(printCustomWidgetClass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET(WebKitPrintCustomWidgetClass, update), + 0, 0, + g_cclosure_marshal_generic, + G_TYPE_NONE, 2, + GTK_TYPE_PAGE_SETUP, GTK_TYPE_PRINT_SETTINGS); + + /** + * WebKitPrintCustomWidget::apply: + * @print_custom_widget: the #WebKitPrintCustomWidget on which the signal was emitted + * + * Emitted right before the printing will start. You should read the information + * from the widget and update the content based on it if necessary. The widget + * is not guaranteed to be valid at a later time. + * + * Since: 2.16 + */ + signals[APPLY] = + g_signal_new( + "apply", + G_TYPE_FROM_CLASS(printCustomWidgetClass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET(WebKitPrintCustomWidgetClass, apply), + 0, 0, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); +} + +/** + * webkit_print_custom_widget_new: + * @widget: a #GtkWidget + * @title: a @widget's title + * + * Create a new #WebKitPrintCustomWidget with given @widget and @title. The @widget + * ownership is taken and it is destroyed together with the dialog even if this + * object could still be alive at that point. You typically want to pass a container + * widget with multiple widgets in it. + * + * Returns: (transfer full): a new #WebKitPrintOperation. + * + * Since: 2.16 + */ +WebKitPrintCustomWidget* webkit_print_custom_widget_new(GtkWidget* widget, const char* title) +{ + g_return_val_if_fail(GTK_IS_WIDGET(widget), nullptr); + g_return_val_if_fail(title, nullptr); + + return WEBKIT_PRINT_CUSTOM_WIDGET(g_object_new(WEBKIT_TYPE_PRINT_CUSTOM_WIDGET, "widget", widget, "title", title, nullptr)); +} + +/** + * webkit_print_custom_widget_get_widget: + * @print_custom_widget: a #WebKitPrintCustomWidget + * + * Return the value of #WebKitPrintCustomWidget:widget property for the given + * @print_custom_widget object. The returned value will always be valid if called + * from #WebKitPrintCustomWidget::apply or #WebKitPrintCustomWidget::update + * callbacks, but it will be %NULL if called after the + * #WebKitPrintCustomWidget::apply signal is emitted. + * + * Returns: (transfer none): a #GtkWidget. + * + * Since: 2.16 + */ +GtkWidget* webkit_print_custom_widget_get_widget(WebKitPrintCustomWidget* printCustomWidget) +{ + g_return_val_if_fail(WEBKIT_IS_PRINT_CUSTOM_WIDGET(printCustomWidget), nullptr); + + return printCustomWidget->priv->widget.get(); +} + +/** + * webkit_print_custom_widget_get_title: + * @print_custom_widget: a #WebKitPrintCustomWidget + * + * Return the value of #WebKitPrintCustomWidget:title property for the given + * @print_custom_widget object. + * + * Returns: Title of the @print_custom_widget. + * + * Since: 2.16 + */ +const gchar* webkit_print_custom_widget_get_title(WebKitPrintCustomWidget* printCustomWidget) +{ + g_return_val_if_fail(WEBKIT_IS_PRINT_CUSTOM_WIDGET(printCustomWidget), nullptr); + + return printCustomWidget->priv->title.data(); +} + +void webkitPrintCustomWidgetEmitCustomWidgetApplySignal(WebKitPrintCustomWidget* printCustomWidget) +{ + g_signal_emit(printCustomWidget, signals[APPLY], 0); + printCustomWidget->priv->widget = nullptr; +} + +void webkitPrintCustomWidgetEmitUpdateCustomWidgetSignal(WebKitPrintCustomWidget *printCustomWidget, GtkPageSetup *pageSetup, GtkPrintSettings *printSettings) +{ + g_signal_emit(printCustomWidget, signals[UPDATE], 0, pageSetup, printSettings); +} |