diff options
Diffstat (limited to 'addressbook/gui/widgets/e-addressbook-reflow-adapter.c')
-rw-r--r-- | addressbook/gui/widgets/e-addressbook-reflow-adapter.c | 411 |
1 files changed, 184 insertions, 227 deletions
diff --git a/addressbook/gui/widgets/e-addressbook-reflow-adapter.c b/addressbook/gui/widgets/e-addressbook-reflow-adapter.c index 7f99062144..cd306d1627 100644 --- a/addressbook/gui/widgets/e-addressbook-reflow-adapter.c +++ b/addressbook/gui/widgets/e-addressbook-reflow-adapter.c @@ -2,18 +2,20 @@ #include <config.h> -#include <string.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" @@ -21,24 +23,21 @@ struct _EAddressbookReflowAdapterPrivate { EAddressbookModel *model; - - gboolean loading; - + int create_card_id, remove_card_id, modify_card_id, model_changed_id; - int search_started_id, search_result_id; }; #define PARENT_TYPE e_reflow_model_get_type() -static EReflowModel *parent_class; +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 { @@ -53,53 +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); - if (priv->model && priv->search_started_id) - g_signal_handler_disconnect (priv->model, - priv->search_started_id); - if (priv->model && priv->search_result_id) - g_signal_handler_disconnect (priv->model, - priv->search_result_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; - priv->search_started_id = 0; - priv->search_result_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 ++; + } + } - pango_layout_get_pixel_size (layout, NULL, &height); + return num_lines; +} + +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); @@ -121,21 +120,21 @@ 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) { EAddressbookReflowAdapter *adapter = E_ADDRESSBOOK_REFLOW_ADAPTER(erm); EAddressbookReflowAdapterPrivate *priv = adapter->priv; + /* FIXME */ ECardSimpleField field; int count = 0; + 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), ""); - int height; 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++) { @@ -148,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; @@ -163,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; } @@ -175,32 +173,27 @@ addressbook_compare (EReflowModel *erm, int n1, int n2) EAddressbookReflowAdapter *adapter = E_ADDRESSBOOK_REFLOW_ADAPTER(erm); EAddressbookReflowAdapterPrivate *priv = adapter->priv; ECard *card1, *card2; - - if (priv->loading) { - return n1-n2; - } - else { - card1 = e_addressbook_model_card_at (priv->model, n1); - card2 = e_addressbook_model_card_at (priv->model, n2); - - if (card1 && card2) { - char *file_as1, *file_as2; - file_as1 = card1->file_as; - file_as2 = card2->file_as; - if (file_as1 && file_as2) - return g_utf8_collate(file_as1, file_as2); - if (file_as1) - return -1; - if (file_as2) - return 1; - return strcmp(e_card_get_id(card1), e_card_get_id(card2)); - } - if (card1) + + card1 = e_addressbook_model_card_at (priv->model, n1); + card2 = e_addressbook_model_card_at (priv->model, n2); + + if (card1 && card2) { + char *file_as1, *file_as2; + file_as1 = card1->file_as; + file_as2 = card2->file_as; + if (file_as1 && file_as2) + return g_utf8_collate(file_as1, file_as2); + if (file_as1) return -1; - if (card2) + if (file_as2) return 1; - return 0; + return strcmp(e_card_get_id(card1), e_card_get_id(card2)); } + if (card1) + return -1; + if (card2) + return 1; + return 0; } static int @@ -208,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; } @@ -229,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; } @@ -250,10 +243,12 @@ addressbook_reincarnate (EReflowModel *erm, int i, GnomeCanvasItem *item) NULL); } + + static void -create_card (EAddressbookModel *model, - gint index, gint count, - EAddressbookReflowAdapter *adapter) +create_card(EAddressbookModel *model, + gint index, gint count, + EAddressbookReflowAdapter *adapter) { e_reflow_model_items_inserted (E_REFLOW_MODEL (adapter), index, @@ -261,155 +256,129 @@ create_card (EAddressbookModel *model, } static void -remove_card (EAddressbookModel *model, - gint index, - EAddressbookReflowAdapter *adapter) +remove_card(EAddressbookModel *model, + gint index, + EAddressbookReflowAdapter *adapter) { - e_reflow_model_item_removed (E_REFLOW_MODEL (adapter), index); + e_reflow_model_changed (E_REFLOW_MODEL (adapter)); } static void -modify_card (EAddressbookModel *model, - gint index, - EAddressbookReflowAdapter *adapter) +modify_card(EAddressbookModel *model, + gint index, + EAddressbookReflowAdapter *adapter) { e_reflow_model_item_changed (E_REFLOW_MODEL (adapter), index); } static void -model_changed (EAddressbookModel *model, - EAddressbookReflowAdapter *adapter) +model_changed(EAddressbookModel *model, + EAddressbookReflowAdapter *adapter) { e_reflow_model_changed (E_REFLOW_MODEL (adapter)); } static void -search_started (EAddressbookModel *model, - EAddressbookReflowAdapter *adapter) +addressbook_set_arg (GtkObject *o, GtkArg *arg, guint arg_id) { + EAddressbookReflowAdapter *adapter = E_ADDRESSBOOK_REFLOW_ADAPTER(o); EAddressbookReflowAdapterPrivate *priv = adapter->priv; - priv->loading = TRUE; -} - -static void -search_result (EAddressbookModel *model, - EBookViewStatus status, - EAddressbookReflowAdapter *adapter) -{ - EAddressbookReflowAdapterPrivate *priv = adapter->priv; - - priv->loading = FALSE; - - e_reflow_model_comparison_changed (E_REFLOW_MODEL (adapter)); -} - -static void -addressbook_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) -{ - EAddressbookReflowAdapter *adapter = E_ADDRESSBOOK_REFLOW_ADAPTER(object); - 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); + case ARG_QUERY: + gtk_object_set (GTK_OBJECT (priv->model), + "query", GTK_VALUE_STRING (*arg), + NULL); break; - case PROP_EDITABLE: - g_object_set (priv->model, - "editable", g_value_get_boolean (value), - 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: { - g_object_get_property (G_OBJECT (priv->model), - "query", value); + case ARG_QUERY: { + char *query; + 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; @@ -427,34 +396,30 @@ e_addressbook_reflow_adapter_init (GtkObject *object) priv = adapter->priv = g_new0 (EAddressbookReflowAdapterPrivate, 1); - priv->loading = FALSE; priv->create_card_id = 0; priv->remove_card_id = 0; priv->modify_card_id = 0; priv->model_changed_id = 0; - priv->search_started_id = 0; - priv->search_result_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; @@ -467,32 +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->search_started_id = g_signal_connect(priv->model, - "search_started", - G_CALLBACK(search_started), - adapter); - priv->search_result_id = g_signal_connect(priv->model, - "search_result", - G_CALLBACK(search_result), + 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 * @@ -500,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); |