diff options
author | Jon Trowbridge <trow@ximian.com> | 2001-12-28 11:08:27 +0800 |
---|---|---|
committer | Jon Trowbridge <trow@src.gnome.org> | 2001-12-28 11:08:27 +0800 |
commit | 2786536d7f25b29b20a41b417896cff810368d85 (patch) | |
tree | 3ecdda5c24e1de152937a451a10bc09a5be891ba /addressbook/gui/component/select-names/e-select-names-model.c | |
parent | b054d4b4e6f7eff593a2ac7c3b40f2d8bb92b82c (diff) | |
download | gsoc2013-evolution-2786536d7f25b29b20a41b417896cff810368d85.tar gsoc2013-evolution-2786536d7f25b29b20a41b417896cff810368d85.tar.gz gsoc2013-evolution-2786536d7f25b29b20a41b417896cff810368d85.tar.bz2 gsoc2013-evolution-2786536d7f25b29b20a41b417896cff810368d85.tar.lz gsoc2013-evolution-2786536d7f25b29b20a41b417896cff810368d85.tar.xz gsoc2013-evolution-2786536d7f25b29b20a41b417896cff810368d85.tar.zst gsoc2013-evolution-2786536d7f25b29b20a41b417896cff810368d85.zip |
When we clean, don't clean the model's last element. This helps keep
2001-12-27 Jon Trowbridge <trow@ximian.com>
* gui/component/select-names/e-select-names.c
(real_add_address_cb): When we clean, don't clean the model's last
element. This helps keep things working properly when we have
signal-character separators.
(section_right_click_cb): Changed to work properly with our
EText-emitted popup signal.
(e_select_names_add_section): Use ETexts for the recipient
sections, rather than tables. This lets us make them directly
editable. (Bug #1721)
* gui/component/select-names/e-select-names-popup.c
(popup_info_new): Pass in a ESelectNamesTextModel, not a
ESelectNamesModel.
(e_select_names_popup): Adjust for the new signature for
e_select_names_model_text_pos.
* gui/component/select-names/e-select-names-manager.c
(focus_out_cb): Schedule a cleaning when we focus out.
(focus_in_cb): Cancel pending cleaning when we get focus. This
helps us avoid bad things happening during the fast focus out/ins
that happen when the completion dropdown appears.
(completion_handler): Adjust for new signatures of
e_select_names_model_text_pos and e_select_names_model_name_pos.
(e_select_names_manager_entry_new): Pass in our
ESelectNamesTextModel when constructing the
ESelectNamesCompletion.
(e_select_names_manager_entry_free): Cancel any pending clean-ups.
* gui/component/select-names/e-select-names-bonobo.c
(entry_get_property_fn): Get the text off of the text model.
Which is the only way that really makes sense when you think about
it.
* gui/component/select-names/e-select-names-completion.c: Added a
copy of the associated ESelectNamesTextModel to
ESelectNamesCompletionPrivate. This replaces the
ESelectNamesModel.
(e_select_names_completion_destroy): Unref ->text_model.
(e_select_names_completion_handle_request): Pass in our text
model's separator info when calling e_select_names_model_text_pos.
(e_select_names_completion_new): Pass in the text model as an arg
instead of the model, and ref it as needed.
* gui/component/select-names/e-select-names-text-model.c
(e_select_names_text_model_init): Set separator as either ", " or
",", depending on the value of the EVOLUTION_DISABLE_MAGIC_COMMA
environment variable.
(e_select_names_text_model_destroy): Free the separator.
(changed_cb): Flush our cached text on changed.
(e_select_names_text_model_set_source): Use our own changed_cb
callback on changed, rather than just connecting up
e_text_model_changed.
(e_select_names_text_model_set_separator): Added. Lets the
separator between recipients be specified.
(e_select_names_text_model_get_text): Cache the text we get from
calling e_select_names_model_get_textification.
(e_select_names_text_model_insert_length): A bunch of small
changes to properly support generic separators, rather than
(implicit and explicitly) assuming ", ".
(e_select_names_text_model_delete): More small tweaks to handle
generic separators.
(e_select_names_text_model_get_nth_obj): Use new signature when
calling e_select_names_model_name_pos, and use our cached text.
* gui/component/select-names/e-select-names-model.c
(e_select_names_model_destroy): We don't cache the text or
addr_text anymore, so no need to free them here.
(e_select_names_model_changed): ...and no need to reset our text
and addr_text caches here.
(e_select_names_model_get_textification): Take a separator as an
arg, rather than just using ", ". Also, no caching.
(e_select_names_model_get_address_text): Take a separator as an
arg, rather than just using ", ". And no caching here either.
(e_select_names_model_clean): Add arg that give us control over
whether or not the last entry should get cleaned. We need this
when using a one-character separator, so that new destinations
that get tacked onto the end don't get immediately cleaned away
for being empty.
(e_select_names_model_name_pos): Take the separator length as an
argument, remove implicit assumption of length 2.
(e_select_names_model_text_pos): Take the separator length as an
argument, remove implicit assumption of length 2.CVS: ----------------------------------------------------------------------
svn path=/trunk/; revision=15221
Diffstat (limited to 'addressbook/gui/component/select-names/e-select-names-model.c')
-rw-r--r-- | addressbook/gui/component/select-names/e-select-names-model.c | 140 |
1 files changed, 66 insertions, 74 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 138b0d73ad..fadb8c21a0 100644 --- a/addressbook/gui/component/select-names/e-select-names-model.c +++ b/addressbook/gui/component/select-names/e-select-names-model.c @@ -20,9 +20,6 @@ #include "e-select-names-model.h" #include "addressbook/backend/ebook/e-card-simple.h" -#define SEPARATOR ", " -#define SEPLEN (strlen(SEPARATOR)) - #define MAX_LENGTH 2047 @@ -56,8 +53,6 @@ struct _ESelectNamesModelPrivate { gchar *title; GList *data; /* of EDestination */ - gchar *text; - gchar *addr_text; gint limit; @@ -170,9 +165,6 @@ e_select_names_model_destroy (GtkObject *object) g_list_foreach (model->priv->data, (GFunc) gtk_object_unref, NULL); g_list_free (model->priv->data); - g_free (model->priv->text); - g_free (model->priv->addr_text); - g_free (model->priv); } @@ -215,12 +207,6 @@ e_select_names_model_get_arg (GtkObject *object, GtkArg *arg, guint arg_id) static void e_select_names_model_changed (ESelectNamesModel *model) { - g_free (model->priv->text); - model->priv->text = NULL; - - g_free (model->priv->addr_text); - model->priv->addr_text = NULL; - if (model->priv->freeze_count > 0) { model->priv->pending_changed = TRUE; } else { @@ -264,76 +250,78 @@ e_select_names_model_duplicate (ESelectNamesModel *old) return model; } -const gchar * -e_select_names_model_get_textification (ESelectNamesModel *model) +gchar * +e_select_names_model_get_textification (ESelectNamesModel *model, const char *separator) { + gchar *text; + g_return_val_if_fail (model != NULL, NULL); g_return_val_if_fail (E_IS_SELECT_NAMES_MODEL (model), NULL); + g_return_val_if_fail (separator && *separator, NULL); - if (model->priv->text == NULL) { - - if (model->priv->data == NULL) { - - model->priv->text = g_strdup (""); - - } else { - gchar **strv = g_new0 (gchar *, g_list_length (model->priv->data)+1); - gint i = 0; - GList *iter = model->priv->data; - - while (iter) { - EDestination *dest = E_DESTINATION (iter->data); - strv[i] = (gchar *) e_destination_get_textrep (dest); - ++i; - iter = g_list_next (iter); - } - - model->priv->text = g_strjoinv (SEPARATOR, strv); + if (model->priv->data == NULL) { + + text = g_strdup (""); - if (strlen(model->priv->text) > MAX_LENGTH) { - model->priv->text[MAX_LENGTH] = 0; - g_realloc (model->priv->text, MAX_LENGTH + 1); - } - - g_free (strv); + } else { + gchar **strv = g_new0 (gchar *, g_list_length (model->priv->data)+1); + gint i = 0; + GList *iter = model->priv->data; + + while (iter) { + EDestination *dest = E_DESTINATION (iter->data); + strv[i] = (gchar *) e_destination_get_textrep (dest); + ++i; + iter = g_list_next (iter); + } + + text = g_strjoinv (separator, strv); + + if (strlen(text) > MAX_LENGTH) { + text[MAX_LENGTH] = '\0'; + text = g_realloc (text, MAX_LENGTH + 1); } + + g_free (strv); + } - return model->priv->text; + return text; } -const gchar * -e_select_names_model_get_address_text (ESelectNamesModel *model) +gchar * +e_select_names_model_get_address_text (ESelectNamesModel *model, const char *separator) { + gchar *addr_text; + g_return_val_if_fail (model != NULL, NULL); g_return_val_if_fail (E_IS_SELECT_NAMES_MODEL (model), NULL); + g_return_val_if_fail (separator && *separator, NULL); - if (model->priv->addr_text == NULL) { - - if (model->priv->data == NULL) { - - model->priv->addr_text = g_strdup (""); - - } else { - gchar **strv = g_new0 (gchar *, g_list_length (model->priv->data)+1); - gint i = 0; - GList *iter = model->priv->data; - - while (iter) { - EDestination *dest = E_DESTINATION (iter->data); - strv[i] = (gchar *) e_destination_get_address (dest); - if (strv[i]) - ++i; - iter = g_list_next (iter); - } - - model->priv->addr_text = g_strjoinv (SEPARATOR, strv); + if (model->priv->data == NULL) { - g_free (strv); + addr_text = g_strdup (""); + + } else { + gchar **strv = g_new0 (gchar *, g_list_length (model->priv->data)+1); + gint i = 0; + GList *iter = model->priv->data; + + while (iter) { + EDestination *dest = E_DESTINATION (iter->data); + strv[i] = (gchar *) e_destination_get_address (dest); + if (strv[i]) + ++i; + iter = g_list_next (iter); } + + addr_text = g_strjoinv (separator, strv); + + g_free (strv); + } - return model->priv->addr_text; + return addr_text; } gint @@ -614,7 +602,7 @@ e_select_names_model_delete (ESelectNamesModel *model, gint index) } void -e_select_names_model_clean (ESelectNamesModel *model) +e_select_names_model_clean (ESelectNamesModel *model, gboolean clean_last_entry) { GList *iter, *next; gboolean changed = FALSE; @@ -627,6 +615,10 @@ e_select_names_model_clean (ESelectNamesModel *model) EDestination *dest; next = g_list_next (iter); + + if (next == NULL && !clean_last_entry) + break; + dest = iter->data ? E_DESTINATION (iter->data) : NULL; if (dest == NULL || e_destination_is_empty (dest)) { @@ -705,19 +697,19 @@ e_select_names_model_merge (ESelectNamesModel *dest, ESelectNamesModel *src) } void -e_select_names_model_name_pos (ESelectNamesModel *model, gint index, gint *pos, gint *length) +e_select_names_model_name_pos (ESelectNamesModel *model, gint seplen, gint index, gint *pos, gint *length) { gint rp = 0, i, len = 0; GList *iter; const gchar *str; - g_return_if_fail (model != NULL); g_return_if_fail (E_IS_SELECT_NAMES_MODEL (model)); + g_return_if_fail (seplen > 0); i = 0; iter = model->priv->data; while (iter && i <= index) { - rp += len + (i > 0 ? SEPLEN : 0); + rp += len + (i > 0 ? seplen : 0); str = e_destination_get_textrep (E_DESTINATION (iter->data)); len = str ? strlen (str) : 0; ++i; @@ -736,14 +728,14 @@ e_select_names_model_name_pos (ESelectNamesModel *model, gint index, gint *pos, } void -e_select_names_model_text_pos (ESelectNamesModel *model, gint pos, gint *index, gint *start_pos, gint *length) +e_select_names_model_text_pos (ESelectNamesModel *model, gint seplen, gint pos, gint *index, gint *start_pos, gint *length) { GList *iter; const gchar *str; gint len = 0, i = 0, sp = 0, adj = 0; - g_return_if_fail (model != NULL); g_return_if_fail (E_IS_SELECT_NAMES_MODEL (model)); + g_return_if_fail (seplen > 0); iter = model->priv->data; @@ -756,14 +748,14 @@ e_select_names_model_text_pos (ESelectNamesModel *model, gint pos, gint *index, } sp += len + adj + 1; - adj = 1; + adj = seplen-1; ++i; iter = g_list_next (iter); } if (i != 0) - ++sp; /* skip past "magic space" */ + sp += seplen-1; /* skip past "magic space" */ if (iter == NULL) { #if 0 |