diff options
author | Perberos <[email protected]> | 2011-11-09 18:17:43 -0300 |
---|---|---|
committer | Perberos <[email protected]> | 2011-11-09 18:17:43 -0300 |
commit | f6ce926719943751cf65cacde7fae050593eb2d6 (patch) | |
tree | 9224d1751678cf2d1fbd0431f128b711311c0287 /shell/ev-message-area.c | |
download | atril-f6ce926719943751cf65cacde7fae050593eb2d6.tar.bz2 atril-f6ce926719943751cf65cacde7fae050593eb2d6.tar.xz |
inicial
Diffstat (limited to 'shell/ev-message-area.c')
-rw-r--r-- | shell/ev-message-area.c | 354 |
1 files changed, 354 insertions, 0 deletions
diff --git a/shell/ev-message-area.c b/shell/ev-message-area.c new file mode 100644 index 00000000..3530f4a4 --- /dev/null +++ b/shell/ev-message-area.c @@ -0,0 +1,354 @@ +/* ev-message-area.c + * this file is part of evince, a mate document viewer + * + * Copyright (C) 2007 Carlos Garcia Campos + * + * Author: + * Carlos Garcia Campos <[email protected]> + * + * Evince is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Evince 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <config.h> + +#include "ev-message-area.h" + +#define EV_MESSAGE_AREA_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EV_TYPE_MESSAGE_AREA, EvMessageAreaPrivate)) + +struct _EvMessageAreaPrivate { + GtkWidget *main_box; + GtkWidget *image; + GtkWidget *label; + GtkWidget *secondary_label; + + guint message_type : 3; +}; + +enum { + PROP_0, + PROP_TEXT, + PROP_SECONDARY_TEXT, + PROP_IMAGE +}; + +static void ev_message_area_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); +static void ev_message_area_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); + +G_DEFINE_TYPE (EvMessageArea, ev_message_area, GTK_TYPE_INFO_BAR) + +static void +ev_message_area_class_init (EvMessageAreaClass *class) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (class); + + gobject_class->set_property = ev_message_area_set_property; + gobject_class->get_property = ev_message_area_get_property; + + g_object_class_install_property (gobject_class, + PROP_TEXT, + g_param_spec_string ("text", + "Text", + "The primary text of the message dialog", + NULL, + G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, + PROP_SECONDARY_TEXT, + g_param_spec_string ("secondary-text", + "Secondary Text", + "The secondary text of the message dialog", + NULL, + G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, + PROP_IMAGE, + g_param_spec_object ("image", + "Image", + "The image", + GTK_TYPE_WIDGET, + G_PARAM_READWRITE)); + + g_type_class_add_private (gobject_class, sizeof (EvMessageAreaPrivate)); +} + +static void +ev_message_area_init (EvMessageArea *area) +{ + GtkWidget *hbox, *vbox; + GtkWidget *content_area; + + area->priv = EV_MESSAGE_AREA_GET_PRIVATE (area); + + area->priv->main_box = gtk_vbox_new (FALSE, 12); + + hbox = gtk_hbox_new (FALSE, 12); + vbox = gtk_vbox_new (FALSE, 12); + + area->priv->label = gtk_label_new (NULL); + gtk_label_set_use_markup (GTK_LABEL (area->priv->label), TRUE); + gtk_label_set_line_wrap (GTK_LABEL (area->priv->label), TRUE); + gtk_label_set_selectable (GTK_LABEL (area->priv->label), TRUE); + gtk_misc_set_alignment (GTK_MISC (area->priv->label), 0.0, 0.5); + gtk_widget_set_can_focus (area->priv->label, TRUE); + gtk_box_pack_start (GTK_BOX (vbox), area->priv->label, TRUE, TRUE, 0); + gtk_widget_show (area->priv->label); + + area->priv->secondary_label = gtk_label_new (NULL); + gtk_label_set_use_markup (GTK_LABEL (area->priv->secondary_label), TRUE); + gtk_label_set_line_wrap (GTK_LABEL (area->priv->secondary_label), TRUE); + gtk_label_set_selectable (GTK_LABEL (area->priv->secondary_label), TRUE); + gtk_misc_set_alignment (GTK_MISC (area->priv->secondary_label), 0.0, 0.5); + gtk_widget_set_can_focus (area->priv->secondary_label, TRUE); + gtk_box_pack_start (GTK_BOX (vbox), area->priv->secondary_label, TRUE, TRUE, 0); + + area->priv->image = gtk_image_new_from_stock (NULL, GTK_ICON_SIZE_DIALOG); + gtk_misc_set_alignment (GTK_MISC (area->priv->image), 0.5, 0.0); + gtk_box_pack_start (GTK_BOX (hbox), area->priv->image, FALSE, FALSE, 0); + gtk_widget_show (area->priv->image); + + gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0); + gtk_widget_show (vbox); + + gtk_box_pack_start (GTK_BOX (area->priv->main_box), hbox, TRUE, TRUE, 0); + gtk_widget_show (hbox); + + content_area = gtk_info_bar_get_content_area (GTK_INFO_BAR (area)); + gtk_container_add (GTK_CONTAINER (content_area), area->priv->main_box); + gtk_widget_show (area->priv->main_box); +} + +static void +ev_message_area_set_image_for_type (EvMessageArea *area, + GtkMessageType type) +{ + const gchar *stock_id = NULL; + AtkObject *atk_obj; + + switch (type) { + case GTK_MESSAGE_INFO: + stock_id = GTK_STOCK_DIALOG_INFO; + break; + case GTK_MESSAGE_QUESTION: + stock_id = GTK_STOCK_DIALOG_QUESTION; + break; + case GTK_MESSAGE_WARNING: + stock_id = GTK_STOCK_DIALOG_WARNING; + break; + case GTK_MESSAGE_ERROR: + stock_id = GTK_STOCK_DIALOG_ERROR; + break; + case GTK_MESSAGE_OTHER: + break; + default: + g_warning ("Unknown GtkMessageType %u", type); + break; + } + + if (stock_id) + gtk_image_set_from_stock (GTK_IMAGE (area->priv->image), stock_id, + GTK_ICON_SIZE_DIALOG); + + atk_obj = gtk_widget_get_accessible (GTK_WIDGET (area)); + if (GTK_IS_ACCESSIBLE (atk_obj)) { + atk_object_set_role (atk_obj, ATK_ROLE_ALERT); + if (stock_id) { + GtkStockItem item; + + gtk_stock_lookup (stock_id, &item); + atk_object_set_name (atk_obj, item.label); + } + } +} + +static void +ev_message_area_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + EvMessageArea *area = EV_MESSAGE_AREA (object); + + switch (prop_id) { + case PROP_TEXT: + ev_message_area_set_text (area, g_value_get_string (value)); + break; + case PROP_SECONDARY_TEXT: + ev_message_area_set_secondary_text (area, g_value_get_string (value)); + break; + case PROP_IMAGE: + ev_message_area_set_image (area, (GtkWidget *)g_value_get_object (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +ev_message_area_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + EvMessageArea *area = EV_MESSAGE_AREA (object); + + switch (prop_id) { + case PROP_TEXT: + g_value_set_string (value, gtk_label_get_label (GTK_LABEL (area->priv->label))); + break; + case PROP_SECONDARY_TEXT: + g_value_set_string (value, gtk_label_get_label (GTK_LABEL (area->priv->secondary_label))); + break; + case PROP_IMAGE: + g_value_set_object (value, area->priv->image); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +void +_ev_message_area_add_buttons_valist (EvMessageArea *area, + const gchar *first_button_text, + va_list args) +{ + const gchar* text; + gint response_id; + + if (first_button_text == NULL) + return; + + text = first_button_text; + response_id = va_arg (args, gint); + + while (text != NULL) { + gtk_info_bar_add_button (GTK_INFO_BAR (area), text, response_id); + + text = va_arg (args, gchar*); + if (text == NULL) + break; + + response_id = va_arg (args, int); + } +} + +GtkWidget * +_ev_message_area_get_main_box (EvMessageArea *area) +{ + return area->priv->main_box; +} + +GtkWidget * +ev_message_area_new (GtkMessageType type, + const gchar *text, + const gchar *first_button_text, + ...) +{ + GtkWidget *widget; + + widget = g_object_new (EV_TYPE_MESSAGE_AREA, + "message-type", type, + "text", text, + NULL); + ev_message_area_set_image_for_type (EV_MESSAGE_AREA (widget), type); + if (first_button_text) { + va_list args; + + va_start (args, first_button_text); + _ev_message_area_add_buttons_valist (EV_MESSAGE_AREA (widget), + first_button_text, args); + va_end (args); + } + + return widget; +} + +void +ev_message_area_set_image (EvMessageArea *area, + GtkWidget *image) +{ + GtkWidget *parent; + + g_return_if_fail (EV_IS_MESSAGE_AREA (area)); + + area->priv->message_type = GTK_MESSAGE_OTHER; + + parent = gtk_widget_get_parent (area->priv->image); + gtk_container_add (GTK_CONTAINER (parent), image); + gtk_container_remove (GTK_CONTAINER (parent), area->priv->image); + gtk_box_reorder_child (GTK_BOX (parent), image, 0); + + area->priv->image = image; + + g_object_notify (G_OBJECT (area), "image"); +} + +void +ev_message_area_set_image_from_stock (EvMessageArea *area, + const gchar *stock_id) +{ + g_return_if_fail (EV_IS_MESSAGE_AREA (area)); + g_return_if_fail (stock_id != NULL); + + gtk_image_set_from_stock (GTK_IMAGE (area->priv->image), + stock_id, + GTK_ICON_SIZE_DIALOG); +} + +void +ev_message_area_set_text (EvMessageArea *area, + const gchar *str) +{ + g_return_if_fail (EV_IS_MESSAGE_AREA (area)); + + if (str) { + gchar *msg; + + msg = g_strdup_printf ("<b>%s</b>", str); + gtk_label_set_markup (GTK_LABEL (area->priv->label), msg); + g_free (msg); + } else { + gtk_label_set_markup (GTK_LABEL (area->priv->label), NULL); + } + + g_object_notify (G_OBJECT (area), "text"); +} + +void +ev_message_area_set_secondary_text (EvMessageArea *area, + const gchar *str) +{ + g_return_if_fail (EV_IS_MESSAGE_AREA (area)); + + if (str) { + gchar *msg; + + msg = g_strdup_printf ("<small>%s</small>", str); + gtk_label_set_markup (GTK_LABEL (area->priv->secondary_label), msg); + g_free (msg); + gtk_widget_show (area->priv->secondary_label); + } else { + gtk_label_set_markup (GTK_LABEL (area->priv->secondary_label), NULL); + gtk_widget_hide (area->priv->secondary_label); + } + + g_object_notify (G_OBJECT (area), "secondary-text"); +} |