diff options
Diffstat (limited to 'addressbook/gui/widgets/e-minicard-view-widget.c')
-rw-r--r-- | addressbook/gui/widgets/e-minicard-view-widget.c | 617 |
1 files changed, 386 insertions, 231 deletions
diff --git a/addressbook/gui/widgets/e-minicard-view-widget.c b/addressbook/gui/widgets/e-minicard-view-widget.c index 1f6e1bd26b..7ff63a1bd9 100644 --- a/addressbook/gui/widgets/e-minicard-view-widget.c +++ b/addressbook/gui/widgets/e-minicard-view-widget.c @@ -1,146 +1,194 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * e-minicard-view-widget.c - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey <clahey@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) version 3. * * This program 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. + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with the program; if not, see <http://www.gnu.org/licenses/> + * + * + * Authors: + * Chris Lahey <clahey@ximian.com> + * + * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. */ +#ifdef HAVE_CONFIG_H #include <config.h> +#endif -#include <gtk/gtksignal.h> -#include <gal/widgets/e-canvas-background.h> -#include <gal/widgets/e-canvas.h> +#include <gtk/gtk.h> +#include <glib/gi18n.h> -#include "e-minicard-view-widget.h" +#include <e-util/e-util.h> -static void e_minicard_view_widget_init (EMinicardViewWidget *widget); -static void e_minicard_view_widget_class_init (EMinicardViewWidgetClass *klass); -static void e_minicard_view_widget_set_arg (GtkObject *o, GtkArg *arg, guint arg_id); -static void e_minicard_view_widget_get_arg (GtkObject *object, GtkArg *arg, guint arg_id); -static void e_minicard_view_widget_destroy (GtkObject *object); -static void e_minicard_view_widget_reflow (ECanvas *canvas); -static void e_minicard_view_widget_size_allocate (GtkWidget *widget, GtkAllocation *allocation); -static void e_minicard_view_widget_realize (GtkWidget *widget); +#include "e-minicard-view-widget.h" -static ECanvasClass *parent_class = NULL; +static void e_minicard_view_widget_set_property + (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec); +static void e_minicard_view_widget_get_property + (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec); +static void e_minicard_view_widget_dispose (GObject *object); +static void e_minicard_view_widget_reflow (ECanvas *canvas); +static void e_minicard_view_widget_size_allocate + (GtkWidget *widget, + GtkAllocation *allocation); +static void e_minicard_view_widget_style_set + (GtkWidget *widget, + GtkStyle *previous_style); +static void e_minicard_view_widget_realize (GtkWidget *widget); +static gboolean e_minicard_view_widget_real_focus_in_event + (GtkWidget *widget, + GdkEventFocus *event); -/* The arguments we take */ enum { - ARG_0, - ARG_BOOK, - ARG_QUERY, - ARG_EDITABLE, - ARG_COLUMN_WIDTH + PROP_0, + PROP_CLIENT, + PROP_QUERY, + PROP_EDITABLE, + PROP_COLUMN_WIDTH }; enum { + CREATE_CONTACT, + CREATE_CONTACT_LIST, SELECTION_CHANGE, COLUMN_WIDTH_CHANGED, RIGHT_CLICK, LAST_SIGNAL }; -static guint signals [LAST_SIGNAL] = {0, }; +static guint signals[LAST_SIGNAL] = {0, }; -GtkType -e_minicard_view_widget_get_type (void) -{ - static GtkType type = 0; - - if (!type) - { - static const GtkTypeInfo info = - { - "EMinicardViewWidget", - sizeof (EMinicardViewWidget), - sizeof (EMinicardViewWidgetClass), - (GtkClassInitFunc) e_minicard_view_widget_class_init, - (GtkObjectInitFunc) e_minicard_view_widget_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - type = gtk_type_unique (e_canvas_get_type (), &info); - } - - return type; -} +G_DEFINE_TYPE ( + EMinicardViewWidget, + e_minicard_view_widget, + E_TYPE_CANVAS) static void -e_minicard_view_widget_class_init (EMinicardViewWidgetClass *klass) +e_minicard_view_widget_class_init (EMinicardViewWidgetClass *class) { - GtkObjectClass *object_class; + GObjectClass *object_class; GtkWidgetClass *widget_class; ECanvasClass *canvas_class; - object_class = (GtkObjectClass*) klass; - widget_class = GTK_WIDGET_CLASS (klass); - canvas_class = E_CANVAS_CLASS (klass); - - parent_class = gtk_type_class (e_canvas_get_type ()); - - gtk_object_add_arg_type ("EMinicardViewWidget::book", GTK_TYPE_OBJECT, - GTK_ARG_READWRITE, ARG_BOOK); - gtk_object_add_arg_type ("EMinicardViewWidget::query", GTK_TYPE_STRING, - GTK_ARG_READWRITE, ARG_QUERY); - gtk_object_add_arg_type ("EMinicardViewWidget::editable", GTK_TYPE_BOOL, - GTK_ARG_READWRITE, ARG_EDITABLE); - gtk_object_add_arg_type ("EMinicardViewWidget::column_width", GTK_TYPE_INT, - GTK_ARG_READWRITE, ARG_COLUMN_WIDTH); - - signals [SELECTION_CHANGE] = - gtk_signal_new ("selection_change", - GTK_RUN_LAST, - object_class->type, - GTK_SIGNAL_OFFSET (EMinicardViewWidgetClass, selection_change), - gtk_marshal_NONE__NONE, - GTK_TYPE_NONE, 0); - - signals [COLUMN_WIDTH_CHANGED] = - gtk_signal_new ("column_width_changed", - GTK_RUN_LAST, - object_class->type, - GTK_SIGNAL_OFFSET (EMinicardViewWidgetClass, column_width_changed), - e_marshal_NONE__DOUBLE, - GTK_TYPE_NONE, 1, GTK_TYPE_DOUBLE); - - signals [RIGHT_CLICK] = - gtk_signal_new ("right_click", - GTK_RUN_LAST, - object_class->type, - GTK_SIGNAL_OFFSET (EMinicardViewWidgetClass, right_click), - gtk_marshal_INT__POINTER, - GTK_TYPE_INT, 1, GTK_TYPE_GDK_EVENT); - - gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL); - - object_class->set_arg = e_minicard_view_widget_set_arg; - object_class->get_arg = e_minicard_view_widget_get_arg; - object_class->destroy = e_minicard_view_widget_destroy; - - widget_class->realize = e_minicard_view_widget_realize; - widget_class->size_allocate = e_minicard_view_widget_size_allocate; - - canvas_class->reflow = e_minicard_view_widget_reflow; + object_class = G_OBJECT_CLASS (class); + object_class->set_property = e_minicard_view_widget_set_property; + object_class->get_property = e_minicard_view_widget_get_property; + object_class->dispose = e_minicard_view_widget_dispose; - klass->selection_change = NULL; - klass->column_width_changed = NULL; - klass->right_click = NULL; + widget_class = GTK_WIDGET_CLASS (class); + widget_class->style_set = e_minicard_view_widget_style_set; + widget_class->realize = e_minicard_view_widget_realize; + widget_class->size_allocate = e_minicard_view_widget_size_allocate; + widget_class->focus_in_event = e_minicard_view_widget_real_focus_in_event; + + canvas_class = E_CANVAS_CLASS (class); + canvas_class->reflow = e_minicard_view_widget_reflow; + + class->selection_change = NULL; + class->column_width_changed = NULL; + class->right_click = NULL; + + g_object_class_install_property ( + object_class, + PROP_CLIENT, + g_param_spec_object ( + "client", + "EBookClient", + NULL, + E_TYPE_BOOK_CLIENT, + G_PARAM_READWRITE)); + + g_object_class_install_property ( + object_class, + PROP_QUERY, + g_param_spec_string ( + "query", + "Query", + NULL, + NULL, + G_PARAM_READWRITE)); + + g_object_class_install_property ( + object_class, + PROP_EDITABLE, + g_param_spec_boolean ( + "editable", + "Editable", + NULL, + FALSE, + G_PARAM_READWRITE)); + + g_object_class_install_property ( + object_class, + PROP_COLUMN_WIDTH, + g_param_spec_double ( + "column_width", + "Column Width", + NULL, + 0.0, G_MAXDOUBLE, 225.0, + G_PARAM_READWRITE)); + + signals[CREATE_CONTACT] = g_signal_new ( + "create-contact", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (EMinicardViewWidgetClass, create_contact), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + signals[CREATE_CONTACT_LIST] = g_signal_new ( + "create-contact-list", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (EMinicardViewWidgetClass, create_contact_list), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + signals[SELECTION_CHANGE] = g_signal_new ( + "selection_change", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (EMinicardViewWidgetClass, selection_change), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + signals[COLUMN_WIDTH_CHANGED] = g_signal_new ( + "column_width_changed", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (EMinicardViewWidgetClass, column_width_changed), + NULL, NULL, + g_cclosure_marshal_VOID__DOUBLE, + G_TYPE_NONE, 1, + G_TYPE_DOUBLE); + + signals[RIGHT_CLICK] = g_signal_new ( + "right_click", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (EMinicardViewWidgetClass, right_click), + NULL, NULL, + e_marshal_INT__POINTER, + G_TYPE_INT, 1, + G_TYPE_POINTER); } static void @@ -148,205 +196,287 @@ e_minicard_view_widget_init (EMinicardViewWidget *view) { view->emv = NULL; - view->book = NULL; + view->book_client = NULL; view->query = NULL; view->editable = FALSE; - view->column_width = 150; + view->column_width = 225; } GtkWidget * e_minicard_view_widget_new (EAddressbookReflowAdapter *adapter) { - EMinicardViewWidget *widget = E_MINICARD_VIEW_WIDGET (gtk_type_new (e_minicard_view_widget_get_type ())); + EMinicardViewWidget *widget; + + widget = g_object_new (E_TYPE_MINICARD_VIEW_WIDGET, NULL); - widget->adapter = adapter; - gtk_object_ref (GTK_OBJECT (widget->adapter)); + widget->adapter = g_object_ref (adapter); return GTK_WIDGET (widget); } static void -e_minicard_view_widget_set_arg (GtkObject *o, GtkArg *arg, guint arg_id) +e_minicard_view_widget_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) { EMinicardViewWidget *emvw; - emvw = E_MINICARD_VIEW_WIDGET (o); + emvw = E_MINICARD_VIEW_WIDGET (object); - switch (arg_id){ - case ARG_BOOK: - if (emvw->book) - gtk_object_unref(GTK_OBJECT(emvw->book)); - if (GTK_VALUE_OBJECT (*arg)) { - emvw->book = E_BOOK(GTK_VALUE_OBJECT (*arg)); - if (emvw->book) - gtk_object_ref(GTK_OBJECT(emvw->book)); + switch (property_id) { + case PROP_CLIENT: + if (emvw->book_client) + g_object_unref (emvw->book_client); + if (g_value_get_object (value)) { + emvw->book_client = E_BOOK_CLIENT (g_value_get_object (value)); + if (emvw->book_client) + g_object_ref (emvw->book_client); } else - emvw->book = NULL; + emvw->book_client = NULL; if (emvw->emv) - gtk_object_set(GTK_OBJECT(emvw->emv), - "book", emvw->book, - NULL); + g_object_set ( + emvw->emv, + "client", emvw->book_client, + NULL); break; - case ARG_QUERY: - emvw->query = g_strdup(GTK_VALUE_STRING (*arg)); + case PROP_QUERY: + emvw->query = g_strdup (g_value_get_string (value)); if (emvw->emv) - gtk_object_set(GTK_OBJECT(emvw->emv), - "query", emvw->query, - NULL); + g_object_set ( + emvw->emv, + "query", emvw->query, + NULL); break; - case ARG_EDITABLE: - emvw->editable = GTK_VALUE_BOOL(*arg); + case PROP_EDITABLE: + emvw->editable = g_value_get_boolean (value); if (emvw->emv) - gtk_object_set (GTK_OBJECT(emvw->emv), - "editable", emvw->editable, - NULL); + g_object_set ( + emvw->emv, + "editable", emvw->editable, + NULL); break; - case ARG_COLUMN_WIDTH: - emvw->column_width = GTK_VALUE_INT (*arg); + case PROP_COLUMN_WIDTH: + emvw->column_width = g_value_get_double (value); if (emvw->emv) { - gtk_object_set (GTK_OBJECT(emvw->emv), - "column_width", (int) emvw->column_width, - NULL); + g_object_set ( + emvw->emv, + "column_width", emvw->column_width, + NULL); } break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; } } static void -e_minicard_view_widget_get_arg (GtkObject *object, GtkArg *arg, guint arg_id) +e_minicard_view_widget_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) { EMinicardViewWidget *emvw; emvw = E_MINICARD_VIEW_WIDGET (object); - switch (arg_id) { - case ARG_BOOK: - GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(emvw->book); + switch (property_id) { + case PROP_CLIENT: + g_value_set_object (value, emvw->book_client); break; - case ARG_QUERY: - GTK_VALUE_STRING (*arg) = g_strdup(emvw->query); + case PROP_QUERY: + g_value_set_string (value, emvw->query); break; - case ARG_EDITABLE: - GTK_VALUE_BOOL (*arg) = emvw->editable; + case PROP_EDITABLE: + g_value_set_boolean (value, emvw->editable); break; - case ARG_COLUMN_WIDTH: - GTK_VALUE_INT (*arg) = emvw->column_width; + case PROP_COLUMN_WIDTH: + g_value_set_double (value, emvw->column_width); break; default: - arg->type = GTK_TYPE_INVALID; + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } static void -e_minicard_view_widget_destroy (GtkObject *object) +e_minicard_view_widget_dispose (GObject *object) { - EMinicardViewWidget *view = E_MINICARD_VIEW_WIDGET(object); + EMinicardViewWidget *view = E_MINICARD_VIEW_WIDGET (object); - if (view->book) - gtk_object_unref(GTK_OBJECT(view->book)); - g_free(view->query); + if (view->book_client) { + g_object_unref (view->book_client); + view->book_client = NULL; + } + if (view->query) { + g_free (view->query); + view->query = NULL; + } - gtk_object_unref (GTK_OBJECT (view->adapter)); + if (view->adapter) { + g_object_unref (view->adapter); + view->adapter = NULL; + } - GTK_OBJECT_CLASS(parent_class)->destroy (object); + /* Chain up to parent's dispose() method. */ + G_OBJECT_CLASS (e_minicard_view_widget_parent_class)->dispose (object); } static void -selection_change (ESelectionModel *esm, EMinicardViewWidget *widget) +selection_change (ESelectionModel *esm, + EMinicardViewWidget *widget) { - gtk_signal_emit (GTK_OBJECT(widget), - signals [SELECTION_CHANGE]); + g_signal_emit (widget, signals[SELECTION_CHANGE], 0); } static void -column_width_changed (ESelectionModel *esm, double width, EMinicardViewWidget *widget) +selection_row_change (ESelectionModel *esm, + gint row, + EMinicardViewWidget *widget) { - gtk_signal_emit (GTK_OBJECT(widget), - signals [COLUMN_WIDTH_CHANGED], width); + selection_change (esm, widget); +} + +static void +column_width_changed (ESelectionModel *esm, + gdouble width, + EMinicardViewWidget *widget) +{ + g_signal_emit (widget, signals[COLUMN_WIDTH_CHANGED], 0, width); +} + +static void +create_contact (EMinicardView *view, + EMinicardViewWidget *widget) +{ + g_signal_emit (widget, signals[CREATE_CONTACT], 0); +} + +static void +create_contact_list (EMinicardView *view, + EMinicardViewWidget *widget) +{ + g_signal_emit (widget, signals[CREATE_CONTACT_LIST], 0); } static guint -right_click (EMinicardView *view, GdkEvent *event, EMinicardViewWidget *widget) +right_click (EMinicardView *view, + GdkEvent *event, + EMinicardViewWidget *widget) { guint ret_val; - gtk_signal_emit (GTK_OBJECT(widget), - signals [RIGHT_CLICK], - event, &ret_val); + + g_signal_emit (widget, signals[RIGHT_CLICK], 0, event, &ret_val); + return ret_val; } static void +e_minicard_view_widget_style_set (GtkWidget *widget, + GtkStyle *previous_style) +{ + EMinicardViewWidget *view = E_MINICARD_VIEW_WIDGET (widget); + GtkStyle *style; + + style = gtk_widget_get_style (widget); + + if (view->background) + gnome_canvas_item_set ( + view->background, "fill_color_gdk", + &style->base[GTK_STATE_NORMAL], NULL); + + GTK_WIDGET_CLASS (e_minicard_view_widget_parent_class)-> + style_set (widget, previous_style); +} + +static void e_minicard_view_widget_realize (GtkWidget *widget) { - EMinicardViewWidget *view = E_MINICARD_VIEW_WIDGET(widget); - - gnome_canvas_item_new(gnome_canvas_root( GNOME_CANVAS(view) ), - e_canvas_background_get_type(), - "fill_color", "white", - NULL ); - - view->emv = gnome_canvas_item_new( - gnome_canvas_root( GNOME_CANVAS(view) ), - e_minicard_view_get_type(), - "height", (double) 100, - "minimum_width", (double) 100, + EMinicardViewWidget *view = E_MINICARD_VIEW_WIDGET (widget); + GtkStyle *style = gtk_widget_get_style (widget); + + view->background = gnome_canvas_item_new ( + gnome_canvas_root (GNOME_CANVAS (view)), + e_canvas_background_get_type (), + "fill_color_gdk", &style->base[GTK_STATE_NORMAL], + NULL); + + view->emv = gnome_canvas_item_new ( + gnome_canvas_root (GNOME_CANVAS (view)), + e_minicard_view_get_type (), + "height", (gdouble) 100, + "minimum_width", (gdouble) 100, "adapter", view->adapter, - "column_width", (int) view->column_width, - NULL ); - - gtk_signal_connect (GTK_OBJECT (E_REFLOW(view->emv)->selection), - "selection_changed", - selection_change, view); - gtk_signal_connect (GTK_OBJECT (view->emv), - "column_width_changed", - column_width_changed, view); - gtk_signal_connect (GTK_OBJECT (view->emv), - "right_click", - GTK_SIGNAL_FUNC (right_click), view); - - if (GTK_WIDGET_CLASS(parent_class)->realize) - GTK_WIDGET_CLASS(parent_class)->realize (widget); + "column_width", view->column_width, + NULL); + + g_signal_connect ( + E_REFLOW (view->emv)->selection, + "selection_changed", + G_CALLBACK (selection_change), view); + g_signal_connect ( + E_REFLOW (view->emv)->selection, + "selection_row_changed", + G_CALLBACK (selection_row_change), view); + g_signal_connect ( + view->emv, "column_width_changed", + G_CALLBACK (column_width_changed), view); + g_signal_connect ( + view->emv, "create-contact", + G_CALLBACK (create_contact), view); + g_signal_connect ( + view->emv, "create-contact-list", + G_CALLBACK (create_contact_list), view); + g_signal_connect ( + view->emv, "right_click", + G_CALLBACK (right_click), view); + + GTK_WIDGET_CLASS (e_minicard_view_widget_parent_class)-> + realize (widget); } static void -e_minicard_view_widget_size_allocate(GtkWidget *widget, GtkAllocation *allocation) +e_minicard_view_widget_size_allocate (GtkWidget *widget, + GtkAllocation *allocation) { - if (GTK_WIDGET_CLASS(parent_class)->size_allocate) - GTK_WIDGET_CLASS(parent_class)->size_allocate (widget, allocation); - - if (GTK_WIDGET_REALIZED(widget)) { - double width; - EMinicardViewWidget *view = E_MINICARD_VIEW_WIDGET(widget); - - gnome_canvas_item_set( view->emv, - "height", (double) allocation->height, - NULL ); - gnome_canvas_item_set( view->emv, - "minimum_width", (double) allocation->width, - NULL ); - gtk_object_get(GTK_OBJECT(view->emv), - "width", &width, - NULL); - width = MAX(width, allocation->width); - gnome_canvas_set_scroll_region (GNOME_CANVAS (view), 0, 0, width - 1, allocation->height - 1); + GTK_WIDGET_CLASS (e_minicard_view_widget_parent_class)-> + size_allocate (widget, allocation); + + if (gtk_widget_get_realized (widget)) { + gdouble width; + EMinicardViewWidget *view = E_MINICARD_VIEW_WIDGET (widget); + + gnome_canvas_item_set ( + view->emv, "height", + (gdouble) allocation->height, NULL); + gnome_canvas_item_set ( + view->emv, "minimum_width", + (gdouble) allocation->width, NULL); + g_object_get (view->emv, "width", &width, NULL); + width = MAX (width, allocation->width); + gnome_canvas_set_scroll_region ( + GNOME_CANVAS (view), 0, 0, + width - 1, allocation->height - 1); } } static void -e_minicard_view_widget_reflow(ECanvas *canvas) +e_minicard_view_widget_reflow (ECanvas *canvas) { - double width; - EMinicardViewWidget *view = E_MINICARD_VIEW_WIDGET(canvas); + gdouble width; + EMinicardViewWidget *view = E_MINICARD_VIEW_WIDGET (canvas); + GtkAllocation allocation; + + E_CANVAS_CLASS (e_minicard_view_widget_parent_class)->reflow (canvas); - if (E_CANVAS_CLASS(parent_class)->reflow) - E_CANVAS_CLASS(parent_class)->reflow (canvas); + g_object_get (view->emv, "width", &width, NULL); + gtk_widget_get_allocation (GTK_WIDGET (canvas), &allocation); - gtk_object_get(GTK_OBJECT(view->emv), - "width", &width, - NULL); - width = MAX(width, GTK_WIDGET(canvas)->allocation.width); - gnome_canvas_set_scroll_region(GNOME_CANVAS(canvas), 0, 0, width - 1, GTK_WIDGET(canvas)->allocation.height - 1); + gnome_canvas_set_scroll_region ( + GNOME_CANVAS (canvas), 0, 0, + MAX (width, allocation.width) - 1, + allocation.height - 1); } ESelectionModel * @@ -359,10 +489,35 @@ e_minicard_view_widget_get_selection_model (EMinicardViewWidget *view) } EMinicardView * -e_minicard_view_widget_get_view (EMinicardViewWidget *view) +e_minicard_view_widget_get_view (EMinicardViewWidget *view) { if (view->emv) return E_MINICARD_VIEW (view->emv); else return NULL; } + +static gboolean +e_minicard_view_widget_real_focus_in_event (GtkWidget *widget, + GdkEventFocus *event) +{ + GnomeCanvas *canvas; + EMinicardViewWidget *view; + + canvas = GNOME_CANVAS (widget); + view = E_MINICARD_VIEW_WIDGET (widget); + + if (!canvas->focused_item) { + EReflow *reflow = E_REFLOW (view->emv); + if (reflow->count) { + gint unsorted = e_sorter_sorted_to_model (E_SORTER (reflow->sorter), 0); + + if (unsorted != -1) + canvas->focused_item = reflow->items[unsorted]; + } + } + + return GTK_WIDGET_CLASS (e_minicard_view_widget_parent_class)-> + focus_in_event (widget, event); +} + |