aboutsummaryrefslogtreecommitdiffstats
path: root/addressbook/gui/widgets/e-minicard-view-widget.c
diff options
context:
space:
mode:
Diffstat (limited to 'addressbook/gui/widgets/e-minicard-view-widget.c')
-rw-r--r--addressbook/gui/widgets/e-minicard-view-widget.c617
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);
+}
+