diff options
Diffstat (limited to 'addressbook/gui/widgets/e-addressbook-reflow-adapter.c')
-rw-r--r-- | addressbook/gui/widgets/e-addressbook-reflow-adapter.c | 297 |
1 files changed, 148 insertions, 149 deletions
diff --git a/addressbook/gui/widgets/e-addressbook-reflow-adapter.c b/addressbook/gui/widgets/e-addressbook-reflow-adapter.c index 8b70de2734..cd306d1627 100644 --- a/addressbook/gui/widgets/e-addressbook-reflow-adapter.c +++ b/addressbook/gui/widgets/e-addressbook-reflow-adapter.c @@ -3,16 +3,19 @@ #include <config.h> -#include <libgnome/gnome-i18n.h> -#include "e-addressbook-marshal.h" #include "e-addressbook-reflow-adapter.h" #include "e-addressbook-model.h" #include "e-addressbook-view.h" #include "e-addressbook-util.h" +#include <gal/util/e-i18n.h> + #include "e-minicard.h" +#include <gal/widgets/e-unicode.h> +#include <gal/widgets/e-font.h> #include <gal/widgets/e-popup-menu.h> #include <gal/widgets/e-gui-utils.h> +#include <gal/unicode/gunicode.h> #include "e-contact-save-as.h" #include "addressbook/printing/e-contact-print.h" #include "addressbook/printing/e-contact-print-envelope.h" @@ -30,11 +33,11 @@ EReflowModel *parent_class; #define d(x) enum { - PROP_0, - PROP_BOOK, - PROP_QUERY, - PROP_EDITABLE, - PROP_MODEL, + ARG_0, + ARG_BOOK, + ARG_QUERY, + ARG_EDITABLE, + ARG_MODEL, }; enum { @@ -49,46 +52,53 @@ unlink_model(EAddressbookReflowAdapter *adapter) { EAddressbookReflowAdapterPrivate *priv = adapter->priv; - if (priv->model && priv->create_card_id) - g_signal_handler_disconnect (priv->model, - priv->create_card_id); - if (priv->model && priv->remove_card_id) - g_signal_handler_disconnect (priv->model, - priv->remove_card_id); - if (priv->model && priv->modify_card_id) - g_signal_handler_disconnect (priv->model, - priv->modify_card_id); - - if (priv->model && priv->model_changed_id) - g_signal_handler_disconnect (priv->model, - priv->model_changed_id); + gtk_signal_disconnect(GTK_OBJECT (priv->model), + priv->create_card_id); + gtk_signal_disconnect(GTK_OBJECT (priv->model), + priv->remove_card_id); + gtk_signal_disconnect(GTK_OBJECT (priv->model), + priv->modify_card_id); + gtk_signal_disconnect(GTK_OBJECT (priv->model), + priv->model_changed_id); priv->create_card_id = 0; priv->remove_card_id = 0; priv->modify_card_id = 0; priv->model_changed_id = 0; - if (priv->model) - g_object_unref (priv->model); + gtk_object_unref(GTK_OBJECT(priv->model)); priv->model = NULL; } static int -text_height (PangoLayout *layout, const gchar *text) +count_lines (const gchar *text) { - int height; + int num_lines = 1; + gunichar unival; - pango_layout_set_text (layout, text, -1); + for (text = e_unicode_get_utf8 (text, &unival); (unival && text); text = e_unicode_get_utf8 (text, &unival)) { + if (unival == '\n') { + num_lines ++; + } + } + + return num_lines; +} - pango_layout_get_pixel_size (layout, NULL, &height); +static int +text_height (GnomeCanvas *canvas, const gchar *text) +{ + EFont *font = e_font_from_gdk_font (((GtkWidget *) canvas)->style->font); + gint height = e_font_height (font) * count_lines (text) / canvas->pixels_per_unit; + e_font_unref (font); return height; } static void -addressbook_dispose(GObject *object) +addressbook_finalize(GtkObject *object) { EAddressbookReflowAdapter *adapter = E_ADDRESSBOOK_REFLOW_ADAPTER(object); @@ -110,12 +120,10 @@ addressbook_count (EReflowModel *erm) return e_addressbook_model_card_count (priv->model); } -/* This function returns the height of the minicard in question */ +/* This function returns the number of items in our EReflowModel. */ static int addressbook_height (EReflowModel *erm, int i, GnomeCanvasGroup *parent) { - /* XXX ugh, an extra pango layout step for every minicard - whether it's displayed or not? */ EAddressbookReflowAdapter *adapter = E_ADDRESSBOOK_REFLOW_ADAPTER(erm); EAddressbookReflowAdapterPrivate *priv = adapter->priv; /* FIXME */ @@ -124,10 +132,9 @@ addressbook_height (EReflowModel *erm, int i, GnomeCanvasGroup *parent) int height; char *string; ECardSimple *simple = e_card_simple_new (e_addressbook_model_card_at (priv->model, i)); - PangoLayout *layout = gtk_widget_create_pango_layout (GTK_WIDGET (GNOME_CANVAS_ITEM (parent)->canvas), ""); string = e_card_simple_get(simple, E_CARD_SIMPLE_FIELD_FILE_AS); - height = text_height (layout, string ? string : "") + 10.0; + height = text_height (GNOME_CANVAS_ITEM (parent)->canvas, string ? string : "") + 10.0; g_free(string); for(field = E_CARD_SIMPLE_FIELD_FULL_NAME; field != E_CARD_SIMPLE_FIELD_LAST_SIMPLE_STRING && count < 5; field++) { @@ -140,9 +147,9 @@ addressbook_height (EReflowModel *erm, int i, GnomeCanvasGroup *parent) int this_height; int field_text_height; - this_height = text_height (layout, e_card_simple_get_name(simple, field)); + this_height = text_height (GNOME_CANVAS_ITEM (parent)->canvas, e_card_simple_get_name(simple, field)); - field_text_height = text_height (layout, string); + field_text_height = text_height (GNOME_CANVAS_ITEM (parent)->canvas, string); if (this_height < field_text_height) this_height = field_text_height; @@ -155,8 +162,7 @@ addressbook_height (EReflowModel *erm, int i, GnomeCanvasGroup *parent) } height += 2; - g_object_unref (simple); - g_object_unref (layout); + gtk_object_unref (GTK_OBJECT (simple)); return height; } @@ -195,9 +201,9 @@ adapter_drag_begin (EMinicard *card, GdkEvent *event, EAddressbookReflowAdapter { gint ret_val = 0; - g_signal_emit (adapter, - e_addressbook_reflow_adapter_signals[DRAG_BEGIN], 0, - event, &ret_val); + gtk_signal_emit (GTK_OBJECT(adapter), + e_addressbook_reflow_adapter_signals[DRAG_BEGIN], + event, &ret_val); return ret_val; } @@ -216,13 +222,13 @@ addressbook_incarnate (EReflowModel *erm, int i, GnomeCanvasGroup *parent) NULL); #if 0 - g_signal_connect (item, "selected", - G_CALLBACK(card_selected), 0, emvm); + gtk_signal_connect (GTK_OBJECT (item), "selected", + GTK_SIGNAL_FUNC(card_selected), emvm); #endif - g_signal_connect (item, "drag_begin", - G_CALLBACK(adapter_drag_begin), adapter); - + gtk_signal_connect (GTK_OBJECT (item), "drag_begin", + GTK_SIGNAL_FUNC(adapter_drag_begin), adapter); + return item; } @@ -273,112 +279,106 @@ model_changed(EAddressbookModel *model, } static void -addressbook_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +addressbook_set_arg (GtkObject *o, GtkArg *arg, guint arg_id) { - EAddressbookReflowAdapter *adapter = E_ADDRESSBOOK_REFLOW_ADAPTER(object); + EAddressbookReflowAdapter *adapter = E_ADDRESSBOOK_REFLOW_ADAPTER(o); EAddressbookReflowAdapterPrivate *priv = adapter->priv; - switch (prop_id) { - case PROP_BOOK: - g_object_set (priv->model, - "book", g_value_get_object (value), - NULL); + switch (arg_id){ + case ARG_BOOK: + gtk_object_set (GTK_OBJECT (priv->model), + "book", GTK_VALUE_OBJECT (*arg), + NULL); break; - case PROP_QUERY: - g_object_set (priv->model, - "query", g_value_get_string (value), - NULL); - break; - case PROP_EDITABLE: - g_object_set (priv->model, - "editable", g_value_get_boolean (value), - NULL); + case ARG_QUERY: + gtk_object_set (GTK_OBJECT (priv->model), + "query", GTK_VALUE_STRING (*arg), + NULL); break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + case ARG_EDITABLE: + gtk_object_set (GTK_OBJECT (priv->model), + "editable", GTK_VALUE_BOOL (*arg), + NULL); break; } } static void -addressbook_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +addressbook_get_arg (GtkObject *o, GtkArg *arg, guint arg_id) { - EAddressbookReflowAdapter *adapter = E_ADDRESSBOOK_REFLOW_ADAPTER(object); + EAddressbookReflowAdapter *adapter = E_ADDRESSBOOK_REFLOW_ADAPTER(o); EAddressbookReflowAdapterPrivate *priv = adapter->priv; - switch (prop_id) { - case PROP_BOOK: { - g_object_get_property (G_OBJECT (priv->model), - "book", value); + switch (arg_id) { + case ARG_BOOK: { + EBook *book; + gtk_object_get (GTK_OBJECT (priv->model), + "book", &book, + NULL); + if (book) + GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(book); + else + GTK_VALUE_OBJECT (*arg) = NULL; break; } - case PROP_QUERY: { + case ARG_QUERY: { char *query; - g_object_get_property (G_OBJECT (priv->model), - "query", value); + gtk_object_get (GTK_OBJECT (priv->model), + "query", &query, + NULL); + GTK_VALUE_STRING (*arg) = query; break; } - case PROP_EDITABLE: { - g_object_get_property (G_OBJECT (priv->model), - "editable", value); + case ARG_EDITABLE: { + gboolean editable; + gtk_object_get (GTK_OBJECT (priv->model), + "editable", &editable, + NULL); + GTK_VALUE_BOOL (*arg) = editable; break; } - case PROP_MODEL: - g_value_set_object (value, priv->model); + case ARG_MODEL: + if (priv->model) + GTK_VALUE_OBJECT (*arg) = GTK_OBJECT (priv->model); + else + GTK_VALUE_OBJECT (*arg) = NULL; break; default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + arg->type = GTK_TYPE_INVALID; break; } } static void -e_addressbook_reflow_adapter_class_init (GObjectClass *object_class) +e_addressbook_reflow_adapter_class_init (GtkObjectClass *object_class) { EReflowModelClass *model_class = (EReflowModelClass *) object_class; - parent_class = g_type_class_peek_parent (object_class); - - object_class->set_property = addressbook_set_property; - object_class->get_property = addressbook_get_property; - object_class->dispose = addressbook_dispose; - - g_object_class_install_property (object_class, PROP_BOOK, - g_param_spec_object ("book", - _("Book"), - /*_( */"XXX blurb" /*)*/, - E_TYPE_BOOK, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_QUERY, - g_param_spec_string ("query", - _("Query"), - /*_( */"XXX blurb" /*)*/, - NULL, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_EDITABLE, - g_param_spec_boolean ("editable", - _("Editable"), - /*_( */"XXX blurb" /*)*/, - FALSE, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_MODEL, - g_param_spec_object ("model", - _("Model"), - /*_( */"XXX blurb" /*)*/, - E_TYPE_ADDRESSBOOK_MODEL, - G_PARAM_READABLE)); + parent_class = gtk_type_class (PARENT_TYPE); + + object_class->set_arg = addressbook_set_arg; + object_class->get_arg = addressbook_get_arg; + object_class->finalize = addressbook_finalize; + + gtk_object_add_arg_type ("EAddressbookReflowAdapter::book", GTK_TYPE_OBJECT, + GTK_ARG_READWRITE, ARG_BOOK); + gtk_object_add_arg_type ("EAddressbookReflowAdapter::query", GTK_TYPE_STRING, + GTK_ARG_READWRITE, ARG_QUERY); + gtk_object_add_arg_type ("EAddressbookReflowAdapter::editable", GTK_TYPE_BOOL, + GTK_ARG_READWRITE, ARG_EDITABLE); + gtk_object_add_arg_type ("EAddressbookReflowAdapter::model", E_ADDRESSBOOK_MODEL_TYPE, + GTK_ARG_READABLE, ARG_MODEL); e_addressbook_reflow_adapter_signals [DRAG_BEGIN] = - g_signal_new ("drag_begin", - G_OBJECT_CLASS_TYPE(object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EAddressbookReflowAdapterClass, drag_begin), - NULL, NULL, - e_addressbook_marshal_INT__POINTER, - G_TYPE_INT, 1, G_TYPE_POINTER); + gtk_signal_new ("drag_begin", + GTK_RUN_LAST, + object_class->type, + GTK_SIGNAL_OFFSET (EAddressbookReflowAdapterClass, drag_begin), + gtk_marshal_INT__POINTER, + GTK_TYPE_INT, 1, GTK_TYPE_POINTER); + + + gtk_object_class_add_signals (object_class, e_addressbook_reflow_adapter_signals, LAST_SIGNAL); model_class->set_width = addressbook_set_width; model_class->count = addressbook_count; @@ -402,25 +402,24 @@ e_addressbook_reflow_adapter_init (GtkObject *object) priv->model_changed_id = 0; } -GType +GtkType e_addressbook_reflow_adapter_get_type (void) { - static GType type = 0; + static GtkType type = 0; - if (!type) { - static const GTypeInfo info = { - sizeof (EAddressbookReflowAdapterClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) e_addressbook_reflow_adapter_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ + if (!type){ + GtkTypeInfo info = { + "EAddressbookReflowAdapter", sizeof (EAddressbookReflowAdapter), - 0, /* n_preallocs */ - (GInstanceInitFunc) e_addressbook_reflow_adapter_init, + sizeof (EAddressbookReflowAdapterClass), + (GtkClassInitFunc) e_addressbook_reflow_adapter_class_init, + (GtkObjectInitFunc) e_addressbook_reflow_adapter_init, + NULL, /* reserved 1 */ + NULL, /* reserved 2 */ + (GtkClassInitFunc) NULL }; - type = g_type_register_static (PARENT_TYPE, "EAddressbookReflowAdapter", &info, 0); + type = gtk_type_unique (PARENT_TYPE, &info); } return type; @@ -433,24 +432,24 @@ e_addressbook_reflow_adapter_construct (EAddressbookReflowAdapter *adapter, EAddressbookReflowAdapterPrivate *priv = adapter->priv; priv->model = model; - g_object_ref (priv->model); - - priv->create_card_id = g_signal_connect(priv->model, - "card_added", - G_CALLBACK(create_card), - adapter); - priv->remove_card_id = g_signal_connect(priv->model, - "card_removed", - G_CALLBACK(remove_card), - adapter); - priv->modify_card_id = g_signal_connect(priv->model, - "card_changed", - G_CALLBACK(modify_card), - adapter); - priv->model_changed_id = g_signal_connect(priv->model, - "model_changed", - G_CALLBACK(model_changed), + gtk_object_ref (GTK_OBJECT (priv->model)); + + priv->create_card_id = gtk_signal_connect(GTK_OBJECT(priv->model), + "card_added", + GTK_SIGNAL_FUNC(create_card), + adapter); + priv->remove_card_id = gtk_signal_connect(GTK_OBJECT(priv->model), + "card_removed", + GTK_SIGNAL_FUNC(remove_card), + adapter); + priv->modify_card_id = gtk_signal_connect(GTK_OBJECT(priv->model), + "card_changed", + GTK_SIGNAL_FUNC(modify_card), adapter); + priv->model_changed_id = gtk_signal_connect(GTK_OBJECT(priv->model), + "model_changed", + GTK_SIGNAL_FUNC(model_changed), + adapter); } EReflowModel * @@ -458,7 +457,7 @@ e_addressbook_reflow_adapter_new (EAddressbookModel *model) { EAddressbookReflowAdapter *et; - et = g_object_new (E_TYPE_ADDRESSBOOK_REFLOW_ADAPTER, NULL); + et = gtk_type_new (e_addressbook_reflow_adapter_get_type ()); e_addressbook_reflow_adapter_construct (et, model); |