aboutsummaryrefslogtreecommitdiffstats
path: root/addressbook/gui/component/select-names/e-select-names-table-model.c
diff options
context:
space:
mode:
Diffstat (limited to 'addressbook/gui/component/select-names/e-select-names-table-model.c')
-rw-r--r--addressbook/gui/component/select-names/e-select-names-table-model.c229
1 files changed, 210 insertions, 19 deletions
diff --git a/addressbook/gui/component/select-names/e-select-names-table-model.c b/addressbook/gui/component/select-names/e-select-names-table-model.c
index dc3edda5f9..7f4d916435 100644
--- a/addressbook/gui/component/select-names/e-select-names-table-model.c
+++ b/addressbook/gui/component/select-names/e-select-names-table-model.c
@@ -13,6 +13,7 @@
#include <gtk/gtk.h>
#include "e-select-names-table-model.h"
+#include "addressbook/backend/ebook/e-card-simple.h"
/* Object argument IDs */
enum {
@@ -27,6 +28,33 @@ static void e_select_names_table_model_destroy (GtkObject *object);
static void e_select_names_table_model_set_arg (GtkObject *object, GtkArg *arg, guint arg_id);
static void e_select_names_table_model_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
+static void e_select_names_table_model_model_changed (ESelectNamesModel *source,
+ ESelectNamesTableModel *model);
+
+
+static void
+e_select_names_table_model_add_source (ESelectNamesTableModel *model,
+ ESelectNamesModel *source)
+{
+ model->source = source;
+ if (model->source)
+ gtk_object_ref(GTK_OBJECT(model->source));
+ model->source_changed_id = gtk_signal_connect(GTK_OBJECT(model->source), "changed",
+ GTK_SIGNAL_FUNC(e_select_names_table_model_model_changed),
+ model);
+}
+
+static void
+e_select_names_table_model_drop_source (ESelectNamesTableModel *model)
+{
+ if (model->source_changed_id)
+ gtk_signal_disconnect(GTK_OBJECT(model->source), model->source_changed_id);
+ if (model->source)
+ gtk_object_unref(GTK_OBJECT(model->source));
+ model->source = NULL;
+ model->source_changed_id = 0;
+}
+
/**
* e_select_names_table_model_get_type:
* @void:
@@ -76,20 +104,57 @@ e_select_names_table_model_new (ESelectNamesModel *source)
}
static void
-e_select_names_table_model_class_init (ESelectNamesTableModelClass *klass)
+fill_in_info (ESelectNamesTableModel *model)
{
- GtkObjectClass *object_class;
- ETableModelClass *table_model_class;
-
- object_class = GTK_OBJECT_CLASS(klass);
- table_model_class = E_TABLE_MODEL_CLASS(klass);
-
- gtk_object_add_arg_type ("ESelectNamesTableModel::source",
- GTK_TYPE_OBJECT, GTK_ARG_READWRITE, ARG_SOURCE);
+ if (model->source) {
+ EList *list = e_select_names_model_get_data(model->source);
+ EIterator *iterator = e_list_get_iterator(list);
+ int count = 0;
+ for (e_iterator_reset(iterator); e_iterator_is_valid(iterator); e_iterator_next(iterator)) {
+ const ESelectNamesModelData *data = e_iterator_get(iterator);
+ if (data->type != E_SELECT_NAMES_MODEL_DATA_TYPE_SEPARATION_MATERIAL) {
+ count ++;
+ }
+ }
+ model->count = count;
+ model->data = g_new(ESelectNamesTableModelData, count);
+ count = 0;
+ for (e_iterator_reset(iterator); e_iterator_is_valid(iterator); e_iterator_next(iterator)) {
+ const ESelectNamesModelData *data = e_iterator_get(iterator);
+ switch (data->type) {
+ case E_SELECT_NAMES_MODEL_DATA_TYPE_CARD: {
+ ECardSimple *simple = e_card_simple_new(data->card);
+ model->data[count].name = e_card_simple_get(simple, E_CARD_SIMPLE_FIELD_FULL_NAME);
+ model->data[count].email = e_card_simple_get(simple, E_CARD_SIMPLE_FIELD_EMAIL);
+ gtk_object_unref(GTK_OBJECT(simple));
+ count ++;
+ break;
+ }
+ case E_SELECT_NAMES_MODEL_DATA_TYPE_STRING_ADDRESS:
+ model->data[count].name = g_strdup(data->string);
+ model->data[count].email = g_strdup(data->string);
+ count ++;
+ break;
+ case E_SELECT_NAMES_MODEL_DATA_TYPE_SEPARATION_MATERIAL:
+ break;
+ }
+ }
+ } else {
+ model->count = 0;
+ }
+}
- object_class->destroy = e_select_names_table_model_destroy;
- object_class->get_arg = e_select_names_table_model_get_arg;
- object_class->set_arg = e_select_names_table_model_set_arg;
+static void
+clear_info (ESelectNamesTableModel *model)
+{
+ int i;
+ for (i = 0; i < model->count; i++) {
+ g_free(model->data[i].name);
+ g_free(model->data[i].email);
+ }
+ g_free(model->data);
+ model->data = NULL;
+ model->count = -1;
}
/*
@@ -103,10 +168,107 @@ e_select_names_table_model_destroy (GtkObject *object)
model = E_SELECT_NAMES_TABLE_MODEL (object);
- if (model->source)
- gtk_object_unref(GTK_OBJECT(model->source));
+ e_select_names_table_model_drop_source (model);
+ clear_info(model);
+}
+
+/* This function returns the number of columns in our ETableModel. */
+static int
+e_select_names_table_model_col_count (ETableModel *etc)
+{
+ return 2;
+}
+
+/* This function returns the number of rows in our ETableModel. */
+static int
+e_select_names_table_model_row_count (ETableModel *etc)
+{
+ ESelectNamesTableModel *e_select_names_table_model = E_SELECT_NAMES_TABLE_MODEL(etc);
+ if (e_select_names_table_model->count == -1) {
+ if (e_select_names_table_model->source) {
+ fill_in_info(e_select_names_table_model);
+ } else {
+ return 0;
+ }
+ }
+ return e_select_names_table_model->count;
+}
+
+/* This function returns the value at a particular point in our ETableModel. */
+static void *
+e_select_names_table_model_value_at (ETableModel *etc, int col, int row)
+{
+ ESelectNamesTableModel *e_select_names_table_model = E_SELECT_NAMES_TABLE_MODEL(etc);
+ if (e_select_names_table_model->data == NULL) {
+ }
+ switch (col) {
+ case 0:
+ if (e_select_names_table_model->data[row].name == NULL) {
+ fill_in_info(e_select_names_table_model);
+ }
+ return e_select_names_table_model->data[row].name;
+ break;
+ case 1:
+ if (e_select_names_table_model->data[row].email == NULL) {
+ fill_in_info(e_select_names_table_model);
+ }
+ return e_select_names_table_model->data[row].email;
+ break;
+ }
+ return "";
+}
+
+/* This function sets the value at a particular point in our ETableModel. */
+static void
+e_select_names_table_model_set_value_at (ETableModel *etc, int col, int row, const void *val)
+{
+}
+
+/* This function returns whether a particular cell is editable. */
+static gboolean
+e_select_names_table_model_is_cell_editable (ETableModel *etc, int col, int row)
+{
+ return FALSE;
+}
+
+/* This function duplicates the value passed to it. */
+static void *
+e_select_names_table_model_duplicate_value (ETableModel *etc, int col, const void *value)
+{
+ return g_strdup(value);
+}
+
+/* This function frees the value passed to it. */
+static void
+e_select_names_table_model_free_value (ETableModel *etc, int col, void *value)
+{
+ g_free(value);
+}
+
+static void *
+e_select_names_table_model_initialize_value (ETableModel *etc, int col)
+{
+ return g_strdup("");
+}
+
+static gboolean
+e_select_names_table_model_value_is_empty (ETableModel *etc, int col, const void *value)
+{
+ return !(value && *(char *)value);
+}
+
+static char *
+e_select_names_table_model_value_to_string (ETableModel *etc, int col, const void *value)
+{
+ return g_strdup(value);
}
+static void
+e_select_names_table_model_model_changed (ESelectNamesModel *source,
+ ESelectNamesTableModel *model)
+{
+ clear_info(model);
+}
/* Set_arg handler for the model */
static void
@@ -118,11 +280,8 @@ e_select_names_table_model_set_arg (GtkObject *object, GtkArg *arg, guint arg_id
switch (arg_id) {
case ARG_SOURCE:
- if (model->source)
- gtk_object_unref(GTK_OBJECT(model->source));
- model->source = E_SELECT_NAMES_MODEL(GTK_VALUE_OBJECT(*arg));
- if (model->source)
- gtk_object_ref(GTK_OBJECT(model->source));
+ e_select_names_table_model_drop_source (model);
+ e_select_names_table_model_add_source (model, E_SELECT_NAMES_MODEL(GTK_VALUE_OBJECT (*arg)));
break;
default:
return;
@@ -154,4 +313,36 @@ static void
e_select_names_table_model_init (ESelectNamesTableModel *model)
{
model->source = NULL;
+ model->source_changed_id = 0;
+
+ model->count = -1;
+ model->data = NULL;
+}
+
+static void
+e_select_names_table_model_class_init (ESelectNamesTableModelClass *klass)
+{
+ GtkObjectClass *object_class;
+ ETableModelClass *table_model_class;
+
+ object_class = GTK_OBJECT_CLASS(klass);
+ table_model_class = E_TABLE_MODEL_CLASS(klass);
+
+ gtk_object_add_arg_type ("ESelectNamesTableModel::source",
+ GTK_TYPE_OBJECT, GTK_ARG_READWRITE, ARG_SOURCE);
+
+ object_class->destroy = e_select_names_table_model_destroy;
+ object_class->get_arg = e_select_names_table_model_get_arg;
+ object_class->set_arg = e_select_names_table_model_set_arg;
+
+ table_model_class->column_count = e_select_names_table_model_col_count;
+ table_model_class->row_count = e_select_names_table_model_row_count;
+ table_model_class->value_at = e_select_names_table_model_value_at;
+ table_model_class->set_value_at = e_select_names_table_model_set_value_at;
+ table_model_class->is_cell_editable = e_select_names_table_model_is_cell_editable;
+ table_model_class->duplicate_value = e_select_names_table_model_duplicate_value;
+ table_model_class->free_value = e_select_names_table_model_free_value;
+ table_model_class->initialize_value = e_select_names_table_model_initialize_value;
+ table_model_class->value_is_empty = e_select_names_table_model_value_is_empty;
+ table_model_class->value_to_string = e_select_names_table_model_value_to_string;
}