static void verify_commit (EContact *contact) { EVCardAttribute *attr; gchar *email_value; g_assert ((attr = e_vcard_get_attribute (E_VCARD (contact), EVC_EMAIL))); g_assert (e_vcard_attribute_is_single_valued (attr)); email_value = e_vcard_attribute_get_value (attr); g_assert (!g_strcmp0 (email_value, EMAIL_ADD)); }
/** * e_vcard_attribute_get_value: * @attr: an #EVCardAttribute * * Gets the value of a single-valued #EVCardAttribute, @attr. * * Return value: A newly allocated string representing the value. **/ char* e_vcard_attribute_get_value (EVCardAttribute *attr) { GList *values; g_return_val_if_fail (attr != NULL, NULL); values = e_vcard_attribute_get_values (attr); if (!e_vcard_attribute_is_single_valued (attr)) g_warning ("e_vcard_attribute_get_value called on multivalued attribute"); return values ? g_strdup ((char*)values->data) : NULL; }
/** * e_vcard_attribute_get_value_decoded: * @attr: an #EVCardAttribute * * Gets the value of a single-valued #EVCardAttribute, @attr, decoding * it if necessary. * * Note: this function seems currently to be unused. Could be removed. * * Return value: A newly allocated #GString representing the value. **/ GString* e_vcard_attribute_get_value_decoded (EVCardAttribute *attr) { GList *values; GString *str = NULL; g_return_val_if_fail (attr != NULL, NULL); values = e_vcard_attribute_get_values_decoded (attr); if (!e_vcard_attribute_is_single_valued (attr)) g_warning ("e_vcard_attribute_get_value_decoded called on multivalued attribute"); if (values) str = values->data; return str ? g_string_new_len (str->str, str->len) : NULL; }
/* This function returns a GtkEntry derived from field_id for a particular * contact. * Returns GtkWidget * on success, NULL on failure */ GtkWidget * contacts_label_widget_new (EContact *contact, EVCardAttribute *attr, const gchar *name, gboolean multi_line, gboolean *changed) { GtkWidget *label_widget, *type_edit = NULL, *container; gchar *label_markup; /* Create label/button text */ label_markup = g_strdup_printf (_("<b>%s:</b>"), name); /* Create widget */ label_widget = gtk_label_new (NULL); gtk_label_set_use_markup (GTK_LABEL (label_widget), TRUE); gtk_label_set_markup (GTK_LABEL (label_widget), label_markup); gtk_label_set_justify (GTK_LABEL (label_widget), GTK_JUSTIFY_RIGHT); if (/*(e_vcard_attribute_is_single_valued (attr)) &&*/ (multi_line == FALSE)) gtk_misc_set_alignment (GTK_MISC (label_widget), 1, 0.5); else gtk_misc_set_alignment (GTK_MISC (label_widget), 1, 0); g_free (label_markup); if (e_vcard_attribute_is_single_valued (attr)) type_edit = contacts_type_edit_widget_new (attr, multi_line, changed); if (type_edit) { gtk_widget_show (type_edit); gtk_widget_show (label_widget); container = gtk_hbox_new (FALSE, 6); gtk_box_pack_start (GTK_BOX (container), label_widget, FALSE, TRUE, 0); gtk_box_pack_end (GTK_BOX (container), type_edit, FALSE, FALSE, 0); label_widget = container; } gtk_widget_set_name (label_widget, e_vcard_attribute_get_name (attr)); return label_widget; }
/* This function returns a GtkEntry derived from field_id for a particular * contact. * Returns GtkWidget * on success, NULL on failure * TODO: Lots of duplicated code here, perhaps add a few bits to utils? */ static GtkWidget * contacts_edit_widget_new (EContact *contact, EVCardAttribute *attr, gboolean multi_line, gboolean *changed) { GtkWidget *type_edit; EContactChangeData *data; const gchar *attr_name = e_vcard_attribute_get_name (attr); /* Create data structure for changes */ data = g_new0 (EContactChangeData, 1); data->contact = contact; data->attr = attr; data->changed = changed; /* Create widget */ if (!e_vcard_attribute_is_single_valued (attr)) { /* Handle structured fields */ GtkWidget *adr_table; guint field; GList *values = e_vcard_attribute_get_values (attr); adr_table = gtk_table_new (1, 2, FALSE); gtk_table_set_col_spacings (GTK_TABLE (adr_table), 6); gtk_table_set_row_spacings (GTK_TABLE (adr_table), 6); gtk_container_set_border_width (GTK_CONTAINER (adr_table), 6); /* Set widget that contains attribute data */ data->widget = adr_table; /* Add type editor */ type_edit = contacts_type_edit_widget_new (attr, multi_line, changed); if (type_edit) { GtkWidget *label = gtk_label_new (NULL); gtk_label_set_use_markup (GTK_LABEL (label), TRUE); gtk_label_set_markup (GTK_LABEL (label), /* TODO: make nicer for i18n */ _("<b>Type:</b>")); gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5); gtk_table_attach (GTK_TABLE (adr_table), label, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0); gtk_table_attach (GTK_TABLE (adr_table), type_edit, 1, 2, 0, 1, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show (label); gtk_widget_show (type_edit); } /* Create sub-fields */ for (field = 0; values; values = values->next, field++) { /* If no information exists, assume field is * single-lined. * TODO: It may be more intelligent in the future * to look at the value and search for new-line * characters. */ gboolean multiline = FALSE; GtkWidget *label = NULL, *entry; const ContactsStructuredField *sfield = contacts_get_structured_field (attr_name, field); const gchar *string = (const gchar *)values->data; /* If we have the information, label the field */ if (sfield) { gchar *label_markup; if (sfield->priority == 0) continue; label = gtk_label_new (NULL); multiline = sfield->multiline; gtk_label_set_use_markup (GTK_LABEL (label), TRUE); label_markup = g_strdup_printf ( /** Translators, the first * argument is the field's * name, ex. <b>Country:</b> */ _("<b>%s:</b>"), gettext(sfield->subfield_name)); gtk_label_set_markup (GTK_LABEL (label), label_markup); g_free (label_markup); gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT); if (!multiline) gtk_misc_set_alignment ( GTK_MISC (label), 1, 0.5); else gtk_misc_set_alignment ( GTK_MISC (label), 1, 0); gtk_table_attach (GTK_TABLE (adr_table), label, 0, 1, field + 1, field + 2, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show (label); } /* This code is pretty much a verbatim copy of the * code below to handle single-valued fields */ if (multiline) { GtkTextBuffer *buffer; GtkTextView *view; view = GTK_TEXT_VIEW (gtk_text_view_new ()); gtk_widget_set_name (GTK_WIDGET (view), attr_name); buffer = gtk_text_view_get_buffer (view); gtk_text_buffer_set_text (buffer, string ? string : "", -1); gtk_text_view_set_editable (view, TRUE); gtk_text_view_set_accepts_tab (view, FALSE); entry = gtk_frame_new (NULL); gtk_frame_set_shadow_type (GTK_FRAME (entry), GTK_SHADOW_IN); gtk_container_add (GTK_CONTAINER (entry), GTK_WIDGET (view)); gtk_widget_show (GTK_WIDGET (view)); /* Connect signal for changes */ g_signal_connect (G_OBJECT (buffer), "changed", G_CALLBACK (contacts_entry_changed), data); } else { entry = gtk_entry_new (); gtk_widget_set_name (entry, attr_name); gtk_entry_set_text (GTK_ENTRY (entry), string ? string : ""); /* Connect signal for changes */ g_signal_connect (G_OBJECT (entry), "changed", G_CALLBACK (contacts_entry_changed), data); } gtk_widget_show (entry); /* Hide the label when the entry is hidden */ g_signal_connect_swapped (G_OBJECT (entry), "hide", G_CALLBACK (gtk_widget_hide), label); gtk_table_attach (GTK_TABLE (adr_table), entry, 1, 2, field + 1, field + 2, GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0); } } else if (multi_line) { /* Handle single-valued fields that span multiple lines */ gchar *string = e_vcard_attribute_get_value (attr); GtkWidget *container = NULL; GtkTextView *view = GTK_TEXT_VIEW (gtk_text_view_new ()); GtkTextBuffer *buffer = gtk_text_view_get_buffer (view); gtk_widget_set_name (GTK_WIDGET (view), attr_name); gtk_text_buffer_set_text (buffer, string ? string : "", -1); gtk_text_view_set_editable (view, TRUE); gtk_text_view_set_accepts_tab (view, FALSE); g_free (string); container = gtk_frame_new (NULL); gtk_frame_set_shadow_type ( GTK_FRAME (container), GTK_SHADOW_IN); gtk_container_add (GTK_CONTAINER (container), GTK_WIDGET (view)); gtk_widget_show (GTK_WIDGET (view)); /* if (type_edit) { gtk_widget_show (type_edit); gtk_widget_show (window); container = gtk_hbox_new (FALSE, 6); gtk_box_pack_start (GTK_BOX (container), type_edit, FALSE, TRUE, 0); gtk_box_pack_end (GTK_BOX (container), window, TRUE, TRUE, 0); }*/ /* Set widget that contains attribute data */ data->widget = container; /* Connect signal for changes */ g_signal_connect (G_OBJECT (buffer), "changed", G_CALLBACK (contacts_entry_changed), data); } else { /* Handle simple single-valued single-line fields */ gchar *string = e_vcard_attribute_get_value (attr); GtkWidget *entry, *container = NULL; entry = gtk_entry_new (); gtk_entry_set_text (GTK_ENTRY (entry), string ? string : ""); gtk_widget_set_name (entry, attr_name); g_free (string); /* if (type_edit) { gtk_widget_show (type_edit); gtk_widget_show (entry); container = gtk_hbox_new (FALSE, 6); gtk_box_pack_start (GTK_BOX (container), type_edit, FALSE, TRUE, 0); gtk_box_pack_end (GTK_BOX (container), entry, TRUE, TRUE, 0); }*/ /* Set widget that contains attribute data */ data->widget = container ? container : entry; /* Connect signal for changes */ g_signal_connect (G_OBJECT (entry), "changed", G_CALLBACK (contacts_entry_changed), data); } /* Free change data structure on destruction */ g_signal_connect_swapped (G_OBJECT (data->widget), "destroy", G_CALLBACK (g_free), data); gtk_widget_set_name (data->widget, attr_name); return data->widget; }