diff options
Diffstat (limited to 'addressbook/gui/component')
5 files changed, 355 insertions, 23 deletions
diff --git a/addressbook/gui/component/select-names/e-select-names-model.c b/addressbook/gui/component/select-names/e-select-names-model.c index 8399136dd8..f819a1197e 100644 --- a/addressbook/gui/component/select-names/e-select-names-model.c +++ b/addressbook/gui/component/select-names/e-select-names-model.c @@ -198,3 +198,53 @@ EList *e_select_names_model_get_data (ESelect { return model->data; } + +void +e_select_names_model_insert (ESelectNamesModel *model, + EIterator *iterator, /* Must be one of the iterators in the model. */ + int index, + char *data) +{ +} + +void +e_select_names_model_insert_length (ESelectNamesModel *model, + EIterator *iterator, /* Must be one of the iterators in the model. */ + int index, + char *data, + int length) +{ +} + +void +e_select_names_model_delete (ESelectNamesModel *model, + EIterator *iterator, /* Must be one of the iterators in the model. */ + int index, + int length) +{ +} + +void +e_select_names_model_replace (ESelectNamesModel *model, + EIterator *iterator, /* Must be one of the iterators in the model. */ + int index, + int replacement_length, + char *data) +{ +} + + +void +e_select_names_model_add_item (ESelectNamesModel *model, + EIterator *iterator, /* NULL for at the beginning. */ + ESelectNamesModelData *data) +{ +} + +void +e_select_names_model_remove_item (ESelectNamesModel *model, + EIterator *iterator) +{ +} + + diff --git a/addressbook/gui/component/select-names/e-select-names-model.h b/addressbook/gui/component/select-names/e-select-names-model.h index 20c90818f7..313b4dee25 100644 --- a/addressbook/gui/component/select-names/e-select-names-model.h +++ b/addressbook/gui/component/select-names/e-select-names-model.h @@ -55,6 +55,32 @@ struct _ESelectNamesModelClass { ESelectNamesModel *e_select_names_model_new (void); +/* These lengths are allowed to go over objects and act just like the text model does. */ +void e_select_names_model_insert (ESelectNamesModel *model, + EIterator *iterator, /* Must be one of the iterators in the model. */ + int index, + char *data); +void e_select_names_model_insert_length (ESelectNamesModel *model, + EIterator *iterator, /* Must be one of the iterators in the model. */ + int index, + char *data, + int length); +void e_select_names_model_delete (ESelectNamesModel *model, + EIterator *iterator, /* Must be one of the iterators in the model. */ + int index, + int length); +void e_select_names_model_replace (ESelectNamesModel *model, + EIterator *iterator, /* Must be one of the iterators in the model. */ + int index, + int replacement_length, + char *data); + +void e_select_names_model_add_item (ESelectNamesModel *model, + EIterator *iterator, /* NULL for at the beginning. */ + ESelectNamesModelData *data); +void e_select_names_model_remove_item (ESelectNamesModel *model, + EIterator *iterator); + /* Of type ECard */ EList *e_select_names_model_get_cards (ESelectNamesModel *model); 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; } diff --git a/addressbook/gui/component/select-names/e-select-names-table-model.h b/addressbook/gui/component/select-names/e-select-names-table-model.h index 94cbaff13a..9afc3f7a12 100644 --- a/addressbook/gui/component/select-names/e-select-names-table-model.h +++ b/addressbook/gui/component/select-names/e-select-names-table-model.h @@ -21,6 +21,11 @@ #define E_IS_SELECT_NAMES_TABLE_MODEL(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_SELECT_NAMES_TABLE_MODEL)) #define E_IS_SELECT_NAMES_TABLE_MODEL_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_SELECT_NAMES_TABLE_MODEL)) +typedef struct { + char *name; + char *email; +} ESelectNamesTableModelData; + typedef struct _ESelectNamesTableModel ESelectNamesTableModel; typedef struct _ESelectNamesTableModelClass ESelectNamesTableModelClass; @@ -28,6 +33,10 @@ struct _ESelectNamesTableModel { ETableModel parent; ESelectNamesModel *source; + int source_changed_id; + + int count; + ESelectNamesTableModelData *data; /* This is used as an array. */ }; struct _ESelectNamesTableModelClass { diff --git a/addressbook/gui/component/select-names/e-select-names-text-model.c b/addressbook/gui/component/select-names/e-select-names-text-model.c index db273796f3..abbbae3321 100644 --- a/addressbook/gui/component/select-names/e-select-names-text-model.c +++ b/addressbook/gui/component/select-names/e-select-names-text-model.c @@ -33,7 +33,7 @@ static void e_select_names_text_model_insert_length (ETextModel *model, gint po static void e_select_names_text_model_delete (ETextModel *model, gint position, gint length); static void e_select_names_text_model_model_changed (ESelectNamesModel *source, - ESelectNamesTextModel *model); + ESelectNamesTextModel *model); ETextModelClass *parent_class; @@ -111,27 +111,83 @@ e_select_names_text_model_class_init (ESelectNamesTextModelClass *klass) text_model_class->delete = e_select_names_text_model_delete; } +static int +get_length(EIterator *iterator) +{ + const ESelectNamesModelData *data = e_iterator_get(iterator); + return strlen(data->string); +} + static void e_select_names_text_model_set_text (ETextModel *model, gchar *text) { -#if 0 - e_select_names_model_clear(model); -#endif + ESelectNamesModel *source = E_SELECT_NAMES_TEXT_MODEL(model)->source; + EIterator *iterator = e_list_get_iterator(e_select_names_model_get_data(source)); + + e_iterator_reset(iterator); + e_select_names_model_replace(source, + iterator, + 0, + strlen(model->text), + text); } static void e_select_names_text_model_insert (ETextModel *model, gint position, gchar *text) { + ESelectNamesModel *source = E_SELECT_NAMES_TEXT_MODEL(model)->source; + EIterator *iterator = e_list_get_iterator(e_select_names_model_get_data(source)); + + for (e_iterator_reset(iterator); e_iterator_is_valid(iterator); e_iterator_next(iterator)) { + int this_length = get_length(iterator); + if (position <= this_length) { + e_select_names_model_insert(source, + iterator, + position, + text); + } else { + position -= this_length; + } + } } static void e_select_names_text_model_insert_length (ETextModel *model, gint position, gchar *text, gint length) { + ESelectNamesModel *source = E_SELECT_NAMES_TEXT_MODEL(model)->source; + EIterator *iterator = e_list_get_iterator(e_select_names_model_get_data(source)); + + for (e_iterator_reset(iterator); e_iterator_is_valid(iterator); e_iterator_next(iterator)) { + int this_length = get_length(iterator); + if (position <= this_length) { + e_select_names_model_insert_length(source, + iterator, + position, + text, + length); + } else { + position -= this_length; + } + } } static void e_select_names_text_model_delete (ETextModel *model, gint position, gint length) { + ESelectNamesModel *source = E_SELECT_NAMES_TEXT_MODEL(model)->source; + EIterator *iterator = e_list_get_iterator(e_select_names_model_get_data(source)); + + for (e_iterator_reset(iterator); e_iterator_is_valid(iterator); e_iterator_next(iterator)) { + int this_length = get_length(iterator); + if (position <= this_length) { + e_select_names_model_delete(source, + iterator, + position, + length); + } else { + position -= this_length; + } + } } static void |