blob: 72eddf4e832fd59bb647ac07d96d277d979be5b4 [file] [log] [blame]
/*
* 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>
#include <wtf/glib/WTFGType.h>
#include <wtf/text/CString.h>
/**
* 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);
}