aboutsummaryrefslogtreecommitdiffstats
path: root/addressbook/gui/component/select-names/e-select-names-model.c
diff options
context:
space:
mode:
authorJon Trowbridge <trow@ximian.com>2001-12-28 11:08:27 +0800
committerJon Trowbridge <trow@src.gnome.org>2001-12-28 11:08:27 +0800
commit2786536d7f25b29b20a41b417896cff810368d85 (patch)
tree3ecdda5c24e1de152937a451a10bc09a5be891ba /addressbook/gui/component/select-names/e-select-names-model.c
parentb054d4b4e6f7eff593a2ac7c3b40f2d8bb92b82c (diff)
downloadgsoc2013-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.c140
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